diff --git a/.github/workflows/check-static-glibc.yml b/.github/workflows/check-static-glibc.yml index d79e9b0d78..b295687389 100644 --- a/.github/workflows/check-static-glibc.yml +++ b/.github/workflows/check-static-glibc.yml @@ -34,5 +34,13 @@ jobs: - name: Get Python dependencies run: python3 -m pip install -r toolkit/scripts/requirements.txt + - name: Copy Azure Linux rpm + run: | + echo ########## + echo "Copy Azure Linux rpm" + echo ########## + toolkit/scripts/toolchain/toolchain_update_git_submodule.sh + shell: bash + - name: Verify .spec files run: python3 toolkit/scripts/check_static_glibc.py SPECS/**/*.spec SPECS-EXTENDED/**/*.spec SPECS-SIGNED/**/*.spec diff --git a/LICENSES-AND-NOTICES/SPECS/LICENSES-MAP.md b/LICENSES-AND-NOTICES/SPECS/LICENSES-MAP.md index 4f8b48a17d..d91c3a421a 100644 --- a/LICENSES-AND-NOTICES/SPECS/LICENSES-MAP.md +++ b/LICENSES-AND-NOTICES/SPECS/LICENSES-MAP.md @@ -2,24 +2,24 @@ The Edge Microvisor Toolkit SPEC files originated from a variety of sources with | Origin | License | Specs | | --- | --- | --- | -| CentOS | [MIT](https://www.centos.org/legal/#licensing-policy) | crash-ptdump-command
delve
fstrm
nodejs-nodemon
rhnlib | +| CentOS | [MIT](https://www.centos.org/legal/#licensing-policy) | crash-ptdump-command
delve
fstrm
nodejs-nodemon
rhnlib
rt-setup
rt-tests
rtctl
tuned | | Ceph source | [LGPL2.1](https://github.com/ceph/ceph/blob/master/COPYING-LGPL2.1) | | | Debian | [MIT](https://opensource.org/licenses/MIT) | prometheus-process-exporter | | DOC group source | [DOC](https://www.dre.vanderbilt.edu/~schmidt/ACE-copying.html) | ace-tao | -| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | 389-ds-base
a52dec
accountsservice
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
alsa-firmware
alsa-plugins
alsa-sof-firmware
amtk
amtterm
ansible-freeipa
arptables
arpwatch
asio
aspell-en
audiofile
babeltrace
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
blosc
bolt
boom-boot
booth
botan2
breezy
buildah
busybox
bwidget
ca-certificates
cachefilesd
caddy
cairomm
calamares
capnproto
capstone
catatonit
catch1
cdrdao
celt051
certmonger
cfitsio
cgdcbxd
chan
CharLS
cim-schema
cjkuni-uming-fonts
cjose
cjson
clang15
cldr-emoji-annotation
clinfo
clucene
clutter
clutter-gst3
clutter-gtk
cogl
colorize
compat-lua
console-setup
container-exception-logger
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpptest
cpuid
criu
crypto-policies
cscope
custodia
Cython
dbus-c++
dbxtool
dcraw
deltarpm
device-mapper-persistent-data
diffstat
discount
dleyna-connector-dbus
dleyna-core
dmraid
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-style-xsl
dogtail
dotconf
dovecot
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dyninst
edac-utils
edk2
efax
efi-rpm-macros
elinks
enca
enchant
enscript
evemu
exempi
exiv2
fabtests
facter
fakechroot
fence-virt
fetchmail
fftw
filebench
flac
flashrom
flite
fltk
fonts-rpm-macros
foomatic-db
freeradius
freetds
freexl
fros
fuse-overlayfs
fuse-sshfs
future
fwupd
fwupd-efi
fxload
gavl
gconf-editor
GConf2
gcr
gdal
gdisk
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
gi-docgen
gl-manpages
glew
glm
glog
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-noto-cjk-fonts
google-noto-emoji-fonts
gphoto2
gpm
gpsbabel
graphene
graphite2
gsl
gspell
gssdp
gssntlmssp
gstreamer1
gtk-vnc
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hdf
hiera
highlight
hping3
hsakmt
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
iftop
igt-gpu-tools
iio-sensor-proxy
ilmbase
imaptest
incron
indent
intel-cmt-cat
intel-compute-runtime
intel-gmmlib
intel-igc
intel-level-zero
intel-media-driver
intel-metee
intel-npu-driver
intel-opencl-clang
intel-vpl-gpu-rt
ioping
ipa-pgothic-fonts
ipcalc
iprutils
iptstate
irssi
iso-codes
isomd5sum
iwd
jabberpy
jbigkit
jdom2
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kde-filesystem
keybinder3
keycloak-httpd-client-install
kronosnet
kyotocabinet
ladspa
lame
langtable
lasso
latencytop
lcov
leatherman
ledmon
lensfun
lftp
libabw
libao
libappstream-glib
libart_lgpl
libasyncns
libavc1394
libblockdev
libbpf
libbsd
libbytesize
libcanberra
libcbor
libcdio
libcdio-paranoia
libcdr
libchewing
libclc
libcli
libcmis
libcmpiutil
libcroco
libdap
libdatrie
libdazzle
libdbi
libdbusmenu
libdc1394
libdeflate
libdmx
libdrm
libdvdnav
libdvdread
libeasyfc
libecb
libEMF
libeot
libepubgen
libesmtp
libetonyek
libexttextcat
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgeotiff
libgexiv2
libgit2-glib
libglade2
libgovirt
libgphoto2
libgsf
libgta
libgxps
libhangul
libibcommon
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libiodbc
libipt
libiptcdata
libjaylink
libjcat
libkeepalive
libkkc
libkkc-data
libkml
liblangtag
libldb
liblerc
liblockfile
liblouis
liblqr-1
libmad
libmediaart
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
librevenge
librx
libsamplerate
libsass
libsecret
libsigc++20
libsigsegv
libsmbios
libspiro
libsrtp
libstaroffice
libstemmer
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtranslit
libucil
libunicap
libuninameslist
libusb1
libusbmuxd
libva-utils
libvarlink
libverto
libvisio
libvorbis
libvpl
libvpx
libwebsockets
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libxcrypt
libxklavier
libxmlb
libXScrnSaver
libyami
libyubikey
libzmf
lilv
linuxconsoletools
lksctp-tools
lld15
llvm15
lockdev
logwatch
lpsolve
lrzsz
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunitx
lua-term
luksmeta
lv2
lxc
lxcfs
lzip
m17n-db
m17n-lib
mailx
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-parent
mcelog
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memkind
mesa
mesa-demos
metis
microcode_ctl
microdnf
minicom
minizip-ng
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mosh
mosquitto
mpage
mrtg
mt-st
mtx
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
needrestart
neon
netcdf
netcf
netlabel_tools
netpbm
netsniff-ng
nilfs-utils
nkf
nload
nodejs-packaging
nss-pam-ldapd
numatop
ocaml-calendar
ocaml-camlp5
ocaml-csv
ocaml-curses
ocaml-extlib
ocaml-fileutils
ocaml-fpath
ocaml-libvirt
ocaml-markup
ocaml-tyxml
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
openblas
openbox
opencc
opencl-filesystem
opencl-headers
opencryptoki
opendnssec
OpenEXR
openjade
openjpeg2
openobex
openoffice-lv
openrdate
openslp
openssl-ibmpkcs11
openwsman
optipng
opus
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
pacemaker
pacrunner
paho-c
pakchois
papi
paps
parallel
passim
pbzip2
pcp
PEGTL
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Keywords
perl-B-Lint
perl-BDB
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-Load
perl-Class-Load-XS
perl-Class-Singleton
perl-Class-Tiny
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-CSS-Tiny
perl-Data-Munge
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-EnforceEncapsulation
perl-Devel-Leak
perl-Devel-Size
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-ExtUtils-Config
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-MimeInfo
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-TreeCreate
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Tree
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Importer
perl-inc-latest
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Module-Build-Tiny
perl-Module-Install-AuthorRequires
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Signature
perl-Mojolicious
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-IP
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Stash
perl-Package-Stash-XS
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-String-CRC32
perl-String-Format
perl-String-Similarity
perl-Sub-Info
perl-Sub-Uplevel
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-File
perl-Test-File-ShareDir
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LongString
perl-Test-Manifest
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-NoTabs
perl-Test-Object
perl-Test-Portability-Files
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-Variable-Magic
perl-Version-Requirements
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXSLT
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
physfs
pinfo
pipewire
pkcs11-helper
plexus-pom
plotutils
pmdk-convert
pngcrush
pngnq
po4a
podman
polkit-pkla-compat
portreserve
potrace
powertop
ppp
pps-tools
pptp
procmail
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pulseaudio
puppet
pyatspi
PyGreSQL
pykickstart
pylint
pyparted
pyserial
python-aiodns
python-aiohttp
python-alsa
python-apscheduler
python-argcomplete
python-argparse-manpage
python-astroid
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blivet
python-breathe
python-cbor2
python-cheetah
python-cmd2
python-colorama
python-CommonMark
python-configshell
python-cups
python-curio
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-elementpath
python-enchant
python-entrypoints
python-extras
python-faker
python-fasteners
python-fixtures
python-flake8
python-flaky
python-flask
python-fluidity-sm
python-funcsigs
python-genshi
python-gssapi
python-hs-dbus-signature
python-httplib2
python-humanize
python-hwdata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-jsonschema-specifications
python-justbases
python-justbytes
python-jwcrypto
python-kdcproxy
python-kerberos
python-kmod
python-lazy-object-proxy
python-ldap
python-lit
python-mccabe
python-memcached
python-mimeparse
python-monotonic
python-msal
python-msrestazure
python-mutagen
python-ntlm-auth
python-oauth2client
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paho-mqtt
python-paramiko
python-podman-api
python-productmd
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyproject-api
python-pyrsistent
python-pysocks
python-pytest-flake8
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytoml
python-qrcode
python-rdflib
python-recommonmark
python-referencing
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-toolbelt
python-requests_ntlm
python-rfc3986
python-rpmautospec-core
python-rpmfluff
python-rtslib
python-s3transfer
python-semantic_version
python-shortuuid
python-should_dsl
python-simpleline
python-slip
python-smartypants
python-sniffio
python-soupsieve
python-sphinx-epytext
python-sphinxcontrib-apidoc
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jquery
python-sphinxygen
python-suds
python-systemd
python-tempita
python-testpath
python-testresources
python-testscenarios
python-testtools
python-toml
python-tornado
python-tox
python-trio
python-typogrify
python-tzlocal
python-uamqp
python-unittest2
python-untangle
python-uritemplate
python-url-normalize
python-urwid
python-uswid
python-varlink
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-whoosh
python-winrm
python-xmlschema
python-xmltodict
python-yubico
python-zmq
python3-mallard-ducktype
python3-pycares
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtconnectivity
qt5-qtsensors
qt5-qtserialport
quagga
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2c
realmd
rear
recode
resource-agents
rhash
rp-pppoe
rpmdevtools
rpmlint
rr
rtkit
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-liquid
rubygem-maruku
rubygem-mongo
rubygem-mysql2
rubygem-pkg-config
rubygem-rouge
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-scanf
rubygem-sys-filesystem
rubygem-thread_order
rusers
rust-cbindgen
s-nail
samba
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
sdl12-compat
SDL2
SDL_sound
sdparm
selinux-policy
serd
setserial
setuptool
sgpio
sip
skkdic
slirp4netns
smc-tools
sombok
sord
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice
spice-protocol
spice-vdagent
spirv-headers
spirv-llvm-translator
spirv-llvm15-translator
spirv-tools
splix
sratom
star
startup-notification
stress-ng
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
systemd
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
thrift
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tss2
ttmkfdir
twolame
uchardet
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
umockdev
unicode-emoji
unicode-ucd
unique3
units
upower
uriparser
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usermode
ustr
uthash
uw-imap
v4l-utils
vc-intrinsics
vhostmd
vino
virt-p2v
virt-top
virt-who
vmem
volume_key
vorbis-tools
vte291
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
whois
wireshark
woff2
wordnet
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xdp-tools
xfconf
xfsdump
xhtml1-dtds
xorg-x11-drv-libinput
xorg-x11-fonts
xorg-x11-server
xorg-x11-utils
xpp3
xrestop
yelp-tools
yelp-xsl
ykclient
ypserv
z3
zenity
zix
zopfli
zziplib | -| Fedora (Copyright Remi Collet) | [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | librabbitmq | -| Fedora (ISC) | [ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE) | | +| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | 389-ds-base
a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
alsa-sof-firmware
amtk
amtterm
annobin
ansible-freeipa
archivemount
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
blosc
bluez
bmake
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
caddy
cairomm
calamares
capnproto
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cjson
ck
clang15
cldr-emoji-annotation
clinfo
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpufrequtils
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dhcpcd
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
driverctl
dropwatch
drpm
duktape
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
erofs-utils
evemu
execstack
exempi
exiv2
expected
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fdupes
fence-virt
fetchmail
fftw
filebench
fio
firewalld
flac
flashrom
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontawesome4-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
freexl
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fwupd
fwupd-efi
fxload
gavl
gbenchmark
gconf-editor
GConf2
gcovr
gcr
gdal
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
gi-docgen
giflib
gl-manpages
glew
glm
glog
glslang
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
gpsbabel
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hping3
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
igt-gpu-tools
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
incron
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-compute-runtime
intel-gmmlib
intel-igc
intel-ipsec-mb
intel-level-zero
intel-media-driver
intel-metee
intel-npu-driver
intel-opencl-clang
intel-vpl-gpu-rt
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jakarta-servlet
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
jurand
kata-containers
kde-filesystem
kde-settings
kernel-srpm-macros
kexec-tools
keybinder3
keycloak-httpd-client-install
kf
kf-kconfig
kf-kcoreaddons
kf-ki18n
kf-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libarrow
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcbor
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libclc
libcli
libcmis
libcmpiutil
libcomps
libcroco
libcxx
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbusmenu
libdc1394
libdecor
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libei
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgeotiff
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libgta
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjaylink
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
libkml
liblangtag
libldb
libldm
liblerc
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmamba
libmd
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
libnvme
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtpms
libtracecmd
libtraceevent
libtracefs
libtranslit
libucil
libunicap
libuninameslist
liburing
libusb1
libusbmuxd
libuser
libutempter
libva-utils
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvisio
libvoikko
libvorbis
libvpl
libvpx
libwacom
libwebsockets
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libxcvt
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
lksctp-tools
lld15
lldpd
llvm15
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunitx
lua-rpm-macros
lua-term
luajit
lujavrite
luksmeta
lutok
lv2
lxc
lxcfs
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mandoc
mariadb
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-parent
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
mdevctl
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-demos
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip-ng
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mosh
mosquitto
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
needrestart
neon
netavark
netcdf
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-mdns
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-augeas
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp-streams
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-pp
ocaml-ppx-derivers
ocaml-ppx-here
ocaml-ppx-let
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-srpm-macros
ocaml-stdio
ocaml-stdlib-random
ocaml-topkg
ocaml-tyxml
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
openbox
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
paho-c
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
passim
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-COW
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Refcount
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-TreeCreate
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Match-Simple
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-IP
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Infix
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Type-Tiny
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-apcu
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-pom
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
polkit-qt-1
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus-node-exporter
ps_mem
psacct
pssh
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-apscheduler
python-archspec
python-argcomplete
python-argparse-manpage
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-backoff
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-boltons
python-breathe
python-cached_property
python-cbor2
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-libmamba-solver
python-conda-package-handling
python-conda-package-streaming
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-editables
python-elementpath
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fastjsonschema
python-fields
python-filelock
python-fixtures
python-flake8
python-flaky
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hatch-fancy-pypi-readme
python-hatch-vcs
python-hatchling
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-iniconfig
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-jsonschema-specifications
python-junit_xml
python-junitxml
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lark
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-looseversion
python-markdown
python-markdown-it-py
python-mccabe
python-mdurl
python-memcached
python-menuinst
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paho-mqtt
python-paramiko
python-pathspec
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-poetry-core
python-process-tests
python-productmd
python-prometheus_client
python-ptyprocess
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyproject-api
python-pyproject-metadata
python-pyroute2
python-pyrsistent
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-flakes
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-referencing
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rich
python-rpm-generators
python-rpmautospec-core
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-shortuuid
python-should_dsl
python-simpleline
python-slip
python-smartypants
python-sniffio
python-sortedcontainers
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jquery
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sphinxygen
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-trove-classifiers
python-typing-extensions
python-typogrify
python-tzlocal
python-uamqp
python-unittest2
python-untangle
python-uritemplate
python-url-normalize
python-urwid
python-uswid
python-varlink
python-versioneer
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xlrd
python-xlsxwriter
python-xmlschema
python-xmltodict
python-yubico
python-zipp
python-zmq
python-zstandard
python-zstd
python3-mallard-ducktype
python3-pycares
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt-rpm-macros
qt5-qtconnectivity
qt5-qtsensors
qt5-qtserialport
qtbase
qtdeclarative
qtsvg
qttools
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
reproc
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rr
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-scanf
rubygem-sys-filesystem
rubygem-thread_order
rusers
rust-cbindgen
s-nail
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
sdl12-compat
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
shim-unsigned-aarch64
shim-unsigned-x64
simdjson
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
spdlog
speex
speexdsp
spice
spice-protocol
spice-vdagent
spirv-headers
spirv-llvm-translator
spirv-llvm15-translator
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stress-ng
strongswan
stunnel
subscription-manager
subunit
suitesparse
SuperLU
supermin
switcheroo-control
swtpm
symlinks
sympy
sysfsutils
systemd
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
thrift
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
trace-cmd
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
umockdev
unicode-emoji
unicode-ucd
unique3
units
upower
uriparser
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vc-intrinsics
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
wget
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xdp-tools
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-server-Xwayland
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xpp3
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zix
zopfli
zziplib | +| Fedora (Copyright Remi Collet) | [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | libmemcached-awesome
librabbitmq | +| Fedora (ISC) | [ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE) | python-resolvelib | | Intel | [MIT License](/LICENSES-AND-NOTICES/LICENSE.md) | cluster-agent
device-discovery
edge-release
edge-repos
edge-rpm-macros
hardware-discovery-agent
in-band-manageability
intel-idv-services
intel-igsc
intel-lms
intel-npu-firmware
intel-xpu-smi
node-agent
nvidia-data-center-driver
os-update
otelcol-contrib
persistent-mount
platform-manageability-agent
platform-observability-agent
platform-telemetry-agent
platform-update-agent
python-snoop
reporting-agent
rpc
tink-worker
tpm-cryptsetup
tpm2-initramfs-tool | -| Magnus Edenhill Open Source | [Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING) | | -| Microsoft | [Microsoft MIT License](https://github.com/microsoft/azurelinux/blob/3.0/LICENSES-AND-NOTICES/LICENSE.md) | alsa-lib
application-gateway-kubernetes-ingress
asc
azcopy
azl-otel-collector
azurelinux-sysinfo
cert-manager
cf-cli
cmake-fedora
containerd2
distroless-packages
docker-cli
docker-compose
edk2-hvloader-signed
elfutils
fluent-bit
gh
go-md2man
groff
grub2-efi-binary-signed
gstreamer1
gstreamer1-plugins-base
helm
jx
keda
kernel-64k-signed
kernel-hwe-signed
kernel-mshv-signed
kernel-rt
kernel-signed
kernel-uki
kernel-uki-signed
kube-vip-cloud-provider
libutempter
libvirt
libvisual
linuxptp
moby-containerd-cc
moby-engine
packer
prebuilt-ca-certificates
prebuilt-ca-certificates-base
prometheus-adapter
rubygem-deep_merge
rubygem-eventmachine
rubygem-hocon
rubygem-puppet-resource_api
rubygem-thor
runc
skopeo
sriov-network-device-plugin
systemd-boot-signed
tardev-snapshotter
umoci
xterm | -| Netplan source | [GPLv3](https://github.com/canonical/netplan/blob/main/COPYING) | | +| Magnus Edenhill Open Source | [Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING) | librdkafka | +| Microsoft | [Microsoft MIT License](https://github.com/microsoft/azurelinux/blob/3.0/LICENSES-AND-NOTICES/LICENSE.md) | alsa-lib
application-gateway-kubernetes-ingress
asc
azcopy
azl-otel-collector
azure-iot-sdk-c
azure-nvme-utils
azure-storage-cpp
azurelinux-image-tools
azurelinux-sysinfo
bazel
bmon
bpftrace
ccache
cert-manager
cf-cli
check-restart
clamav
cloud-hypervisor
cmake-fedora
containerd2
dasel
debugedit
dejavu-fonts
distroless-packages
docker-buildx
docker-cli
docker-compose
doxygen
dtc
edk2-hvloader-signed
elfutils
elixir
espeak-ng
espeakup
expat
flannel
fluent-bit
freefont
gflags
gh
go-md2man
groff
grpc
grub2-efi-binary-signed
GSL
gstreamer1
gstreamer1-plugins-base
gtk-update-icon-cache
helm
intel-pf-bb-config
ivykis
jsonbuilder
jx
kata-containers-cc
kata-packages-uvm
keda
keras
kernel-64k-signed
kernel-hwe-signed
kernel-mshv-signed
kernel-rt
kernel-signed
kernel-uki
kernel-uki-signed
kpatch
kube-vip-cloud-provider
kubernetes
libacvp
libconfini
libconfuse
libgdiplus
libmaxminddb
libmetalink
libsafec
libuv
libvirt
libvirt-python
libvisual
libxml++
linuxptp
lld
lsb-release
ltp
lttng-consume
mm-common
moby-containerd-cc
moby-engine
msgpack
ncompress
networkd-dispatcher
nlohmann-json
nmap
ntopng
opentelemetry-cpp
packer
pcaudiolib
pcre2
perl-Test-Warnings
perl-Text-Template
pigz
prebuilt-ca-certificates
prebuilt-ca-certificates-base
prometheus-adapter
python-cachetools
python-cherrypy
python-cstruct
python-execnet
python-google-pasta
python-libclang
python-libevdev
python-logutils
python-ml-dtypes
python-namex
python-nocasedict
python-omegaconf
python-opt-einsum
python-optree
python-pecan
python-pip
python-pyrpm
python-remoto
python-repoze-lru
python-routes
python-rsa
python-setuptools
python-sphinxcontrib-websupport
python-tensorboard
python-tensorboard-plugin-wit
python-yamlloader
R
rabbitmq-server
rocksdb
rubygem-addressable
rubygem-asciidoctor
rubygem-bindata
rubygem-concurrent-ruby
rubygem-connection_pool
rubygem-cool.io
rubygem-deep_merge
rubygem-digest-crc
rubygem-elastic-transport
rubygem-elasticsearch
rubygem-elasticsearch-api
rubygem-eventmachine
rubygem-excon
rubygem-faraday
rubygem-faraday-em_http
rubygem-faraday-em_synchrony
rubygem-faraday-excon
rubygem-faraday-httpclient
rubygem-faraday-multipart
rubygem-faraday-net_http
rubygem-faraday-net_http_persistent
rubygem-faraday-rack
rubygem-faraday-retry
rubygem-ffi
rubygem-fiber-local
rubygem-hirb
rubygem-hocon
rubygem-hoe
rubygem-http_parser
rubygem-httpclient
rubygem-io-event
rubygem-jmespath
rubygem-ltsv
rubygem-mini_portile2
rubygem-minitest
rubygem-mocha
rubygem-msgpack
rubygem-multi_json
rubygem-multipart-post
rubygem-net-http-persistent
rubygem-nio4r
rubygem-nokogiri
rubygem-oj
rubygem-parallel
rubygem-power_assert
rubygem-prometheus-client
rubygem-protocol-hpack
rubygem-protocol-http
rubygem-protocol-http1
rubygem-protocol-http2
rubygem-public_suffix
rubygem-puppet-resource_api
rubygem-rdiscount
rubygem-rdkafka
rubygem-rexml
rubygem-ruby-kafka
rubygem-ruby-progressbar
rubygem-rubyzip
rubygem-semantic_puppet
rubygem-serverengine
rubygem-sigdump
rubygem-strptime
rubygem-systemd-journal
rubygem-test-unit
rubygem-thor
rubygem-timers
rubygem-tzinfo
rubygem-tzinfo-data
rubygem-webhdfs
rubygem-webrick
rubygem-yajl-ruby
rubygem-zip-zip
runc
sdbus-cpp
sgx-backwards-compatibility
shim
skopeo
span-lite
sriov-network-device-plugin
SymCrypt
SymCrypt-OpenSSL
systemd-boot-signed
tardev-snapshotter
tensorflow
tinyxml2
toml11
tracelogging
umoci
usrsctp
vala
valkey
vnstat
zstd | +| Netplan source | [GPLv3](https://github.com/canonical/netplan/blob/main/COPYING) | netplan | | Numad source | [LGPLv2 License](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt) | numad | -| NVIDIA | [ASL 2.0 License and spec specific licenses](http://www.apache.org/licenses/LICENSE-2.0) | fwctl-signed
iser-signed
isert-signed
knem-modules-signed
mlnx-nfsrdma-signed
xpmem-modules-signed | +| NVIDIA | [ASL 2.0 License and spec specific licenses](http://www.apache.org/licenses/LICENSE-2.0) | fwctl-signed
ibarr
ibsim
iser-signed
isert-signed
knem-modules-signed
libnvidia-container
libvma
mlnx-nfsrdma-signed
multiperf
nvidia-container-toolkit
ofed-docs
ofed-scripts
perftest
rshim
sockperf
xpmem-modules-signed | | NVIDIA (BSD) | [BSD](https://github.com/Mellanox/sockperf/blob/sockperf_v2/copying) | | -| OpenEuler | [BSD-3 License](https://github.com/pytorch/pytorch/blob/master/LICENSE) | | -| OpenMamba | [Openmamba GPLv2 License](https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt) | | -| OpenSUSE | Following [openSUSE guidelines](https://en.opensuse.org/openSUSE:Specfile_guidelines#Specfile_Licensing) | aopalliance
apache-commons-beanutils
apache-commons-codec
apache-commons-collections
apache-commons-collections4
apache-commons-compress
apache-commons-daemon
apache-commons-dbcp
apache-commons-digester
apache-commons-httpclient
apache-commons-io
apache-commons-jexl
apache-commons-lang
apache-commons-net
apache-commons-pool
apache-commons-pool2
apache-commons-validator
apache-commons-vfs2
apache-parent
args4j
base64coder
bcel
bea-stax
beust-jcommander
bsf
cdparanoia
cglib
cni
containerized-data-importer
cri-o
ecj
geronimo-specs
glassfish-annotation-api
gnu-getopt
gnu-regexp
golang-packaging
hawtjni-runtime
httpcomponents-core
influx-cli
jakarta-taglibs-standard
jansi
jarjar
javacc
javacc-bootstrap
jboss-interceptors-1.2-api
jdepend
jlex
jline
jsch
jsoup
jtidy
junitperf
jzlib
kured
libtheora
libva
libvdpau
multus
objectweb-anttask
objenesis
oro
osgi-annotation
osgi-compendium
osgi-core
proj
psl-make-dafsa
publicsuffix
regexp
relaxngDatatype
rhino
ripgrep
servletapi4
servletapi5
shapelib
trilead-ssh2
xalan-j2
xbean
xerces-j2
xmldb-api
xmlrpc-c
xmlunit
xpp2
xz-java | -| Photon | [Photon License](LICENSE-PHOTON.md) and [Photon Notice](NOTICE.APACHE2).
Also see [LICENSE-EXCEPTIONS.PHOTON](LICENSE-EXCEPTIONS.PHOTON). | build-essential
cassandra
cassandra-driver
cloud-init
cni-plugins
core-packages
cqlsh
cronie
dosfstools
dracut
efibootmgr
etcd
ethtool
gcc
git-lfs
glibc
gobject-introspection
golang
golang-1.22
golang-1.23
golang-1.24
grub2
iproute
kernel
kernel-headers
kernel-ipe
kernel-lpg-innovate
linux-firmware
meson
openssh
python-geomet
rpm
rpm-ostree
rsyslog
shadow-utils
strace
systemd-bootstrap
tdnf
telegraf
WALinuxAgent | -| RPM software management source | [GPLv2+ License](https://github.com/rpm-software-management/dnf5/blob/main/COPYING.md) | | -| Source project | Same as the source project. | | -| Sysbench source | [GPLv2+ License](https://github.com/akopytov/sysbench/blob/master/COPYING) | | +| OpenEuler | [BSD-3 License](https://github.com/pytorch/pytorch/blob/master/LICENSE) | pytorch | +| OpenMamba | [Openmamba GPLv2 License](https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt) | bash-completion | +| OpenSUSE | Following [openSUSE guidelines](https://en.opensuse.org/openSUSE:Specfile_guidelines#Specfile_Licensing) | ant
ant-junit
antlr
aopalliance
apache-commons-beanutils
apache-commons-cli
apache-commons-codec
apache-commons-collections
apache-commons-collections4
apache-commons-compress
apache-commons-daemon
apache-commons-dbcp
apache-commons-digester
apache-commons-httpclient
apache-commons-io
apache-commons-jexl
apache-commons-lang
apache-commons-lang3
apache-commons-logging
apache-commons-net
apache-commons-pool
apache-commons-pool2
apache-commons-validator
apache-commons-vfs2
apache-parent
args4j
atinject
base64coder
bcel
bea-stax
beust-jcommander
bsf
byaccj
cal10n
cdparanoia
cglib
cni
containerized-data-importer
cpulimit
cri-o
ecj
fillup
flux
gd
geronimo-specs
glassfish-annotation-api
gnu-getopt
gnu-regexp
golang-packaging
guava
hamcrest
hawtjni-runtime
httpcomponents-core
influx-cli
influxdb
jakarta-taglibs-standard
jansi
jarjar
java-cup
java-cup-bootstrap
javacc
javacc-bootstrap
javassist
jboss-interceptors-1.2-api
jdepend
jflex
jflex-bootstrap
jlex
jline
jna
jsch
jsoup
jsr-305
jtidy
junit
junitperf
jzlib
kubevirt
kured
libcontainers-common
libtheora
libva
libvdpau
lynx
multus
objectweb-anttask
objectweb-asm
objenesis
oro
osgi-annotation
osgi-compendium
osgi-core
plexus-classworlds
plexus-interpolation
plexus-utils
proj
psl-make-dafsa
publicsuffix
qdox
regexp
relaxngDatatype
rhino
ripgrep
servletapi4
servletapi5
shapelib
slf4j
trilead-ssh2
virtiofsd
xalan-j2
xbean
xcursor-themes
xerces-j2
xml-commons-apis
xml-commons-resolver
xmldb-api
xmlrpc-c
xmlunit
xpp2
xz-java | +| Photon | [Photon License](LICENSE-PHOTON.md) and [Photon Notice](NOTICE.APACHE2).
Also see [LICENSE-EXCEPTIONS.PHOTON](LICENSE-EXCEPTIONS.PHOTON). | acl
alsa-utils
ansible
apr
apr-util
asciidoc
atftp
audit
autoconf
autoconf-archive
autofs
autogen
automake
babel
bash
bc
bcc
bind
binutils
bison
blktrace
boost
btrfs-progs
bubblewrap
build-essential
bzip2
c-ares
cairo
cassandra
cassandra-driver
cdrkit
check
chkconfig
chrpath
cifs-utils
clang
cloud-init
cloud-utils-growpart
cmake
cni-plugins
core-packages
coreutils
cpio
cppunit
cqlsh
cracklib
crash
crash-gcore-command
createrepo_c
cri-tools
cronie
curl
cyrus-sasl
cyrus-sasl-bootstrap
dbus
dbus-glib
dejagnu
device-mapper-multipath
dialog
diffutils
dkms
dmidecode
dnsmasq
docbook-dtd-xml
docbook-style-xsl
dosfstools
dracut
dstat
e2fsprogs
ed
efibootmgr
efivar
emacs
erlang
etcd
ethtool
expect
fcgi
file
filesystem
findutils
flex
fontconfig
fping
freetype
fuse
gawk
gc
gcc
gdb
gdbm
gettext
git
git-lfs
glib
glib-networking
glibc
glibmm
gmp
gnome-common
gnupg2
gnuplot
gnutls
gobject-introspection
golang
golang-1.22
golang-1.23
golang-1.24
golang-1.25
gperf
gperftools
gpgme
gptfdisk
grep
grub2
gtest
gtk-doc
guile
gzip
haproxy
harfbuzz
haveged
hdparm
http-parser
httpd
i2c-tools
iana-etc
icu
initramfs
initscripts
inotify-tools
intltool
iotop
iperf3
iproute
ipset
iptables
iputils
ipvsadm
ipxe
irqbalance
itstool
jansson
jq
json-c
json-glib
kbd
keepalived
kernel
kernel-64k
kernel-headers
kernel-ipe
kernel-lpg-innovate
kernel-uvm
keyutils
kmod
krb5
less
libaio
libarchive
libassuan
libatomic_ops
libcap
libcap-ng
libconfig
libdb
libdnet
libedit
libestr
libevent
libfastjson
libffi
libgcrypt
libgpg-error
libgssglue
libgudev
libjpeg-turbo
libksba
liblogging
libmbim
libmnl
libmodulemd
libmpc
libmspack
libndp
libnetfilter_conntrack
libnetfilter_cthelper
libnetfilter_cttimeout
libnetfilter_queue
libnfnetlink
libnftnl
libnl3
libnsl2
libpcap
libpipeline
libpng
libpsl
libqmi
librelp
librepo
librsync
libseccomp
libselinux
libsepol
libserf
libsigc++30
libsolv
libsoup
libssh2
libtalloc
libtar
libtasn1
libtiff
libtirpc
libtool
libunistring
libunwind
libusb
libwebp
libxml2
libxslt
libyaml
linux-firmware
lldb
lldpad
llvm
lm-sensors
lmdb
log4cpp
logrotate
lshw
lsof
lsscsi
ltrace
lttng-tools
lttng-ust
lvm2
lz4
lzo
m2crypto
m4
make
man-db
man-pages
maven
mc
mercurial
meson
mlocate
ModemManager
mpfr
msr-tools
mysql
nano
nasm
ncurses
ndctl
net-snmp
net-tools
nettle
newt
nfs-utils
nghttp2
nginx
ninja-build
nodejs
npth
nspr
nss
nss-altfiles
ntp
numactl
nvme-cli
oniguruma
OpenIPMI
openldap
openscap
openssh
openvswitch
ostree
pam
pango
parted
patch
pciutils
perl-Canary-Stability
perl-CGI
perl-common-sense
perl-Crypt-SSLeay
perl-DBD-SQLite
perl-DBI
perl-DBIx-Simple
perl-Exporter-Tiny
perl-File-HomeDir
perl-File-Which
perl-IO-Socket-SSL
perl-JSON-Any
perl-JSON-XS
perl-libintl-perl
perl-List-MoreUtils
perl-Module-Build
perl-Module-Install
perl-Module-ScanDeps
perl-Net-SSLeay
perl-NetAddr-IP
perl-Object-Accessor
perl-Path-Class
perl-Try-Tiny
perl-Types-Serialiser
perl-WWW-Curl
perl-XML-Parser
perl-YAML
perl-YAML-Tiny
pgbouncer
pinentry
polkit
popt
postgresql
procps-ng
protobuf
protobuf-c
psmisc
pth
pyasn1-modules
pyOpenSSL
pyparsing
pytest
python-appdirs
python-asn1crypto
python-atomicwrites
python-attrs
python-bcrypt
python-certifi
python-cffi
python-chardet
python-configobj
python-constantly
python-coverage
python-cryptography
python-daemon
python-dateutil
python-defusedxml
python-distro
python-docopt
python-docutils
python-ecdsa
python-geomet
python-gevent
python-hyperlink
python-hypothesis
python-idna
python-imagesize
python-incremental
python-iniparse
python-ipaddr
python-jinja2
python-jmespath
python-jsonpatch
python-jsonpointer
python-jsonschema
python-lockfile
python-lxml
python-mako
python-markupsafe
python-mistune
python-msgpack
python-netaddr
python-netifaces
python-ntplib
python-oauthlib
python-packaging
python-pam
python-pbr
python-ply
python-prettytable
python-psutil
python-psycopg2
python-py
python-pyasn1
python-pycodestyle
python-pycparser
python-pycurl
python-pygments
python-pynacl
python-requests
python-setuptools_scm
python-simplejson
python-six
python-snowballstemmer
python-sphinx-theme-alabaster
python-twisted
python-urllib3
python-vcversioner
python-virtualenv
python-wcwidth
python-webob
python-websocket-client
python-werkzeug
python-zope-event
python-zope-interface
python3
pytz
PyYAML
rapidjson
readline
rng-tools
rpcbind
rpcsvc-proto
rpm
rpm-ostree
rrdtool
rsync
rsyslog
ruby
rust
rust-1.75
scons
sed
sg3_utils
shadow-utils
slang
snappy
socat
sqlite
sshpass
strace
subversion
sudo
swig
syslinux
syslog-ng
sysstat
systemd-bootstrap
systemtap
tar
tboot
tcl
tcpdump
tcsh
tdnf
telegraf
texinfo
tmux
tpm2-abrmd
tpm2-pkcs11
tpm2-pytss
tpm2-tools
tpm2-tss
traceroute
tree
tzdata
unbound
unixODBC
unzip
usbutils
userspace-rcu
utf8proc
util-linux
valgrind
vim
vsftpd
WALinuxAgent
which
wpa_supplicant
xfsprogs
xinetd
xmlsec1
xmlto
xz
zchunk
zeromq
zip
zlib
zsh | +| RPM software management source | [GPLv2+ License](https://github.com/rpm-software-management/dnf5/blob/main/COPYING.md) | dnf5 | +| Source project | Same as the source project. | python-nocaselist | +| Sysbench source | [GPLv2+ License](https://github.com/akopytov/sysbench/blob/master/COPYING) | sysbench | diff --git a/LICENSES-AND-NOTICES/SPECS/data/licenses.json b/LICENSES-AND-NOTICES/SPECS/data/licenses.json index 420f83867b..626f4fe67f 100644 --- a/LICENSES-AND-NOTICES/SPECS/data/licenses.json +++ b/LICENSES-AND-NOTICES/SPECS/data/licenses.json @@ -13,7 +13,11 @@ "delve", "fstrm", "nodejs-nodemon", - "rhnlib" + "rhnlib", + "rt-setup", + "rt-tests", + "rtctl", + "tuned" ] }, "Ceph source": { @@ -37,38 +41,64 @@ "specs": [ "389-ds-base", "a52dec", + "abseil-cpp", "accountsservice", + "acpica-tools", "acpid", "adcli", "adobe-mappings-cmap", "adobe-mappings-pdf", "advancecomp", + "adwaita-icon-theme", + "afflib", + "aide", "alsa-firmware", "alsa-plugins", "alsa-sof-firmware", "amtk", "amtterm", + "annobin", "ansible-freeipa", + "archivemount", "arptables", "arpwatch", "asio", + "aspell", "aspell-en", + "at", + "at-spi2-atk", + "at-spi2-core", + "atf", + "atk", + "atop", + "attr", "audiofile", + "augeas", + "authbind", + "authd", + "authselect", + "autoconf213", + "avahi", "babeltrace", + "babeltrace2", "babl", "baekmuk-ttf-fonts", "bats", "bcache-tools", "biosdevname", "blosc", + "bluez", + "bmake", "bolt", "boom-boot", "booth", "botan2", "breezy", + "brotli", "buildah", "busybox", "bwidget", + "byacc", "ca-certificates", "cachefilesd", "caddy", @@ -77,18 +107,24 @@ "capnproto", "capstone", "catatonit", + "catch", "catch1", "cdrdao", "celt051", + "cereal", "certmonger", "cfitsio", "cgdcbxd", "chan", "CharLS", + "checkpolicy", + "checksec", + "chrony", "cim-schema", "cjkuni-uming-fonts", "cjose", "cjson", + "ck", "clang15", "cldr-emoji-annotation", "clinfo", @@ -96,9 +132,18 @@ "clutter", "clutter-gst3", "clutter-gtk", + "cmocka", "cogl", + "collectd", + "colm", + "color-filesystem", + "colord", "colorize", "compat-lua", + "compiler-rt", + "conda", + "conmon", + "conntrack-tools", "console-setup", "container-exception-logger", "convmv", @@ -106,121 +151,196 @@ "corosync-qdevice", "cpp-hocon", "cppcheck", + "cpprest", "cpptest", + "cpufrequtils", "cpuid", "criu", "crypto-policies", + "cryptsetup", "cscope", + "ctags", + "CUnit", + "cups", "custodia", "Cython", "dbus-c++", + "dbus-python", "dbxtool", + "dconf", "dcraw", + "debootstrap", "deltarpm", + "desktop-file-utils", "device-mapper-persistent-data", + "dhcpcd", + "dietlibc", "diffstat", + "ding-libs", "discount", + "distribution-gpg-keys", "dleyna-connector-dbus", "dleyna-core", "dmraid", + "dnf", + "dnf-plugins-core", + "docbook-dtds", "docbook-simple", "docbook-slides", "docbook-style-dsssl", "docbook-utils", "docbook2X", + "docbook5-schemas", "docbook5-style-xsl", "dogtail", + "dos2unix", "dotconf", "dovecot", + "dpdk", "driverctl", "dropwatch", "drpm", + "duktape", "dumpet", "dvd+rw-tools", + "dwarves", + "dwz", "dyninst", + "ebtables", "edac-utils", "edk2", "efax", "efi-rpm-macros", + "egl-wayland", + "eglexternalplatform", "elinks", "enca", "enchant", + "enchant2", "enscript", + "environment-modules", + "erofs-utils", "evemu", + "execstack", "exempi", "exiv2", + "expected", + "extra-cmake-modules", "fabtests", "facter", "fakechroot", + "fakeroot", + "fdupes", "fence-virt", "fetchmail", "fftw", "filebench", + "fio", + "firewalld", "flac", "flashrom", + "flatbuffers", "flite", "fltk", + "fmt", + "fontawesome-fonts", + "fontawesome4-fonts", + "fontpackages", "fonts-rpm-macros", "foomatic-db", + "freeglut", + "freeipmi", "freeradius", "freetds", "freexl", + "fribidi", "fros", + "frr", + "fsverity-utils", "fuse-overlayfs", "fuse-sshfs", + "fuse-zip", + "fuse3", "future", "fwupd", "fwupd-efi", "fxload", "gavl", + "gbenchmark", "gconf-editor", "GConf2", + "gcovr", "gcr", "gdal", "gdisk", + "gdk-pixbuf2", "generic-logos", "genwqe-tools", "geoclue2", "GeoIP", "GeoIP-GeoLite-data", "geolite2", + "geos", + "gfs2-utils", "gi-docgen", + "giflib", "gl-manpages", "glew", "glm", "glog", + "glslang", + "glusterfs", "gnome-desktop-testing", "gnome-doc-utils", "gnome-icon-theme", "gnome-keyring", + "gnu-efi", "go-rpm-macros", "gom", "google-api-python-client", "google-crosextra-caladea-fonts", "google-crosextra-carlito-fonts", + "google-guice", "google-noto-cjk-fonts", "google-noto-emoji-fonts", + "google-roboto-slab-fonts", "gphoto2", "gpm", "gpsbabel", "graphene", "graphite2", + "graphviz", + "grubby", + "gsettings-desktop-schemas", "gsl", + "gsm", "gspell", "gssdp", "gssntlmssp", "gstreamer1", "gtk-vnc", + "gtk2", + "gtk3", "gtkspell", "gupnp", "gupnp-av", "gupnp-dlna", "gupnp-igd", + "hardening-check", "hdf", + "hdf5", + "heimdal", + "help2man", + "hexedit", + "hicolor-icon-theme", "hiera", "highlight", + "hivex", + "hostname", "hping3", "hsakmt", + "htop", + "hunspell", "hunspell-af", "hunspell-ar", "hunspell-as", @@ -239,6 +359,7 @@ "hunspell-de", "hunspell-dsb", "hunspell-el", + "hunspell-en", "hunspell-eo", "hunspell-es", "hunspell-et", @@ -329,6 +450,10 @@ "hunspell-wa", "hunspell-xh", "hunspell-yi", + "hwdata", + "hwloc", + "hyperscan", + "hyperv-daemons", "hyphen", "hyphen-as", "hyphen-bg", @@ -386,17 +511,24 @@ "ibus-table-chinese", "icc-profiles-openicc", "icon-naming-utils", + "icoutils", "iftop", "igt-gpu-tools", "iio-sensor-proxy", "ilmbase", + "im-chooser", "imaptest", + "imsettings", "incron", "indent", + "infinipath-psm", + "inih", + "iniparser", "intel-cmt-cat", "intel-compute-runtime", "intel-gmmlib", "intel-igc", + "intel-ipsec-mb", "intel-level-zero", "intel-media-driver", "intel-metee", @@ -404,78 +536,128 @@ "intel-opencl-clang", "intel-vpl-gpu-rt", "ioping", + "IP2Location", "ipa-pgothic-fonts", "ipcalc", + "ipmitool", "iprutils", + "iptraf-ng", "iptstate", "irssi", + "iscsi-initiator-utils", + "isns-utils", "iso-codes", "isomd5sum", + "iw", "iwd", "jabberpy", + "jakarta-servlet", + "jasper", + "javapackages-bootstrap", + "javapackages-tools", "jbigkit", "jdom2", + "jemalloc", "jfsutils", "jimtcl", "jose", "js-jquery", "jsoncpp", "Judy", + "jurand", + "kata-containers", "kde-filesystem", + "kde-settings", + "kernel-srpm-macros", + "kexec-tools", "keybinder3", "keycloak-httpd-client-install", + "kf", + "kf-kconfig", + "kf-kcoreaddons", + "kf-ki18n", + "kf-kwidgetsaddons", + "kpmcore", "kronosnet", + "ksh", "kyotocabinet", + "kyua", "ladspa", "lame", "langtable", + "lapack", "lasso", "latencytop", + "lato-fonts", + "lcms2", "lcov", + "ldns", "leatherman", "ledmon", "lensfun", + "leveldb", "lftp", "libabw", + "libaec", "libao", "libappstream-glib", + "libarrow", "libart_lgpl", "libasyncns", + "libatasmart", "libavc1394", "libblockdev", "libbpf", "libbsd", + "libburn", "libbytesize", + "libcacard", "libcanberra", "libcbor", "libcdio", "libcdio-paranoia", "libcdr", + "libcgroup", "libchewing", "libclc", "libcli", "libcmis", "libcmpiutil", + "libcomps", "libcroco", + "libcxx", + "libdaemon", "libdap", "libdatrie", "libdazzle", "libdbi", "libdbusmenu", "libdc1394", + "libdecor", "libdeflate", "libdmx", + "libdnf", "libdrm", "libdvdnav", "libdvdread", + "libdwarf", "libeasyfc", + "libecap", "libecb", + "libei", + "libell", "libEMF", "libeot", + "libepoxy", "libepubgen", "libesmtp", "libetonyek", + "libev", + "libevdev", + "libexif", "libexttextcat", + "libfabric", + "libfontenc", "libfreehand", "libftdi", "libgadu", @@ -484,15 +666,23 @@ "libgee06", "libgeotiff", "libgexiv2", + "libgit2", "libgit2-glib", "libglade2", + "libglvnd", "libgovirt", "libgphoto2", "libgsf", "libgta", + "libguestfs", + "libgusb", + "libgxim", "libgxps", "libhangul", + "libhugetlbfs", "libibcommon", + "libical", + "libICE", "libicns", "libid3tag", "libIDL", @@ -501,23 +691,34 @@ "libieee1284", "libimobiledevice", "libindicator", + "libinput", "libiodbc", "libipt", "libiptcdata", + "libiscsi", + "libisoburn", + "libisofs", "libjaylink", "libjcat", + "libkcapi", "libkeepalive", "libkkc", "libkkc-data", "libkml", "liblangtag", "libldb", + "libldm", "liblerc", "liblockfile", + "liblognorm", "liblouis", "liblqr-1", + "liblzf", "libmad", + "libmamba", + "libmd", "libmediaart", + "libmicrohttpd", "libmikmod", "libmodman", "libmodplug", @@ -529,8 +730,12 @@ "libmwaw", "libnbd", "libnet", + "libnetfilter_log", + "libnfs", + "libnotify", "libntlm", "libnumbertext", + "libnvme", "liboauth", "libodfgen", "libofa", @@ -545,6 +750,7 @@ "libotr", "libpagemaker", "libpaper", + "libpciaccess", "libpeas", "libpfm", "libpinyin", @@ -553,43 +759,68 @@ "libpng12", "libpng15", "libproxy", + "libpsm2", + "libpwquality", "libqb", "libqxp", "libraqm", "LibRaw", "libraw1394", "libreport", + "libreswan", "librevenge", + "librsvg2", "librx", "libsamplerate", "libsass", "libsecret", + "libsemanage", "libsigc++20", "libsigsegv", + "libslirp", + "libSM", "libsmbios", + "libsmi", + "libsndfile", + "libsodium", "libspiro", "libsrtp", + "libssh", "libstaroffice", "libstemmer", + "libstoragemgmt", + "libtdb", "libteam", "libtevent", "libthai", "libtnc", "libtomcrypt", "libtommath", + "libtpms", + "libtracecmd", + "libtraceevent", + "libtracefs", "libtranslit", "libucil", "libunicap", "libuninameslist", + "liburing", "libusb1", "libusbmuxd", + "libuser", + "libutempter", "libva-utils", "libvarlink", "libverto", + "libvirt-dbus", + "libvirt-glib", + "libvirt-java", "libvisio", + "libvoikko", "libvorbis", "libvpl", "libvpx", + "libwacom", "libwebsockets", "libwnck3", "libwpd", @@ -597,36 +828,77 @@ "libwpg", "libwps", "libwvstreams", + "libX11", + "libXau", + "libXaw", + "libxcb", + "libXcomposite", "libxcrypt", + "libXcursor", + "libxcvt", + "libXdamage", + "libXdmcp", + "libXext", + "libxfce4util", + "libXfixes", + "libXfont2", + "libXft", + "libXi", + "libXinerama", + "libxkbcommon", + "libxkbfile", "libxklavier", "libxmlb", + "libXmu", + "libXpm", + "libXrandr", + "libXrender", + "libXres", "libXScrnSaver", + "libxshmfence", + "libXt", + "libXtst", + "libXv", + "libXxf86vm", "libyami", + "libyang", "libyubikey", + "libzip", "libzmf", "lilv", "linuxconsoletools", "lksctp-tools", "lld15", + "lldpd", "llvm15", "lockdev", "logwatch", "lpsolve", "lrzsz", + "lua", "lua-expat", "lua-filesystem", "lua-json", "lua-lpeg", "lua-lunitx", + "lua-rpm-macros", "lua-term", + "luajit", + "lujavrite", "luksmeta", + "lutok", "lv2", "lxc", "lxcfs", "lzip", + "lzop", "m17n-db", "m17n-lib", + "mac-robber", + "mailcap", "mailx", + "malaga", + "malaga-suomi-voikko", "mallard-rng", "man-pages-cs", "man-pages-es", @@ -636,19 +908,33 @@ "man-pages-pl", "man-pages-ru", "man-pages-zh-CN", + "mandoc", + "mariadb", "mariadb-connector-c", "mariadb-connector-odbc", "marisa", + "maven-compiler-plugin", + "maven-jar-plugin", "maven-parent", + "maven-resolver", + "maven-resources-plugin", + "maven-surefire", + "maven-wagon", "mcelog", + "mcpp", + "mcstrans", + "mdadm", "mdds", + "mdevctl", "meanwhile", "mecab", "mecab-ipadic", "media-player-info", + "memcached", "memkind", "mesa", "mesa-demos", + "mesa-libGLU", "metis", "microcode_ctl", "microdnf", @@ -670,12 +956,18 @@ "mod_security", "mod_security_crs", "mod_wsgi", + "mokutil", "mosh", "mosquitto", "mpage", "mrtg", + "mstflint", "mt-st", + "mtdev", + "mtools", + "mtr", "mtx", + "munge", "mutt", "mythes", "mythes-bg", @@ -701,29 +993,88 @@ "mythes-sl", "mythes-sv", "mythes-uk", + "nbd", + "nbdkit", "needrestart", "neon", + "netavark", "netcdf", "netcf", "netlabel_tools", "netpbm", "netsniff-ng", + "nfs4-acl-tools", + "nftables", "nilfs-utils", "nkf", "nload", + "nlopt", "nodejs-packaging", + "nss-mdns", "nss-pam-ldapd", + "nss_nis", + "nss_wrapper", + "ntfs-3g", + "ntfs-3g-system-compression", + "numad", "numatop", + "numpy", + "nvml", + "oath-toolkit", + "ocaml", + "ocaml-alcotest", + "ocaml-astring", + "ocaml-augeas", + "ocaml-base", + "ocaml-bigarray-compat", + "ocaml-bisect-ppx", "ocaml-calendar", + "ocaml-camlp-streams", "ocaml-camlp5", + "ocaml-camomile", + "ocaml-cinaps", + "ocaml-cmdliner", + "ocaml-compiler-libs-janestreet", + "ocaml-cppo", + "ocaml-csexp", "ocaml-csv", + "ocaml-ctypes", "ocaml-curses", + "ocaml-dune", "ocaml-extlib", "ocaml-fileutils", + "ocaml-findlib", + "ocaml-fmt", "ocaml-fpath", + "ocaml-gettext", + "ocaml-integers", "ocaml-libvirt", + "ocaml-luv", + "ocaml-lwt", "ocaml-markup", + "ocaml-mmap", + "ocaml-num", + "ocaml-ocamlbuild", + "ocaml-ocplib-endian", + "ocaml-ounit", + "ocaml-parsexp", + "ocaml-pp", + "ocaml-ppx-derivers", + "ocaml-ppx-here", + "ocaml-ppx-let", + "ocaml-ppxlib", + "ocaml-re", + "ocaml-react", + "ocaml-result", + "ocaml-seq", + "ocaml-sexplib", + "ocaml-sexplib0", + "ocaml-srpm-macros", + "ocaml-stdio", + "ocaml-stdlib-random", + "ocaml-topkg", "ocaml-tyxml", + "ocaml-uutf", "ocaml-xml-light", "ocaml-zarith", "ocl-icd", @@ -732,61 +1083,89 @@ "omping", "opa", "opal", + "open-vm-tools", "openblas", "openbox", "opencc", "opencl-filesystem", "opencl-headers", "opencryptoki", + "opencsd", "opendnssec", "OpenEXR", "openjade", "openjpeg2", + "openmpi", "openobex", "openoffice-lv", "openrdate", + "opensc", "openslp", + "opensm", + "opensp", + "openssl", "openssl-ibmpkcs11", + "openssl-pkcs11", "openwsman", "optipng", "opus", + "orangefs", "ORBit2", "orc", "os-prober", "osinfo-db", "osinfo-db-tools", "overpass-fonts", + "p11-kit", + "p7zip", "pacemaker", "pacrunner", "paho-c", "pakchois", + "pam_krb5", + "pam_wrapper", "papi", "paps", "parallel", "passim", + "patchelf", + "patchutils", "pbzip2", "pcp", + "pcsc-lite", + "pcsc-lite-ccid", "PEGTL", + "perl", + "perl-Algorithm-C3", "perl-Algorithm-Diff", "perl-Alien-Build", "perl-Alien-pkgconf", "perl-AnyEvent", "perl-AnyEvent-AIO", "perl-AnyEvent-BDB", + "perl-App-cpanminus", "perl-App-FatPacker", "perl-AppConfig", "perl-Archive-Extract", + "perl-Archive-Zip", "perl-Authen-SASL", + "perl-B-COW", "perl-B-Debug", "perl-B-Hooks-EndOfScope", + "perl-B-Hooks-OP-Check", "perl-B-Keywords", "perl-B-Lint", + "perl-bareword-filehandles", "perl-BDB", + "perl-Bit-Vector", "perl-boolean", "perl-Browser-Open", "perl-BSD-Resource", "perl-Business-ISBN", "perl-Business-ISBN-Data", + "perl-Bytes-Random-Secure", + "perl-Capture-Tiny", + "perl-Carp-Clan", "perl-CBOR-XS", "perl-Class-Accessor", "perl-Class-C3", @@ -794,16 +1173,21 @@ "perl-Class-Data-Inheritable", "perl-Class-Factory-Util", "perl-Class-Inspector", + "perl-Class-ISA", "perl-Class-Load", "perl-Class-Load-XS", + "perl-Class-Method-Modifiers", "perl-Class-Singleton", "perl-Class-Tiny", + "perl-Class-XSAccessor", + "perl-Clone", "perl-Color-ANSI-Util", "perl-Color-RGB-Util", "perl-ColorThemeBase-Static", "perl-ColorThemeRole-ANSI", "perl-ColorThemes-Standard", "perl-ColorThemeUtil-ANSI", + "perl-Compress-Bzip2", "perl-Compress-LZF", "perl-Compress-Raw-Lzma", "perl-Config-AutoConf", @@ -817,6 +1201,9 @@ "perl-Convert-Bencode", "perl-Coro", "perl-Coro-Multicore", + "perl-CPAN-Changes", + "perl-CPAN-DistnameInfo", + "perl-CPAN-Meta-Check", "perl-Cpanel-JSON-XS", "perl-Crypt-CBC", "perl-Crypt-DES", @@ -826,11 +1213,15 @@ "perl-Crypt-OpenSSL-Random", "perl-Crypt-OpenSSL-RSA", "perl-Crypt-PasswdMD5", + "perl-Crypt-Random-Seed", "perl-CSS-Tiny", + "perl-Data-Dump", "perl-Data-Munge", + "perl-Data-OptList", "perl-Data-Peek", "perl-Data-Section", "perl-Data-UUID", + "perl-Date-Calc", "perl-Date-ISO8601", "perl-Date-Manip", "perl-DateTime", @@ -847,11 +1238,24 @@ "perl-DateTime-TimeZone-Tzfile", "perl-DBD-MySQL", "perl-Devel-CallChecker", + "perl-Devel-Caller", + "perl-Devel-CheckBin", + "perl-Devel-CheckLib", + "perl-Devel-Cycle", "perl-Devel-EnforceEncapsulation", + "perl-Devel-GlobalDestruction", + "perl-Devel-GlobalDestruction-XS", + "perl-Devel-Hide", "perl-Devel-Leak", + "perl-Devel-LexAlias", + "perl-Devel-Refcount", "perl-Devel-Size", + "perl-Devel-StackTrace", + "perl-Devel-Symdump", "perl-Digest-BubbleBabble", "perl-Digest-CRC", + "perl-Digest-HMAC", + "perl-Digest-SHA1", "perl-Dist-CheckConflicts", "perl-DynaLoader-Functions", "perl-Email-Address", @@ -859,17 +1263,21 @@ "perl-Encode-Detect", "perl-Encode-EUCJPASCII", "perl-Encode-IMAPUTF7", + "perl-Encode-Locale", "perl-Env-ShellWords", "perl-Error", "perl-EV", "perl-Eval-Closure", "perl-Event", "perl-Exception-Class", + "perl-Expect", "perl-ExtUtils-Config", + "perl-ExtUtils-Depends", "perl-ExtUtils-Helpers", "perl-ExtUtils-InstallPaths", "perl-ExtUtils-PkgConfig", "perl-FCGI", + "perl-Fedora-VSP", "perl-FFI-CheckLib", "perl-File-BaseDir", "perl-File-BOM", @@ -882,7 +1290,9 @@ "perl-File-Find-Rule", "perl-File-Find-Rule-Perl", "perl-File-Inplace", + "perl-File-Listing", "perl-File-MimeInfo", + "perl-File-pushd", "perl-File-ReadBackwards", "perl-File-Remove", "perl-File-ShareDir", @@ -896,62 +1306,87 @@ "perl-FreezeThaw", "perl-GD", "perl-GD-Barcode", + "perl-generators", "perl-Getopt-ArgvFile", "perl-gettext", "perl-Graphics-ColorNamesLite-WWW", "perl-GSSAPI", "perl-Guard", "perl-Hook-LexWrap", + "perl-HTML-Parser", + "perl-HTML-Tagset", "perl-HTML-Tree", + "perl-HTTP-Cookies", + "perl-HTTP-Daemon", + "perl-HTTP-Date", + "perl-HTTP-Message", + "perl-HTTP-Negotiate", "perl-Image-Base", "perl-Image-Info", "perl-Image-Xbm", "perl-Image-Xpm", + "perl-Import-Into", "perl-Importer", "perl-inc-latest", + "perl-indirect", "perl-Inline-Files", "perl-IO-AIO", "perl-IO-All", "perl-IO-CaptureOutput", "perl-IO-Compress-Lzma", + "perl-IO-HTML", "perl-IO-Multiplex", "perl-IO-SessionData", "perl-IO-Socket-INET6", + "perl-IO-String", + "perl-IO-stringy", + "perl-IO-Tty", "perl-IPC-Run", "perl-IPC-Run3", "perl-IPC-System-Simple", + "perl-JSON", "perl-JSON-Color", "perl-JSON-MaybeXS", "perl-LDAP", "perl-libnet", + "perl-libwww-perl", "perl-libxml-perl", "perl-Lingua-EN-Inflect", "perl-List-MoreUtils-XS", + "perl-local-lib", "perl-Locale-Codes", "perl-Locale-Maketext-Gettext", "perl-Locale-Msgfmt", "perl-Locale-PO", "perl-Log-Message", "perl-Log-Message-Simple", + "perl-LWP-MediaTypes", "perl-LWP-Protocol-https", "perl-Mail-AuthenticationResults", "perl-Mail-DKIM", "perl-Mail-IMAPTalk", "perl-Mail-SPF", "perl-MailTools", + "perl-Match-Simple", "perl-Math-Int64", + "perl-Math-Random-ISAAC", "perl-MIME-Charset", "perl-MIME-Lite", "perl-MIME-Types", "perl-Mixin-Linewise", "perl-MLDBM", + "perl-Mock-Config", "perl-Module-Build-Tiny", + "perl-Module-CPANfile", + "perl-Module-Implementation", "perl-Module-Install-AuthorRequires", + "perl-Module-Install-AuthorTests", "perl-Module-Install-AutoLicense", "perl-Module-Install-GithubMeta", "perl-Module-Install-ManifestSkip", "perl-Module-Install-ReadmeFromPod", "perl-Module-Install-ReadmeMarkdownFromPod", + "perl-Module-Install-Repository", "perl-Module-Install-TestBase", "perl-Module-Load-Util", "perl-Module-Manifest", @@ -959,11 +1394,14 @@ "perl-Module-Package", "perl-Module-Package-Au", "perl-Module-Pluggable", + "perl-Module-Runtime", "perl-Module-Signature", "perl-Mojolicious", + "perl-Moo", "perl-Mozilla-CA", "perl-Mozilla-LDAP", "perl-MRO-Compat", + "perl-multidimensional", "perl-namespace-autoclean", "perl-namespace-clean", "perl-Net-CIDR-Lite", @@ -971,6 +1409,7 @@ "perl-Net-DNS", "perl-Net-DNS-Resolver-Mock", "perl-Net-DNS-Resolver-Programmable", + "perl-Net-HTTP", "perl-Net-IMAP-Simple", "perl-Net-IMAP-Simple-SSL", "perl-Net-IP", @@ -981,35 +1420,43 @@ "perl-Net-Telnet", "perl-Newt", "perl-NNTPClient", + "perl-NTLM", "perl-Number-Compare", "perl-Object-Deadly", "perl-Object-HashBase", "perl-Package-Anon", "perl-Package-Constants", "perl-Package-DeprecationManager", + "perl-Package-Generator", "perl-Package-Stash", "perl-Package-Stash-XS", + "perl-PadWalker", "perl-Paper-Specs", "perl-PAR-Dist", "perl-Parallel-Iterator", "perl-Params-Classify", + "perl-Params-Util", "perl-Params-Validate", "perl-Params-ValidationCompiler", + "perl-Parse-PMFile", "perl-Parse-RecDescent", "perl-Parse-Yapp", "perl-Path-Tiny", "perl-Perl-Critic", "perl-Perl-Critic-More", + "perl-Perl-Destruct-Level", "perl-Perl-MinimumVersion", "perl-Perl4-CoreLibs", "perl-PerlIO-gzip", "perl-PerlIO-utf8_strict", "perl-PkgConfig-LibPkgConf", + "perl-Pod-Coverage", "perl-Pod-Coverage-TrustPod", "perl-Pod-Escapes", "perl-Pod-Eventual", "perl-Pod-LaTeX", "perl-Pod-Markdown", + "perl-Pod-Parser", "perl-Pod-Plainer", "perl-Pod-POM", "perl-Pod-Spell", @@ -1027,6 +1474,7 @@ "perl-Ref-Util-XS", "perl-Regexp-Pattern-Perl", "perl-Return-MultiLevel", + "perl-Role-Tiny", "perl-Scope-Guard", "perl-Scope-Upper", "perl-SGMLSpm", @@ -1036,15 +1484,26 @@ "perl-Sort-Versions", "perl-Specio", "perl-Spiffy", + "perl-strictures", "perl-String-CRC32", "perl-String-Format", + "perl-String-ShellQuote", "perl-String-Similarity", + "perl-Sub-Exporter", + "perl-Sub-Exporter-Progressive", + "perl-Sub-Identify", + "perl-Sub-Infix", "perl-Sub-Info", + "perl-Sub-Install", + "perl-Sub-Name", + "perl-Sub-Quote", "perl-Sub-Uplevel", + "perl-SUPER", "perl-Switch", "perl-Syntax-Highlight-Engine-Kate", "perl-Sys-CPU", "perl-Sys-MemInfo", + "perl-Sys-Virt", "perl-Taint-Runtime", "perl-Task-Weaken", "perl-Term-Size-Any", @@ -1056,6 +1515,7 @@ "perl-Test-ClassAPI", "perl-Test-CPAN-Meta", "perl-Test-CPAN-Meta-JSON", + "perl-Test-Deep", "perl-Test-Differences", "perl-Test-DistManifest", "perl-Test-Distribution", @@ -1063,28 +1523,40 @@ "perl-Test-Exception", "perl-Test-Exit", "perl-Test-FailWarnings", + "perl-Test-Fatal", "perl-Test-File", "perl-Test-File-ShareDir", + "perl-Test-Harness", "perl-Test-HasVersion", "perl-Test-InDistDir", "perl-Test-Inter", + "perl-Test-LeakTrace", "perl-Test-LongString", "perl-Test-Manifest", + "perl-Test-Memory-Cycle", "perl-Test-MinimumVersion", "perl-Test-MockObject", "perl-Test-MockRandom", + "perl-Test-Needs", "perl-Test-NoTabs", + "perl-Test-NoWarnings", "perl-Test-Object", + "perl-Test-Output", + "perl-Test-Pod", + "perl-Test-Pod-Coverage", "perl-Test-Portability-Files", + "perl-Test-Requires", "perl-Test-RequiresInternet", "perl-Test-Script", "perl-Test-Simple", "perl-Test-SubCalls", "perl-Test-Synopsis", + "perl-Test-Taint", "perl-Test-TrailingSpace", "perl-Test-utf8", "perl-Test-Vars", "perl-Test-Warn", + "perl-Test-Without-Module", "perl-Test2-Plugin-NoWarnings", "perl-Test2-Suite", "perl-Test2-Tools-Explain", @@ -1097,7 +1569,9 @@ "perl-Text-Unidecode", "perl-Text-WrapI18N", "perl-Tie-IxHash", + "perl-TimeDate", "perl-Tree-DAG_Node", + "perl-Type-Tiny", "perl-Unicode-EastAsianWidth", "perl-Unicode-LineBreak", "perl-Unicode-Map8", @@ -1106,8 +1580,10 @@ "perl-UNIVERSAL-can", "perl-UNIVERSAL-isa", "perl-Unix-Syslog", + "perl-URI", "perl-Variable-Magic", "perl-Version-Requirements", + "perl-WWW-RobotRules", "perl-XML-Catalog", "perl-XML-DOM", "perl-XML-Dumper", @@ -1115,15 +1591,20 @@ "perl-XML-Generator", "perl-XML-Grove", "perl-XML-Handler-YAWriter", + "perl-XML-LibXML", "perl-XML-LibXSLT", + "perl-XML-NamespaceSupport", "perl-XML-Parser-Lite", "perl-XML-RegExp", + "perl-XML-SAX", + "perl-XML-SAX-Base", "perl-XML-SAX-Writer", "perl-XML-Simple", "perl-XML-TokeParser", "perl-XML-TreeBuilder", "perl-XML-Twig", "perl-XML-Writer", + "perl-XML-XPath", "perl-XML-XPathEngine", "perl-XString", "perl-YAML-LibYAML", @@ -1132,60 +1613,100 @@ "perltidy", "pesign", "phodav", + "php", + "php-pear", + "php-pecl-apcu", + "php-pecl-zip", "physfs", + "picosat", "pinfo", "pipewire", + "pixman", "pkcs11-helper", + "pkgconf", + "plexus-cipher", + "plexus-containers", "plexus-pom", + "plexus-sec-dispatcher", "plotutils", "pmdk-convert", + "pmix", "pngcrush", "pngnq", "po4a", "podman", + "poetry", + "policycoreutils", "polkit-pkla-compat", + "polkit-qt-1", "portreserve", + "postfix", "potrace", "powertop", "ppp", "pps-tools", "pptp", + "priv_wrapper", "procmail", "prometheus-node-exporter", "ps_mem", "psacct", + "pssh", "psutils", "ptlib", "publicsuffix-list", + "pugixml", "pulseaudio", "puppet", + "pwgen", "pyatspi", + "pybind11", + "pycairo", + "pyelftools", + "pyflakes", + "pygobject3", "PyGreSQL", "pykickstart", "pylint", "pyparted", + "pyproject-rpm-macros", "pyserial", + "python-absl-py", "python-aiodns", "python-aiohttp", "python-alsa", "python-apscheduler", + "python-archspec", "python-argcomplete", "python-argparse-manpage", "python-astroid", + "python-astunparse", + "python-async-generator", "python-augeas", "python-azure-sdk", + "python-backoff", "python-beautifulsoup4", "python-betamax", + "python-blinker", "python-blivet", + "python-boltons", "python-breathe", + "python-cached_property", "python-cbor2", + "python-charset-normalizer", "python-cheetah", + "python-click", "python-cmd2", "python-colorama", "python-CommonMark", + "python-conda-libmamba-solver", + "python-conda-package-handling", + "python-conda-package-streaming", "python-configshell", + "python-cpuinfo", "python-cups", "python-curio", + "python-cytoolz", "python-d2to1", "python-dbus-client-gen", "python-dbus-python-client-gen", @@ -1193,28 +1714,50 @@ "python-dbusmock", "python-ddt", "python-debtcollector", + "python-decorator", + "python-distlib", "python-dmidecode", "python-dns", "python-dtopt", "python-dulwich", + "python-editables", "python-elementpath", "python-enchant", "python-entrypoints", + "python-ethtool", + "python-evdev", "python-extras", "python-faker", "python-fasteners", + "python-fastjsonschema", + "python-fields", + "python-filelock", "python-fixtures", "python-flake8", "python-flaky", "python-flask", + "python-flit", + "python-flit-core", "python-fluidity-sm", + "python-frozendict", "python-funcsigs", + "python-gast", "python-genshi", + "python-google-auth", + "python-google-auth-oauthlib", + "python-greenlet", "python-gssapi", + "python-h5py", + "python-hatch-fancy-pypi-readme", + "python-hatch-vcs", + "python-hatchling", "python-hs-dbus-signature", + "python-html5lib", "python-httplib2", "python-humanize", "python-hwdata", + "python-importlib-metadata", + "python-iniconfig", "python-inotify", "python-into-dbus-python", "python-IPy", @@ -1223,44 +1766,82 @@ "python-isort", "python-itsdangerous", "python-jsonschema-specifications", + "python-junit_xml", + "python-junitxml", "python-justbases", "python-justbytes", "python-jwcrypto", + "python-jwt", "python-kdcproxy", "python-kerberos", "python-kmod", + "python-kubernetes", + "python-lark", "python-lazy-object-proxy", "python-ldap", + "python-linux-procfs", "python-lit", + "python-looseversion", + "python-markdown", + "python-markdown-it-py", "python-mccabe", + "python-mdurl", "python-memcached", + "python-menuinst", "python-mimeparse", + "python-mock", "python-monotonic", + "python-more-itertools", + "python-mpmath", "python-msal", "python-msrestazure", "python-mutagen", + "python-networkx", + "python-nose2", "python-ntlm-auth", "python-oauth2client", + "python-openpyxl", "python-openstackdocstheme", "python-oslo-i18n", "python-oslo-sphinx", "python-paho-mqtt", "python-paramiko", + "python-pathspec", + "python-pefile", + "python-pexpect", + "python-pkgconfig", + "python-platformdirs", + "python-pluggy", "python-podman-api", + "python-poetry-core", + "python-process-tests", "python-productmd", + "python-prometheus_client", + "python-ptyprocess", + "python-pycosat", "python-pydbus", "python-pymongo", "python-PyMySQL", "python-pyperclip", "python-pyproject-api", + "python-pyproject-metadata", + "python-pyroute2", "python-pyrsistent", - "python-pysocks", + "python-pytest-benchmark", + "python-pytest-cov", + "python-pytest-expect", "python-pytest-flake8", + "python-pytest-flakes", + "python-pytest-forked", + "python-pytest-mock", "python-pytest-relaxed", "python-pytest-runner", "python-pytest-subtests", "python-pytest-timeout", + "python-pytest-xdist", "python-pytoml", + "python-pyudev", + "python-pywbem", "python-qrcode", "python-rdflib", "python-recommonmark", @@ -1269,13 +1850,21 @@ "python-requests-ftp", "python-requests-kerberos", "python-requests-mock", + "python-requests-oauthlib", "python-requests-toolbelt", "python-requests_ntlm", + "python-responses", + "python-retrying", "python-rfc3986", + "python-rich", + "python-rpm-generators", "python-rpmautospec-core", "python-rpmfluff", "python-rtslib", + "python-ruamel-yaml", + "python-ruamel-yaml-clib", "python-s3transfer", + "python-schedutils", "python-semantic_version", "python-shortuuid", "python-should_dsl", @@ -1283,23 +1872,43 @@ "python-slip", "python-smartypants", "python-sniffio", + "python-sortedcontainers", "python-soupsieve", + "python-sphinx", "python-sphinx-epytext", + "python-sphinx-theme-py3doc-enhanced", + "python-sphinx_rtd_theme", "python-sphinxcontrib-apidoc", + "python-sphinxcontrib-applehelp", + "python-sphinxcontrib-devhelp", + "python-sphinxcontrib-htmlhelp", "python-sphinxcontrib-httpdomain", "python-sphinxcontrib-jquery", + "python-sphinxcontrib-jsmath", + "python-sphinxcontrib-qthelp", + "python-sphinxcontrib-serializinghtml", "python-sphinxygen", + "python-sqlalchemy", "python-suds", "python-systemd", "python-tempita", + "python-templated-dictionary", + "python-termcolor", "python-testpath", "python-testresources", "python-testscenarios", "python-testtools", + "python-tidy", "python-toml", + "python-tomli", + "python-toolz", "python-tornado", "python-tox", + "python-tox-current-env", + "python-tqdm", "python-trio", + "python-trove-classifiers", + "python-typing-extensions", "python-typogrify", "python-tzlocal", "python-uamqp", @@ -1310,18 +1919,28 @@ "python-urwid", "python-uswid", "python-varlink", + "python-versioneer", + "python-virt-firmware", "python-voluptuous", "python-waitress", "python-webencodings", "python-webtest", + "python-wheel", "python-whoosh", "python-winrm", + "python-wrapt", + "python-xlrd", + "python-xlsxwriter", "python-xmlschema", "python-xmltodict", "python-yubico", + "python-zipp", "python-zmq", + "python-zstandard", + "python-zstd", "python3-mallard-ducktype", "python3-pycares", + "python3-pytest-asyncio", "python3-typed_ast", "pyusb", "pywbem", @@ -1331,10 +1950,18 @@ "qpdf", "qperf", "qr-code-generator", + "qt-rpm-macros", "qt5-qtconnectivity", "qt5-qtsensors", "qt5-qtserialport", + "qtbase", + "qtdeclarative", + "qtsvg", + "qttools", "quagga", + "quota", + "radvd", + "ragel", "raptor2", "rarian", "rasdaemon", @@ -1342,28 +1969,42 @@ "rcs", "rdist", "rdma-core", + "re2", "re2c", "realmd", "rear", "recode", + "reproc", "resource-agents", + "rest", "rhash", + "rlwrap", "rp-pppoe", + "rpm-mpi-hooks", "rpmdevtools", "rpmlint", "rr", "rtkit", + "rtl-sdr", "ruby-augeas", "rubygem-bson", "rubygem-coderay", "rubygem-diff-lcs", "rubygem-flexmock", + "rubygem-hpricot", + "rubygem-introspection", "rubygem-liquid", "rubygem-maruku", + "rubygem-metaclass", "rubygem-mongo", + "rubygem-mustache", "rubygem-mysql2", "rubygem-pkg-config", + "rubygem-rake", + "rubygem-rake-compiler", + "rubygem-ronn", "rubygem-rouge", + "rubygem-rspec", "rubygem-rspec-expectations", "rubygem-rspec-mocks", "rubygem-rspec-support", @@ -1374,6 +2015,7 @@ "rust-cbindgen", "s-nail", "samba", + "sanlock", "sassist", "satyr", "sbc", @@ -1396,27 +2038,45 @@ "scl-utils", "scotch", "screen", + "scrub", "sdl12-compat", "SDL2", "SDL_sound", "sdparm", + "seabios", + "secilc", "selinux-policy", "serd", + "setools", "setserial", "setuptool", + "sgabios", + "sgml-common", "sgpio", + "shared-mime-info", + "sharutils", + "shim-unsigned-aarch64", + "shim-unsigned-x64", + "simdjson", "sip", + "sisu", "skkdic", + "sleuthkit", "slirp4netns", + "smartmontools", "smc-tools", + "socket_wrapper", + "softhsm", "sombok", "sord", + "sos", "sound-theme-freedesktop", "soundtouch", "sox", "soxr", "sparsehash", "spausedd", + "spdlog", "speex", "speexdsp", "spice", @@ -1427,15 +2087,25 @@ "spirv-llvm15-translator", "spirv-tools", "splix", + "squashfs-tools", + "squid", "sratom", + "sscg", "star", "startup-notification", "stress-ng", + "strongswan", + "stunnel", "subscription-manager", + "subunit", "suitesparse", "SuperLU", "supermin", "switcheroo-control", + "swtpm", + "symlinks", + "sympy", + "sysfsutils", "systemd", "systemd-bootchart", "t1lib", @@ -1449,16 +2119,25 @@ "teckit", "telnet", "thrift", + "tidy", + "time", + "tini", + "tinycdb", "tix", "tk", "tlog", "tmpwatch", "tn5250", "tofrodos", + "tokyocabinet", + "trace-cmd", "tss2", + "ttembed", "ttmkfdir", + "tuna", "twolame", "uchardet", + "uclibc-ng", "ucpp", "ucs-miscfixed-fonts", "ucx", @@ -1466,6 +2145,7 @@ "udica", "udisks2", "uglify-js", + "uid_wrapper", "umockdev", "unicode-emoji", "unicode-ucd", @@ -1479,57 +2159,99 @@ "usbguard", "usbip", "usbmuxd", + "usbredir", "usermode", "ustr", "uthash", + "uuid", "uw-imap", "v4l-utils", "vc-intrinsics", "vhostmd", "vino", + "virglrenderer", "virt-p2v", "virt-top", + "virt-what", "virt-who", "vmem", "volume_key", "vorbis-tools", "vte291", + "vulkan-headers", + "vulkan-loader", "watchdog", "wavpack", "wayland", "wayland-protocols", "web-assets", "webrtc-audio-processing", + "websocketpp", + "wget", "whois", + "wireguard-tools", + "wireless-regdb", "wireshark", "woff2", "wordnet", + "words", "wpebackend-fdo", "wsmancli", "wvdial", "x3270", "xapian-core", "Xaw3d", + "xcb-proto", + "xcb-util", + "xcb-util-image", + "xcb-util-keysyms", + "xcb-util-renderutil", "xcb-util-wm", "xdelta", "xdg-dbus-proxy", "xdg-utils", "xdp-tools", + "xerces-c", "xfconf", "xfsdump", "xhtml1-dtds", + "xkeyboard-config", + "xmlstarlet", + "xmltoman", + "xmvn", + "xorg-x11-apps", "xorg-x11-drv-libinput", + "xorg-x11-font-utils", "xorg-x11-fonts", + "xorg-x11-proto-devel", "xorg-x11-server", + "xorg-x11-server-utils", + "xorg-x11-server-Xwayland", + "xorg-x11-util-macros", "xorg-x11-utils", + "xorg-x11-xauth", + "xorg-x11-xbitmaps", + "xorg-x11-xinit", + "xorg-x11-xkb-utils", + "xorg-x11-xtrans-devel", "xpp3", "xrestop", + "xterm", + "xxhash", + "yajl", + "yaml-cpp", + "yasm", "yelp-tools", "yelp-xsl", "ykclient", + "yp-tools", + "ypbind", "ypserv", "z3", "zenity", + "zerofree", + "zfs-fuse", + "zipper", "zix", "zopfli", "zziplib" @@ -1538,12 +2260,15 @@ "Fedora (Copyright Remi Collet)": { "license": "[CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode)", "specs": [ + "libmemcached-awesome", "librabbitmq" ] }, "Fedora (ISC)": { "license": "[ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE)", - "specs": [] + "specs": [ + "python-resolvelib" + ] }, "Intel": { "license": "[MIT License](/LICENSES-AND-NOTICES/LICENSE.md)", @@ -1579,7 +2304,9 @@ }, "Magnus Edenhill Open Source": { "license": "[Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING)", - "specs": [] + "specs": [ + "librdkafka" + ] }, "Microsoft": { "license": "[Microsoft MIT License](https://github.com/microsoft/azurelinux/blob/3.0/LICENSES-AND-NOTICES/LICENSE.md)", @@ -1589,26 +2316,59 @@ "asc", "azcopy", "azl-otel-collector", + "azure-iot-sdk-c", + "azure-nvme-utils", + "azure-storage-cpp", + "azurelinux-image-tools", "azurelinux-sysinfo", + "bazel", + "bmon", + "bpftrace", + "ccache", "cert-manager", "cf-cli", + "check-restart", + "clamav", + "cloud-hypervisor", "cmake-fedora", "containerd2", + "dasel", + "debugedit", + "dejavu-fonts", "distroless-packages", + "docker-buildx", "docker-cli", "docker-compose", + "doxygen", + "dtc", "edk2-hvloader-signed", "elfutils", + "elixir", + "espeak-ng", + "espeakup", + "expat", + "flannel", "fluent-bit", + "freefont", + "gflags", "gh", "go-md2man", "groff", + "grpc", "grub2-efi-binary-signed", + "GSL", "gstreamer1", "gstreamer1-plugins-base", + "gtk-update-icon-cache", "helm", + "intel-pf-bb-config", + "ivykis", + "jsonbuilder", "jx", + "kata-containers-cc", + "kata-packages-uvm", "keda", + "keras", "kernel-64k-signed", "kernel-hwe-signed", "kernel-mshv-signed", @@ -1616,34 +2376,174 @@ "kernel-signed", "kernel-uki", "kernel-uki-signed", + "kpatch", "kube-vip-cloud-provider", - "libutempter", + "kubernetes", + "libacvp", + "libconfini", + "libconfuse", + "libgdiplus", + "libmaxminddb", + "libmetalink", + "libsafec", + "libuv", "libvirt", + "libvirt-python", "libvisual", + "libxml++", "linuxptp", + "lld", + "lsb-release", + "ltp", + "lttng-consume", + "mm-common", "moby-containerd-cc", "moby-engine", + "msgpack", + "ncompress", + "networkd-dispatcher", + "nlohmann-json", + "nmap", + "ntopng", + "opentelemetry-cpp", "packer", + "pcaudiolib", + "pcre2", + "perl-Test-Warnings", + "perl-Text-Template", + "pigz", "prebuilt-ca-certificates", "prebuilt-ca-certificates-base", "prometheus-adapter", + "python-cachetools", + "python-cherrypy", + "python-cstruct", + "python-execnet", + "python-google-pasta", + "python-libclang", + "python-libevdev", + "python-logutils", + "python-ml-dtypes", + "python-namex", + "python-nocasedict", + "python-omegaconf", + "python-opt-einsum", + "python-optree", + "python-pecan", + "python-pip", + "python-pyrpm", + "python-remoto", + "python-repoze-lru", + "python-routes", + "python-rsa", + "python-setuptools", + "python-sphinxcontrib-websupport", + "python-tensorboard", + "python-tensorboard-plugin-wit", + "python-yamlloader", + "R", + "rabbitmq-server", + "rocksdb", + "rubygem-addressable", + "rubygem-asciidoctor", + "rubygem-bindata", + "rubygem-concurrent-ruby", + "rubygem-connection_pool", + "rubygem-cool.io", "rubygem-deep_merge", + "rubygem-digest-crc", + "rubygem-elastic-transport", + "rubygem-elasticsearch", + "rubygem-elasticsearch-api", "rubygem-eventmachine", + "rubygem-excon", + "rubygem-faraday", + "rubygem-faraday-em_http", + "rubygem-faraday-em_synchrony", + "rubygem-faraday-excon", + "rubygem-faraday-httpclient", + "rubygem-faraday-multipart", + "rubygem-faraday-net_http", + "rubygem-faraday-net_http_persistent", + "rubygem-faraday-rack", + "rubygem-faraday-retry", + "rubygem-ffi", + "rubygem-fiber-local", + "rubygem-hirb", "rubygem-hocon", + "rubygem-hoe", + "rubygem-http_parser", + "rubygem-httpclient", + "rubygem-io-event", + "rubygem-jmespath", + "rubygem-ltsv", + "rubygem-mini_portile2", + "rubygem-minitest", + "rubygem-mocha", + "rubygem-msgpack", + "rubygem-multi_json", + "rubygem-multipart-post", + "rubygem-net-http-persistent", + "rubygem-nio4r", + "rubygem-nokogiri", + "rubygem-oj", + "rubygem-parallel", + "rubygem-power_assert", + "rubygem-prometheus-client", + "rubygem-protocol-hpack", + "rubygem-protocol-http", + "rubygem-protocol-http1", + "rubygem-protocol-http2", + "rubygem-public_suffix", "rubygem-puppet-resource_api", + "rubygem-rdiscount", + "rubygem-rdkafka", + "rubygem-rexml", + "rubygem-ruby-kafka", + "rubygem-ruby-progressbar", + "rubygem-rubyzip", + "rubygem-semantic_puppet", + "rubygem-serverengine", + "rubygem-sigdump", + "rubygem-strptime", + "rubygem-systemd-journal", + "rubygem-test-unit", "rubygem-thor", + "rubygem-timers", + "rubygem-tzinfo", + "rubygem-tzinfo-data", + "rubygem-webhdfs", + "rubygem-webrick", + "rubygem-yajl-ruby", + "rubygem-zip-zip", "runc", + "sdbus-cpp", + "sgx-backwards-compatibility", + "shim", "skopeo", + "span-lite", "sriov-network-device-plugin", + "SymCrypt", + "SymCrypt-OpenSSL", "systemd-boot-signed", "tardev-snapshotter", + "tensorflow", + "tinyxml2", + "toml11", + "tracelogging", "umoci", - "xterm" + "usrsctp", + "vala", + "valkey", + "vnstat", + "zstd" ] }, "Netplan source": { "license": "[GPLv3](https://github.com/canonical/netplan/blob/main/COPYING)", - "specs": [] + "specs": [ + "netplan" + ] }, "Numad source": { "license": "[LGPLv2 License](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)", @@ -1655,10 +2555,21 @@ "license": "[ASL 2.0 License and spec specific licenses](http://www.apache.org/licenses/LICENSE-2.0)", "specs": [ "fwctl-signed", + "ibarr", + "ibsim", "iser-signed", "isert-signed", "knem-modules-signed", + "libnvidia-container", + "libvma", "mlnx-nfsrdma-signed", + "multiperf", + "nvidia-container-toolkit", + "ofed-docs", + "ofed-scripts", + "perftest", + "rshim", + "sockperf", "xpmem-modules-signed" ] }, @@ -1668,17 +2579,25 @@ }, "OpenEuler": { "license": "[BSD-3 License](https://github.com/pytorch/pytorch/blob/master/LICENSE)", - "specs": [] + "specs": [ + "pytorch" + ] }, "OpenMamba": { "license": "[Openmamba GPLv2 License](https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt)", - "specs": [] + "specs": [ + "bash-completion" + ] }, "OpenSUSE": { "license": "Following [openSUSE guidelines](https://en.opensuse.org/openSUSE:Specfile_guidelines#Specfile_Licensing)", "specs": [ + "ant", + "ant-junit", + "antlr", "aopalliance", "apache-commons-beanutils", + "apache-commons-cli", "apache-commons-codec", "apache-commons-collections", "apache-commons-collections4", @@ -1690,6 +2609,8 @@ "apache-commons-io", "apache-commons-jexl", "apache-commons-lang", + "apache-commons-lang3", + "apache-commons-logging", "apache-commons-net", "apache-commons-pool", "apache-commons-pool2", @@ -1697,53 +2618,79 @@ "apache-commons-vfs2", "apache-parent", "args4j", + "atinject", "base64coder", "bcel", "bea-stax", "beust-jcommander", "bsf", + "byaccj", + "cal10n", "cdparanoia", "cglib", "cni", "containerized-data-importer", + "cpulimit", "cri-o", "ecj", + "fillup", + "flux", + "gd", "geronimo-specs", "glassfish-annotation-api", "gnu-getopt", "gnu-regexp", "golang-packaging", + "guava", + "hamcrest", "hawtjni-runtime", "httpcomponents-core", "influx-cli", + "influxdb", "jakarta-taglibs-standard", "jansi", "jarjar", + "java-cup", + "java-cup-bootstrap", "javacc", "javacc-bootstrap", + "javassist", "jboss-interceptors-1.2-api", "jdepend", + "jflex", + "jflex-bootstrap", "jlex", "jline", + "jna", "jsch", "jsoup", + "jsr-305", "jtidy", + "junit", "junitperf", "jzlib", + "kubevirt", "kured", + "libcontainers-common", "libtheora", "libva", "libvdpau", + "lynx", "multus", "objectweb-anttask", + "objectweb-asm", "objenesis", "oro", "osgi-annotation", "osgi-compendium", "osgi-core", + "plexus-classworlds", + "plexus-interpolation", + "plexus-utils", "proj", "psl-make-dafsa", "publicsuffix", + "qdox", "regexp", "relaxngDatatype", "rhino", @@ -1751,10 +2698,15 @@ "servletapi4", "servletapi5", "shapelib", + "slf4j", "trilead-ssh2", + "virtiofsd", "xalan-j2", "xbean", + "xcursor-themes", "xerces-j2", + "xml-commons-apis", + "xml-commons-resolver", "xmldb-api", "xmlrpc-c", "xmlunit", @@ -1765,59 +2717,499 @@ "Photon": { "license": "[Photon License](LICENSE-PHOTON.md) and [Photon Notice](NOTICE.APACHE2).
Also see [LICENSE-EXCEPTIONS.PHOTON](LICENSE-EXCEPTIONS.PHOTON).", "specs": [ + "acl", + "alsa-utils", + "ansible", + "apr", + "apr-util", + "asciidoc", + "atftp", + "audit", + "autoconf", + "autoconf-archive", + "autofs", + "autogen", + "automake", + "babel", + "bash", + "bc", + "bcc", + "bind", + "binutils", + "bison", + "blktrace", + "boost", + "btrfs-progs", + "bubblewrap", "build-essential", + "bzip2", + "c-ares", + "cairo", "cassandra", "cassandra-driver", + "cdrkit", + "check", + "chkconfig", + "chrpath", + "cifs-utils", + "clang", "cloud-init", + "cloud-utils-growpart", + "cmake", "cni-plugins", "core-packages", + "coreutils", + "cpio", + "cppunit", "cqlsh", + "cracklib", + "crash", + "crash-gcore-command", + "createrepo_c", + "cri-tools", "cronie", + "curl", + "cyrus-sasl", + "cyrus-sasl-bootstrap", + "dbus", + "dbus-glib", + "dejagnu", + "device-mapper-multipath", + "dialog", + "diffutils", + "dkms", + "dmidecode", + "dnsmasq", + "docbook-dtd-xml", + "docbook-style-xsl", "dosfstools", "dracut", + "dstat", + "e2fsprogs", + "ed", "efibootmgr", + "efivar", + "emacs", + "erlang", "etcd", "ethtool", + "expect", + "fcgi", + "file", + "filesystem", + "findutils", + "flex", + "fontconfig", + "fping", + "freetype", + "fuse", + "gawk", + "gc", "gcc", + "gdb", + "gdbm", + "gettext", + "git", "git-lfs", + "glib", + "glib-networking", "glibc", + "glibmm", + "gmp", + "gnome-common", + "gnupg2", + "gnuplot", + "gnutls", "gobject-introspection", "golang", "golang-1.22", "golang-1.23", "golang-1.24", + "golang-1.25", + "gperf", + "gperftools", + "gpgme", + "gptfdisk", + "grep", "grub2", + "gtest", + "gtk-doc", + "guile", + "gzip", + "haproxy", + "harfbuzz", + "haveged", + "hdparm", + "http-parser", + "httpd", + "i2c-tools", + "iana-etc", + "icu", + "initramfs", + "initscripts", + "inotify-tools", + "intltool", + "iotop", + "iperf3", "iproute", + "ipset", + "iptables", + "iputils", + "ipvsadm", + "ipxe", + "irqbalance", + "itstool", + "jansson", + "jq", + "json-c", + "json-glib", + "kbd", + "keepalived", "kernel", + "kernel-64k", "kernel-headers", "kernel-ipe", "kernel-lpg-innovate", + "kernel-uvm", + "keyutils", + "kmod", + "krb5", + "less", + "libaio", + "libarchive", + "libassuan", + "libatomic_ops", + "libcap", + "libcap-ng", + "libconfig", + "libdb", + "libdnet", + "libedit", + "libestr", + "libevent", + "libfastjson", + "libffi", + "libgcrypt", + "libgpg-error", + "libgssglue", + "libgudev", + "libjpeg-turbo", + "libksba", + "liblogging", + "libmbim", + "libmnl", + "libmodulemd", + "libmpc", + "libmspack", + "libndp", + "libnetfilter_conntrack", + "libnetfilter_cthelper", + "libnetfilter_cttimeout", + "libnetfilter_queue", + "libnfnetlink", + "libnftnl", + "libnl3", + "libnsl2", + "libpcap", + "libpipeline", + "libpng", + "libpsl", + "libqmi", + "librelp", + "librepo", + "librsync", + "libseccomp", + "libselinux", + "libsepol", + "libserf", + "libsigc++30", + "libsolv", + "libsoup", + "libssh2", + "libtalloc", + "libtar", + "libtasn1", + "libtiff", + "libtirpc", + "libtool", + "libunistring", + "libunwind", + "libusb", + "libwebp", + "libxml2", + "libxslt", + "libyaml", "linux-firmware", + "lldb", + "lldpad", + "llvm", + "lm-sensors", + "lmdb", + "log4cpp", + "logrotate", + "lshw", + "lsof", + "lsscsi", + "ltrace", + "lttng-tools", + "lttng-ust", + "lvm2", + "lz4", + "lzo", + "m2crypto", + "m4", + "make", + "man-db", + "man-pages", + "maven", + "mc", + "mercurial", "meson", + "mlocate", + "ModemManager", + "mpfr", + "msr-tools", + "mysql", + "nano", + "nasm", + "ncurses", + "ndctl", + "net-snmp", + "net-tools", + "nettle", + "newt", + "nfs-utils", + "nghttp2", + "nginx", + "ninja-build", + "nodejs", + "npth", + "nspr", + "nss", + "nss-altfiles", + "ntp", + "numactl", + "nvme-cli", + "oniguruma", + "OpenIPMI", + "openldap", + "openscap", "openssh", + "openvswitch", + "ostree", + "pam", + "pango", + "parted", + "patch", + "pciutils", + "perl-Canary-Stability", + "perl-CGI", + "perl-common-sense", + "perl-Crypt-SSLeay", + "perl-DBD-SQLite", + "perl-DBI", + "perl-DBIx-Simple", + "perl-Exporter-Tiny", + "perl-File-HomeDir", + "perl-File-Which", + "perl-IO-Socket-SSL", + "perl-JSON-Any", + "perl-JSON-XS", + "perl-libintl-perl", + "perl-List-MoreUtils", + "perl-Module-Build", + "perl-Module-Install", + "perl-Module-ScanDeps", + "perl-Net-SSLeay", + "perl-NetAddr-IP", + "perl-Object-Accessor", + "perl-Path-Class", + "perl-Try-Tiny", + "perl-Types-Serialiser", + "perl-WWW-Curl", + "perl-XML-Parser", + "perl-YAML", + "perl-YAML-Tiny", + "pgbouncer", + "pinentry", + "polkit", + "popt", + "postgresql", + "procps-ng", + "protobuf", + "protobuf-c", + "psmisc", + "pth", + "pyasn1-modules", + "pyOpenSSL", + "pyparsing", + "pytest", + "python-appdirs", + "python-asn1crypto", + "python-atomicwrites", + "python-attrs", + "python-bcrypt", + "python-certifi", + "python-cffi", + "python-chardet", + "python-configobj", + "python-constantly", + "python-coverage", + "python-cryptography", + "python-daemon", + "python-dateutil", + "python-defusedxml", + "python-distro", + "python-docopt", + "python-docutils", + "python-ecdsa", "python-geomet", + "python-gevent", + "python-hyperlink", + "python-hypothesis", + "python-idna", + "python-imagesize", + "python-incremental", + "python-iniparse", + "python-ipaddr", + "python-jinja2", + "python-jmespath", + "python-jsonpatch", + "python-jsonpointer", + "python-jsonschema", + "python-lockfile", + "python-lxml", + "python-mako", + "python-markupsafe", + "python-mistune", + "python-msgpack", + "python-netaddr", + "python-netifaces", + "python-ntplib", + "python-oauthlib", + "python-packaging", + "python-pam", + "python-pbr", + "python-ply", + "python-prettytable", + "python-psutil", + "python-psycopg2", + "python-py", + "python-pyasn1", + "python-pycodestyle", + "python-pycparser", + "python-pycurl", + "python-pygments", + "python-pynacl", + "python-requests", + "python-setuptools_scm", + "python-simplejson", + "python-six", + "python-snowballstemmer", + "python-sphinx-theme-alabaster", + "python-twisted", + "python-urllib3", + "python-vcversioner", + "python-virtualenv", + "python-wcwidth", + "python-webob", + "python-websocket-client", + "python-werkzeug", + "python-zope-event", + "python-zope-interface", + "python3", + "pytz", + "PyYAML", + "rapidjson", + "readline", + "rng-tools", + "rpcbind", + "rpcsvc-proto", "rpm", "rpm-ostree", + "rrdtool", + "rsync", "rsyslog", + "ruby", + "rust", + "rust-1.75", + "scons", + "sed", + "sg3_utils", "shadow-utils", + "slang", + "snappy", + "socat", + "sqlite", + "sshpass", "strace", + "subversion", + "sudo", + "swig", + "syslinux", + "syslog-ng", + "sysstat", "systemd-bootstrap", + "systemtap", + "tar", + "tboot", + "tcl", + "tcpdump", + "tcsh", "tdnf", "telegraf", - "WALinuxAgent" + "texinfo", + "tmux", + "tpm2-abrmd", + "tpm2-pkcs11", + "tpm2-pytss", + "tpm2-tools", + "tpm2-tss", + "traceroute", + "tree", + "tzdata", + "unbound", + "unixODBC", + "unzip", + "usbutils", + "userspace-rcu", + "utf8proc", + "util-linux", + "valgrind", + "vim", + "vsftpd", + "WALinuxAgent", + "which", + "wpa_supplicant", + "xfsprogs", + "xinetd", + "xmlsec1", + "xmlto", + "xz", + "zchunk", + "zeromq", + "zip", + "zlib", + "zsh" ] }, "RPM software management source": { "license": "[GPLv2+ License](https://github.com/rpm-software-management/dnf5/blob/main/COPYING.md)", - "specs": [] + "specs": [ + "dnf5" + ] }, "Source project": { "license": "Same as the source project.", - "specs": [] + "specs": [ + "python-nocaselist" + ] }, "Sysbench source": { "license": "[GPLv2+ License](https://github.com/akopytov/sysbench/blob/master/COPYING)", - "specs": [] + "specs": [ + "sysbench" + ] } } } diff --git a/SPECS/.gitignore b/SPECS/.gitignore index 8de37795cd..a0d2903a51 100644 --- a/SPECS/.gitignore +++ b/SPECS/.gitignore @@ -23,6 +23,7 @@ antlr apache-commons-cli apache-commons-lang3 apache-commons-logging +application-gateway-kubernetes-ingress apr apr-util archivemount @@ -49,6 +50,7 @@ autofs autogen automake avahi +azcopy azure-iot-sdk-c azure-nvme-utils azure-storage-cpp @@ -67,6 +69,7 @@ blktrace bluez bmake bmon +bolt boost bpftrace brotli @@ -83,6 +86,8 @@ ccache cdrkit ceph cereal +cert-manager +cf-cli check check-restart checkpolicy @@ -98,6 +103,8 @@ cloud-hypervisor cloud-utils-growpart cmake cmocka +cni +cni-plugins collectd colm color-filesystem @@ -106,7 +113,7 @@ compiler-rt conda conmon conntrack-tools -coredns +containerized-data-importer coreutils cpio cpprest @@ -152,6 +159,8 @@ docbook-dtds docbook-style-xsl docbook5-schemas docker-buildx +docker-cli +docker-compose dos2unix doxygen dpdk @@ -163,6 +172,7 @@ dwz e2fsprogs ebtables ed +edk2 efivar egl-wayland eglexternalplatform @@ -174,8 +184,8 @@ erlang erofs-utils espeak-ng espeakup +etcd execstack -expat expect expected extra-cmake-modules @@ -211,6 +221,7 @@ fuse3 gawk gbenchmark gc +gcc gcovr gd gdb @@ -220,10 +231,13 @@ geos gettext gflags gfs2-utils +gh giflib git +git-lfs glib glib-networking +glibc glibmm glslang glusterfs @@ -233,6 +247,9 @@ gnu-efi gnupg2 gnuplot gnutls +go-md2man +gobject-introspection +golang-packaging google-guice google-roboto-slab-fonts gperf @@ -284,6 +301,7 @@ icu im-chooser imsettings infinipath-psm +influx-cli influxdb inih iniparser @@ -325,19 +343,20 @@ jsonbuilder jsr-305 junit jurand +jx kata-containers kata-containers-cc kata-packages-uvm kbd kde-settings keepalived +keda keras kernel-64k kernel-hwe kernel-hwe-headers kernel-srpm-macros kernel-uvm -kexec-tools keyutils kf kf-kconfig @@ -349,8 +368,10 @@ kpatch kpmcore krb5 ksh +kube-vip-cloud-provider kubernetes kubevirt +kured kyua lapack lato-fonts @@ -470,6 +491,7 @@ libnotify libnsl2 libnvidia-container libnvme +libogg libpcap libpciaccess libpipeline @@ -485,6 +507,7 @@ libreswan librsvg2 librsync libsafec +libseccomp libselinux libsemanage libsepol @@ -505,6 +528,7 @@ libtasn1 libtdb libtiff libtirpc +libtheora libtool libtpms libtracecmd @@ -515,12 +539,14 @@ libunwind liburing libusb libuser +libutempter libuv +libvma libvirt-dbus libvirt-glib libvirt-java -libvirt-python libvoikko +libvorbis libwacom libwebp libxcb @@ -535,6 +561,7 @@ libxslt libyaml libyang libzip +lksctp-tools lld lldb lldpad @@ -604,6 +631,7 @@ mtdev mtools mtr multiperf +multus munge mysql nano @@ -630,6 +658,7 @@ nlohmann-json nlopt nmap nodejs +nodejs24 npth nspr nss @@ -696,6 +725,7 @@ ocaml-uutf ofed-docs ofed-scripts oniguruma +opa open-vm-tools opencsd openldap @@ -712,6 +742,7 @@ orangefs ostree p11-kit p7zip +packer pam pam_krb5 pam_wrapper @@ -896,6 +927,9 @@ postfix postgresql priv_wrapper procps-ng +prometheus-adapter +prometheus-node-exporter +prometheus-process-exporter protobuf protobuf-c psmisc @@ -912,6 +946,7 @@ pyflakes pygobject3 pyparsing pyproject-rpm-macros +pyserial pytest python-absl-py python-appdirs @@ -949,6 +984,7 @@ python-decorator python-defusedxml python-distlib python-distro +python-dmidecode python-docopt python-docutils python-ecdsa @@ -1150,6 +1186,7 @@ rng-tools rocksdb rpcbind rpcsvc-proto +rpm rpm-mpi-hooks rrdtool rshim @@ -1234,6 +1271,7 @@ rubygem-webhdfs rubygem-webrick rubygem-yajl-ruby rubygem-zip-zip +runc rust sanlock scons @@ -1247,6 +1285,7 @@ sg3_utils sgabios sgml-common sgx-backwards-compatibility +skopeo shared-mime-info sharutils shim @@ -1269,10 +1308,10 @@ spdlog sqlite squashfs-tools squid +sriov-network-device-plugin sscg sshpass strongswan -stunnel subunit subversion sudo @@ -1293,6 +1332,7 @@ tcpdump tcsh tensorflow texinfo +thrift tidy time tini @@ -1310,6 +1350,7 @@ trace-cmd tracelogging traceroute tree +trident ttembed tuna tuned @@ -1320,6 +1361,7 @@ uid_wrapper unbound unixODBC unzip +usbip usbredir usbutils userspace-rcu @@ -1373,6 +1415,7 @@ xorg-x11-xbitmaps xorg-x11-xinit xorg-x11-xkb-utils xorg-x11-xtrans-devel +xterm xxhash xz yajl diff --git a/SPECS/Cython/Cython.signatures.json b/SPECS/Cython/Cython.signatures.json deleted file mode 100644 index bce6f50490..0000000000 --- a/SPECS/Cython/Cython.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "Cython-3.0.5.tar.gz": "39318348db488a2f24e7c84e08bdc82f2624853c0fea8b475ea0b70b27176492" - } -} diff --git a/SPECS/Cython/Cython.spec b/SPECS/Cython/Cython.spec deleted file mode 100644 index e429855435..0000000000 --- a/SPECS/Cython/Cython.spec +++ /dev/null @@ -1,420 +0,0 @@ -%global _description \ -Cython is an optimising static compiler for both the Python programming language and the extended Cython programming language (based on Pyrex). It makes writing C extensions for Python as easy as Python itself. -Summary: Language for writing Python extension modules -Name: Cython -Version: 3.0.5 -Release: 2%{?dist} -License: Apache-2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -URL: https://www.cython.org -Source0: https://github.com/cython/cython/releases/download/%{version}/%{name}-%{version}.tar.gz -Patch0: fix_testcycache.patch -BuildRequires: gcc -BuildRequires: python3-devel -BuildRequires: python3-setuptools -%if 0%{?with_check} -BuildRequires: python3-pip -%endif - -%description %{_description} - -%package -n python3-%{name} -%{?python_provide:%python_provide python3-%{name}} -Summary: C extensions for Python 3 -Requires: python3 -Provides: %{name} = %{version}-%{release} -Provides: %{name}%{?_isa} = %{version}-%{release} - -%description -n python3-%{name} -%{_description} - -%prep -%autosetup -p1 - -%build -%py3_build - -%install -%py3_install -rm -rf %{buildroot}%{python3_sitelib}/setuptools/tests - -%check -pip3 install -r test-requirements-312.txt -# Skip the file based tests, since they typically take over 5 hours to run. -%python3 runtests.py -vv --no-file - -%files -n python3-%{name} -%license LICENSE.txt COPYING.txt -%doc *.txt Demos docs Tools -%{_bindir}/cython -%{_bindir}/cygdb -%{_bindir}/cythonize -%{python3_sitearch}/%{name}-*.egg-info/ -%{python3_sitearch}/%{name}/ -%{python3_sitearch}/pyximport/ -%{python3_sitearch}/cython.py -%{python3_sitearch}/__pycache__/cython.* - -%changelog -* Thu Mar 21 2024 Andrew Phelps - 3.0.5-2 -- Switch to test-requirements-312.txt -- Skip long-running file based tests -- Add patch to fix TestPyCache test - -* Fri Nov 10 2023 Andrew Phelps - 3.0.5-1 -- Upgrade to version 3.0.5 - -* Mon Feb 13 2023 Olivia Crain - 0.29.33-1 -- Update to latest upstream patch version to fix failing package tests -- Use release tarball instead of git snapshot of release commit -- Use SPDX license expression in license tag - -* Fri Nov 04 2022 Osama Esmail - 0.29.32-1 -- Update version to 0.29.32 - -* Mon Jan 24 2022 Thomas Crain - 0.29.26-1 -- Update version to 0.29.26 -- Add check section - -* Thu Jan 06 2022 Suresh Babu Chalamalasetty - 0.29.24-1 -- Update version to 0.29.24 - -* Fri Dec 03 2021 Thomas Crain - 0.29.13-7 -- Add upstream patch to enable generating code for Python >= 3.8 -- License verified - -* Fri Aug 21 2020 Thomas Crain - 0.29.13-6 -- Initial CBL-Mariner import from Fedora 31 (license: MIT). - -* Thu Oct 03 2019 Miro Hrončok - 0.29.13-5 -- Rebuilt for Python 3.8.0rc1 (#1748018) - -* Thu Aug 15 2019 Miro Hrončok - 0.29.13-4 -- Rebuilt for Python 3.8 - -* Thu Aug 15 2019 Miro Hrončok - 0.29.13-3 -- Bootstrap for Python 3.8 - -* Thu Aug 01 2019 Gwyn Ciesla 0.29.13-2 -- Rebuild with new numpy. - -* Sat Jul 27 11:58:51 CEST 2019 Igor Gnatenko - 0.29.13-1 -- Update to 0.29.13 - -* Wed Jul 24 2019 Fedora Release Engineering - 0.29.12-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Mon Jul 22 2019 Petr Viktorin - 0.29.12-2 -- Remove non-essential Python 2 test dependencies - -* Thu Jul 11 2019 Miro Hrončok - 0.29.12-1 -- Update to 0.29.12 (#1727580) - -* Mon Jul 01 2019 Miro Hrončok - 0.29.11-1 -- Update to 0.29.11 (#1725361) - -* Sun Jun 02 2019 Charalampos Stratakis - 0.29.10-1 -- Update to 0.29.10 (#1716146) - -* Thu May 30 2019 Miro Hrončok - 0.29.9-1 -- Update to 0.29.9 (#1714365) - -* Mon May 13 07:10:35 CEST 2019 Igor Gnatenko - 0.29.7-1 -- Update to 0.29.7 - -* Wed Feb 27 2019 Miro Hrončok - 0.29.6-1 -- Update to 0.29.6 (#1683661) - -* Fri Feb 08 2019 Miro Hrončok - 0.29.5-1 -- Update to 0.29.5 (#1667643) - -* Thu Jan 31 2019 Fedora Release Engineering - 0.29.3-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Sat Jan 19 2019 Miro Hrončok - 0.29.3-1 -- Update to 0.29.3 (#1667643) - -* Tue Jan 08 2019 Alex Cobb - 0.29.1-2 -- Added emacs-cython-mode subpackage - -* Mon Dec 10 2018 Igor Gnatenko - 0.29.1-1 -- Update to 0.29.1 - -* Mon Dec 10 2018 Igor Gnatenko - 0.29-1 -- Update to 0.29 - -* Wed Oct 03 2018 Igor Gnatenko - 0.29~rc2-1 -- Update to 0.29~rc2 - -* Sat Aug 11 2018 Igor Gnatenko - 0.28.5-1 -- Update to 0.28.5 - -* Sun Aug 05 2018 Miro Hrončok - 0.28.4-3 -- Only have one /usr/bin/cython - -* Sun Jul 15 2018 Igor Gnatenko - 0.28.4-1 -- Update to 0.28.4 - -* Thu Jul 12 2018 Fedora Release Engineering - 0.28.1-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Fri Jun 15 2018 Miro Hrončok - 0.28.1-2 -- Rebuilt for Python 3.7 - -* Mon Mar 19 2018 Igor Gnatenko - 0.28.1-1 -- Update to 0.28.1 - -* Wed Feb 07 2018 Fedora Release Engineering - 0.27.3-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Mon Nov 06 2017 Igor Gnatenko - 0.27.3-1 -- Update to 0.27.3 - -* Mon Oct 02 2017 Igor Gnatenko - 0.27.1-1 -- Update to 0.27.1 - -* Wed Aug 02 2017 Fedora Release Engineering - 0.25.2-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Wed Jul 26 2017 Fedora Release Engineering - 0.25.2-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Wed May 03 2017 Igor Gnatenko - 0.25.2-5 -- Fix license - -* Fri Feb 10 2017 Fedora Release Engineering - 0.25.2-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Thu Dec 22 2016 Igor Gnatenko - 0.25.2-3 -- Backport couple of patches - -* Mon Dec 12 2016 Charalampos Stratakis - 0.25.2-2 -- Rebuild for Python 3.6 - -* Sat Dec 10 2016 Igor Gnatenko - 0.25.2-1 -- Update to 0.25.2 - -* Sat Aug 27 2016 Igor Gnatenko - 0.24.1-8 -- Fix provides (RHBZ #1370879) - -* Thu Aug 25 2016 Igor Gnatenko - 0.24.1-7 -- Run test suite - -* Thu Aug 25 2016 Igor Gnatenko - 0.24.1-6 -- Provide old names - -* Thu Aug 25 2016 Igor Gnatenko - 0.24.1-5 -- Use %%python_provide - -* Tue Aug 23 2016 Igor Gnatenko - 0.24.1-4 -- Update to 0.24.1 - -* Tue Jul 19 2016 Fedora Release Engineering - 0.23.4-4 -- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages - -* Wed Feb 03 2016 Fedora Release Engineering - 0.23.4-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Wed Jan 13 2016 Orion Poplawski - 0.23.4-1 -- Update to 0.23.4 -- Ship cythonize3 -- Modernize and cleanup spec -- Run tests, one python3 test fails with 3.5 - -* Tue Oct 13 2015 Robert Kuska - 0.23-2 -- Rebuilt for Python3.5 rebuild - -* Wed Aug 12 2015 Neal Becker - 0.23-2 -- Update to 0.23 - -* Tue Jun 16 2015 Fedora Release Engineering - 0.22-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Fri Feb 13 2015 nbecker - 0.22-1 -- oops, that should be 0.22 not 0.22.1 - -* Fri Feb 13 2015 nbecker - 0.22.1-1 -- Update to 0.22 - -* Sat Nov 22 2014 nbecker - 0.21.1-1 -- Update to 0.21.1 (br #1164297) - -* Mon Sep 15 2014 nbecker - 0.21-5 -- Add /bin/cythonize - -* Mon Sep 15 2014 nbecker - 0.21-1 -- Update to 0.21 - -* Fri Aug 15 2014 Fedora Release Engineering - 0.20.1-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Fri Jun 06 2014 Fedora Release Engineering - 0.20.1-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Wed May 28 2014 Thomas Spura - 0.20.1-3 -- Rebuilt for https://fedoraproject.org/wiki/Changes/Python_3.4 - -* Fri May 9 2014 Orion Poplawski - 0.20.1-2 -- Rebuild for Python 3.4 - -* Fri May 9 2014 Orion Poplawski - 0.20.1-1 -- Update to 0.20.1 - -* Mon Jan 20 2014 nbecker - 0.20-1 -- Update to 0.20 - -* Thu Oct 17 2013 nbecker - 0.19.2-2 -- Fix BR 1019498 - -* Sun Oct 13 2013 nbecker - 0.19-2 -- Update to 0.19.2 - -* Fri Aug 02 2013 Fedora Release Engineering - 0.19-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Fri Apr 19 2013 nbecker - 0.19-1 -- Update to 0.19 - -* Tue Jan 29 2013 Neal Becker - 0.18-1 -- update to 0.18 - -* Sat Dec 15 2012 Neal Becker - 0.17.3-1 -- Update to 0.17.3 - -* Wed Nov 21 2012 Neal Becker - 0.17.2-1 -- update to 0.17.2 - -* Wed Sep 26 2012 Neal Becker - 0.17.1-1 -- Update to 0.17.1 - -* Mon Sep 3 2012 Neal Becker - 0.17-1 -- Update to 0.17 - -* Tue Aug 28 2012 Neal Becker - 0.17-3.b3 -- Turn on check (temporarily) -- Add br numpy from check - -* Tue Aug 28 2012 Neal Becker - 0.17-1.b3 -- Test 0.17b3 - -* Fri Aug 24 2012 David Malcolm - 0.16-3 -- generalize egg-info logic to support RHEL (rhbz#851528) - -* Wed Jul 18 2012 Fedora Release Engineering - 0.16-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Fri Apr 27 2012 Neal Becker - 0.16-1 -- Update to 0.16 - -* Thu Jan 12 2012 Fedora Release Engineering - 0.15.1-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild - -* Tue Sep 20 2011 Neal Becker - 0.15.1-1 -- Update to 0.15.1 - -* Sat Aug 6 2011 Neal Becker - 0.15-1 -- Update to 0.15 - -* Mon Feb 07 2011 Fedora Release Engineering - 0.14.1-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Sat Feb 5 2011 Neal Becker - 0.14.1-1 -- Update to 0.14.1 - -* Wed Dec 15 2010 Neal Becker - 0.14-2 -- Add cygdb - -* Wed Dec 15 2010 Neal Becker - 0.14-1 -- Update to 0.14 - -* Wed Aug 25 2010 Neal Becker - 0.13-1 -- Update to 0.13 - -* Wed Jul 21 2010 David Malcolm - 0.12.1-5 -- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild - -* Fri Feb 5 2010 Neal Becker - 0.12.1-4 -- Disable check for now as it fails on PPC - -* Tue Feb 2 2010 Neal Becker - 0.12.1-2 -- typo -- stupid rpm comments - -* Mon Nov 23 2009 Neal Becker - 0.12-1.rc1 -- Make that 0.12 - -* Mon Nov 23 2009 Neal Becker - 0.12.1-1.rc1 -- Update to 0.12.1 - -* Sun Sep 27 2009 Neal Becker - 0.11.3-1.rc1 -- Update to 0.11.3rc1 -- Update to 0.11.3 - -* Fri Jul 24 2009 Fedora Release Engineering - 0.11.2-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Wed May 20 2009 Neal Becker - 0.11.2-1 -- Update to 0.11.2 - -* Thu Apr 16 2009 Neal Becker - 0.11.1-1 -- Update to 0.11.1 - -* Sat Mar 14 2009 Neal Becker - 0.11-2 -- Missed cython.py* - -* Sat Mar 14 2009 Neal Becker - 0.11-1 -- Update to 0.11 -- Exclude numpy from tests so we don't have to BR it - -* Mon Feb 23 2009 Fedora Release Engineering - 0.10.3-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - -* Wed Dec 17 2008 Neal Becker - 0.10.3-1 -- Update to 0.10.3 - -* Thu Dec 04 2008 Ignacio Vazquez-Abrams - 0.10.2-2 -- Rebuild for Python 2.6 - -* Mon Dec 1 2008 Neal Becker - 0.10.2-1 -- Update to 0.10.2 - -* Sat Nov 29 2008 Ignacio Vazquez-Abrams - 0.10.1-2 -- Rebuild for Python 2.6 - -* Wed Nov 19 2008 Neal Becker - 0.10.1-1 -- Update to 0.10.1 - -* Sun Nov 9 2008 Neal Becker - 0.10-3 -- Fix typo - -* Sun Nov 9 2008 Neal Becker - 0.10-1 -- Update to 0.10 - -* Fri Jun 13 2008 Neal Becker - 0.9.8-2 -- Install into python_sitearch -- Add %%check - -* Fri Jun 13 2008 Neal Becker - 0.9.8-1 -- Update to 0.9.8 - -* Mon Apr 14 2008 José Matos - 0.9.6.13.1-3 -- Remove remaining --record. -- Add more documentation (Doc and Tools). -- Add correct entry for egg-info (F9+). - -* Mon Apr 14 2008 Neal Becker - 0.9.6.13.1-2 -- Change License to Python -- Install About.html -- Fix mixed spaces/tabs -- Don't use --record - -* Tue Apr 8 2008 Neal Becker - 0.9.6.13.1-1 -- Update to 0.9.6.13.1 - -* Mon Apr 7 2008 Neal Becker - 0.9.6.13-1 -- Update to 0.9.6.13 -- Add docs - -* Tue Feb 26 2008 Neal Becker - 0.9.6.12-1 -- Initial version diff --git a/SPECS/Cython/fix_testcycache.patch b/SPECS/Cython/fix_testcycache.patch deleted file mode 100644 index f3dd8bb3ab..0000000000 --- a/SPECS/Cython/fix_testcycache.patch +++ /dev/null @@ -1,23 +0,0 @@ -https://github.com/cython/cython/pull/5945/files - -diff -ruN a/Cython/Build/Tests/TestCyCache.py b/Cython/Build/Tests/TestCyCache.py ---- a/Cython/Build/Tests/TestCyCache.py 2024-03-22 16:33:42.785995661 +0000 -+++ b/Cython/Build/Tests/TestCyCache.py 2024-03-22 16:41:00.218527876 +0000 -@@ -3,6 +3,7 @@ - import gzip - import os - import tempfile -+from contextlib import closing - - import Cython.Build.Dependencies - import Cython.Utils -@@ -70,7 +71,8 @@ - f.write('pass') - self.fresh_cythonize(a_pyx, cache=self.cache_dir) - a_cache = os.path.join(self.cache_dir, os.listdir(self.cache_dir)[0]) -- gzip.GzipFile(a_cache, 'wb').write('fake stuff'.encode('ascii')) -+ with closing(gzip.GzipFile(a_cache, 'wb')) as gzipfile: -+ gzipfile.write('fake stuff'.encode('ascii')) - os.unlink(a_c) - self.fresh_cythonize(a_pyx, cache=self.cache_dir) - with open(a_c) as f: diff --git a/SPECS/alsa-lib/CVE-2026-25068.patch b/SPECS/alsa-lib/CVE-2026-25068.patch new file mode 100644 index 0000000000..2023cf5912 --- /dev/null +++ b/SPECS/alsa-lib/CVE-2026-25068.patch @@ -0,0 +1,36 @@ +From 0bb8a3f223be367ec0db859577d15ad366f0fb48 Mon Sep 17 00:00:00 2001 +From: Jaroslav Kysela +Date: Thu, 29 Jan 2026 16:51:09 +0100 +Subject: [PATCH] topology: decoder - add boundary check for channel mixer + count + +Malicious binary topology file may cause heap corruption. + +CVE: CVE-2026-25068 + +Signed-off-by: Jaroslav Kysela +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/alsa-project/alsa-lib/commit/5f7fe33002d2d98d84f72e381ec2cccc0d5d3d40.patch +--- + src/topology/ctl.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/topology/ctl.c b/src/topology/ctl.c +index dd05424..311dd05 100644 +--- a/src/topology/ctl.c ++++ b/src/topology/ctl.c +@@ -1246,6 +1246,11 @@ int tplg_decode_control_mixer1(snd_tplg_t *tplg, + if (mc->num_channels > 0) { + map = tplg_calloc(heap, sizeof(*map)); + map->num_channels = mc->num_channels; ++ if (map->num_channels > SND_TPLG_MAX_CHAN || ++ map->num_channels > SND_SOC_TPLG_MAX_CHAN) { ++ SNDERR("mixer: unexpected channel count %d", map->num_channels); ++ return -EINVAL; ++ } + for (i = 0; i < map->num_channels; i++) { + map->channel[i].reg = mc->channel[i].reg; + map->channel[i].shift = mc->channel[i].shift; +-- +2.45.4 + diff --git a/SPECS/alsa-lib/alsa-lib.spec b/SPECS/alsa-lib/alsa-lib.spec index 133289292b..ca7f6ffd7f 100644 --- a/SPECS/alsa-lib/alsa-lib.spec +++ b/SPECS/alsa-lib/alsa-lib.spec @@ -3,7 +3,7 @@ Summary: ALSA library Name: alsa-lib Version: 1.2.9 -Release: 2%{?dist} +Release: 3%{?dist} License: LGPLv2+ Distribution: Edge Microvisor Toolkit Vendor: Intel Corporation @@ -11,6 +11,7 @@ Group: Applications/Internet URL: https://alsa-project.org Source0: https://www.alsa-project.org/files/pub/lib/%{name}-%{version}.tar.bz2 Source1: https://www.alsa-project.org/files/pub/lib/alsa-topology-conf-%{version_alsa_tplg}.tar.bz2 +Patch0: CVE-2026-25068.patch BuildRequires: python3-devel BuildRequires: python3-libs @@ -37,7 +38,7 @@ The Advanced Linux Sound Architecture (ALSA) topology configuration contains alsa-lib configuration of SoC topology (widgets, mixers, pipelines). %prep -%setup -q +%autosetup -p1 %build %configure @@ -68,6 +69,10 @@ tar xvjf %{SOURCE1} -C %{buildroot}/%{_datadir}/alsa --strip-components=1 --wild %{_datadir}/alsa/topology/* %changelog +* Mon Mar 16 2026 Lee Chee Yang - 1.2.9-3 +- merge from Azure Linux 3.0.20260304-3.0 +- Patch for CVE-2026-25068 + * Tue Aug 26 2025 Basavaraj unniche - 1.2.9-2 - Generate alsa-topology, which is needed for alsa-sof-firmware - Initial Edge Microvisor Toolkit import from Azure Linux (license: MIT). License verified. diff --git a/SPECS/application-gateway-kubernetes-ingress/CVE-2025-30204.patch b/SPECS/application-gateway-kubernetes-ingress/CVE-2025-30204.patch deleted file mode 100644 index 6eb7de916b..0000000000 --- a/SPECS/application-gateway-kubernetes-ingress/CVE-2025-30204.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 84c7f3d0b9dccb4a20d0ad4de10896d40344ba26 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Fri, 28 Mar 2025 20:43:26 +0000 -Subject: [PATCH] CVE-2025-30204 -Upstream Patch Reference : -v4 : https://github.com/golang-jwt/jwt/commit/2f0e9add62078527821828c76865661aa7718a84 -v5 : https://github.com/golang-jwt/jwt/commit/0951d184286dece21f73c85673fd308786ffe9c3 ---- - github.com/golang-jwt/jwt/v4/parser.go | 36 +++++++++++++++++++++++--- - github.com/golang-jwt/jwt/v5/parser.go | 36 +++++++++++++++++++++++--- - 2 files changed, 66 insertions(+), 6 deletions(-) - -diff --git a/vendor/github.com/golang-jwt/jwt/v4/parser.go b/vendor/github.com/golang-jwt/jwt/v4/parser.go -index c0a6f69..8e7e67c 100644 ---- a/vendor/github.com/golang-jwt/jwt/v4/parser.go -+++ b/vendor/github.com/golang-jwt/jwt/v4/parser.go -@@ -7,6 +7,8 @@ import ( - "strings" - ) - -+const tokenDelimiter = "." -+ - type Parser struct { - // If populated, only these methods will be considered valid. - // -@@ -123,9 +125,10 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - // It's only ever useful in cases where you know the signature is valid (because it has - // been checked previously in the stack) and you want to extract values from it. - func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { -- parts = strings.Split(tokenString, ".") -- if len(parts) != 3 { -- return nil, parts, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) -+ var ok bool -+ parts, ok = splitToken(tokenString) -+ if !ok { -+ return nil, nil, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) - } - - token = &Token{Raw: tokenString} -@@ -175,3 +178,30 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke - - return token, parts, nil - } -+ -+// splitToken splits a token string into three parts: header, claims, and signature. It will only -+// return true if the token contains exactly two delimiters and three parts. In all other cases, it -+// will return nil parts and false. -+func splitToken(token string) ([]string, bool) { -+ parts := make([]string, 3) -+ header, remain, ok := strings.Cut(token, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[0] = header -+ claims, remain, ok := strings.Cut(remain, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[1] = claims -+ // One more cut to ensure the signature is the last part of the token and there are no more -+ // delimiters. This avoids an issue where malicious input could contain additional delimiters -+ // causing unecessary overhead parsing tokens. -+ signature, _, unexpected := strings.Cut(remain, tokenDelimiter) -+ if unexpected { -+ return nil, false -+ } -+ parts[2] = signature -+ -+ return parts, true -+} -diff --git a/vendor/github.com/golang-jwt/jwt/v5/parser.go b/vendor/github.com/golang-jwt/jwt/v5/parser.go -index ecf99af..054c7eb 100644 ---- a/vendor/github.com/golang-jwt/jwt/v5/parser.go -+++ b/vendor/github.com/golang-jwt/jwt/v5/parser.go -@@ -8,6 +8,8 @@ import ( - "strings" - ) - -+const tokenDelimiter = "." -+ - type Parser struct { - // If populated, only these methods will be considered valid. - validMethods []string -@@ -136,9 +138,10 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - // It's only ever useful in cases where you know the signature is valid (since it has already - // been or will be checked elsewhere in the stack) and you want to extract values from it. - func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { -- parts = strings.Split(tokenString, ".") -- if len(parts) != 3 { -- return nil, parts, newError("token contains an invalid number of segments", ErrTokenMalformed) -+ var ok bool -+ parts, ok = splitToken(tokenString) -+ if !ok { -+ return nil, nil, newError("token contains an invalid number of segments", ErrTokenMalformed) - } - - token = &Token{Raw: tokenString} -@@ -196,6 +199,33 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke - return token, parts, nil - } - -+// splitToken splits a token string into three parts: header, claims, and signature. It will only -+// return true if the token contains exactly two delimiters and three parts. In all other cases, it -+// will return nil parts and false. -+func splitToken(token string) ([]string, bool) { -+ parts := make([]string, 3) -+ header, remain, ok := strings.Cut(token, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[0] = header -+ claims, remain, ok := strings.Cut(remain, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[1] = claims -+ // One more cut to ensure the signature is the last part of the token and there are no more -+ // delimiters. This avoids an issue where malicious input could contain additional delimiters -+ // causing unecessary overhead parsing tokens. -+ signature, _, unexpected := strings.Cut(remain, tokenDelimiter) -+ if unexpected { -+ return nil, false -+ } -+ parts[2] = signature -+ -+ return parts, true -+} -+ - // DecodeSegment decodes a JWT specific base64url encoding. This function will - // take into account whether the [Parser] is configured with additional options, - // such as [WithStrictDecoding] or [WithPaddingAllowed]. --- -2.45.2 - diff --git a/SPECS/application-gateway-kubernetes-ingress/application-gateway-kubernetes-ingress.signatures.json b/SPECS/application-gateway-kubernetes-ingress/application-gateway-kubernetes-ingress.signatures.json deleted file mode 100644 index 0bd7b0b16e..0000000000 --- a/SPECS/application-gateway-kubernetes-ingress/application-gateway-kubernetes-ingress.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "application-gateway-kubernetes-ingress-1.7.7-govendor-v1.tar.gz": "75b49d0831e436fdef44c1d69fccd495441ef37e20cac949a31bc4fedea60537", - "application-gateway-kubernetes-ingress-1.7.7.tar.gz": "a5b81630e0be41373d11f53813461dad2f825d1b5a250bb243011a783ba8d4f9" - } -} diff --git a/SPECS/application-gateway-kubernetes-ingress/application-gateway-kubernetes-ingress.spec b/SPECS/application-gateway-kubernetes-ingress/application-gateway-kubernetes-ingress.spec deleted file mode 100644 index b905064b28..0000000000 --- a/SPECS/application-gateway-kubernetes-ingress/application-gateway-kubernetes-ingress.spec +++ /dev/null @@ -1,117 +0,0 @@ -%global debug_package %{nil} -Summary: Application Gateway Ingress Controller -Name: application-gateway-kubernetes-ingress -Version: 1.7.7 -Release: 3%{?dist} -License: MIT -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Applications/Networking -URL: https://github.com/Azure/application-gateway-kubernetes-ingress -Source0: https://github.com/Azure/application-gateway-kubernetes-ingress/archive/refs/tags/%{version}.tar.gz#/%{name}-%{version}.tar.gz -# Leverage the `generate_source_tarball.sh` to create the vendor sources -# NOTE: govendor-v1 format is for inplace CVE updates so that we do not have to overwrite in the blob-store. -# After fixing any possible CVE for the vendored source, we must bump v1 -> v2 -Source1: %{name}-%{version}-govendor-v1.tar.gz -Patch0: CVE-2025-30204.patch - -BuildRequires: golang >= 1.23 - -%description -This is an ingress controller that can be run on Azure Kubernetes Service (AKS) to allow an Azure Application Gateway -to act as the ingress for an AKS cluster. - -%prep -%autosetup -N - -rm -rf vendor -tar -xf %{SOURCE1} --no-same-owner -%autopatch -p1 - -%build -export VERSION=%{version} -export VERSION_PATH=github.com/Azure/application-gateway-kubernetes-ingress/pkg/version - -go build -ldflags "-s -X $VERSION_PATH.Version=$VERSION" -mod=vendor -v -o appgw-ingress ./cmd/appgw-ingress - -%install -mkdir -p %{buildroot}%{_bindir} -cp appgw-ingress %{buildroot}%{_bindir}/ - - -%files -%defattr(-,root,root) -%license LICENSE -%{_bindir}/appgw-ingress - -%changelog -* Fri Apr 28 2025 Ranjan Dutta - 1.7.7-3 -- merge from Azure Linux 3.0.20250423. -- Patch CVE-2025-30204 - -* Fri Mar 21 2025 Anuj Mittal - 1.7.7-2 -- Bump release to rebuild - -* Tue Feb 04 2025 Gary Swalling - 1.7.7-1 -- Upgrade to v1.7.7 with golang.org/x/net v0.33.0 for CVE-2023-39325, CVE-2023-44487, -- CVE-2023-45288, CVE-2024-51744, CVE-2024-35255, CVE-2023-3978 -- Remove patches which are no longer needed - -* Tue Dec 31 2024 Rohit Rawat - 1.7.2-3 -- Add patch for CVE-2024-45338 - -* Thu Jul 11 2024 Thien Trung Vuong - 1.7.2-2 -- Add patch for CVE-2022-21698, CVE-2022-41273 -- Move vendored tarball extraction into %prep and %changed from %autosetup to %setup - -* Fri Oct 27 2023 CBL-Mariner Servicing Account - 1.7.2-1 -- Auto-upgrade to 1.7.2 - Azure Linux 3.0 - package upgrades - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 1.4.0-16 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 1.4.0-15 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.4.0-14 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 1.4.0-13 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 1.4.0-12 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.4.0-11 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 1.4.0-10 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 1.4.0-9 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 1.4.0-8 -- Bump release to rebuild with go 1.19.5 - -* Tue Jan 24 2023 Adit Jha - 1.4.0-7 -- Bump release to rebuild vendor repoistory which contain patch fix for CVE-2021-4235, CVE-2022-3064 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 1.4.0-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 1.4.0-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 1.4.0-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 1.4.0-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 1.4.0-2 -- Bump release to rebuild with golang 1.18.3 - -* Mon Jul 12 2021 Henry Li - 1.4.0-1 -- Original version for CBL-Mariner. -- License Verified. diff --git a/SPECS/application-gateway-kubernetes-ingress/generate_source_tarball.sh b/SPECS/application-gateway-kubernetes-ingress/generate_source_tarball.sh deleted file mode 100755 index 6609b85e3d..0000000000 --- a/SPECS/application-gateway-kubernetes-ingress/generate_source_tarball.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -# Quit on failure -set -e - -PKG_VERSION="" -SRC_TARBALL="" -VENDOR_VERSION="1" -OUT_FOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# parameters: -# -# --srcTarball : src tarball file -# this file contains the 'initial' source code of the component -# and should be replaced with the new/modified src code -# --outFolder : folder where to copy the new tarball(s) -# --pkgVersion : package version -# --vendorVersion : vendor version -# -PARAMS="" -while (( "$#" )); do - case "$1" in - --srcTarball) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - SRC_TARBALL=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --outFolder) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - OUT_FOLDER=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --pkgVersion) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - PKG_VERSION=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --vendorVersion) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - VENDOR_VERSION=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - -*|--*=) # unsupported flags - echo "Error: Unsupported flag $1" >&2 - exit 1 - ;; - *) # preserve positional arguments - PARAMS="$PARAMS $1" - shift - ;; - esac -done - -echo "--srcTarball -> $SRC_TARBALL" -echo "--outFolder -> $OUT_FOLDER" -echo "--pkgVersion -> $PKG_VERSION" -echo "--vendorVersion -> $VENDOR_VERSION" - -if [ -z "$PKG_VERSION" ]; then - echo "--pkgVersion parameter cannot be empty" - exit 1 -fi - -echo "-- create temp folder" -tmpdir=$(mktemp -d) -function cleanup { - echo "+++ cleanup -> remove $tmpdir" - rm -rf $tmpdir -} -trap cleanup EXIT - -TARBALL_FOLDER="$tmpdir/tarballFolder" -mkdir -p $TARBALL_FOLDER -cp $SRC_TARBALL $tmpdir - -pushd $tmpdir > /dev/null - -PKG_NAME="application-gateway-kubernetes-ingress" -NAME_VER="$PKG_NAME-$PKG_VERSION" -VENDOR_TARBALL="$OUT_FOLDER/$NAME_VER-govendor-v$VENDOR_VERSION.tar.gz" - -echo "Unpacking source tarball..." -tar -xf $SRC_TARBALL - -cd "$NAME_VER" -echo "Get vendored modules" -go mod vendor - -echo "Tar vendored modules" -tar --sort=name \ - --mtime="2021-04-26 00:00Z" \ - --owner=0 --group=0 --numeric-owner \ - --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ - -czf "$VENDOR_TARBALL" vendor - -popd > /dev/null -echo "$PKG_NAME vendored modules are available at $VENDOR_TARBALL" diff --git a/SPECS/azcopy/CVE-2024-51744.patch b/SPECS/azcopy/CVE-2024-51744.patch deleted file mode 100644 index 1979410696..0000000000 --- a/SPECS/azcopy/CVE-2024-51744.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 20e147bb207d101d62acbd38642590e5808afd9d Mon Sep 17 00:00:00 2001 -From: Sreenivasulu Malavathula -Date: Mon, 17 Mar 2025 11:12:02 -0500 -Subject: [PATCH] Addressing CVE-2024-51744 -Upstream Patch Reference: https://github.com/golang-jwt/jwt/commit/7b1c1c00a171c6c79bbdb40e4ce7d197060c1c2c - ---- - vendor/github.com/golang-jwt/jwt/v4/parser.go | 41 +++++++++---------- - 1 file changed, 20 insertions(+), 21 deletions(-) - -diff --git a/vendor/github.com/golang-jwt/jwt/v4/parser.go b/vendor/github.com/golang-jwt/jwt/v4/parser.go -index c0a6f69..9dd36e5 100644 ---- a/vendor/github.com/golang-jwt/jwt/v4/parser.go -+++ b/vendor/github.com/golang-jwt/jwt/v4/parser.go -@@ -36,19 +36,21 @@ func NewParser(options ...ParserOption) *Parser { - return p - } - --// Parse parses, validates, verifies the signature and returns the parsed token. --// keyFunc will receive the parsed token and should return the key for validating. -+// Parse parses, validates, verifies the signature and returns the parsed token. keyFunc will -+// receive the parsed token and should return the key for validating. - func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) - } - --// ParseWithClaims parses, validates, and verifies like Parse, but supplies a default object implementing the Claims --// interface. This provides default values which can be overridden and allows a caller to use their own type, rather --// than the default MapClaims implementation of Claims. -+// ParseWithClaims parses, validates, and verifies like Parse, but supplies a default object -+// implementing the Claims interface. This provides default values which can be overridden and -+// allows a caller to use their own type, rather than the default MapClaims implementation of -+// Claims. - // --// Note: If you provide a custom claim implementation that embeds one of the standard claims (such as RegisteredClaims), --// make sure that a) you either embed a non-pointer version of the claims or b) if you are using a pointer, allocate the --// proper memory for it before passing in the overall claims, otherwise you might run into a panic. -+// Note: If you provide a custom claim implementation that embeds one of the standard claims (such -+// as RegisteredClaims), make sure that a) you either embed a non-pointer version of the claims or -+// b) if you are using a pointer, allocate the proper memory for it before passing in the overall -+// claims, otherwise you might run into a panic. - func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - token, parts, err := p.ParseUnverified(tokenString, claims) - if err != nil { -@@ -85,12 +87,17 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - return token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable} - } - -+ // Perform validation -+ token.Signature = parts[2] -+ if err := token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { -+ return token, &ValidationError{Inner: err, Errors: ValidationErrorSignatureInvalid} -+ } -+ - vErr := &ValidationError{} - - // Validate Claims - if !p.SkipClaimsValidation { - if err := token.Claims.Valid(); err != nil { -- - // If the Claims Valid returned an error, check if it is a validation error, - // If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set - if e, ok := err.(*ValidationError); !ok { -@@ -98,22 +105,14 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - } else { - vErr = e - } -+ return token, vErr - } - } - -- // Perform validation -- token.Signature = parts[2] -- if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { -- vErr.Inner = err -- vErr.Errors |= ValidationErrorSignatureInvalid -- } -- -- if vErr.valid() { -- token.Valid = true -- return token, nil -- } -+ // No errors so far, token is valid. -+ token.Valid = true - -- return token, vErr -+ return token, nil - } - - // ParseUnverified parses the token but doesn't validate the signature. --- -2.45.2 - diff --git a/SPECS/azcopy/CVE-2025-22868.patch b/SPECS/azcopy/CVE-2025-22868.patch deleted file mode 100644 index c4f136f3ca..0000000000 --- a/SPECS/azcopy/CVE-2025-22868.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 681b4d8edca1bcfea5bce685d77ea7b82ed3e7b3 Mon Sep 17 00:00:00 2001 -From: Neal Patel -Date: Thu, 30 Jan 2025 14:10:09 -0500 -Subject: [PATCH] jws: split token into fixed number of parts - -Thanks to 'jub0bs' for reporting this issue. - -Fixes #71490 -Fixes CVE-2025-22868 - -Change-Id: I2552731f46d4907f29aafe7863c558387b6bd6e2 -Reviewed-on: https://go-review.googlesource.com/c/oauth2/+/652155 -Auto-Submit: Gopher Robot -Reviewed-by: Damien Neil -Reviewed-by: Roland Shoemaker -LUCI-TryBot-Result: Go LUCI ---- - vendor/golang.org/x/oauth2/jws/jws.go | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/oauth2/jws/jws.go b/vendor/golang.org/x/oauth2/jws/jws.go -index 95015648b..6f03a49d3 100644 ---- a/vendor/golang.org/x/oauth2/jws/jws.go -+++ b/vendor/golang.org/x/oauth2/jws/jws.go -@@ -165,11 +165,11 @@ func Encode(header *Header, c *ClaimSet, key *rsa.PrivateKey) (string, error) { - // Verify tests whether the provided JWT token's signature was produced by the private key - // associated with the supplied public key. - func Verify(token string, key *rsa.PublicKey) error { -- parts := strings.Split(token, ".") -- if len(parts) != 3 { -+ if strings.Count(token, ".") != 2 { - return errors.New("jws: invalid token received, token must have 3 parts") - } - -+ parts := strings.SplitN(token, ".", 3) - signedContent := parts[0] + "." + parts[1] - signatureString, err := base64.RawURLEncoding.DecodeString(parts[2]) - if err != nil { diff --git a/SPECS/azcopy/CVE-2025-22870.patch b/SPECS/azcopy/CVE-2025-22870.patch deleted file mode 100644 index abe01c7b92..0000000000 --- a/SPECS/azcopy/CVE-2025-22870.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 00fc79d4c9b2996f895fd0d5b1908463e7e69f69 Mon Sep 17 00:00:00 2001 -From: Sreenivasulu Malavathula -Date: Sun, 16 Mar 2025 22:19:38 -0500 -Subject: [PATCH] Addressing CVE-2025-22870 -Upstream Patch Reference: https://github.com/golang/go/commit/25177ecde0922c50753c043579d17828b7ee88e7 - ---- - vendor/golang.org/x/net/http/httpproxy/proxy.go | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/http/httpproxy/proxy.go b/vendor/golang.org/x/net/http/httpproxy/proxy.go -index 6404aaf..d89c257 100644 ---- a/vendor/golang.org/x/net/http/httpproxy/proxy.go -+++ b/vendor/golang.org/x/net/http/httpproxy/proxy.go -@@ -14,6 +14,7 @@ import ( - "errors" - "fmt" - "net" -+ "net/netip" - "net/url" - "os" - "strings" -@@ -177,8 +178,10 @@ func (cfg *config) useProxy(addr string) bool { - if host == "localhost" { - return false - } -- ip := net.ParseIP(host) -- if ip != nil { -+ nip, err := netip.ParseAddr(host) -+ var ip net.IP -+ if err == nil { -+ ip = net.IP(nip.AsSlice()) - if ip.IsLoopback() { - return false - } -@@ -360,6 +363,9 @@ type domainMatch struct { - } - - func (m domainMatch) match(host, port string, ip net.IP) bool { -+ if ip != nil { -+ return false -+ } - if strings.HasSuffix(host, m.host) || (m.matchHost && host == m.host[1:]) { - return m.port == "" || m.port == port - } --- -2.45.2 - diff --git a/SPECS/azcopy/CVE-2025-30204.patch b/SPECS/azcopy/CVE-2025-30204.patch deleted file mode 100644 index 6eb7de916b..0000000000 --- a/SPECS/azcopy/CVE-2025-30204.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 84c7f3d0b9dccb4a20d0ad4de10896d40344ba26 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Fri, 28 Mar 2025 20:43:26 +0000 -Subject: [PATCH] CVE-2025-30204 -Upstream Patch Reference : -v4 : https://github.com/golang-jwt/jwt/commit/2f0e9add62078527821828c76865661aa7718a84 -v5 : https://github.com/golang-jwt/jwt/commit/0951d184286dece21f73c85673fd308786ffe9c3 ---- - github.com/golang-jwt/jwt/v4/parser.go | 36 +++++++++++++++++++++++--- - github.com/golang-jwt/jwt/v5/parser.go | 36 +++++++++++++++++++++++--- - 2 files changed, 66 insertions(+), 6 deletions(-) - -diff --git a/vendor/github.com/golang-jwt/jwt/v4/parser.go b/vendor/github.com/golang-jwt/jwt/v4/parser.go -index c0a6f69..8e7e67c 100644 ---- a/vendor/github.com/golang-jwt/jwt/v4/parser.go -+++ b/vendor/github.com/golang-jwt/jwt/v4/parser.go -@@ -7,6 +7,8 @@ import ( - "strings" - ) - -+const tokenDelimiter = "." -+ - type Parser struct { - // If populated, only these methods will be considered valid. - // -@@ -123,9 +125,10 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - // It's only ever useful in cases where you know the signature is valid (because it has - // been checked previously in the stack) and you want to extract values from it. - func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { -- parts = strings.Split(tokenString, ".") -- if len(parts) != 3 { -- return nil, parts, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) -+ var ok bool -+ parts, ok = splitToken(tokenString) -+ if !ok { -+ return nil, nil, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) - } - - token = &Token{Raw: tokenString} -@@ -175,3 +178,30 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke - - return token, parts, nil - } -+ -+// splitToken splits a token string into three parts: header, claims, and signature. It will only -+// return true if the token contains exactly two delimiters and three parts. In all other cases, it -+// will return nil parts and false. -+func splitToken(token string) ([]string, bool) { -+ parts := make([]string, 3) -+ header, remain, ok := strings.Cut(token, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[0] = header -+ claims, remain, ok := strings.Cut(remain, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[1] = claims -+ // One more cut to ensure the signature is the last part of the token and there are no more -+ // delimiters. This avoids an issue where malicious input could contain additional delimiters -+ // causing unecessary overhead parsing tokens. -+ signature, _, unexpected := strings.Cut(remain, tokenDelimiter) -+ if unexpected { -+ return nil, false -+ } -+ parts[2] = signature -+ -+ return parts, true -+} -diff --git a/vendor/github.com/golang-jwt/jwt/v5/parser.go b/vendor/github.com/golang-jwt/jwt/v5/parser.go -index ecf99af..054c7eb 100644 ---- a/vendor/github.com/golang-jwt/jwt/v5/parser.go -+++ b/vendor/github.com/golang-jwt/jwt/v5/parser.go -@@ -8,6 +8,8 @@ import ( - "strings" - ) - -+const tokenDelimiter = "." -+ - type Parser struct { - // If populated, only these methods will be considered valid. - validMethods []string -@@ -136,9 +138,10 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - // It's only ever useful in cases where you know the signature is valid (since it has already - // been or will be checked elsewhere in the stack) and you want to extract values from it. - func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { -- parts = strings.Split(tokenString, ".") -- if len(parts) != 3 { -- return nil, parts, newError("token contains an invalid number of segments", ErrTokenMalformed) -+ var ok bool -+ parts, ok = splitToken(tokenString) -+ if !ok { -+ return nil, nil, newError("token contains an invalid number of segments", ErrTokenMalformed) - } - - token = &Token{Raw: tokenString} -@@ -196,6 +199,33 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke - return token, parts, nil - } - -+// splitToken splits a token string into three parts: header, claims, and signature. It will only -+// return true if the token contains exactly two delimiters and three parts. In all other cases, it -+// will return nil parts and false. -+func splitToken(token string) ([]string, bool) { -+ parts := make([]string, 3) -+ header, remain, ok := strings.Cut(token, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[0] = header -+ claims, remain, ok := strings.Cut(remain, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[1] = claims -+ // One more cut to ensure the signature is the last part of the token and there are no more -+ // delimiters. This avoids an issue where malicious input could contain additional delimiters -+ // causing unecessary overhead parsing tokens. -+ signature, _, unexpected := strings.Cut(remain, tokenDelimiter) -+ if unexpected { -+ return nil, false -+ } -+ parts[2] = signature -+ -+ return parts, true -+} -+ - // DecodeSegment decodes a JWT specific base64url encoding. This function will - // take into account whether the [Parser] is configured with additional options, - // such as [WithStrictDecoding] or [WithPaddingAllowed]. --- -2.45.2 - diff --git a/SPECS/azcopy/azcopy.signatures.json b/SPECS/azcopy/azcopy.signatures.json deleted file mode 100644 index 0c4250f6ac..0000000000 --- a/SPECS/azcopy/azcopy.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "azure-storage-azcopy-10.25.1-vendor.tar.gz": "2e51019e29834b9b4ea2480fa80eaa95d2ce09601eb1be2edcf5febd927e5a4e", - "azure-storage-azcopy-10.25.1.tar.gz": "d62f0a88e8899a611d9ef627252e4379bee8530177caca081f155e28917e70d3" - } -} \ No newline at end of file diff --git a/SPECS/azcopy/azcopy.spec b/SPECS/azcopy/azcopy.spec deleted file mode 100644 index 0c8a67067f..0000000000 --- a/SPECS/azcopy/azcopy.spec +++ /dev/null @@ -1,134 +0,0 @@ -Summary: The new Azure Storage data transfer utility - AzCopy v10 -Name: azcopy -Version: 10.25.1 -Release: 5%{?dist} -License: MIT -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Applications/Tools -URL: https://github.com/Azure/azure-storage-azcopy -Source0: https://github.com/Azure/azure-storage-azcopy/archive/refs/tags/v%{version}.tar.gz#/azure-storage-%{name}-%{version}.tar.gz -# Below is a manually created tarball, no download link. -# We're using pre-populated Go modules from this tarball, since network is disabled during build time. -# How to re-build this file: -# 1. wget https://github.com/Azure/azure-storage-azcopy/archive/refs/tags/v%{version}.tar.gz -O azure-storage-%{name}-%{version}.tar.gz -# 2. tar -xf azure-storage-%{name}-%{version}.tar.gz -# 3. cd azure-storage-%{name}-%{version} -# 4. go mod vendor -# 5. tar --sort=name \ -# --mtime="2021-04-26 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cf azure-storage-%{name}-%{version}-vendor.tar.gz vendor -# -# NOTES: -# - You require GNU tar version 1.28+. -# - The additional options enable generation of a tarball with the same hash every time regardless of the environment. -# See: https://reproducible-builds.org/docs/archives/ -# - For the value of "--mtime" use the date "2021-04-26 00:00Z" to simplify future updates. -Source1: azure-storage-%{name}-%{version}-vendor.tar.gz -Patch0: CVE-2025-22868.patch -Patch1: CVE-2025-30204.patch -Patch2: CVE-2025-22870.patch -Patch3: CVE-2024-51744.patch - -BuildRequires: golang >= 1.17.9 -BuildRequires: git -%global debug_package %{nil} -%define our_gopath %{_topdir}/.gopath - -%description -AzCopy v10 is a command-line utility that you can use to copy data to -and from containers and file shares in Azure Storage accounts. -AzCopy V10 presents easy-to-use commands that are optimized for high -performance and throughput. - -%prep -%setup -q -n azure-storage-%{name}-%{version} -# Apply vendor before patching -tar --no-same-owner -xf %{SOURCE1} -%autopatch -p1 - -%build -export GOPATH=%{our_gopath} -go build -buildmode=pie -mod=vendor - -%install -install -D -m 0755 ./azure-storage-azcopy %{buildroot}%{_bindir}/azcopy - -%check -go test -mod=vendor -./azure-storage-azcopy --version - -%files -%defattr(-,root,root) -%license LICENSE -%doc NOTICE.txt README.md -%{_bindir}/azcopy - -%changelog -* Fri May 30 2025 Ranjan Dutta - 10.25.1-5 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22870, CVE-2024-51744 - -* Fri Apr 28 2025 Ranjan Dutta - 10.25.1-4 -- merge from Azure Linux 3.0.20250423. -- Patch CVE-2025-30204 - -* Fri Mar 21 2025 Anuj Mittal - 10.25.1-3 -- Bump release to rebuild - -* Tue Mar 04 2025 Kanishk Bansal - 10.25.1-2 -- Fix CVE-2025-22868 with an upstream patch - -* Tue Aug 06 2024 Archana Choudhary - 10.25.1-1 -- Upgrade azcopy to latest 10.25.1 to fix multiple security issues - -* Thu May 23 2024 Sudipta Pandit - 10.24.0-1 -- Upgrade azcopy to latest 10.24.0 to fix multiple security issues - -* Thu Jan 04 2024 CBL-Mariner Servicing Account - 10.22.1-1 -- Auto-upgrade to 10.22.1 - 3.0 upgrade - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 10.15.0-14 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 10.15.0-13 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 10.15.0-12 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 10.15.0-11 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 10.15.0-10 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 10.15.0-9 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 10.15.0-8 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 10.15.0-7 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 10.15.0-6 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 10.15.0-5 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 10.15.0-4 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 10.15.0-3 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 10.15.0-2 -- Bump release to rebuild against Go 1.18.5 - -* Fri Jul 01 2022 Suresh Babu Chalamalasetty - 10.15.0-1 -- Original version for CBL-Mariner. -- License verified. diff --git a/SPECS/azcopy/generate_source_tarball.sh b/SPECS/azcopy/generate_source_tarball.sh deleted file mode 100755 index febc81b4ca..0000000000 --- a/SPECS/azcopy/generate_source_tarball.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -# Quit on failure -set -e - -PKG_VERSION="" -SRC_TARBALL="" -OUT_FOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# parameters: -# -# --srcTarball : src tarball file -# this file contains the 'initial' source code of the component -# and should be replaced with the new/modified src code -# --outFolder : folder where to copy the new tarball(s) -# --pkgVersion : package version -# -PARAMS="" -while (( "$#" )); do - case "$1" in - --srcTarball) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - SRC_TARBALL=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --outFolder) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - OUT_FOLDER=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --pkgVersion) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - PKG_VERSION=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - -*|--*=) # unsupported flags - echo "Error: Unsupported flag $1" >&2 - exit 1 - ;; - *) # preserve positional arguments - PARAMS="$PARAMS $1" - shift - ;; - esac -done - -echo "--srcTarball -> $SRC_TARBALL" -echo "--outFolder -> $OUT_FOLDER" -echo "--pkgVersion -> $PKG_VERSION" - -if [ -z "$PKG_VERSION" ]; then - echo "--pkgVersion parameter cannot be empty" - exit 1 -fi - -echo "-- create temp folder" -tmpdir=$(mktemp -d) -function cleanup { - echo "+++ cleanup -> remove $tmpdir" - rm -rf $tmpdir -} -trap cleanup EXIT - -pushd $tmpdir > /dev/null - -NAME_VER="azure-storage-azcopy-$PKG_VERSION" -VENDOR_TARBALL="$OUT_FOLDER/$NAME_VER-vendor.tar.gz" - -echo "Unpacking source tarball..." -tar -xf $SRC_TARBALL - -cd "$NAME_VER" -echo "Get vendored modules" -go mod vendor - -echo "Tar vendored modules" -tar --sort=name \ - --mtime="2021-04-26 00:00Z" \ - --owner=0 --group=0 --numeric-owner \ - --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ - -cf "$VENDOR_TARBALL" vendor - -popd > /dev/null -echo "azcopy vendored modules are available at $VENDOR_TARBALL" \ No newline at end of file diff --git a/SPECS/bolt/0001-test-test-unix-skip-unix-domain-socket-test.patch b/SPECS/bolt/0001-test-test-unix-skip-unix-domain-socket-test.patch deleted file mode 100644 index d0b1f941aa..0000000000 --- a/SPECS/bolt/0001-test-test-unix-skip-unix-domain-socket-test.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 74eace0d89b63be92615364568ba36ad7d748477 Mon Sep 17 00:00:00 2001 -From: Kate Hsuan -Date: Tue, 14 Feb 2023 16:25:04 +0800 -Subject: [PATCH] test: test-unix: skip unix domain socket test - -Skip the test since we can't test unix domain socket in mock. ---- - tests/test-unix.c | 7 ------- - 1 file changed, 7 deletions(-) - -diff --git a/tests/test-unix.c b/tests/test-unix.c -index 98de3db..366488f 100644 ---- a/tests/test-unix.c -+++ b/tests/test-unix.c -@@ -198,13 +198,6 @@ main (int argc, char **argv) - test_pid_is_alive, - NULL); - -- g_test_add ("/common/unix/bolt_sd_notify", -- TestNotify, -- NULL, -- test_notify_setup, -- test_sd_notify, -- test_notify_teardown); -- - g_test_add ("/common/unix/sd_watchdog_enabled", - TestDummy, - NULL, --- -2.39.1 - diff --git a/SPECS/bolt/bolt.signatures.json b/SPECS/bolt/bolt.signatures.json deleted file mode 100644 index 6f5d8a233e..0000000000 --- a/SPECS/bolt/bolt.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "bolt-0.9.8.tar.gz": "5a4306aa21ee398e1e9f2a5072748c9469c9360bf5edc7dcec2f12fc17be122e" - } -} diff --git a/SPECS/bolt/bolt.spec b/SPECS/bolt/bolt.spec deleted file mode 100644 index 78eb048f39..0000000000 --- a/SPECS/bolt/bolt.spec +++ /dev/null @@ -1,166 +0,0 @@ -Summary: Thunderbolt device manager -Name: bolt -Version: 0.9.8 -Release: 1%{?dist} -License: LGPL-2.0-or-later -Vendor: Microsoft Corporation -Distribution: Azure Linux -URL: https://gitlab.freedesktop.org/bolt/bolt -Source0: %{url}/-/archive/%{version}/%{name}-%{version}.tar.gz - -Patch0: 0001-test-test-unix-skip-unix-domain-socket-test.patch - -BuildRequires: asciidoc -BuildRequires: gcc -BuildRequires: libudev-devel -BuildRequires: meson -BuildRequires: pkgconfig -BuildRequires: polkit-devel -BuildRequires: systemd -BuildRequires: systemd-devel -BuildRequires: pkgconfig(gio-2.0) -%{?systemd_requires} - -%description -bolt is a system daemon to manage Thunderbolt devices via a D-BUS -API. Thunderbolt 3 introduced different security modes that require -devices to be authorized before they can be used. The D-Bus API can be -used to list devices, enroll them (authorize and store them in the -local database) and forget them again (remove previously enrolled -devices). It also emits signals if new devices are connected (or -removed). During enrollment devices can be set to be automatically -authorized as soon as they are connected. A command line tool, called -boltctl, can be used to control the daemon and perform all the above -mentioned tasks. - -%prep -%autosetup -p1 - -%build -%meson -Ddb-name=boltd -%meson_build - -%check -%meson_test - -%install -%meson_install - -%post -%systemd_post %{name}.service - -%preun -%systemd_preun %{name}.service - -%postun -%systemd_postun_with_restart %{name}.service - -%files -%license COPYING -%doc README.md CHANGELOG.md -%{_bindir}/boltctl -%{_libexecdir}/boltd -%{_unitdir}/%{name}.service -%{_udevrulesdir}/*-%{name}.rules -%{_datadir}/dbus-1/system.d/org.freedesktop.bolt.conf -%{_datadir}/dbus-1/interfaces/org.freedesktop.bolt.xml -%{_datadir}/polkit-1/actions/org.freedesktop.bolt.policy -%{_datadir}/polkit-1/rules.d/org.freedesktop.bolt.rules -%{_datadir}/dbus-1/system-services/org.freedesktop.bolt.service -%{_mandir}/man1/boltctl.1* -%{_mandir}/man8/boltd.8* -%ghost %dir %{_localstatedir}/lib/boltd - -%changelog -* Mon Nov 25 2024 Akarsh Chaudhary - 0.9.8-1 -- Upgrade to version 0.9.8 - -* Thu Jan 05 2023 Suresh Thelkar - 0.9.2-2 -- Initial CBL-Mariner import from Fedora 36 (license: MIT) -- License verified - -* Thu Jan 27 2022 Christian Kellner - 0.9.2-1 -- bolt 0.9.2 release - -* Wed Jan 19 2022 Fedora Release Engineering - 0.9.1-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Wed Jul 21 2021 Fedora Release Engineering - 0.9.1-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Tue Mar 02 2021 Zbigniew Jędrzejewski-Szmek - 0.9.1-3 -- Rebuilt for updated systemd-rpm-macros - See https://pagure.io/fesco/issue/2583. - -* Tue Jan 26 2021 Fedora Release Engineering - 0.9.1-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Tue Dec 1 2020 Christian Kellner - 0.9.1-1 -- bolt 0.9.1 release -- Update description with less emphasis on Thunderbolt version - -* Sat Aug 01 2020 Fedora Release Engineering - 0.9-3 -- Second attempt - Rebuilt for - https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Mon Jul 27 2020 Fedora Release Engineering - 0.9-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Mon Jun 15 2020 Christian Kellner - 0.9-1 -- bolt 0.9 release - Drop all patches (all merged upstream). - -* Tue Jan 28 2020 Fedora Release Engineering - 0.8-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Thu Jan 23 2020 Christian Kellner - 0.8-3 -- Add patch to ignore uevents from wakeup devices. See upstream issue - https://gitlab.freedesktop.org/bolt/bolt/issues/156 -- Add patch to fix BoltError not being a typedef. - -* Wed Jul 24 2019 Fedora Release Engineering - 0.8-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Thu Jun 13 2019 Christian Kellner - 0.8-1 -- bolt 0.8 release - D-Bus Configuration moved from sysconfdir to datadir. - Package new CHNAGELOG.md. - -* Thu Jan 31 2019 Fedora Release Engineering - 0.7-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Tue Jan 1 2019 Christian Kellner - 0.7-1 -- bolt 0.7 release - -* Wed Nov 28 2018 Christian Kellner - 0.6-1 -- bolt 0.6 release - -* Fri Sep 21 2018 Christian Kellner - 0.5-1 -- bolt 0.5 release -- Remove forge macros again and use gitlab as authorative source -- Testing depedencies are now only pulled in on Fedora - -* Thu Jul 12 2018 Fedora Release Engineering - 0.4-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Mon May 28 2018 Christian Kellner - 0.4-1 -- bolt 0.4 upstream release - -* Tue Apr 10 2018 Christian Kellner - 0.3-1 -- bolt 0.3 upstream release -- Update BuildRequires to include gcc -- Use forge macros - -* Tue Mar 6 2018 Christian Kellner - 0.2-1 -- bolt 0.2 upstream release -- Update BuildRequires dependencies. - -* Wed Feb 07 2018 Fedora Release Engineering - 0.1-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Sun Dec 17 2017 Christian Kellner - 0.1-2 -- Set database path to /var/lib/boltd, create it during - installation, which is needed for the service file to work. - -* Thu Dec 14 2017 Christian Kellner - 0.1-1 -- Initial upstream release diff --git a/SPECS/busybox/CVE-2026-26157.patch b/SPECS/busybox/CVE-2026-26157.patch new file mode 100644 index 0000000000..cee37279d6 --- /dev/null +++ b/SPECS/busybox/CVE-2026-26157.patch @@ -0,0 +1,176 @@ +From 77a3ee825c430d054492b0101750b1c7ee8edf1c Mon Sep 17 00:00:00 2001 +From: AllSpark +Date: Mon, 16 Feb 2026 08:13:03 +0000 +Subject: [PATCH] tar: strip unsafe hardlink components - GNU tar does the same + +Signed-off-by: Denys Vlasenko +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: AI Backport of https://github.com/mirror/busybox/commit/3fb6b31c716669e12f75a2accd31bb7685b1a1cb.patch +--- + archival/libarchive/data_extract_all.c | 7 +++-- + archival/libarchive/get_header_tar.c | 11 ++++++-- + archival/libarchive/unsafe_prefix.c | 30 +++++++++++++++++---- + archival/libarchive/unsafe_symlink_target.c | 1 + + archival/tar.c | 2 +- + archival/unzip.c | 2 +- + include/bb_archive.h | 3 ++- + 7 files changed, 42 insertions(+), 14 deletions(-) + +diff --git a/archival/libarchive/data_extract_all.c b/archival/libarchive/data_extract_all.c +index 8a69711..b84b960 100644 +--- a/archival/libarchive/data_extract_all.c ++++ b/archival/libarchive/data_extract_all.c +@@ -66,8 +66,8 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) + } + #endif + #if ENABLE_FEATURE_PATH_TRAVERSAL_PROTECTION +- /* Strip leading "/" and up to last "/../" path component */ +- dst_name = (char *)strip_unsafe_prefix(dst_name); ++ /* Skip leading "/" and past last ".." path component */ ++ dst_name = (char *)skip_unsafe_prefix(dst_name); + #endif + // ^^^ This may be a problem if some applets do need to extract absolute names. + // (Probably will need to invent ARCHIVE_ALLOW_UNSAFE_NAME flag). +@@ -185,8 +185,7 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) + + /* To avoid a directory traversal attack via symlinks, + * do not restore symlinks with ".." components +- * or symlinks starting with "/", unless a magic +- * envvar is set. ++ * or symlinks starting with "/" + * + * For example, consider a .tar created via: + * $ tar cvf bug.tar anything.txt +diff --git a/archival/libarchive/get_header_tar.c b/archival/libarchive/get_header_tar.c +index cc6f3f0..1c40ece 100644 +--- a/archival/libarchive/get_header_tar.c ++++ b/archival/libarchive/get_header_tar.c +@@ -454,8 +454,15 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) + #endif + + /* Everything up to and including last ".." component is stripped */ +- overlapping_strcpy(file_header->name, strip_unsafe_prefix(file_header->name)); +-//TODO: do the same for file_header->link_target? ++ strip_unsafe_prefix(file_header->name); ++ if (file_header->link_target) { ++ /* GNU tar 1.34 examples: ++ * tar: Removing leading '/' from hard link targets ++ * tar: Removing leading '../' from hard link targets ++ * tar: Removing leading 'etc/../' from hard link targets ++ */ ++ strip_unsafe_prefix(file_header->link_target); ++ } + + /* Strip trailing '/' in directories */ + /* Must be done after mode is set as '/' is used to check if it's a directory */ +diff --git a/archival/libarchive/unsafe_prefix.c b/archival/libarchive/unsafe_prefix.c +index 6670811..89a371a 100644 +--- a/archival/libarchive/unsafe_prefix.c ++++ b/archival/libarchive/unsafe_prefix.c +@@ -5,11 +5,11 @@ + #include "libbb.h" + #include "bb_archive.h" + +-const char* FAST_FUNC strip_unsafe_prefix(const char *str) ++const char* FAST_FUNC skip_unsafe_prefix(const char *str) + { + const char *cp = str; + while (1) { +- char *cp2; ++ const char *cp2; + if (*cp == '/') { + cp++; + continue; +@@ -22,10 +22,25 @@ const char* FAST_FUNC strip_unsafe_prefix(const char *str) + cp += 3; + continue; + } +- cp2 = strstr(cp, "/../"); ++ cp2 = cp; ++ find_dotdot: ++ cp2 = strstr(cp2, "/.."); + if (!cp2) +- break; +- cp = cp2 + 4; ++ break; /* No (more) malicious components */ ++ ++ /* We found "/..something" */ ++ cp2 += 3; ++ if (*cp2 != '/') { ++ if (*cp2 == '\0') { ++ /* Trailing "/..": malicious, return "" */ ++ /* (causes harmless errors trying to create or hardlink a file named "") */ ++ return cp2; ++ } ++ /* "/..name" is not malicious, look for next "/.." */ ++ goto find_dotdot; ++ } ++ /* Found "/../": malicious, advance past it */ ++ cp = cp2 + 1; + } + if (cp != str) { + static smallint warned = 0; +@@ -37,3 +52,8 @@ const char* FAST_FUNC strip_unsafe_prefix(const char *str) + } + return cp; + } ++ ++void FAST_FUNC strip_unsafe_prefix(char *str) ++{ ++ overlapping_strcpy(str, skip_unsafe_prefix(str)); ++} +diff --git a/archival/libarchive/unsafe_symlink_target.c b/archival/libarchive/unsafe_symlink_target.c +index f8dc803..d764c89 100644 +--- a/archival/libarchive/unsafe_symlink_target.c ++++ b/archival/libarchive/unsafe_symlink_target.c +@@ -36,6 +36,7 @@ void FAST_FUNC create_links_from_list(llist_t *list) + *list->data ? "hard" : "sym", + list->data + 1, target + ); ++ /* Note: GNU tar 1.34 errors out only _after_ all links are (attempted to be) created */ + } + list = list->link; + } +diff --git a/archival/tar.c b/archival/tar.c +index 9de3759..cf8c2d1 100644 +--- a/archival/tar.c ++++ b/archival/tar.c +@@ -475,7 +475,7 @@ static int FAST_FUNC writeFileToTarball(struct recursive_state *state, + DBG("writeFileToTarball('%s')", fileName); + + /* Strip leading '/' and such (must be before memorizing hardlink's name) */ +- header_name = strip_unsafe_prefix(fileName); ++ header_name = skip_unsafe_prefix(fileName); + + if (header_name[0] == '\0') + return TRUE; +diff --git a/archival/unzip.c b/archival/unzip.c +index 691a2d8..5844215 100644 +--- a/archival/unzip.c ++++ b/archival/unzip.c +@@ -853,7 +853,7 @@ int unzip_main(int argc, char **argv) + unzip_skip(zip.fmt.extra_len); + + /* Guard against "/abspath", "/../" and similar attacks */ +- overlapping_strcpy(dst_fn, strip_unsafe_prefix(dst_fn)); ++ strip_unsafe_prefix(dst_fn); + + /* Filter zip entries */ + if (find_list_entry(zreject, dst_fn) +diff --git a/include/bb_archive.h b/include/bb_archive.h +index e0ef8fc..1dc77f3 100644 +--- a/include/bb_archive.h ++++ b/include/bb_archive.h +@@ -202,7 +202,8 @@ char get_header_tar_xz(archive_handle_t *archive_handle) FAST_FUNC; + void seek_by_jump(int fd, off_t amount) FAST_FUNC; + void seek_by_read(int fd, off_t amount) FAST_FUNC; + +-const char *strip_unsafe_prefix(const char *str) FAST_FUNC; ++const char *skip_unsafe_prefix(const char *str) FAST_FUNC; ++void strip_unsafe_prefix(char *str) FAST_FUNC; + void create_or_remember_link(llist_t **link_placeholders, + const char *target, + const char *linkname, +-- +2.45.4 + diff --git a/SPECS/busybox/busybox.spec b/SPECS/busybox/busybox.spec index 98c0d919d6..cc5e50aeab 100644 --- a/SPECS/busybox/busybox.spec +++ b/SPECS/busybox/busybox.spec @@ -1,7 +1,7 @@ Summary: Statically linked binary providing simplified versions of system commands Name: busybox Version: 1.36.1 -Release: 15%{?dist} +Release: 22%{?dist} License: GPLv2 Vendor: Intel Corporation Distribution: Edge Microvisor Toolkit @@ -16,11 +16,12 @@ Patch3: CVE-2023-42363.patch # Also Fixes CVE-2023-42364 Patch4: CVE-2023-42365.patch Patch5: CVE-2023-42366.patch -Patch6: no-cbq.patch -Patch7: CVE-2023-39810.patch -Patch8: CVE-2022-48174.patch +Patch6: CVE-2023-39810.patch +Patch7: CVE-2022-48174.patch +Patch8: CVE-2026-26157.patch +Patch99: no-cbq.patch BuildRequires: gcc -BuildRequires: glibc-static >= 2.38-12%{?dist} +BuildRequires: glibc-static >= 2.38-18%{?dist} BuildRequires: libselinux-devel >= 1.27.7-2 BuildRequires: libsepol-devel %if 0%{?with_check} @@ -92,7 +93,10 @@ install -m 644 docs/busybox.petitboot.1 %{buildroot}/%{_mandir}/man1/busybox.pet %check cd testsuite -SKIP_KNOWN_BUGS=1 ./runtest + +# CVE-2026-26157: hardened tar extraction blocks symlink + hardlink write attacks +# These tests validate insecure legacy behavior and are expected to fail +./runtest --skip "tar-symlink-attack,tar-symlink-hardlink-coexist" %files %license LICENSE @@ -107,6 +111,11 @@ SKIP_KNOWN_BUGS=1 ./runtest %{_mandir}/man1/busybox.petitboot.1.gz %changelog +* Thu Mar 12 2026 Lee Chee Yang - 1.36.1-22 +- merge from Azure Linux 3.0.20260304-3.0 +- Bump to rebuild with updated glibc +- Patch for CVE-2026-26157 + * Fri Oct 3 2025 Lee Chee Yang - 1.36.1-15 - merge from Azure Linux 3.0.20250910-3.0 - Patch CVE-2022-48174 diff --git a/SPECS/ca-certificates/ca-certificates.signatures.json b/SPECS/ca-certificates/ca-certificates.signatures.json index 73e57fe636..3c8c538f71 100644 --- a/SPECS/ca-certificates/ca-certificates.signatures.json +++ b/SPECS/ca-certificates/ca-certificates.signatures.json @@ -10,9 +10,9 @@ "README.src": "86184318d451bec55d70c84e618cbfe10c8adb7dc893964ce4aaecff99d83433", "README.usr": "0d2e90b6cf575678cd9d4f409d92258ef0d676995d4d733acdb2425309a38ff8", "bundle2pem.sh": "a61e0d9f34e21456cfe175e9a682f56959240e66dfeb75bd2457226226aa413a", - "certdata.base.txt": "8896c309aef808c7769dc630abee75adbb6bfb5c8a961461b51f845a1740ea66", + "certdata.base.txt": "4bef2bd5e4f4693c424b92a4b9862d9fa8a62a654c998a4ca8c1e82bdcd62e99", "certdata.distrusted.txt": "536b1235c5b0b3c82ddf303eca696ec164cdb21899cd9e5313d8b29ce9cdc268", - "certdata.microsoft.txt": "9c802e9f5a0bd90ba51a4f04ec1d2304a11d1cf321e4e5bdff97459b46ba3e02", + "certdata.microsoft.txt": "38cd7da10bce27751cfee01b2fdaa55f52321cdf1a408ec658bbf591b64cc484", "certdata2pem.py": "4f5848c14210758f19ab9fdc9ffd83733303a48642a3d47c4d682f904fdc0f33", "pem2bundle.sh": "f96a2f0071fb80e30332c0bd95853183f2f49a3c98d5e9fc4716aeeb001e3426", "trust-fixes": "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b", diff --git a/SPECS/ca-certificates/ca-certificates.spec b/SPECS/ca-certificates/ca-certificates.spec index 77c4937433..dbddafa6a3 100644 --- a/SPECS/ca-certificates/ca-certificates.spec +++ b/SPECS/ca-certificates/ca-certificates.spec @@ -47,7 +47,7 @@ Name: ca-certificates # When updating, "Epoch, "Version", AND "Release" tags must be updated in the "prebuilt-ca-certificates*" packages as well. Epoch: 1 Version: %{emt}.0.0 -Release: 11%{?dist} +Release: 14%{?dist} License: MPLv2.0 Vendor: Intel Corporation Distribution: Edge Microvisor Toolkit @@ -340,6 +340,12 @@ rm -f %{pkidir}/tls/certs/*.{0,pem} %{_bindir}/bundle2pem.sh %changelog +* Fri Oct 3 2025 Lee Chee Yang - 1:3.0.0-14 +- merge from Azure Linux 3.0.20251206-3.0 +- Adding 2 new base CAs: 'Microsoft TLS RSA Root G2' and 'Microsoft TLS ECC Root G2'. +- Revert: Adding 2 new base CAs: 'Microsoft TLS RSA Root G2' and 'Microsoft TLS ECC Root G2'. +- Updating Microsoft trusted root CAs. + * Fri Oct 3 2025 Lee Chee Yang - 1:3.0.0-11 - merge from Azure Linux 3.0.20250910-3.0 - Adding 2 new base CAs: 'Microsoft TLS RSA Root G2' and 'Microsoft TLS ECC Root G2'. diff --git a/SPECS/ca-certificates/certdata.base.txt b/SPECS/ca-certificates/certdata.base.txt index caf5f5f5b8..fb9c22d064 100644 --- a/SPECS/ca-certificates/certdata.base.txt +++ b/SPECS/ca-certificates/certdata.base.txt @@ -3196,115 +3196,142 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE # -# Certificate "Microsoft TLS ECC Root G2" +# Certificate "DigiCert Global Root CA" # -# Issuer: CN=Microsoft TLS ECC Root G2,O=Microsoft Corporation,C=US -# Serial Number:72:e2:02:2b:c5:b2:c1:b0:4d:25:05:6e:62:e2:76:79 -# Subject: CN=Microsoft TLS ECC Root G2,O=Microsoft Corporation,C=US -# Not Valid Before: Thu Apr 10 20:52:36 2025 -# Not Valid After : Tue Apr 10 20:58:59 2040 -# Fingerprint (SHA-256): 87:75:5C:FE:88:BD:B0:D1:09:9D:CD:ED:3E:AE:11:4B:A9:76:E6:64:B3:24:8E:E3:DC:64:9E:35:7F:17:E8:A7 -# Fingerprint (SHA1): F8:2B:B9:51:BA:6B:8A:85:AD:FA:75:15:02:85:60:D1:25:0E:72:37 +# Issuer: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US +# Serial Number:08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a +# Subject: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US +# Not Valid Before: Fri Nov 10 00:00:00 2006 +# Not Valid After : Mon Nov 10 00:00:00 2031 +# Fingerprint (SHA-256): 43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:01:61 +# Fingerprint (SHA1): A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Microsoft TLS ECC Root G2" +CKA_LABEL UTF8 "DigiCert Global Root CA" CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\042\060\040\006\003\125\004\003\023\031\115\151\143\162\157\163 -\157\146\164\040\124\114\123\040\105\103\103\040\122\157\157\164 -\040\107\062 +\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 +\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 +\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 +\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 +\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 +\040\103\101 END CKA_ID UTF8 "0" CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\042\060\040\006\003\125\004\003\023\031\115\151\143\162\157\163 -\157\146\164\040\124\114\123\040\105\103\103\040\122\157\157\164 -\040\107\062 +\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 +\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 +\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 +\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 +\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 +\040\103\101 END CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\162\342\002\053\305\262\301\260\115\045\005\156\142\342 -\166\171 +\002\020\010\073\340\126\220\102\106\261\241\165\152\311\131\221 +\307\112 END CKA_VALUE MULTILINE_OCTAL -\060\202\002\061\060\202\001\267\240\003\002\001\002\002\020\162 -\342\002\053\305\262\301\260\115\045\005\156\142\342\166\171\060 -\012\006\010\052\206\110\316\075\004\003\003\060\121\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\036\060\034\006\003 -\125\004\012\023\025\115\151\143\162\157\163\157\146\164\040\103 -\157\162\160\157\162\141\164\151\157\156\061\042\060\040\006\003 -\125\004\003\023\031\115\151\143\162\157\163\157\146\164\040\124 -\114\123\040\105\103\103\040\122\157\157\164\040\107\062\060\036 -\027\015\062\065\060\064\061\060\062\060\065\062\063\066\132\027 -\015\064\060\060\064\061\060\062\060\065\070\065\071\132\060\121 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\036\060 -\034\006\003\125\004\012\023\025\115\151\143\162\157\163\157\146 -\164\040\103\157\162\160\157\162\141\164\151\157\156\061\042\060 -\040\006\003\125\004\003\023\031\115\151\143\162\157\163\157\146 -\164\040\124\114\123\040\105\103\103\040\122\157\157\164\040\107 -\062\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005 -\053\201\004\000\042\003\142\000\004\121\302\070\204\366\153\056 -\265\355\067\026\112\345\343\327\115\000\204\073\100\124\374\011 -\346\364\305\247\246\153\126\104\116\255\140\236\025\230\216\003 -\356\342\262\315\165\075\130\144\300\026\014\337\132\334\054\235 -\100\133\276\113\124\052\316\217\074\277\225\274\216\254\211\357 -\151\076\027\006\367\175\301\270\002\145\043\313\365\035\032\343 -\123\241\364\007\176\012\213\135\131\243\124\060\122\060\016\006 -\003\125\035\017\001\001\377\004\004\003\002\001\206\060\017\006 -\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\035 -\006\003\125\035\016\004\026\004\024\157\253\176\332\377\227\103 -\162\354\073\147\167\336\202\141\065\210\107\102\205\060\020\006 -\011\053\006\001\004\001\202\067\025\001\004\003\002\001\000\060 -\012\006\010\052\206\110\316\075\004\003\003\003\150\000\060\145 -\002\061\000\330\063\132\321\341\314\222\262\315\037\360\362\214 -\261\075\262\264\324\312\230\334\332\211\005\364\033\127\161\337 -\224\115\042\166\005\120\111\115\220\051\222\054\277\057\067\345 -\271\165\342\002\060\001\222\151\130\235\123\262\310\125\146\133 -\272\311\120\132\052\201\266\216\317\021\320\362\176\204\334\177 -\066\337\303\055\332\115\370\042\260\330\263\213\064\237\235\061 -\034\254\017\021\031 +\060\202\003\257\060\202\002\227\240\003\002\001\002\002\020\010 +\073\340\126\220\102\106\261\241\165\152\311\131\221\307\112\060 +\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\141 +\061\013\060\011\006\003\125\004\006\023\002\125\123\061\025\060 +\023\006\003\125\004\012\023\014\104\151\147\151\103\145\162\164 +\040\111\156\143\061\031\060\027\006\003\125\004\013\023\020\167 +\167\167\056\144\151\147\151\143\145\162\164\056\143\157\155\061 +\040\060\036\006\003\125\004\003\023\027\104\151\147\151\103\145 +\162\164\040\107\154\157\142\141\154\040\122\157\157\164\040\103 +\101\060\036\027\015\060\066\061\061\061\060\060\060\060\060\060 +\060\132\027\015\063\061\061\061\061\060\060\060\060\060\060\060 +\132\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123 +\061\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103 +\145\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013 +\023\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143 +\157\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147 +\151\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157 +\164\040\103\101\060\202\001\042\060\015\006\011\052\206\110\206 +\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012 +\002\202\001\001\000\342\073\341\021\162\336\250\244\323\243\127 +\252\120\242\217\013\167\220\311\242\245\356\022\316\226\133\001 +\011\040\314\001\223\247\116\060\267\123\367\103\304\151\000\127 +\235\342\215\042\335\207\006\100\000\201\011\316\316\033\203\277 +\337\315\073\161\106\342\326\146\307\005\263\166\047\026\217\173 +\236\036\225\175\356\267\110\243\010\332\326\257\172\014\071\006 +\145\177\112\135\037\274\027\370\253\276\356\050\327\164\177\172 +\170\231\131\205\150\156\134\043\062\113\277\116\300\350\132\155 +\343\160\277\167\020\277\374\001\366\205\331\250\104\020\130\062 +\251\165\030\325\321\242\276\107\342\047\152\364\232\063\370\111 +\010\140\213\324\137\264\072\204\277\241\252\112\114\175\076\317 +\117\137\154\166\136\240\113\067\221\236\334\042\346\155\316\024 +\032\216\152\313\376\315\263\024\144\027\307\133\051\236\062\277 +\362\356\372\323\013\102\324\253\267\101\062\332\014\324\357\370 +\201\325\273\215\130\077\265\033\350\111\050\242\160\332\061\004 +\335\367\262\026\362\114\012\116\007\250\355\112\075\136\265\177 +\243\220\303\257\047\002\003\001\000\001\243\143\060\141\060\016 +\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\017 +\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 +\035\006\003\125\035\016\004\026\004\024\003\336\120\065\126\321 +\114\273\146\360\243\342\033\033\303\227\262\075\321\125\060\037 +\006\003\125\035\043\004\030\060\026\200\024\003\336\120\065\126 +\321\114\273\146\360\243\342\033\033\303\227\262\075\321\125\060 +\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003\202 +\001\001\000\313\234\067\252\110\023\022\012\372\335\104\234\117 +\122\260\364\337\256\004\365\171\171\010\243\044\030\374\113\053 +\204\300\055\271\325\307\376\364\301\037\130\313\270\155\234\172 +\164\347\230\051\253\021\265\343\160\240\241\315\114\210\231\223 +\214\221\160\342\253\017\034\276\223\251\377\143\325\344\007\140 +\323\243\277\235\133\011\361\325\216\343\123\364\216\143\372\077 +\247\333\264\146\337\142\146\326\321\156\101\215\362\055\265\352 +\167\112\237\235\130\342\053\131\300\100\043\355\055\050\202\105 +\076\171\124\222\046\230\340\200\110\250\067\357\360\326\171\140 +\026\336\254\350\016\315\156\254\104\027\070\057\111\332\341\105 +\076\052\271\066\123\317\072\120\006\367\056\350\304\127\111\154 +\141\041\030\325\004\255\170\074\054\072\200\153\247\353\257\025 +\024\351\330\211\301\271\070\154\342\221\154\212\377\144\271\167 +\045\127\060\300\033\044\243\341\334\351\337\107\174\265\264\044 +\010\005\060\354\055\275\013\277\105\277\120\271\251\363\353\230 +\001\022\255\310\210\306\230\064\137\215\012\074\306\351\325\225 +\225\155\336 END CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE -# Trust for "Microsoft TLS ECC Root G2" -# Issuer: CN=Microsoft TLS ECC Root G2,O=Microsoft Corporation,C=US -# Serial Number:72:e2:02:2b:c5:b2:c1:b0:4d:25:05:6e:62:e2:76:79 -# Subject: CN=Microsoft TLS ECC Root G2,O=Microsoft Corporation,C=US -# Not Valid Before: Thu Apr 10 20:52:36 2025 -# Not Valid After : Tue Apr 10 20:58:59 2040 -# Fingerprint (SHA-256): 87:75:5C:FE:88:BD:B0:D1:09:9D:CD:ED:3E:AE:11:4B:A9:76:E6:64:B3:24:8E:E3:DC:64:9E:35:7F:17:E8:A7 -# Fingerprint (SHA1): F8:2B:B9:51:BA:6B:8A:85:AD:FA:75:15:02:85:60:D1:25:0E:72:37 +# Trust for "DigiCert Global Root CA" +# Issuer: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US +# Serial Number:08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a +# Subject: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US +# Not Valid Before: Fri Nov 10 00:00:00 2006 +# Not Valid After : Mon Nov 10 00:00:00 2031 +# Fingerprint (SHA-256): 43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:01:61 +# Fingerprint (SHA1): A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Microsoft TLS ECC Root G2" +CKA_LABEL UTF8 "DigiCert Global Root CA" CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\370\053\271\121\272\153\212\205\255\372\165\025\002\205\140\321 -\045\016\162\067 +\250\230\135\072\145\345\345\304\262\327\326\155\100\306\335\057 +\261\234\124\066 END CKA_CERT_MD5_HASH MULTILINE_OCTAL -\145\135\363\235\302\063\135\000\103\264\133\132\216\042\341\167 +\171\344\251\204\015\175\072\226\327\300\117\342\103\114\211\056 END CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\042\060\040\006\003\125\004\003\023\031\115\151\143\162\157\163 -\157\146\164\040\124\114\123\040\105\103\103\040\122\157\157\164 -\040\107\062 +\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 +\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 +\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 +\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 +\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 +\040\103\101 END CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\162\342\002\053\305\262\301\260\115\045\005\156\142\342 -\166\171 +\002\020\010\073\340\126\220\102\106\261\241\165\152\311\131\221 +\307\112 END CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST @@ -3312,168 +3339,260 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE # -# Certificate "Microsoft TLS RSA Root G2" +# Certificate "DigiCert Global Root G3" # -# Issuer: CN=Microsoft TLS RSA Root G2,O=Microsoft Corporation,C=US -# Serial Number:64:86:e3:b2:69:18:0f:bf:40:40:39:2e:2e:53:4b:9b -# Subject: CN=Microsoft TLS RSA Root G2,O=Microsoft Corporation,C=US -# Not Valid Before: Thu Apr 10 18:36:30 2025 -# Not Valid After : Tue Apr 10 18:43:51 2040 -# Fingerprint (SHA-256): 6A:17:05:83:DB:58:41:51:E1:C4:54:EE:CA:2A:64:CC:5D:8E:48:4A:5B:D1:15:6E:72:0B:44:58:65:4E:E9:E5 -# Fingerprint (SHA1): 21:73:4D:95:A2:47:3B:E2:5C:BF:D1:2A:84:C6:FB:C5:BC:8E:24:14 +# Issuer: CN=DigiCert Global Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US +# Serial Number:05:55:56:bc:f2:5e:a4:35:35:c3:a4:0f:d5:ab:45:72 +# Subject: CN=DigiCert Global Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US +# Not Valid Before: Thu Aug 01 12:00:00 2013 +# Not Valid After : Fri Jan 15 12:00:00 2038 +# Fingerprint (SHA-256): 31:AD:66:48:F8:10:41:38:C7:38:F3:9E:A4:32:01:33:39:3E:3A:18:CC:02:29:6E:F9:7C:2A:C9:EF:67:31:D0 +# Fingerprint (SHA1): 7E:04:DE:89:6A:3E:66:6D:00:E6:87:D3:3F:FA:D9:3B:E8:3D:34:9E CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Microsoft TLS RSA Root G2" +CKA_LABEL UTF8 "DigiCert Global Root G3" CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\042\060\040\006\003\125\004\003\023\031\115\151\143\162\157\163 -\157\146\164\040\124\114\123\040\122\123\101\040\122\157\157\164 +\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 +\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 +\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 +\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 +\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 +\040\107\063 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 +\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 +\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 +\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 +\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 +\040\107\063 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\005\125\126\274\362\136\244\065\065\303\244\017\325\253 +\105\162 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\002\077\060\202\001\305\240\003\002\001\002\002\020\005 +\125\126\274\362\136\244\065\065\303\244\017\325\253\105\162\060 +\012\006\010\052\206\110\316\075\004\003\003\060\141\061\013\060 +\011\006\003\125\004\006\023\002\125\123\061\025\060\023\006\003 +\125\004\012\023\014\104\151\147\151\103\145\162\164\040\111\156 +\143\061\031\060\027\006\003\125\004\013\023\020\167\167\167\056 +\144\151\147\151\143\145\162\164\056\143\157\155\061\040\060\036 +\006\003\125\004\003\023\027\104\151\147\151\103\145\162\164\040 +\107\154\157\142\141\154\040\122\157\157\164\040\107\063\060\036 +\027\015\061\063\060\070\060\061\061\062\060\060\060\060\132\027 +\015\063\070\060\061\061\065\061\062\060\060\060\060\132\060\141 +\061\013\060\011\006\003\125\004\006\023\002\125\123\061\025\060 +\023\006\003\125\004\012\023\014\104\151\147\151\103\145\162\164 +\040\111\156\143\061\031\060\027\006\003\125\004\013\023\020\167 +\167\167\056\144\151\147\151\143\145\162\164\056\143\157\155\061 +\040\060\036\006\003\125\004\003\023\027\104\151\147\151\103\145 +\162\164\040\107\154\157\142\141\154\040\122\157\157\164\040\107 +\063\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005 +\053\201\004\000\042\003\142\000\004\335\247\331\273\212\270\013 +\373\013\177\041\322\360\276\276\163\363\063\135\032\274\064\352 +\336\306\233\274\320\225\366\360\314\320\013\272\141\133\121\106 +\176\236\055\237\356\216\143\014\027\354\007\160\365\317\204\056 +\100\203\234\350\077\101\155\073\255\323\244\024\131\066\170\235 +\003\103\356\020\023\154\162\336\256\210\247\241\153\265\103\316 +\147\334\043\377\003\034\243\342\076\243\102\060\100\060\017\006 +\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016 +\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\035 +\006\003\125\035\016\004\026\004\024\263\333\110\244\371\241\305 +\330\256\066\101\314\021\143\151\142\051\274\113\306\060\012\006 +\010\052\206\110\316\075\004\003\003\003\150\000\060\145\002\061 +\000\255\274\362\154\077\022\112\321\055\071\303\012\011\227\163 +\364\210\066\214\210\047\273\346\210\215\120\205\247\143\371\236 +\062\336\146\223\017\361\314\261\011\217\335\154\253\372\153\177 +\240\002\060\071\146\133\302\144\215\270\236\120\334\250\325\111 +\242\355\307\334\321\111\177\027\001\270\310\206\217\116\214\210 +\053\250\232\251\212\305\321\000\275\370\124\342\232\345\133\174 +\263\047\027 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "DigiCert Global Root G3" +# Issuer: CN=DigiCert Global Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US +# Serial Number:05:55:56:bc:f2:5e:a4:35:35:c3:a4:0f:d5:ab:45:72 +# Subject: CN=DigiCert Global Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US +# Not Valid Before: Thu Aug 01 12:00:00 2013 +# Not Valid After : Fri Jan 15 12:00:00 2038 +# Fingerprint (SHA-256): 31:AD:66:48:F8:10:41:38:C7:38:F3:9E:A4:32:01:33:39:3E:3A:18:CC:02:29:6E:F9:7C:2A:C9:EF:67:31:D0 +# Fingerprint (SHA1): 7E:04:DE:89:6A:3E:66:6D:00:E6:87:D3:3F:FA:D9:3B:E8:3D:34:9E +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "DigiCert Global Root G3" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\176\004\336\211\152\076\146\155\000\346\207\323\077\372\331\073 +\350\075\064\236 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\365\135\244\120\245\373\050\176\036\017\015\314\226\127\126\312 +END +CKA_ISSUER MULTILINE_OCTAL +\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 +\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 +\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 +\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 +\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 +\040\107\063 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\005\125\126\274\362\136\244\065\065\303\244\017\325\253 +\105\162 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "DigiCert Global Root G2" +# +# Issuer: CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US +# Serial Number:03:3a:f1:e6:a7:11:a9:a0:bb:28:64:b1:1d:09:fa:e5 +# Subject: CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US +# Not Valid Before: Thu Aug 01 12:00:00 2013 +# Not Valid After : Fri Jan 15 12:00:00 2038 +# Fingerprint (SHA-256): CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F +# Fingerprint (SHA1): DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "DigiCert Global Root G2" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 +\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 +\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 +\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 +\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 \040\107\062 END CKA_ID UTF8 "0" CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\042\060\040\006\003\125\004\003\023\031\115\151\143\162\157\163 -\157\146\164\040\124\114\123\040\122\123\101\040\122\157\157\164 +\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 +\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 +\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 +\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 +\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 \040\107\062 END CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\144\206\343\262\151\030\017\277\100\100\071\056\056\123 -\113\233 +\002\020\003\072\361\346\247\021\251\240\273\050\144\261\035\011 +\372\345 END CKA_VALUE MULTILINE_OCTAL -\060\202\005\200\060\202\003\150\240\003\002\001\002\002\020\144 -\206\343\262\151\030\017\277\100\100\071\056\056\123\113\233\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\121 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\036\060 -\034\006\003\125\004\012\023\025\115\151\143\162\157\163\157\146 -\164\040\103\157\162\160\157\162\141\164\151\157\156\061\042\060 -\040\006\003\125\004\003\023\031\115\151\143\162\157\163\157\146 -\164\040\124\114\123\040\122\123\101\040\122\157\157\164\040\107 -\062\060\036\027\015\062\065\060\064\061\060\061\070\063\066\063 -\060\132\027\015\064\060\060\064\061\060\061\070\064\063\065\061 -\132\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157 -\163\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156 -\061\042\060\040\006\003\125\004\003\023\031\115\151\143\162\157 -\163\157\146\164\040\124\114\123\040\122\123\101\040\122\157\157 -\164\040\107\062\060\202\002\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012 -\002\202\002\001\000\337\352\213\237\107\341\050\020\161\257\101 -\326\031\333\222\127\336\153\253\346\056\336\255\072\140\203\267 -\023\230\254\133\271\062\013\173\353\237\162\047\153\135\100\253 -\276\030\006\223\262\015\322\022\355\270\164\365\177\057\352\250 -\027\224\366\063\026\127\212\336\040\174\041\335\267\332\254\336 -\116\144\260\132\315\113\165\363\357\002\144\115\355\122\332\243 -\217\004\350\221\370\327\373\077\031\375\116\105\071\136\350\051 -\303\326\362\147\257\263\000\224\301\215\341\360\112\030\230\071 -\372\300\011\204\063\101\005\003\005\253\364\165\341\123\245\041 -\222\134\104\114\346\140\127\244\220\002\227\307\325\330\223\004 -\062\112\355\205\121\355\326\305\272\240\077\066\212\057\157\114 -\071\250\004\151\042\204\073\165\024\367\331\076\264\251\320\007 -\101\070\201\176\106\110\035\350\031\346\160\270\240\252\030\335 -\162\277\176\175\265\154\116\031\160\021\204\004\023\201\324\142 -\375\234\153\361\034\335\377\354\247\340\346\307\215\061\113\277 -\362\153\063\314\321\214\266\376\261\033\243\112\250\137\016\177 -\061\166\070\077\007\107\154\001\250\254\245\024\332\202\260\137 -\037\154\274\211\032\300\022\052\313\173\227\037\050\056\061\026 -\212\123\114\165\146\371\175\001\326\302\140\252\145\217\061\236 -\162\313\314\233\055\345\104\031\223\127\253\156\216\302\331\056 -\145\260\162\055\347\241\303\241\176\111\035\131\147\326\011\324 -\030\022\155\300\225\105\170\311\361\140\152\344\366\356\006\044 -\073\163\112\132\021\302\076\227\141\300\170\356\357\023\247\060 -\342\112\070\055\356\130\027\023\040\267\066\052\337\013\062\264 -\302\070\261\221\335\022\260\105\266\174\300\261\035\142\241\235 -\335\161\022\025\226\001\235\012\011\365\261\335\263\331\340\070 -\102\064\366\151\266\303\257\026\163\376\324\103\370\103\344\130 -\371\117\263\363\354\326\075\224\072\100\070\025\253\014\206\320 -\144\316\032\143\350\204\224\125\011\132\266\004\266\321\076\232 -\025\307\144\021\200\320\033\202\016\115\377\105\236\262\145\007 -\045\037\333\232\310\306\354\326\133\205\120\004\237\034\313\135 -\040\202\147\236\171\342\337\350\362\350\157\304\040\162\060\206 -\345\235\165\047\065\002\003\001\000\001\243\124\060\122\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\017 +\060\202\003\216\060\202\002\166\240\003\002\001\002\002\020\003 +\072\361\346\247\021\251\240\273\050\144\261\035\011\372\345\060 +\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\141 +\061\013\060\011\006\003\125\004\006\023\002\125\123\061\025\060 +\023\006\003\125\004\012\023\014\104\151\147\151\103\145\162\164 +\040\111\156\143\061\031\060\027\006\003\125\004\013\023\020\167 +\167\167\056\144\151\147\151\143\145\162\164\056\143\157\155\061 +\040\060\036\006\003\125\004\003\023\027\104\151\147\151\103\145 +\162\164\040\107\154\157\142\141\154\040\122\157\157\164\040\107 +\062\060\036\027\015\061\063\060\070\060\061\061\062\060\060\060 +\060\132\027\015\063\070\060\061\061\065\061\062\060\060\060\060 +\132\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123 +\061\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103 +\145\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013 +\023\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143 +\157\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147 +\151\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157 +\164\040\107\062\060\202\001\042\060\015\006\011\052\206\110\206 +\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012 +\002\202\001\001\000\273\067\315\064\334\173\153\311\262\150\220 +\255\112\165\377\106\272\041\012\010\215\365\031\124\311\373\210 +\333\363\256\362\072\211\221\074\172\346\253\006\032\153\317\254 +\055\350\136\011\044\104\272\142\232\176\326\243\250\176\340\124 +\165\040\005\254\120\267\234\143\032\154\060\334\332\037\031\261 +\327\036\336\375\327\340\313\224\203\067\256\354\037\103\116\335 +\173\054\322\275\056\245\057\344\251\270\255\072\324\231\244\266 +\045\351\233\153\000\140\222\140\377\117\041\111\030\367\147\220 +\253\141\006\234\217\362\272\351\264\351\222\062\153\265\363\127 +\350\135\033\315\214\035\253\225\004\225\111\363\065\055\226\343 +\111\155\335\167\343\373\111\113\264\254\125\007\251\217\225\263 +\264\043\273\114\155\105\360\366\251\262\225\060\264\375\114\125 +\214\047\112\127\024\174\202\235\315\163\222\323\026\112\006\014 +\214\120\321\217\036\011\276\027\241\346\041\312\375\203\345\020 +\274\203\245\012\304\147\050\366\163\024\024\075\106\166\303\207 +\024\211\041\064\115\257\017\105\014\246\111\241\272\273\234\305 +\261\063\203\051\205\002\003\001\000\001\243\102\060\100\060\017 \006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\035\006\003\125\035\016\004\026\004\024\336\221\206\110\267\241 -\061\131\061\361\113\137\007\251\334\210\171\332\250\166\060\020 -\006\011\053\006\001\004\001\202\067\025\001\004\003\002\001\000 -\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000\003 -\202\002\001\000\164\063\232\120\171\256\201\126\045\317\233\157 -\121\021\336\125\022\220\223\154\063\340\056\044\014\136\144\142 -\064\116\066\031\265\240\024\363\265\306\170\323\243\355\260\073 -\012\136\222\076\162\033\056\012\203\336\277\237\250\323\071\250 -\016\330\043\065\007\005\217\266\363\306\032\324\103\044\027\223 -\232\033\100\360\171\335\311\300\017\163\032\005\207\213\012\272 -\333\044\210\264\204\275\315\352\177\033\355\166\245\064\007\272 -\156\016\352\163\072\110\302\355\361\235\177\367\216\005\023\333 -\313\323\175\050\134\314\262\276\240\171\020\052\046\353\162\344 -\246\241\227\036\166\304\074\176\126\232\363\346\075\317\342\325 -\004\031\152\074\327\070\345\343\273\036\005\017\335\110\053\174 -\071\235\351\117\115\167\250\275\111\050\237\347\271\050\133\066 -\364\163\040\202\126\026\325\301\132\115\304\355\373\007\314\150 -\067\256\303\164\123\253\227\050\000\003\106\204\321\332\071\236 -\117\020\112\077\231\102\053\065\250\071\225\267\176\201\076\154 -\257\375\274\251\256\300\222\114\302\064\045\073\027\247\233\213 -\100\012\043\362\212\326\270\000\077\122\136\126\273\171\353\213 -\211\370\044\211\340\315\346\016\372\317\010\110\146\315\312\226 -\240\265\313\057\157\104\023\346\306\070\236\361\004\220\361\023 -\110\265\110\102\050\375\377\201\110\142\121\125\224\237\147\111 -\137\154\110\376\307\321\355\221\240\264\033\266\320\153\273\023 -\140\240\250\237\222\375\063\125\314\201\117\063\343\232\107\243 -\305\063\231\234\065\157\174\037\244\113\137\075\017\071\143\017 -\372\055\120\216\254\031\224\375\277\227\331\216\130\314\200\151 -\100\147\070\266\306\027\353\034\252\257\204\126\122\237\140\045 -\062\173\220\146\362\343\227\061\042\042\301\265\072\075\211\024 -\341\264\220\152\265\062\142\260\226\070\125\006\373\212\257\052 -\203\114\172\352\031\255\304\364\224\032\266\320\027\122\207\255 -\371\014\345\047\234\110\075\306\262\324\261\076\060\017\223\063 -\254\002\345\240\240\122\151\240\362\305\110\056\277\106\303\046 -\105\346\352\327\371\113\051\342\326\270\340\111\267\272\224\257 -\170\317\207\047\043\054\243\362\376\066\013\102\371\341\327\044 -\273\253\346\310 +\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060 +\035\006\003\125\035\016\004\026\004\024\116\042\124\040\030\225 +\346\343\156\346\017\372\372\271\022\355\006\027\217\071\060\015 +\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202\001 +\001\000\140\147\050\224\157\016\110\143\353\061\335\352\147\030 +\325\211\175\074\305\213\112\177\351\276\333\053\027\337\260\137 +\163\167\052\062\023\071\201\147\102\204\043\362\105\147\065\354 +\210\277\370\217\260\141\014\064\244\256\040\114\204\306\333\370 +\065\341\166\331\337\246\102\273\307\104\010\206\177\066\164\044 +\132\332\154\015\024\131\065\275\362\111\335\266\037\311\263\015 +\107\052\075\231\057\273\134\273\265\324\040\341\231\137\123\106 +\025\333\150\233\360\363\060\325\076\061\342\215\204\236\343\212 +\332\332\226\076\065\023\245\137\360\371\160\120\160\107\101\021 +\127\031\116\300\217\256\006\304\225\023\027\057\033\045\237\165 +\362\261\216\231\241\157\023\261\101\161\376\210\052\310\117\020 +\040\125\327\363\024\105\345\340\104\364\352\207\225\062\223\016 +\376\123\106\372\054\235\377\213\042\271\113\331\011\105\244\336 +\244\270\232\130\335\033\175\122\237\216\131\103\210\201\244\236 +\046\325\157\255\335\015\306\067\175\355\003\222\033\345\167\137 +\166\356\074\215\304\135\126\133\242\331\146\156\263\065\067\345 +\062\266 END CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE -# Trust for "Microsoft TLS RSA Root G2" -# Issuer: CN=Microsoft TLS RSA Root G2,O=Microsoft Corporation,C=US -# Serial Number:64:86:e3:b2:69:18:0f:bf:40:40:39:2e:2e:53:4b:9b -# Subject: CN=Microsoft TLS RSA Root G2,O=Microsoft Corporation,C=US -# Not Valid Before: Thu Apr 10 18:36:30 2025 -# Not Valid After : Tue Apr 10 18:43:51 2040 -# Fingerprint (SHA-256): 6A:17:05:83:DB:58:41:51:E1:C4:54:EE:CA:2A:64:CC:5D:8E:48:4A:5B:D1:15:6E:72:0B:44:58:65:4E:E9:E5 -# Fingerprint (SHA1): 21:73:4D:95:A2:47:3B:E2:5C:BF:D1:2A:84:C6:FB:C5:BC:8E:24:14 +# Trust for "DigiCert Global Root G2" +# Issuer: CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US +# Serial Number:03:3a:f1:e6:a7:11:a9:a0:bb:28:64:b1:1d:09:fa:e5 +# Subject: CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US +# Not Valid Before: Thu Aug 01 12:00:00 2013 +# Not Valid After : Fri Jan 15 12:00:00 2038 +# Fingerprint (SHA-256): CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F +# Fingerprint (SHA1): DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Microsoft TLS RSA Root G2" +CKA_LABEL UTF8 "DigiCert Global Root G2" CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\041\163\115\225\242\107\073\342\134\277\321\052\204\306\373\305 -\274\216\044\024 +\337\074\044\371\277\326\146\166\033\046\200\163\376\006\321\314 +\215\117\202\244 END CKA_CERT_MD5_HASH MULTILINE_OCTAL -\026\212\065\244\272\263\236\123\271\074\053\101\136\351\342\233 +\344\246\212\310\124\254\122\102\106\012\375\162\110\033\052\104 END CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\042\060\040\006\003\125\004\003\023\031\115\151\143\162\157\163 -\157\146\164\040\124\114\123\040\122\123\101\040\122\157\157\164 +\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 +\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 +\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 +\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 +\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 \040\107\062 END CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\144\206\343\262\151\030\017\277\100\100\071\056\056\123 -\113\233 +\002\020\003\072\361\346\247\021\251\240\273\050\144\261\035\011 +\372\345 END CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST diff --git a/SPECS/ca-certificates/certdata.microsoft.txt b/SPECS/ca-certificates/certdata.microsoft.txt index 4e919e50d8..24d0efded3 100644 --- a/SPECS/ca-certificates/certdata.microsoft.txt +++ b/SPECS/ca-certificates/certdata.microsoft.txt @@ -1,4 +1,4 @@ -# Release: May 2025 +# Release: August 2025 # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this @@ -1432,131 +1432,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "RXC-R2" -# -# Issuer: CN=Cisco RXC-R2,O=Cisco Systems,C=US -# Serial Number: 1 (0x1) -# Subject: CN=Cisco RXC-R2,O=Cisco Systems,C=US -# Not Valid Before: Wed Jul 09 21:46:56 2014 -# Not Valid After : Sun Jul 09 21:46:56 2034 -# Fingerprint (SHA-256): 22:9C:CC:19:6D:32:C9:84:21:CC:11:9E:78:48:6E:EB:EF:60:3A:EC:D5:25:C6:B8:8B:47:AB:B7:40:69:2B:96 -# Fingerprint (SHA1): 2C:8A:FF:CE:96:64:30:BA:04:C0:4F:81:DD:4B:49:C7:1B:5B:81:A0 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "RXC-R2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\074\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\026\060\024\006\003\125\004\012\023\015\103\151\163\143\157\040 -\123\171\163\164\145\155\163\061\025\060\023\006\003\125\004\003 -\023\014\103\151\163\143\157\040\122\130\103\055\122\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\074\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\026\060\024\006\003\125\004\012\023\015\103\151\163\143\157\040 -\123\171\163\164\145\155\163\061\025\060\023\006\003\125\004\003 -\023\014\103\151\163\143\157\040\122\130\103\055\122\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\065\060\202\002\035\240\003\002\001\002\002\001\001 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\074\061\013\060\011\006\003\125\004\006\023\002\125\123\061\026 -\060\024\006\003\125\004\012\023\015\103\151\163\143\157\040\123 -\171\163\164\145\155\163\061\025\060\023\006\003\125\004\003\023 -\014\103\151\163\143\157\040\122\130\103\055\122\062\060\036\027 -\015\061\064\060\067\060\071\062\061\064\066\065\066\132\027\015 -\063\064\060\067\060\071\062\061\064\066\065\066\132\060\074\061 -\013\060\011\006\003\125\004\006\023\002\125\123\061\026\060\024 -\006\003\125\004\012\023\015\103\151\163\143\157\040\123\171\163 -\164\145\155\163\061\025\060\023\006\003\125\004\003\023\014\103 -\151\163\143\157\040\122\130\103\055\122\062\060\202\001\042\060 -\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202 -\001\017\000\060\202\001\012\002\202\001\001\000\333\102\061\173 -\012\323\234\052\115\307\272\322\144\006\144\260\010\057\314\023 -\352\055\066\076\167\356\076\330\166\024\001\203\301\113\117\057 -\210\313\034\022\126\362\345\111\044\100\113\242\155\351\312\023 -\351\163\370\332\251\335\140\351\327\135\053\034\012\341\215\213 -\274\165\277\163\130\374\350\203\052\215\162\336\023\337\377\273 -\237\061\064\077\241\210\350\101\307\124\020\244\357\201\025\356 -\043\245\005\272\065\022\230\251\151\163\354\156\132\074\357\214 -\176\115\363\015\141\047\021\144\151\242\053\037\332\063\116\234 -\326\025\251\024\035\021\216\076\305\237\115\035\073\000\115\055 -\315\154\001\205\000\064\142\355\134\164\013\247\122\211\342\076 -\012\323\154\115\021\272\164\305\074\307\317\310\137\215\025\315 -\021\062\076\322\052\061\045\255\033\013\263\323\031\072\051\254 -\201\324\000\330\270\025\274\230\176\143\176\347\310\070\271\365 -\375\164\240\127\076\337\225\253\062\174\237\042\051\265\265\172 -\202\040\244\143\162\134\221\201\043\177\142\075\144\330\146\314 -\041\370\351\073\263\006\154\222\075\046\077\061\002\003\001\000 -\001\243\102\060\100\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004 -\024\220\162\004\140\375\335\372\204\354\216\132\004\130\367\317 -\373\303\162\011\026\060\015\006\011\052\206\110\206\367\015\001 -\001\013\005\000\003\202\001\001\000\201\015\364\141\145\143\233 -\156\127\032\112\072\164\003\313\121\022\046\043\035\240\326\366 -\204\172\076\115\361\167\224\214\140\115\232\306\234\270\346\161 -\143\155\365\302\257\321\323\007\077\246\213\304\253\272\165\060 -\077\211\163\202\377\217\370\114\262\117\362\246\267\242\221\256 -\155\263\370\043\353\350\225\032\173\026\040\261\351\347\066\057 -\323\106\150\252\165\144\127\143\210\062\255\204\254\012\002\101 -\217\015\300\356\312\300\122\366\122\231\256\211\022\043\366\023 -\213\044\307\162\225\036\151\142\303\040\132\053\116\012\112\102 -\212\301\216\033\372\204\010\145\132\266\162\014\222\233\146\301 -\326\255\276\110\302\071\214\311\075\245\025\041\321\251\310\231 -\260\362\144\360\200\106\302\020\272\025\003\344\303\222\142\037 -\206\210\156\350\116\352\357\261\376\364\037\124\161\271\232\320 -\375\034\041\014\253\036\012\124\225\133\060\142\056\330\203\133 -\162\316\002\216\124\066\072\262\100\006\140\145\304\265\312\020 -\054\031\313\017\134\036\336\172\136\374\334\206\103\156\256\320 -\220\256\021\111\103\106\002\221\016 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "RXC-R2" -# Issuer: CN=Cisco RXC-R2,O=Cisco Systems,C=US -# Serial Number: 1 (0x1) -# Subject: CN=Cisco RXC-R2,O=Cisco Systems,C=US -# Not Valid Before: Wed Jul 09 21:46:56 2014 -# Not Valid After : Sun Jul 09 21:46:56 2034 -# Fingerprint (SHA-256): 22:9C:CC:19:6D:32:C9:84:21:CC:11:9E:78:48:6E:EB:EF:60:3A:EC:D5:25:C6:B8:8B:47:AB:B7:40:69:2B:96 -# Fingerprint (SHA1): 2C:8A:FF:CE:96:64:30:BA:04:C0:4F:81:DD:4B:49:C7:1B:5B:81:A0 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "RXC-R2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\054\212\377\316\226\144\060\272\004\300\117\201\335\113\111\307 -\033\133\201\240 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\370\254\130\302\266\102\025\143\005\202\363\066\357\306\057\022 -END -CKA_ISSUER MULTILINE_OCTAL -\060\074\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\026\060\024\006\003\125\004\012\023\015\103\151\163\143\157\040 -\123\171\163\164\145\155\163\061\025\060\023\006\003\125\004\003 -\023\014\103\151\163\143\157\040\122\130\103\055\122\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "GlobalSign Root CA - R6" # @@ -2077,130 +1952,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "CCA India 2015" -# -# Issuer: CN=CCA India 2015 SPL,O=India PKI,C=IN -# Serial Number: 10165 (0x27b5) -# Subject: CN=CCA India 2015 SPL,O=India PKI,C=IN -# Not Valid Before: Thu Jan 29 11:36:43 2015 -# Not Valid After : Wed Jan 29 11:36:43 2025 -# Fingerprint (SHA-256): C3:4C:5D:F5:30:80:07:8F:FE:45:B2:1A:7F:60:04:69:91:72:04:F4:F0:29:3F:1D:72:09:39:3E:52:65:C0:4F -# Fingerprint (SHA1): 3B:C6:DC:E0:03:07:BD:67:60:41:EB:D8:59:70:C6:2F:8F:DA:51:09 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "CCA India 2015" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\076\061\013\060\011\006\003\125\004\006\023\002\111\116\061 -\022\060\020\006\003\125\004\012\023\011\111\156\144\151\141\040 -\120\113\111\061\033\060\031\006\003\125\004\003\023\022\103\103 -\101\040\111\156\144\151\141\040\062\060\061\065\040\123\120\114 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\076\061\013\060\011\006\003\125\004\006\023\002\111\116\061 -\022\060\020\006\003\125\004\012\023\011\111\156\144\151\141\040 -\120\113\111\061\033\060\031\006\003\125\004\003\023\022\103\103 -\101\040\111\156\144\151\141\040\062\060\061\065\040\123\120\114 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\002\047\265 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\053\060\202\002\023\240\003\002\001\002\002\002\047 -\265\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000 -\060\076\061\013\060\011\006\003\125\004\006\023\002\111\116\061 -\022\060\020\006\003\125\004\012\023\011\111\156\144\151\141\040 -\120\113\111\061\033\060\031\006\003\125\004\003\023\022\103\103 -\101\040\111\156\144\151\141\040\062\060\061\065\040\123\120\114 -\060\036\027\015\061\065\060\061\062\071\061\061\063\066\064\063 -\132\027\015\062\065\060\061\062\071\061\061\063\066\064\063\132 -\060\076\061\013\060\011\006\003\125\004\006\023\002\111\116\061 -\022\060\020\006\003\125\004\012\023\011\111\156\144\151\141\040 -\120\113\111\061\033\060\031\006\003\125\004\003\023\022\103\103 -\101\040\111\156\144\151\141\040\062\060\061\065\040\123\120\114 -\060\202\001\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\001\017\000\060\202\001\012\002\202\001\001 -\000\227\327\066\211\075\067\101\016\221\077\153\040\137\374\072 -\176\073\132\135\057\303\014\207\123\074\030\242\310\141\163\015 -\010\016\126\036\322\156\140\245\127\145\334\376\317\120\206\017 -\132\116\253\142\213\004\312\126\357\341\321\236\256\164\255\252 -\372\077\101\130\321\125\160\160\076\105\311\033\200\163\374\010 -\210\344\213\162\250\012\265\051\127\260\255\012\221\101\032\234 -\137\120\175\254\027\032\045\133\041\360\225\053\347\337\067\254 -\064\363\007\260\361\035\301\023\357\173\056\072\305\251\141\220 -\262\170\137\124\120\074\263\132\125\143\266\313\020\243\157\373 -\015\364\266\357\346\010\336\242\020\277\166\227\177\352\331\226 -\321\324\303\163\002\161\264\251\260\254\254\037\027\040\245\107 -\106\326\104\002\070\231\276\313\024\170\376\346\137\304\177\335 -\157\351\252\107\024\220\021\330\035\200\300\025\324\214\240\231 -\343\031\016\012\017\314\032\010\234\324\123\007\000\340\037\111 -\277\202\202\114\317\233\330\156\323\324\021\000\022\154\017\175 -\140\147\112\214\120\333\362\057\340\271\171\207\203\303\134\302 -\071\002\003\001\000\001\243\063\060\061\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\021\006\003\125 -\035\016\004\012\004\010\114\021\160\252\217\335\037\007\060\013 -\006\003\125\035\017\004\004\003\002\001\006\060\015\006\011\052 -\206\110\206\367\015\001\001\013\005\000\003\202\001\001\000\055 -\274\214\025\312\064\355\114\050\042\273\341\123\045\113\072\227 -\251\355\046\242\244\253\115\373\012\022\156\347\065\346\147\016 -\030\201\142\066\245\314\302\337\032\345\150\001\201\116\263\231 -\324\107\025\022\235\166\351\241\246\023\035\260\377\175\273\127 -\343\357\131\233\310\073\120\151\306\143\072\254\240\301\345\220 -\350\144\051\134\110\101\151\067\254\073\273\335\343\125\306\327 -\222\015\225\203\260\050\127\302\243\251\226\247\312\336\114\036 -\232\377\076\245\056\047\136\333\146\147\047\205\357\253\212\134 -\163\174\210\315\107\146\360\235\203\314\204\217\342\051\364\037 -\101\157\267\365\041\015\365\224\126\121\343\374\377\023\130\267 -\237\003\356\051\237\322\001\260\142\236\224\275\031\206\132\103 -\372\152\211\201\260\352\134\030\207\312\200\225\373\355\001\277 -\021\032\337\225\024\256\056\342\257\315\221\220\272\263\047\303 -\157\020\330\331\016\264\245\164\154\201\267\137\031\314\376\047 -\116\263\105\230\130\030\234\127\304\222\162\022\317\247\202\071 -\325\341\020\227\012\206\060\105\205\143\250\153\115\232\374 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "CCA India 2015" -# Issuer: CN=CCA India 2015 SPL,O=India PKI,C=IN -# Serial Number: 10165 (0x27b5) -# Subject: CN=CCA India 2015 SPL,O=India PKI,C=IN -# Not Valid Before: Thu Jan 29 11:36:43 2015 -# Not Valid After : Wed Jan 29 11:36:43 2025 -# Fingerprint (SHA-256): C3:4C:5D:F5:30:80:07:8F:FE:45:B2:1A:7F:60:04:69:91:72:04:F4:F0:29:3F:1D:72:09:39:3E:52:65:C0:4F -# Fingerprint (SHA1): 3B:C6:DC:E0:03:07:BD:67:60:41:EB:D8:59:70:C6:2F:8F:DA:51:09 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "CCA India 2015" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\073\306\334\340\003\007\275\147\140\101\353\330\131\160\306\057 -\217\332\121\011 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\026\332\076\254\035\012\127\251\264\342\336\320\223\226\334\324 -END -CKA_ISSUER MULTILINE_OCTAL -\060\076\061\013\060\011\006\003\125\004\006\023\002\111\116\061 -\022\060\020\006\003\125\004\012\023\011\111\156\144\151\141\040 -\120\113\111\061\033\060\031\006\003\125\004\003\023\022\103\103 -\101\040\111\156\144\151\141\040\062\060\061\065\040\123\120\114 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\002\047\265 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Swedish Government Root Authority v3" # @@ -2376,348 +2127,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Tunisian Root Certificate Authority - TunRootCA2" -# -# Issuer: O=National Digital Certification Agency,CN=Tunisian Root Certificate Authority - TunRootCA2,C=TN -# Serial Number:21:66:15:05:05:27:05:05:bc:8a:b0:1d:af:0a:be:c4 -# Subject: O=National Digital Certification Agency,CN=Tunisian Root Certificate Authority - TunRootCA2,C=TN -# Not Valid Before: Tue May 05 08:57:01 2015 -# Not Valid After : Wed May 05 08:57:01 2027 -# Fingerprint (SHA-256): C7:95:FF:8F:F2:0C:96:66:88:F0:64:A1:E0:91:42:1D:31:10:A3:45:6C:17:EC:24:04:B9:98:73:87:41:F6:22 -# Fingerprint (SHA1): 96:38:63:3C:90:56:AE:88:14:A0:65:D2:3B:DC:60:A0:EE:70:2F:A7 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Tunisian Root Certificate Authority - TunRootCA2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\170\061\013\060\011\006\003\125\004\006\023\002\124\116\061 -\071\060\067\006\003\125\004\003\023\060\124\165\156\151\163\151 -\141\156\040\122\157\157\164\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171\040\055\040 -\124\165\156\122\157\157\164\103\101\062\061\056\060\054\006\003 -\125\004\012\023\045\116\141\164\151\157\156\141\154\040\104\151 -\147\151\164\141\154\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\147\145\156\143\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\170\061\013\060\011\006\003\125\004\006\023\002\124\116\061 -\071\060\067\006\003\125\004\003\023\060\124\165\156\151\163\151 -\141\156\040\122\157\157\164\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171\040\055\040 -\124\165\156\122\157\157\164\103\101\062\061\056\060\054\006\003 -\125\004\012\023\045\116\141\164\151\157\156\141\154\040\104\151 -\147\151\164\141\154\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\147\145\156\143\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\041\146\025\005\005\047\005\005\274\212\260\035\257\012 -\276\304 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\274\060\202\003\244\240\003\002\001\002\002\020\041 -\146\025\005\005\047\005\005\274\212\260\035\257\012\276\304\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\170 -\061\013\060\011\006\003\125\004\006\023\002\124\116\061\071\060 -\067\006\003\125\004\003\023\060\124\165\156\151\163\151\141\156 -\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164 -\145\040\101\165\164\150\157\162\151\164\171\040\055\040\124\165 -\156\122\157\157\164\103\101\062\061\056\060\054\006\003\125\004 -\012\023\045\116\141\164\151\157\156\141\154\040\104\151\147\151 -\164\141\154\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\147\145\156\143\171\060\036\027\015\061\065\060\065 -\060\065\060\070\065\067\060\061\132\027\015\062\067\060\065\060 -\065\060\070\065\067\060\061\132\060\170\061\013\060\011\006\003 -\125\004\006\023\002\124\116\061\071\060\067\006\003\125\004\003 -\023\060\124\165\156\151\163\151\141\156\040\122\157\157\164\040 -\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150 -\157\162\151\164\171\040\055\040\124\165\156\122\157\157\164\103 -\101\062\061\056\060\054\006\003\125\004\012\023\045\116\141\164 -\151\157\156\141\154\040\104\151\147\151\164\141\154\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\101\147\145\156 -\143\171\060\202\002\042\060\015\006\011\052\206\110\206\367\015 -\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202 -\002\001\000\260\007\347\142\373\320\015\125\316\147\267\127\215 -\156\014\251\047\124\036\353\251\044\253\147\217\217\234\141\017 -\333\050\062\057\073\370\054\145\222\055\256\272\063\222\300\053 -\236\362\037\136\155\043\135\263\130\037\215\241\300\155\165\205 -\012\260\023\116\133\126\106\213\071\275\013\202\273\072\103\233 -\010\272\106\356\371\027\353\315\310\327\343\165\023\336\256\121 -\110\012\316\040\225\106\237\002\354\125\214\164\252\132\374\374 -\352\011\063\065\156\243\107\006\307\335\176\204\150\016\307\022 -\312\224\303\355\346\154\002\155\336\002\211\065\263\004\313\105 -\370\174\107\244\323\037\337\345\134\043\342\363\042\173\271\113 -\242\375\027\065\135\110\351\277\365\263\045\143\213\347\170\353 -\374\165\047\275\210\134\246\205\077\101\337\225\174\335\172\106 -\217\376\036\332\261\253\330\323\216\315\006\214\311\330\122\102 -\021\122\242\203\217\134\203\173\344\047\266\217\037\240\136\075 -\322\165\175\171\123\223\006\227\343\003\307\226\054\332\001\074 -\171\305\073\120\350\260\323\241\244\342\323\203\175\104\370\020 -\317\240\032\052\362\145\200\275\167\301\230\145\166\256\022\041 -\142\312\072\276\276\265\231\303\133\304\321\277\233\300\012\312 -\130\036\025\246\327\041\136\261\115\012\345\160\170\232\150\346 -\164\146\062\024\052\036\021\276\210\367\006\366\125\243\303\037 -\156\027\220\125\321\212\100\211\126\103\325\117\346\242\311\210 -\144\000\005\121\077\127\264\074\266\276\152\221\161\100\361\242 -\134\361\327\355\234\266\127\366\131\324\052\021\345\324\345\277 -\273\036\321\310\327\137\104\005\233\273\211\072\255\247\103\167 -\176\025\140\174\210\135\233\354\245\134\322\106\255\014\213\124 -\105\324\224\121\125\105\122\252\134\330\021\254\370\126\042\154 -\331\322\024\351\267\116\102\205\124\106\370\001\306\075\046\006 -\167\350\262\065\033\360\235\102\311\177\376\200\047\001\120\313 -\177\305\254\124\372\153\155\226\214\101\244\241\322\347\265\221 -\110\157\167\034\213\302\053\164\376\074\134\304\135\224\316\253 -\361\040\226\153\301\014\132\137\371\345\065\271\154\243\020\147 -\357\221\252\110\016\357\110\267\166\130\142\331\276\236\102\263 -\244\275\065\002\003\001\000\001\243\102\060\100\060\035\006\003 -\125\035\016\004\026\004\024\314\163\305\243\152\051\061\227\247 -\215\240\330\124\301\012\165\266\043\077\246\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003 -\125\035\017\001\001\377\004\004\003\002\001\006\060\015\006\011 -\052\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000 -\056\362\207\110\355\231\236\237\001\014\074\311\012\170\123\174 -\030\065\336\266\345\154\364\000\200\341\233\213\331\372\373\252 -\373\145\267\322\311\365\327\247\313\176\311\261\242\161\130\155 -\131\067\326\340\063\020\312\265\331\162\333\116\045\067\252\246 -\335\035\030\275\365\311\212\234\172\210\356\037\002\304\055\222 -\124\175\127\342\134\031\030\043\002\172\134\111\225\266\230\347 -\302\140\101\145\100\273\354\132\267\161\234\120\362\163\166\373 -\137\015\357\065\317\264\151\215\205\350\114\220\027\003\013\311 -\263\056\040\067\143\021\142\246\117\343\064\340\373\171\125\347 -\306\302\256\102\376\260\064\154\111\043\016\162\007\173\146\005 -\125\110\373\022\017\240\300\372\116\321\373\075\314\376\375\026 -\113\126\120\315\021\054\247\233\367\261\012\317\246\353\357\335 -\216\270\256\102\010\174\244\214\224\352\206\307\103\343\367\074 -\212\337\107\322\060\100\310\055\123\365\157\021\111\314\041\214 -\226\103\117\020\240\107\241\126\215\037\034\133\330\126\133\353 -\064\166\341\065\072\161\324\314\041\057\236\065\050\362\132\336 -\236\344\356\107\152\020\350\070\275\112\264\175\004\177\005\256 -\110\012\264\003\277\056\263\012\033\237\313\255\335\115\320\207 -\041\267\107\166\202\203\055\307\127\276\232\025\243\033\060\030 -\154\243\072\161\157\144\107\050\222\333\021\141\040\232\167\145 -\055\371\254\126\023\154\113\243\137\377\233\244\350\357\347\130 -\350\173\236\073\177\152\247\276\071\012\023\224\311\110\116\146 -\144\330\123\114\354\101\153\375\374\066\056\327\016\337\141\013 -\173\265\100\254\335\102\111\155\236\200\277\140\225\360\351\300 -\077\173\273\030\351\070\265\126\116\247\176\212\142\357\230\036 -\370\170\100\251\273\330\351\345\264\264\371\343\147\234\354\123 -\317\270\102\264\057\223\201\065\240\154\366\272\040\212\150\075 -\367\155\377\177\323\114\367\172\224\150\003\167\103\073\065\121 -\252\123\022\076\107\023\024\071\254\326\145\217\250\106\377\074 -\041\364\322\277\320\110\244\176\247\121\233\227\022\365\231\064 -\027\043\126\204\023\143\313\064\312\037\312\272\250\007\051\363 -\103\044\012\111\177\375\016\324\220\360\253\103\041\142\234\217 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Tunisian Root Certificate Authority - TunRootCA2" -# Issuer: O=National Digital Certification Agency,CN=Tunisian Root Certificate Authority - TunRootCA2,C=TN -# Serial Number:21:66:15:05:05:27:05:05:bc:8a:b0:1d:af:0a:be:c4 -# Subject: O=National Digital Certification Agency,CN=Tunisian Root Certificate Authority - TunRootCA2,C=TN -# Not Valid Before: Tue May 05 08:57:01 2015 -# Not Valid After : Wed May 05 08:57:01 2027 -# Fingerprint (SHA-256): C7:95:FF:8F:F2:0C:96:66:88:F0:64:A1:E0:91:42:1D:31:10:A3:45:6C:17:EC:24:04:B9:98:73:87:41:F6:22 -# Fingerprint (SHA1): 96:38:63:3C:90:56:AE:88:14:A0:65:D2:3B:DC:60:A0:EE:70:2F:A7 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Tunisian Root Certificate Authority - TunRootCA2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\226\070\143\074\220\126\256\210\024\240\145\322\073\334\140\240 -\356\160\057\247 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\003\321\045\261\360\125\255\312\335\174\131\223\120\357\027\041 -END -CKA_ISSUER MULTILINE_OCTAL -\060\170\061\013\060\011\006\003\125\004\006\023\002\124\116\061 -\071\060\067\006\003\125\004\003\023\060\124\165\156\151\163\151 -\141\156\040\122\157\157\164\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171\040\055\040 -\124\165\156\122\157\157\164\103\101\062\061\056\060\054\006\003 -\125\004\012\023\045\116\141\164\151\157\156\141\154\040\104\151 -\147\151\164\141\154\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\147\145\156\143\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\041\146\025\005\005\047\005\005\274\212\260\035\257\012 -\276\304 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "TW Government Root Certification Authority 2" -# -# Issuer: O=Government Root Certification Authority,C=TW -# Serial Number:00:b6:4b:88:07:e2:23:ee:c8:5c:12:ad:a6:0e:06:a1:f2 -# Subject: O=Government Root Certification Authority,C=TW -# Not Valid Before: Fri Sep 28 08:58:51 2012 -# Not Valid After : Thu Dec 31 15:59:59 2037 -# Fingerprint (SHA-256): 70:B9:22:BF:DA:0E:3F:4A:34:2E:4E:E2:2D:57:9A:E5:98:D0:71:CC:5E:C9:C3:0F:12:36:80:34:03:88:AE:A5 -# Fingerprint (SHA1): B0:91:AA:91:38:47:F3:13:D7:27:BC:EF:C8:17:9F:08:6F:3A:8C:0F -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TW Government Root Certification Authority 2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\077\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\060\060\056\006\003\125\004\012\014\047\107\157\166\145\162\156 -\155\145\156\164\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\077\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\060\060\056\006\003\125\004\012\014\047\107\157\166\145\162\156 -\155\145\156\164\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\266\113\210\007\342\043\356\310\134\022\255\246\016 -\006\241\362 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\113\060\202\003\063\240\003\002\001\002\002\021\000 -\266\113\210\007\342\043\356\310\134\022\255\246\016\006\241\362 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\077\061\013\060\011\006\003\125\004\006\023\002\124\127\061\060 -\060\056\006\003\125\004\012\014\047\107\157\166\145\162\156\155 -\145\156\164\040\122\157\157\164\040\103\145\162\164\151\146\151 -\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171 -\060\036\027\015\061\062\060\071\062\070\060\070\065\070\065\061 -\132\027\015\063\067\061\062\063\061\061\065\065\071\065\071\132 -\060\077\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\060\060\056\006\003\125\004\012\014\047\107\157\166\145\162\156 -\155\145\156\164\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001 -\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002 -\001\000\266\377\227\074\201\276\001\130\044\047\257\216\001\053 -\326\162\222\060\062\033\137\233\174\324\324\177\350\241\140\163 -\060\127\020\000\372\120\226\044\376\120\346\214\072\225\321\127 -\171\204\325\147\123\014\052\202\076\030\134\270\060\046\032\326 -\136\306\055\262\004\121\016\357\337\014\143\107\353\304\022\010 -\121\053\231\161\136\325\151\173\341\135\311\167\035\040\354\126 -\216\345\141\140\055\374\351\034\200\337\372\152\203\273\005\265 -\036\043\022\234\202\312\012\363\024\035\040\344\006\217\103\044 -\231\237\266\012\223\132\163\033\026\071\276\005\266\361\214\245 -\144\222\217\005\344\134\166\367\071\303\317\055\275\016\330\313 -\250\016\061\233\311\106\017\147\123\103\004\217\310\262\310\203 -\200\137\272\362\017\253\201\065\242\040\041\227\316\017\211\064 -\170\017\317\037\116\351\373\214\050\074\336\064\347\355\237\322 -\146\365\305\312\061\170\322\316\120\321\140\202\143\235\340\114 -\367\007\256\203\064\235\111\111\103\324\176\275\055\342\352\307 -\161\145\200\010\344\066\236\171\160\012\074\207\051\351\344\222 -\224\352\006\222\051\047\170\346\255\327\075\351\012\013\136\364 -\340\326\206\235\055\162\313\213\144\126\346\364\256\170\245\240 -\071\063\130\074\334\250\217\215\264\152\055\375\210\163\351\225 -\120\163\004\337\021\210\076\102\326\002\164\373\054\304\157\274 -\154\326\340\200\157\321\206\245\062\127\003\326\115\364\116\012 -\231\042\166\176\112\100\202\370\311\344\116\313\123\055\307\261 -\266\342\323\302\165\047\156\271\016\161\262\064\374\277\034\116 -\302\075\370\066\351\012\314\130\232\241\030\206\116\342\341\252 -\263\163\131\156\136\235\264\302\010\257\257\134\375\244\002\157 -\377\270\015\273\325\253\327\156\237\032\117\221\100\360\037\106 -\125\155\240\222\303\211\315\267\261\377\034\263\313\243\234\012 -\343\376\315\252\274\001\354\335\124\312\221\335\117\023\207\244 -\366\230\357\375\111\326\127\052\074\246\134\366\140\067\277\330 -\076\176\116\150\052\043\062\072\276\156\344\042\075\007\044\317 -\212\313\233\135\121\263\060\322\161\155\316\106\212\155\174\112 -\063\104\332\022\057\066\113\362\351\361\121\011\155\333\152\227 -\016\027\002\003\001\000\001\243\102\060\100\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003 -\125\035\016\004\026\004\024\325\147\035\340\234\172\054\234\313 -\305\230\347\035\007\046\052\206\354\164\315\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\006\060\015\006\011\052 -\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\220 -\073\345\302\123\102\050\352\365\061\116\216\075\221\236\115\011 -\363\330\261\122\346\117\254\014\061\041\273\361\352\231\314\203 -\374\266\050\344\354\204\007\016\017\116\227\273\157\150\106\217 -\016\121\025\225\370\072\073\037\137\202\016\014\161\016\274\221 -\117\256\063\056\043\101\364\046\153\117\023\207\372\170\366\056 -\302\017\221\005\227\252\152\301\152\237\274\204\236\010\052\047 -\335\332\207\027\206\341\263\312\135\355\070\251\051\156\204\336 -\106\153\374\047\031\120\245\022\172\214\175\142\374\332\347\314 -\274\237\111\257\006\270\047\047\362\211\367\026\075\030\346\275 -\336\365\214\022\221\237\343\004\215\376\007\024\032\132\254\071 -\202\033\361\070\031\341\143\343\257\154\266\246\121\027\353\372 -\113\353\213\042\366\227\376\020\072\137\224\240\113\123\161\077 -\132\341\020\370\162\217\226\200\335\215\002\230\000\141\075\215 -\274\055\261\107\314\332\135\341\040\247\214\061\134\361\343\332 -\271\012\206\107\310\241\075\007\243\074\246\163\156\224\221\355 -\156\044\072\371\311\060\321\007\250\201\175\046\175\175\204\337 -\206\311\213\345\256\015\036\276\211\110\121\025\203\230\226\057 -\112\353\163\064\327\164\315\311\157\320\302\272\053\366\232\376 -\231\335\140\024\216\033\371\234\071\074\177\103\211\123\350\345 -\302\253\276\042\255\047\070\233\167\050\267\243\143\143\247\201 -\347\251\151\105\353\216\170\126\314\005\204\307\373\255\266\060 -\174\143\005\237\055\214\044\177\113\213\222\374\070\036\237\240 -\245\127\263\156\235\330\144\270\160\232\140\122\160\310\251\320 -\377\306\234\355\020\141\136\315\203\016\156\350\115\002\101\112 -\342\166\004\171\326\124\077\212\230\062\024\240\335\055\234\347 -\272\202\161\243\206\125\051\231\322\051\333\165\072\367\333\103 -\377\266\133\373\267\176\065\200\216\015\154\256\171\267\066\055 -\227\122\241\260\007\234\007\345\053\066\315\003\227\224\275\055 -\016\064\006\374\300\026\211\374\067\124\344\326\317\075\023\004 -\362\221\331\311\066\056\076\305\132\320\245\114\202\303\377\056 -\174\046\166\367\363\375\105\242\245\156\125\256\056\314\317\054 -\211\064\332\366\015\347\221\250\020\352\027\235\362\366\354 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TW Government Root Certification Authority 2" -# Issuer: O=Government Root Certification Authority,C=TW -# Serial Number:00:b6:4b:88:07:e2:23:ee:c8:5c:12:ad:a6:0e:06:a1:f2 -# Subject: O=Government Root Certification Authority,C=TW -# Not Valid Before: Fri Sep 28 08:58:51 2012 -# Not Valid After : Thu Dec 31 15:59:59 2037 -# Fingerprint (SHA-256): 70:B9:22:BF:DA:0E:3F:4A:34:2E:4E:E2:2D:57:9A:E5:98:D0:71:CC:5E:C9:C3:0F:12:36:80:34:03:88:AE:A5 -# Fingerprint (SHA1): B0:91:AA:91:38:47:F3:13:D7:27:BC:EF:C8:17:9F:08:6F:3A:8C:0F -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TW Government Root Certification Authority 2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\260\221\252\221\070\107\363\023\327\047\274\357\310\027\237\010 -\157\072\214\017 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\057\324\055\315\206\177\066\260\137\034\340\123\215\266\242\133 -END -CKA_ISSUER MULTILINE_OCTAL -\060\077\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\060\060\056\006\003\125\004\012\014\047\107\157\166\145\162\156 -\155\145\156\164\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\266\113\210\007\342\043\356\310\134\022\255\246\016 -\006\241\362 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Thailand National Root Certification Authority - G1" # @@ -3788,211 +3197,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "SAPO Class 3 Root CA" -# -# Issuer: E=pkiadmin@trustcentre.co.za,CN=SAPO Class 3 Root CA,OU=SAPO Trust Centre,O=South African Post Office Limited,L=Somerset West,ST=Western Cape,C=ZA -# Serial Number: 2 (0x2) -# Subject: E=pkiadmin@trustcentre.co.za,CN=SAPO Class 3 Root CA,OU=SAPO Trust Centre,O=South African Post Office Limited,L=Somerset West,ST=Western Cape,C=ZA -# Not Valid Before: Wed Sep 15 00:00:00 2010 -# Not Valid After : Sat Sep 14 00:00:00 2030 -# Fingerprint (SHA-256): 1A:25:12:CD:A6:74:4A:BE:A1:14:32:A2:FD:C9:F8:C0:88:DB:5A:98:C8:9E:13:35:25:74:CD:E4:D9:E8:0C:DD -# Fingerprint (SHA1): 38:DD:76:59:C7:35:10:0B:00:A2:37:E4:91:B7:BC:0F:FC:D2:31:6C -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SAPO Class 3 Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\316\061\013\060\011\006\003\125\004\006\023\002\132\101 -\061\025\060\023\006\003\125\004\010\023\014\127\145\163\164\145 -\162\156\040\103\141\160\145\061\026\060\024\006\003\125\004\007 -\023\015\123\157\155\145\162\163\145\164\040\127\145\163\164\061 -\052\060\050\006\003\125\004\012\023\041\123\157\165\164\150\040 -\101\146\162\151\143\141\156\040\120\157\163\164\040\117\146\146 -\151\143\145\040\114\151\155\151\164\145\144\061\032\060\030\006 -\003\125\004\013\023\021\123\101\120\117\040\124\162\165\163\164 -\040\103\145\156\164\162\145\061\035\060\033\006\003\125\004\003 -\023\024\123\101\120\117\040\103\154\141\163\163\040\063\040\122 -\157\157\164\040\103\101\061\051\060\047\006\011\052\206\110\206 -\367\015\001\011\001\026\032\160\153\151\141\144\155\151\156\100 -\164\162\165\163\164\143\145\156\164\162\145\056\143\157\056\172 -\141 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\316\061\013\060\011\006\003\125\004\006\023\002\132\101 -\061\025\060\023\006\003\125\004\010\023\014\127\145\163\164\145 -\162\156\040\103\141\160\145\061\026\060\024\006\003\125\004\007 -\023\015\123\157\155\145\162\163\145\164\040\127\145\163\164\061 -\052\060\050\006\003\125\004\012\023\041\123\157\165\164\150\040 -\101\146\162\151\143\141\156\040\120\157\163\164\040\117\146\146 -\151\143\145\040\114\151\155\151\164\145\144\061\032\060\030\006 -\003\125\004\013\023\021\123\101\120\117\040\124\162\165\163\164 -\040\103\145\156\164\162\145\061\035\060\033\006\003\125\004\003 -\023\024\123\101\120\117\040\103\154\141\163\163\040\063\040\122 -\157\157\164\040\103\101\061\051\060\047\006\011\052\206\110\206 -\367\015\001\011\001\026\032\160\153\151\141\144\155\151\156\100 -\164\162\165\163\164\143\145\156\164\162\145\056\143\157\056\172 -\141 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\002 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\130\060\202\004\100\240\003\002\001\002\002\001\002 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\201\316\061\013\060\011\006\003\125\004\006\023\002\132\101\061 -\025\060\023\006\003\125\004\010\023\014\127\145\163\164\145\162 -\156\040\103\141\160\145\061\026\060\024\006\003\125\004\007\023 -\015\123\157\155\145\162\163\145\164\040\127\145\163\164\061\052 -\060\050\006\003\125\004\012\023\041\123\157\165\164\150\040\101 -\146\162\151\143\141\156\040\120\157\163\164\040\117\146\146\151 -\143\145\040\114\151\155\151\164\145\144\061\032\060\030\006\003 -\125\004\013\023\021\123\101\120\117\040\124\162\165\163\164\040 -\103\145\156\164\162\145\061\035\060\033\006\003\125\004\003\023 -\024\123\101\120\117\040\103\154\141\163\163\040\063\040\122\157 -\157\164\040\103\101\061\051\060\047\006\011\052\206\110\206\367 -\015\001\011\001\026\032\160\153\151\141\144\155\151\156\100\164 -\162\165\163\164\143\145\156\164\162\145\056\143\157\056\172\141 -\060\036\027\015\061\060\060\071\061\065\060\060\060\060\060\060 -\132\027\015\063\060\060\071\061\064\060\060\060\060\060\060\132 -\060\201\316\061\013\060\011\006\003\125\004\006\023\002\132\101 -\061\025\060\023\006\003\125\004\010\023\014\127\145\163\164\145 -\162\156\040\103\141\160\145\061\026\060\024\006\003\125\004\007 -\023\015\123\157\155\145\162\163\145\164\040\127\145\163\164\061 -\052\060\050\006\003\125\004\012\023\041\123\157\165\164\150\040 -\101\146\162\151\143\141\156\040\120\157\163\164\040\117\146\146 -\151\143\145\040\114\151\155\151\164\145\144\061\032\060\030\006 -\003\125\004\013\023\021\123\101\120\117\040\124\162\165\163\164 -\040\103\145\156\164\162\145\061\035\060\033\006\003\125\004\003 -\023\024\123\101\120\117\040\103\154\141\163\163\040\063\040\122 -\157\157\164\040\103\101\061\051\060\047\006\011\052\206\110\206 -\367\015\001\011\001\026\032\160\153\151\141\144\155\151\156\100 -\164\162\165\163\164\143\145\156\164\162\145\056\143\157\056\172 -\141\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001 -\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002 -\001\000\312\170\032\007\274\366\373\264\267\211\274\320\031\126 -\070\052\131\235\007\352\032\371\370\370\150\147\136\217\357\312 -\367\365\152\211\346\243\225\177\251\333\051\044\034\065\320\070 -\226\154\076\126\044\377\136\142\121\220\056\207\350\234\307\332 -\274\063\361\236\241\157\013\216\012\044\364\370\115\220\246\262 -\315\136\021\323\302\227\114\365\137\100\035\046\044\115\215\011 -\020\013\377\273\040\033\223\046\031\014\103\077\351\216\274\061 -\067\020\156\221\312\110\202\126\106\307\274\271\072\236\106\201 -\146\317\331\350\134\020\317\071\236\145\303\236\305\132\364\113 -\314\104\231\146\206\364\162\033\243\123\111\352\256\107\315\062 -\015\160\346\240\240\166\007\235\377\130\357\344\074\221\300\265 -\344\334\270\001\014\323\376\263\102\240\073\141\002\324\067\133 -\327\114\105\225\322\165\135\365\156\060\137\127\121\213\262\377 -\176\310\213\234\252\243\101\067\014\020\221\250\246\205\134\271 -\307\217\005\121\262\320\170\322\342\113\111\351\324\032\247\073 -\254\252\063\346\232\052\003\100\230\157\164\122\023\061\224\321 -\022\301\264\313\060\371\377\104\270\222\133\122\326\060\331\063 -\321\165\343\031\245\026\025\267\124\127\361\126\120\316\116\276 -\003\073\057\354\266\060\356\024\140\136\137\172\065\364\116\144 -\007\021\352\245\007\146\033\156\223\342\260\117\136\326\340\104 -\340\263\334\256\357\270\375\250\263\354\354\345\071\210\104\264 -\241\273\024\140\144\217\326\222\223\313\363\314\120\335\351\007 -\310\147\147\371\360\207\204\221\262\000\142\351\277\112\025\164 -\305\277\004\114\005\106\135\012\313\345\352\141\000\341\157\101 -\261\064\216\246\000\242\174\246\245\246\372\154\114\103\345\250 -\046\232\064\230\036\207\230\347\114\170\321\217\237\005\125\135 -\212\113\311\317\240\013\175\006\220\234\030\222\262\304\262\327 -\343\105\331\153\163\303\227\071\277\051\036\006\011\125\100\272 -\274\332\110\165\103\355\376\104\176\075\054\346\142\221\003\375 -\075\211\357\176\364\135\044\217\245\013\053\263\076\172\051\050 -\274\273\077\277\353\167\205\004\046\213\224\262\220\365\353\215 -\117\242\104\042\120\250\234\052\104\110\000\170\031\253\235\010 -\226\025\002\003\001\000\001\243\077\060\075\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\006\060\014\006\003\125 -\035\023\004\005\060\003\001\001\377\060\035\006\003\125\035\016 -\004\026\004\024\141\263\171\122\235\112\225\222\121\216\202\044 -\160\323\216\100\310\305\146\320\060\015\006\011\052\206\110\206 -\367\015\001\001\005\005\000\003\202\002\001\000\177\306\263\044 -\204\120\067\371\304\260\305\060\074\026\351\120\015\172\272\264 -\073\322\043\345\351\211\170\152\345\343\033\005\036\221\034\316 -\006\227\215\146\026\007\104\357\201\271\010\176\243\307\071\064 -\270\277\232\155\215\260\301\040\102\056\015\367\013\006\003\117 -\156\313\274\267\260\057\031\161\215\216\257\012\115\130\061\213 -\104\231\052\050\146\205\307\200\046\146\260\107\302\071\262\372 -\117\076\125\275\334\211\047\113\163\063\004\376\173\107\220\311 -\005\300\055\063\370\267\010\202\051\101\103\375\046\123\346\372 -\037\067\126\215\117\027\272\330\375\072\204\160\330\076\360\063 -\256\304\005\110\124\241\271\325\041\077\352\076\307\251\061\107 -\367\233\256\112\142\230\321\147\040\145\336\171\341\261\062\036 -\153\337\373\200\153\107\134\071\307\016\010\252\307\243\356\051 -\351\064\342\233\371\165\270\046\353\210\235\264\071\021\056\160 -\375\121\004\062\273\017\171\204\120\041\105\174\057\344\331\377 -\045\070\006\043\253\116\261\016\334\073\061\012\255\332\113\000 -\151\153\056\342\303\014\311\005\001\105\146\341\245\211\141\034 -\144\231\215\013\230\220\263\176\146\073\013\330\253\350\165\016 -\331\177\232\156\175\311\203\047\311\274\350\064\070\302\132\207 -\062\162\007\014\376\325\224\321\360\300\170\362\200\250\106\365 -\153\232\354\342\331\026\216\212\372\204\366\321\122\311\234\262 -\041\126\140\103\246\020\367\177\111\277\276\007\323\120\144\155 -\002\272\052\125\054\317\331\302\156\257\174\013\110\320\361\341 -\247\302\255\164\217\206\344\355\252\372\134\203\175\102\350\175 -\007\035\007\125\314\053\151\062\271\167\202\150\306\167\362\042 -\151\246\311\012\135\207\231\345\161\236\175\057\023\036\322\364 -\375\011\171\047\130\053\012\207\201\052\373\152\043\055\113\044 -\205\164\026\107\030\017\011\305\376\251\110\044\343\254\320\151 -\075\137\123\230\062\275\354\340\121\301\123\112\261\366\073\360 -\064\110\365\232\336\334\321\340\343\275\045\263\104\350\072\163 -\311\171\320\254\321\355\342\000\012\137\241\035\146\131\112\163 -\150\324\005\162\063\070\247\153\257\221\333\015\307\214\100\350 -\236\220\210\311\373\376\044\327\201\254\363\336 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SAPO Class 3 Root CA" -# Issuer: E=pkiadmin@trustcentre.co.za,CN=SAPO Class 3 Root CA,OU=SAPO Trust Centre,O=South African Post Office Limited,L=Somerset West,ST=Western Cape,C=ZA -# Serial Number: 2 (0x2) -# Subject: E=pkiadmin@trustcentre.co.za,CN=SAPO Class 3 Root CA,OU=SAPO Trust Centre,O=South African Post Office Limited,L=Somerset West,ST=Western Cape,C=ZA -# Not Valid Before: Wed Sep 15 00:00:00 2010 -# Not Valid After : Sat Sep 14 00:00:00 2030 -# Fingerprint (SHA-256): 1A:25:12:CD:A6:74:4A:BE:A1:14:32:A2:FD:C9:F8:C0:88:DB:5A:98:C8:9E:13:35:25:74:CD:E4:D9:E8:0C:DD -# Fingerprint (SHA1): 38:DD:76:59:C7:35:10:0B:00:A2:37:E4:91:B7:BC:0F:FC:D2:31:6C -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SAPO Class 3 Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\070\335\166\131\307\065\020\013\000\242\067\344\221\267\274\017 -\374\322\061\154 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\124\345\353\065\321\165\005\074\174\337\060\326\277\363\377\123 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\316\061\013\060\011\006\003\125\004\006\023\002\132\101 -\061\025\060\023\006\003\125\004\010\023\014\127\145\163\164\145 -\162\156\040\103\141\160\145\061\026\060\024\006\003\125\004\007 -\023\015\123\157\155\145\162\163\145\164\040\127\145\163\164\061 -\052\060\050\006\003\125\004\012\023\041\123\157\165\164\150\040 -\101\146\162\151\143\141\156\040\120\157\163\164\040\117\146\146 -\151\143\145\040\114\151\155\151\164\145\144\061\032\060\030\006 -\003\125\004\013\023\021\123\101\120\117\040\124\162\165\163\164 -\040\103\145\156\164\162\145\061\035\060\033\006\003\125\004\003 -\023\024\123\101\120\117\040\103\154\141\163\163\040\063\040\122 -\157\157\164\040\103\101\061\051\060\047\006\011\052\206\110\206 -\367\015\001\011\001\026\032\160\153\151\141\144\155\151\156\100 -\164\162\165\163\164\143\145\156\164\162\145\056\143\157\056\172 -\141 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\002 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "IdenTrust Commercial Root CA 1" # @@ -5190,375 +4394,20 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE # -# Certificate "Autoridad Certificadora Raíz Nacional de Uruguay" +# Certificate "T-TeleSec GlobalRoot Class 2" # -# Issuer: C=UY,O=AGESIC,CN=Autoridad Certificadora Ra..z Nacional de Uruguay -# Serial Number:02:ee:00:9b:66:d8:6a:1d:67:fe:da:8a:25:6f:21:5a:75:1b -# Subject: C=UY,O=AGESIC,CN=Autoridad Certificadora Ra..z Nacional de Uruguay -# Not Valid Before: Thu Nov 03 15:02:49 2011 -# Not Valid After : Wed Oct 29 15:02:49 2031 -# Fingerprint (SHA-256): 55:33:A0:40:1F:61:2C:68:8E:BC:E5:BF:53:F2:EC:14:A7:34:EB:17:8B:FA:E0:0E:50:E8:5D:AE:67:23:07:8A -# Fingerprint (SHA1): 7A:1C:DD:E3:D2:19:7E:71:37:43:3D:3F:99:C0:B3:69:F7:06:C7:49 +# Issuer: CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE +# Serial Number: 1 (0x1) +# Subject: CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE +# Not Valid Before: Wed Oct 01 10:40:14 2008 +# Not Valid After : Sat Oct 01 23:59:59 2033 +# Fingerprint (SHA-256): 91:E2:F5:78:8D:58:10:EB:A7:BA:58:73:7D:E1:54:8A:8E:CA:CD:01:45:98:BC:0B:14:3E:04:1B:17:05:25:52 +# Fingerprint (SHA1): 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Autoridad Certificadora Raíz Nacional de Uruguay" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\072\060\070\006\003\125\004\003\014\061\101\165\164 -\157\162\151\144\141\144\040\103\145\162\164\151\146\151\143\141 -\144\157\162\141\040\122\141\303\255\172\040\116\141\143\151\157 -\156\141\154\040\144\145\040\125\162\165\147\165\141\171\061\017 -\060\015\006\003\125\004\012\023\006\101\107\105\123\111\103\061 -\013\060\011\006\003\125\004\006\023\002\125\131 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\072\060\070\006\003\125\004\003\014\061\101\165\164 -\157\162\151\144\141\144\040\103\145\162\164\151\146\151\143\141 -\144\157\162\141\040\122\141\303\255\172\040\116\141\143\151\157 -\156\141\154\040\144\145\040\125\162\165\147\165\141\171\061\017 -\060\015\006\003\125\004\012\023\006\101\107\105\123\111\103\061 -\013\060\011\006\003\125\004\006\023\002\125\131 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\022\002\356\000\233\146\330\152\035\147\376\332\212\045\157 -\041\132\165\033 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\235\060\202\004\205\240\003\002\001\002\002\022\002 -\356\000\233\146\330\152\035\147\376\332\212\045\157\041\132\165 -\033\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000 -\060\132\061\072\060\070\006\003\125\004\003\014\061\101\165\164 -\157\162\151\144\141\144\040\103\145\162\164\151\146\151\143\141 -\144\157\162\141\040\122\141\303\255\172\040\116\141\143\151\157 -\156\141\154\040\144\145\040\125\162\165\147\165\141\171\061\017 -\060\015\006\003\125\004\012\023\006\101\107\105\123\111\103\061 -\013\060\011\006\003\125\004\006\023\002\125\131\060\036\027\015 -\061\061\061\061\060\063\061\065\060\062\064\071\132\027\015\063 -\061\061\060\062\071\061\065\060\062\064\071\132\060\132\061\072 -\060\070\006\003\125\004\003\014\061\101\165\164\157\162\151\144 -\141\144\040\103\145\162\164\151\146\151\143\141\144\157\162\141 -\040\122\141\303\255\172\040\116\141\143\151\157\156\141\154\040 -\144\145\040\125\162\165\147\165\141\171\061\017\060\015\006\003 -\125\004\012\023\006\101\107\105\123\111\103\061\013\060\011\006 -\003\125\004\006\023\002\125\131\060\202\002\040\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\015\000 -\060\202\002\010\002\202\002\001\000\227\304\037\052\104\241\201 -\113\110\221\165\335\353\332\217\312\033\213\362\264\074\054\306 -\345\364\301\036\321\270\060\023\157\134\237\345\121\226\177\032 -\244\026\376\322\324\035\045\366\320\346\067\140\137\000\243\031 -\251\354\047\277\120\055\005\240\134\136\223\353\343\150\375\233 -\075\271\024\066\055\347\045\025\020\220\032\222\311\021\261\051 -\227\223\126\125\142\255\107\254\177\325\014\167\226\322\223\150 -\152\061\335\124\357\223\362\012\117\240\137\002\132\357\266\104 -\076\347\231\262\216\105\336\240\367\300\350\110\260\107\354\336 -\102\024\333\065\173\240\151\374\036\300\001\051\026\332\063\241 -\041\241\062\062\020\166\175\250\307\300\056\163\203\144\374\132 -\367\233\066\214\151\355\040\125\043\171\315\363\363\154\153\140 -\134\170\215\374\075\205\054\274\251\367\160\350\245\312\115\330 -\174\230\357\206\166\030\204\325\100\051\020\047\062\347\357\003 -\104\013\117\311\052\361\266\264\053\240\325\003\224\204\041\323 -\164\363\051\155\170\360\005\152\256\001\017\141\037\306\245\360 -\307\202\025\331\073\373\335\213\164\151\356\344\307\307\364\021 -\334\024\121\301\204\032\045\126\023\153\133\316\137\054\375\213 -\033\055\017\310\300\125\252\030\117\230\234\317\242\167\010\264 -\065\225\330\271\213\234\111\016\264\020\013\374\374\107\115\324 -\232\127\371\237\172\275\351\127\273\264\017\137\025\220\330\150 -\154\325\205\045\203\055\206\014\107\142\227\263\171\115\271\145 -\010\167\122\157\112\343\156\200\300\254\243\325\274\352\111\342 -\145\342\114\131\152\202\336\053\365\252\076\376\145\350\121\160 -\115\067\204\006\004\077\222\203\324\126\050\343\045\325\124\312 -\205\356\126\300\056\316\371\160\020\022\137\135\236\306\274\113 -\020\035\126\155\312\162\301\123\011\052\023\075\330\265\371\034 -\073\105\306\207\024\320\070\176\236\041\137\374\166\035\377\013 -\051\102\333\241\304\171\071\341\115\325\206\120\343\362\340\263 -\327\131\233\336\077\036\032\003\363\324\151\206\113\107\034\062 -\177\074\007\011\023\020\247\233\007\060\167\063\274\151\021\321 -\064\075\174\020\052\270\036\216\275\107\336\371\262\171\125\146 -\041\002\007\373\071\054\012\027\241\002\001\003\243\202\001\135 -\060\202\001\131\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\142\006\003\125\035\037\004\133\060\131 -\060\054\240\052\240\050\206\046\150\164\164\160\072\057\057\167 -\167\167\056\141\147\145\163\151\143\056\147\165\142\056\165\171 -\057\141\143\162\156\057\141\143\162\156\056\143\162\154\060\051 -\240\047\240\045\206\043\150\164\164\160\072\057\057\167\167\167 -\056\165\143\145\056\147\165\142\056\165\171\057\141\143\162\156 -\057\141\143\162\156\056\143\162\154\060\201\262\006\003\125\035 -\040\004\201\252\060\201\247\060\134\006\013\140\206\132\204\342 -\256\035\204\210\005\000\060\115\060\113\006\010\053\006\001\005 -\005\007\002\001\026\077\150\164\164\160\072\057\057\167\167\167 -\056\165\143\145\056\147\165\142\056\165\171\057\151\156\146\157 -\162\155\141\143\151\157\156\055\164\145\143\156\151\143\141\057 -\160\157\154\151\164\151\143\141\163\057\143\160\137\141\143\162 -\156\056\160\144\146\060\107\006\013\140\206\132\204\342\256\035 -\204\210\005\001\060\070\060\066\006\010\053\006\001\005\005\007 -\002\001\026\052\150\164\164\160\072\057\057\167\167\167\056\141 -\147\145\163\151\143\056\147\165\142\056\165\171\057\141\143\162 -\156\057\143\160\163\137\141\143\162\156\056\160\144\146\060\035 -\006\003\125\035\016\004\026\004\024\222\236\221\270\125\050\075 -\167\102\054\063\245\230\137\320\311\254\215\265\243\060\015\006 -\011\052\206\110\206\367\015\001\001\013\005\000\003\202\002\001 -\000\135\347\253\131\352\111\334\277\106\103\375\224\273\230\160 -\224\024\372\316\003\135\361\175\061\023\222\116\205\044\060\024 -\153\154\323\347\316\346\171\325\333\116\125\116\027\053\327\223 -\105\337\023\014\047\147\035\307\102\220\124\060\306\361\250\151 -\050\264\116\246\155\245\065\246\120\226\150\111\243\356\057\013 -\253\374\003\002\120\150\361\225\051\076\161\054\334\332\345\055 -\331\166\056\356\126\063\176\027\241\047\002\341\241\047\050\041 -\212\277\001\347\142\307\273\262\045\004\332\033\246\043\214\174 -\223\272\311\213\353\012\371\067\267\224\071\375\115\217\176\242 -\334\201\157\033\255\024\017\133\040\003\170\101\163\147\236\322 -\227\027\220\052\212\124\113\247\171\177\044\022\221\237\073\054 -\307\067\244\014\134\162\152\023\236\062\011\047\353\103\062\165 -\137\327\107\303\052\105\123\025\126\166\117\273\011\350\204\140 -\021\357\163\325\347\120\156\151\050\375\353\306\313\312\116\023 -\143\015\016\067\054\061\037\333\247\130\240\262\375\015\027\207 -\263\222\256\033\050\200\037\266\222\176\206\021\341\366\114\230 -\177\146\213\037\023\111\003\102\374\373\230\234\356\206\226\251 -\056\005\176\160\034\301\167\310\351\135\202\270\016\316\133\144 -\005\143\356\077\006\055\066\014\351\037\162\133\036\254\335\046 -\365\034\070\156\375\214\075\115\206\353\047\313\312\003\215\100 -\363\052\321\212\330\064\016\302\255\265\210\355\207\232\212\205 -\242\207\357\351\271\070\347\150\226\243\001\317\202\075\034\113 -\050\235\047\365\371\231\226\173\110\375\254\320\360\062\367\070 -\004\335\115\231\256\016\222\202\303\372\074\033\023\307\150\267 -\135\340\223\106\270\270\270\244\014\304\033\306\272\106\226\335 -\236\125\017\107\235\366\201\245\254\145\131\330\335\256\006\154 -\340\103\202\306\147\330\160\002\065\365\066\004\343\112\071\251 -\165\002\036\346\077\106\317\234\054\036\204\210\027\252\046\251 -\246\103\200\340\300\133\243\144\203\233\232\355\153\001\145\266 -\301\075\030\354\223\031\146\224\250\323\021\120\231\172\210\175 -\257\076\177\224\220\073\012\303\152\267\215\137\322\247\121\321 -\062\037\271\362\062\175\167\223\155\103\354\101\151\253\317\311 -\141 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Autoridad Certificadora Raíz Nacional de Uruguay" -# Issuer: C=UY,O=AGESIC,CN=Autoridad Certificadora Ra..z Nacional de Uruguay -# Serial Number:02:ee:00:9b:66:d8:6a:1d:67:fe:da:8a:25:6f:21:5a:75:1b -# Subject: C=UY,O=AGESIC,CN=Autoridad Certificadora Ra..z Nacional de Uruguay -# Not Valid Before: Thu Nov 03 15:02:49 2011 -# Not Valid After : Wed Oct 29 15:02:49 2031 -# Fingerprint (SHA-256): 55:33:A0:40:1F:61:2C:68:8E:BC:E5:BF:53:F2:EC:14:A7:34:EB:17:8B:FA:E0:0E:50:E8:5D:AE:67:23:07:8A -# Fingerprint (SHA1): 7A:1C:DD:E3:D2:19:7E:71:37:43:3D:3F:99:C0:B3:69:F7:06:C7:49 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Autoridad Certificadora Raíz Nacional de Uruguay" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\172\034\335\343\322\031\176\161\067\103\075\077\231\300\263\151 -\367\006\307\111 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\173\267\347\056\144\030\344\021\014\367\102\170\076\145\242\256 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\072\060\070\006\003\125\004\003\014\061\101\165\164 -\157\162\151\144\141\144\040\103\145\162\164\151\146\151\143\141 -\144\157\162\141\040\122\141\303\255\172\040\116\141\143\151\157 -\156\141\154\040\144\145\040\125\162\165\147\165\141\171\061\017 -\060\015\006\003\125\004\012\023\006\101\107\105\123\111\103\061 -\013\060\011\006\003\125\004\006\023\002\125\131 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\022\002\356\000\233\146\330\152\035\147\376\332\212\045\157 -\041\132\165\033 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "TM Applied Business Root Certificate" -# -# Issuer: CN=TM Applied Business Root Certificate,OU=TM Applied Business Certification Authority,O=TM,C=my -# Serial Number: 1 (0x1) -# Subject: CN=TM Applied Business Root Certificate,OU=TM Applied Business Certification Authority,O=TM,C=my -# Not Valid Before: Mon Oct 10 06:23:39 2011 -# Not Valid After : Fri Oct 10 06:53:39 2031 -# Fingerprint (SHA-256): A9:C7:7A:F1:BC:DF:AA:37:39:44:2B:0B:27:34:C6:8E:AF:2E:98:33:F0:D7:66:FB:CA:A6:F2:AE:B4:2D:EC:02 -# Fingerprint (SHA1): 99:57:C5:3F:C5:9F:B8:E7:39:F7:A4:B7:A7:0E:9B:8E:65:9F:20:8C -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TM Applied Business Root Certificate" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\177\061\013\060\011\006\003\125\004\006\023\002\155\171\061 -\013\060\011\006\003\125\004\012\014\002\124\115\061\064\060\062 -\006\003\125\004\013\014\053\124\115\040\101\160\160\154\151\145 -\144\040\102\165\163\151\156\145\163\163\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\061\055\060\053\006\003\125\004\003\014\044\124\115\040 -\101\160\160\154\151\145\144\040\102\165\163\151\156\145\163\163 -\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164 -\145 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\177\061\013\060\011\006\003\125\004\006\023\002\155\171\061 -\013\060\011\006\003\125\004\012\014\002\124\115\061\064\060\062 -\006\003\125\004\013\014\053\124\115\040\101\160\160\154\151\145 -\144\040\102\165\163\151\156\145\163\163\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\061\055\060\053\006\003\125\004\003\014\044\124\115\040 -\101\160\160\154\151\145\144\040\102\165\163\151\156\145\163\163 -\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164 -\145 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\344\060\202\003\314\240\003\002\001\002\002\001\001 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\177\061\013\060\011\006\003\125\004\006\023\002\155\171\061\013 -\060\011\006\003\125\004\012\014\002\124\115\061\064\060\062\006 -\003\125\004\013\014\053\124\115\040\101\160\160\154\151\145\144 -\040\102\165\163\151\156\145\163\163\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171\061\055\060\053\006\003\125\004\003\014\044\124\115\040\101 -\160\160\154\151\145\144\040\102\165\163\151\156\145\163\163\040 -\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\145 -\060\036\027\015\061\061\061\060\061\060\060\066\062\063\063\071 -\132\027\015\063\061\061\060\061\060\060\066\065\063\063\071\132 -\060\177\061\013\060\011\006\003\125\004\006\023\002\155\171\061 -\013\060\011\006\003\125\004\012\014\002\124\115\061\064\060\062 -\006\003\125\004\013\014\053\124\115\040\101\160\160\154\151\145 -\144\040\102\165\163\151\156\145\163\163\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\061\055\060\053\006\003\125\004\003\014\044\124\115\040 -\101\160\160\154\151\145\144\040\102\165\163\151\156\145\163\163 -\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164 -\145\060\202\001\040\060\015\006\011\052\206\110\206\367\015\001 -\001\001\005\000\003\202\001\015\000\060\202\001\010\002\202\001 -\001\000\305\267\165\031\136\353\364\102\011\215\261\152\154\156 -\062\166\244\005\007\017\217\053\144\072\357\153\307\267\033\127 -\132\045\063\300\141\030\243\202\035\200\167\355\355\034\144\262 -\100\272\310\302\125\265\137\216\302\335\221\156\363\305\347\243 -\071\233\114\057\176\243\346\367\217\025\134\175\033\132\272\226 -\226\223\240\141\162\040\104\210\047\253\101\107\167\076\136\060 -\245\213\065\350\060\106\240\130\352\116\002\155\075\142\015\071 -\363\144\256\146\356\334\022\176\031\113\321\277\302\202\104\372 -\371\327\231\110\354\263\014\364\142\147\065\233\235\106\150\107 -\227\246\042\136\023\126\000\013\121\365\373\144\137\133\340\277 -\362\157\357\105\324\256\306\257\334\234\037\355\024\035\262\246 -\357\007\070\347\010\167\066\252\271\250\074\071\032\345\221\150 -\252\220\216\301\230\031\344\352\155\205\223\033\006\346\334\121 -\013\241\000\354\304\256\162\247\034\151\021\162\076\334\316\363 -\070\127\327\032\032\127\024\115\213\120\166\105\125\163\060\043 -\157\113\257\112\110\102\223\102\137\371\361\332\071\134\006\325 -\017\311\002\001\003\243\202\001\153\060\202\001\147\060\201\253 -\006\003\125\035\043\004\201\243\060\201\240\200\024\100\032\373 -\264\226\067\226\203\337\054\073\024\355\034\306\313\336\040\155 -\010\241\201\204\244\201\201\060\177\061\013\060\011\006\003\125 -\004\006\023\002\155\171\061\013\060\011\006\003\125\004\012\014 -\002\124\115\061\064\060\062\006\003\125\004\013\014\053\124\115 -\040\101\160\160\154\151\145\144\040\102\165\163\151\156\145\163 -\163\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040 -\101\165\164\150\157\162\151\164\171\061\055\060\053\006\003\125 -\004\003\014\044\124\115\040\101\160\160\154\151\145\144\040\102 -\165\163\151\156\145\163\163\040\122\157\157\164\040\103\145\162 -\164\151\146\151\143\141\164\145\202\001\001\060\035\006\003\125 -\035\016\004\026\004\024\100\032\373\264\226\067\226\203\337\054 -\073\024\355\034\306\313\336\040\155\010\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\167\006\003\125 -\035\037\004\160\060\156\060\154\240\152\240\150\206\146\154\144 -\141\160\072\057\057\154\144\141\160\056\164\155\143\141\056\143 -\157\155\056\155\171\072\063\070\071\057\143\156\075\141\162\154 -\061\144\160\061\054\157\165\075\101\122\114\054\157\165\075\124 -\115\040\101\160\160\154\151\145\144\040\102\165\163\151\156\145 -\163\163\040\103\145\162\164\151\146\151\143\141\164\151\157\156 -\040\101\165\164\150\157\162\151\164\171\054\157\075\124\115\054 -\143\075\155\171\060\015\006\011\052\206\110\206\367\015\001\001 -\013\005\000\003\202\001\001\000\100\211\136\227\104\012\253\146 -\061\053\155\334\116\246\347\055\261\107\377\122\171\363\355\333 -\247\201\351\072\074\125\147\365\105\321\356\031\171\375\067\340 -\256\244\050\242\030\070\336\317\322\227\222\244\071\274\124\203 -\357\035\241\201\147\310\214\046\145\206\272\312\157\000\102\130 -\115\272\031\146\267\033\100\121\045\222\320\202\025\210\154\142 -\062\342\361\100\022\335\276\300\357\020\362\046\204\045\365\364 -\152\017\131\077\043\031\035\275\015\274\071\072\274\332\334\156 -\077\016\214\046\221\044\063\314\375\063\071\214\135\242\273\107 -\227\347\020\052\204\046\124\261\053\176\137\371\252\177\355\307 -\376\312\043\246\125\277\337\312\136\340\373\076\247\122\326\052 -\072\245\173\143\362\205\374\041\064\053\301\256\360\101\220\030 -\077\105\304\043\215\274\073\206\335\252\106\147\151\207\041\242 -\127\026\246\247\174\073\376\211\040\107\030\372\325\162\375\134 -\072\150\265\073\341\074\302\053\113\170\123\125\132\262\366\206 -\276\300\075\333\110\377\360\300\172\020\324\036\337\344\266\056 -\302\032\324\016\172\152\240\166 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TM Applied Business Root Certificate" -# Issuer: CN=TM Applied Business Root Certificate,OU=TM Applied Business Certification Authority,O=TM,C=my -# Serial Number: 1 (0x1) -# Subject: CN=TM Applied Business Root Certificate,OU=TM Applied Business Certification Authority,O=TM,C=my -# Not Valid Before: Mon Oct 10 06:23:39 2011 -# Not Valid After : Fri Oct 10 06:53:39 2031 -# Fingerprint (SHA-256): A9:C7:7A:F1:BC:DF:AA:37:39:44:2B:0B:27:34:C6:8E:AF:2E:98:33:F0:D7:66:FB:CA:A6:F2:AE:B4:2D:EC:02 -# Fingerprint (SHA1): 99:57:C5:3F:C5:9F:B8:E7:39:F7:A4:B7:A7:0E:9B:8E:65:9F:20:8C -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TM Applied Business Root Certificate" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\231\127\305\077\305\237\270\347\071\367\244\267\247\016\233\216 -\145\237\040\214 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\272\240\127\377\263\142\143\322\121\066\203\010\243\102\160\170 -END -CKA_ISSUER MULTILINE_OCTAL -\060\177\061\013\060\011\006\003\125\004\006\023\002\155\171\061 -\013\060\011\006\003\125\004\012\014\002\124\115\061\064\060\062 -\006\003\125\004\013\014\053\124\115\040\101\160\160\154\151\145 -\144\040\102\165\163\151\156\145\163\163\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\061\055\060\053\006\003\125\004\003\014\044\124\115\040 -\101\160\160\154\151\145\144\040\102\165\163\151\156\145\163\163 -\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164 -\145 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "T-TeleSec GlobalRoot Class 2" -# -# Issuer: CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE -# Serial Number: 1 (0x1) -# Subject: CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE -# Not Valid Before: Wed Oct 01 10:40:14 2008 -# Not Valid After : Sat Oct 01 23:59:59 2033 -# Fingerprint (SHA-256): 91:E2:F5:78:8D:58:10:EB:A7:BA:58:73:7D:E1:54:8A:8E:CA:CD:01:45:98:BC:0B:14:3E:04:1B:17:05:25:52 -# Fingerprint (SHA1): 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "T-TeleSec GlobalRoot Class 2" +CKA_LABEL UTF8 "T-TeleSec GlobalRoot Class 2" CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 CKA_SUBJECT MULTILINE_OCTAL \060\201\202\061\013\060\011\006\003\125\004\006\023\002\104\105 @@ -7352,171 +6201,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Inera AB" -# -# Issuer: CN=SITHS Root CA v1,O=Inera AB,C=SE -# Serial Number:00:90:66:61:a8:62:3d:65:44:77:04:3f:71:9a:c3:97:0c -# Subject: CN=SITHS Root CA v1,O=Inera AB,C=SE -# Not Valid Before: Thu Mar 29 07:54:49 2012 -# Not Valid After : Mon Mar 29 07:54:49 2032 -# Fingerprint (SHA-256): FC:50:B2:6B:DC:4A:8F:DF:13:44:CC:80:15:7A:E1:3A:C6:71:E2:70:6F:AC:FC:06:05:FE:34:E2:49:EB:72:D6 -# Fingerprint (SHA1): 58:5F:78:75:BE:E7:43:3E:B0:79:EA:AB:7D:05:BB:0F:7A:F2:BC:CC -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Inera AB" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\073\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\021\060\017\006\003\125\004\012\014\010\111\156\145\162\141\040 -\101\102\061\031\060\027\006\003\125\004\003\014\020\123\111\124 -\110\123\040\122\157\157\164\040\103\101\040\166\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\073\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\021\060\017\006\003\125\004\012\014\010\111\156\145\162\141\040 -\101\102\061\031\060\027\006\003\125\004\003\014\020\123\111\124 -\110\123\040\122\157\157\164\040\103\101\040\166\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\220\146\141\250\142\075\145\104\167\004\077\161\232 -\303\227\014 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\223\060\202\003\173\240\003\002\001\002\002\021\000 -\220\146\141\250\142\075\145\104\167\004\077\161\232\303\227\014 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\073\061\013\060\011\006\003\125\004\006\023\002\123\105\061\021 -\060\017\006\003\125\004\012\014\010\111\156\145\162\141\040\101 -\102\061\031\060\027\006\003\125\004\003\014\020\123\111\124\110 -\123\040\122\157\157\164\040\103\101\040\166\061\060\036\027\015 -\061\062\060\063\062\071\060\067\065\064\064\071\132\027\015\063 -\062\060\063\062\071\060\067\065\064\064\071\132\060\073\061\013 -\060\011\006\003\125\004\006\023\002\123\105\061\021\060\017\006 -\003\125\004\012\014\010\111\156\145\162\141\040\101\102\061\031 -\060\027\006\003\125\004\003\014\020\123\111\124\110\123\040\122 -\157\157\164\040\103\101\040\166\061\060\202\002\042\060\015\006 -\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017 -\000\060\202\002\012\002\202\002\001\000\300\355\346\236\250\254 -\250\377\330\065\271\374\373\360\225\117\077\075\107\043\321\222 -\311\311\370\360\342\037\206\255\210\077\340\000\317\117\021\225 -\141\075\245\326\040\031\321\210\322\302\126\011\105\040\241\052 -\352\042\303\352\272\314\102\151\236\270\205\237\160\300\154\247 -\276\157\243\134\335\103\210\007\315\312\051\337\151\172\037\055 -\237\126\152\033\142\040\041\141\306\120\113\145\165\111\106\277 -\134\327\051\036\302\036\205\102\341\016\070\115\303\066\161\102 -\104\121\072\321\130\314\311\264\252\154\100\307\203\361\307\011 -\237\112\363\153\363\007\026\065\364\202\216\136\213\204\334\161 -\171\271\373\156\127\105\267\305\160\072\377\102\002\321\064\277 -\205\160\155\117\217\347\037\031\041\367\325\064\274\356\131\346 -\056\042\363\161\202\142\031\237\005\144\174\073\042\161\030\245 -\055\301\170\130\231\321\257\336\224\100\006\031\166\023\120\207 -\043\313\107\127\256\154\305\023\352\232\205\122\303\312\127\046 -\037\336\026\155\255\161\176\362\330\141\375\346\066\116\161\032 -\235\323\040\065\255\022\041\130\165\066\213\211\026\244\067\050 -\317\240\203\072\100\243\312\021\357\264\345\220\033\343\145\222 -\147\230\157\016\051\345\147\030\327\210\372\215\266\307\172\245 -\240\177\221\036\253\266\371\164\230\166\122\140\057\132\067\231 -\250\333\321\076\326\204\152\157\122\323\264\332\032\307\270\262 -\321\224\021\037\305\210\211\351\133\251\243\224\346\242\175\115 -\247\062\211\241\336\046\153\315\325\243\362\062\033\332\065\023 -\211\021\111\115\277\106\061\273\351\055\023\370\016\000\245\376 -\003\365\126\106\074\217\023\053\340\345\307\036\003\337\212\352 -\106\205\105\206\331\355\136\013\270\144\223\364\320\130\056\051 -\215\105\127\115\211\165\220\145\314\152\073\301\234\200\271\264 -\200\065\003\216\337\156\052\223\276\246\276\012\001\104\157\100 -\163\252\052\202\034\204\166\177\151\335\261\273\222\130\350\100 -\121\162\134\367\076\071\104\372\245\231\240\177\215\213\260\101 -\130\167\255\042\305\240\300\272\375\061\231\065\152\331\311\040 -\032\136\363\275\274\010\177\335\111\055\057\235\221\020\015\133 -\250\077\317\264\127\163\073\133\340\147\002\003\001\000\001\243 -\201\221\060\201\216\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\114\006\003\125\035\040\004\105\060 -\103\060\101\006\011\052\205\160\112\010\001\002\001\001\060\064 -\060\062\006\010\053\006\001\005\005\007\002\001\026\046\150\164 -\164\160\072\057\057\143\160\163\056\163\151\164\150\163\056\163 -\145\057\163\151\164\150\163\162\157\157\164\143\141\166\061\056 -\150\164\155\154\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\035\006\003\125\035\016\004\026\004\024\062 -\371\235\117\151\351\230\215\240\326\214\175\371\035\316\243\074 -\272\166\025\060\015\006\011\052\206\110\206\367\015\001\001\005 -\005\000\003\202\002\001\000\037\077\343\170\130\310\012\312\064 -\042\011\330\262\005\213\321\145\234\341\327\327\175\012\300\034 -\230\245\044\122\070\063\332\144\042\043\200\256\376\075\200\276 -\117\217\335\203\366\015\114\063\132\325\243\073\120\212\122\132 -\046\024\163\121\224\344\122\227\143\333\267\006\250\357\217\255 -\342\355\336\243\277\040\321\106\333\055\170\350\054\047\104\234 -\074\354\267\027\374\211\227\363\243\242\136\302\131\123\340\317 -\344\265\001\073\143\123\050\323\257\146\113\064\071\257\141\016 -\076\233\356\263\211\326\223\240\073\001\304\263\043\124\020\074 -\115\327\252\260\332\331\154\312\060\104\055\335\262\050\142\212 -\101\140\362\100\023\154\260\174\076\101\340\213\246\064\361\347 -\256\121\207\003\216\231\177\331\150\242\366\234\015\171\202\262 -\237\337\044\310\146\140\350\266\110\104\047\310\153\126\267\104 -\205\316\002\267\323\212\161\134\127\121\127\041\214\352\302\121 -\017\120\077\200\253\004\115\311\122\335\344\245\362\056\037\155 -\165\272\207\035\220\013\356\030\204\200\163\273\213\225\204\212 -\141\015\116\135\142\237\343\146\014\373\066\016\047\323\110\370 -\006\210\006\245\137\356\176\134\335\255\012\035\075\034\252\100 -\171\230\171\270\120\214\066\215\013\012\066\013\325\076\347\135 -\201\335\154\334\155\261\157\015\164\236\054\057\302\005\362\104 -\021\262\063\372\201\305\112\155\076\105\326\054\342\153\137\056 -\344\103\225\121\033\231\061\005\337\045\033\163\321\173\234\304 -\163\111\373\142\140\331\151\143\335\321\076\145\155\107\372\144 -\114\003\130\120\331\246\276\345\052\150\353\077\213\020\361\346 -\273\042\006\050\232\240\244\230\151\157\066\264\324\015\016\014 -\175\300\051\061\273\054\003\047\341\147\247\275\321\213\056\266 -\207\304\012\340\011\013\202\241\346\117\130\235\373\330\370\141 -\341\312\227\304\270\267\120\071\314\061\116\375\055\034\032\366 -\107\343\154\354\033\005\350\177\027\065\020\204\332\063\347\064 -\346\265\244\353\304\042\007\112\366\233\130\330\017\234\100\373 -\261\213\137\242\375\231\352\242\173\131\142\321\136\256\321\112 -\162\030\053\113\066\071\162\007\232\132\360\143\072\317\033\371 -\317\335\110\163\131\160\344 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Inera AB" -# Issuer: CN=SITHS Root CA v1,O=Inera AB,C=SE -# Serial Number:00:90:66:61:a8:62:3d:65:44:77:04:3f:71:9a:c3:97:0c -# Subject: CN=SITHS Root CA v1,O=Inera AB,C=SE -# Not Valid Before: Thu Mar 29 07:54:49 2012 -# Not Valid After : Mon Mar 29 07:54:49 2032 -# Fingerprint (SHA-256): FC:50:B2:6B:DC:4A:8F:DF:13:44:CC:80:15:7A:E1:3A:C6:71:E2:70:6F:AC:FC:06:05:FE:34:E2:49:EB:72:D6 -# Fingerprint (SHA1): 58:5F:78:75:BE:E7:43:3E:B0:79:EA:AB:7D:05:BB:0F:7A:F2:BC:CC -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Inera AB" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\130\137\170\165\276\347\103\076\260\171\352\253\175\005\273\017 -\172\362\274\314 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\177\173\002\154\150\237\062\003\307\257\004\235\354\043\337\363 -END -CKA_ISSUER MULTILINE_OCTAL -\060\073\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\021\060\017\006\003\125\004\012\014\010\111\156\145\162\141\040 -\101\102\061\031\060\027\006\003\125\004\003\014\020\123\111\124 -\110\123\040\122\157\157\164\040\103\101\040\166\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\220\146\141\250\142\075\145\104\167\004\077\161\232 -\303\227\014 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "GPKIRootCA1" # @@ -7943,204 +6627,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "?Autoridade Certificadora Raiz Brasileira v2" -# -# Issuer: CN=Autoridade Certificadora Raiz Brasileira v2,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR -# Serial Number: 1 (0x1) -# Subject: CN=Autoridade Certificadora Raiz Brasileira v2,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR -# Not Valid Before: Mon Jun 21 19:04:57 2010 -# Not Valid After : Wed Jun 21 19:04:57 2023 -# Fingerprint (SHA-256): FB:47:D9:2A:99:09:FD:4F:A9:BE:C0:27:37:54:3E:1F:35:14:CE:D7:47:40:7A:8D:9C:FA:39:7B:09:15:06:7C -# Fingerprint (SHA1): A9:82:2E:6C:69:33:C6:3C:14:8C:2D:CA:A4:4A:5C:F1:AA:D2:C4:2E -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "?Autoridade Certificadora Raiz Brasileira v2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\227\061\013\060\011\006\003\125\004\006\023\002\102\122 -\061\023\060\021\006\003\125\004\012\023\012\111\103\120\055\102 -\162\141\163\151\154\061\075\060\073\006\003\125\004\013\023\064 -\111\156\163\164\151\164\165\164\157\040\116\141\143\151\157\156 -\141\154\040\144\145\040\124\145\143\156\157\154\157\147\151\141 -\040\144\141\040\111\156\146\157\162\155\141\143\141\157\040\055 -\040\111\124\111\061\064\060\062\006\003\125\004\003\023\053\101 -\165\164\157\162\151\144\141\144\145\040\103\145\162\164\151\146 -\151\143\141\144\157\162\141\040\122\141\151\172\040\102\162\141 -\163\151\154\145\151\162\141\040\166\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\227\061\013\060\011\006\003\125\004\006\023\002\102\122 -\061\023\060\021\006\003\125\004\012\023\012\111\103\120\055\102 -\162\141\163\151\154\061\075\060\073\006\003\125\004\013\023\064 -\111\156\163\164\151\164\165\164\157\040\116\141\143\151\157\156 -\141\154\040\144\145\040\124\145\143\156\157\154\157\147\151\141 -\040\144\141\040\111\156\146\157\162\155\141\143\141\157\040\055 -\040\111\124\111\061\064\060\062\006\003\125\004\003\023\053\101 -\165\164\157\162\151\144\141\144\145\040\103\145\162\164\151\146 -\151\143\141\144\157\162\141\040\122\141\151\172\040\102\162\141 -\163\151\154\145\151\162\141\040\166\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\241\060\202\004\211\240\003\002\001\002\002\001\001 -\060\015\006\011\052\206\110\206\367\015\001\001\015\005\000\060 -\201\227\061\013\060\011\006\003\125\004\006\023\002\102\122\061 -\023\060\021\006\003\125\004\012\023\012\111\103\120\055\102\162 -\141\163\151\154\061\075\060\073\006\003\125\004\013\023\064\111 -\156\163\164\151\164\165\164\157\040\116\141\143\151\157\156\141 -\154\040\144\145\040\124\145\143\156\157\154\157\147\151\141\040 -\144\141\040\111\156\146\157\162\155\141\143\141\157\040\055\040 -\111\124\111\061\064\060\062\006\003\125\004\003\023\053\101\165 -\164\157\162\151\144\141\144\145\040\103\145\162\164\151\146\151 -\143\141\144\157\162\141\040\122\141\151\172\040\102\162\141\163 -\151\154\145\151\162\141\040\166\062\060\036\027\015\061\060\060 -\066\062\061\061\071\060\064\065\067\132\027\015\062\063\060\066 -\062\061\061\071\060\064\065\067\132\060\201\227\061\013\060\011 -\006\003\125\004\006\023\002\102\122\061\023\060\021\006\003\125 -\004\012\023\012\111\103\120\055\102\162\141\163\151\154\061\075 -\060\073\006\003\125\004\013\023\064\111\156\163\164\151\164\165 -\164\157\040\116\141\143\151\157\156\141\154\040\144\145\040\124 -\145\143\156\157\154\157\147\151\141\040\144\141\040\111\156\146 -\157\162\155\141\143\141\157\040\055\040\111\124\111\061\064\060 -\062\006\003\125\004\003\023\053\101\165\164\157\162\151\144\141 -\144\145\040\103\145\162\164\151\146\151\143\141\144\157\162\141 -\040\122\141\151\172\040\102\162\141\163\151\154\145\151\162\141 -\040\166\062\060\202\002\042\060\015\006\011\052\206\110\206\367 -\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002 -\202\002\001\000\272\106\244\016\335\347\100\362\265\240\174\122 -\225\127\105\374\155\204\363\206\001\311\205\003\255\230\253\322 -\362\136\005\231\311\273\157\142\147\375\167\104\271\003\007\074 -\322\033\000\142\324\160\054\102\203\171\146\253\231\126\256\201 -\274\152\111\275\363\164\017\142\267\353\133\007\146\224\102\044 -\235\106\254\232\102\030\060\360\044\250\121\101\352\253\225\361 -\250\053\002\170\151\265\051\047\136\234\056\163\306\376\043\245 -\343\246\316\375\154\033\153\000\124\353\000\255\117\072\114\074 -\347\012\210\133\332\136\232\013\126\344\265\124\070\035\362\012 -\223\144\116\303\101\222\123\040\052\317\374\164\156\324\333\063 -\070\142\344\376\216\114\130\034\367\217\052\115\377\305\222\331 -\011\122\275\317\160\000\235\151\232\063\152\210\207\105\041\231 -\026\121\015\064\337\202\275\264\151\250\174\174\324\335\323\362 -\025\134\113\305\130\020\352\205\031\313\066\042\130\052\162\014 -\232\226\336\312\317\010\121\141\277\264\005\051\006\053\206\220 -\376\351\115\303\004\005\107\313\317\166\331\177\161\246\207\173 -\025\100\344\063\200\170\007\035\244\362\216\233\100\073\311\162 -\120\337\151\276\360\054\226\037\220\265\325\256\164\343\145\264 -\214\032\351\152\033\373\162\134\305\202\124\352\340\123\007\304 -\314\022\351\367\336\327\057\324\110\057\107\077\046\141\004\261 -\022\232\063\153\265\206\113\023\053\320\206\235\107\355\151\373 -\374\204\022\146\370\126\345\016\212\154\166\304\153\032\172\302 -\240\132\022\321\043\211\130\001\174\010\130\332\025\216\025\331 -\176\175\067\266\244\105\365\003\205\314\107\372\213\171\105\270 -\146\142\063\323\046\112\336\034\351\324\177\346\155\046\271\074 -\175\315\017\050\012\051\017\233\335\143\253\271\246\107\032\204 -\327\205\244\003\145\006\004\113\122\215\203\064\102\177\061\216 -\021\056\346\263\147\225\100\176\227\172\100\000\371\021\154\203 -\070\130\255\003\063\133\246\304\301\305\260\254\015\251\006\360 -\246\151\001\064\266\351\370\224\110\117\076\246\165\011\354\112 -\305\073\340\311\136\260\062\377\237\151\131\317\074\060\157\015 -\316\047\127\354\132\033\150\377\354\117\157\170\062\076\171\305 -\264\135\225\177\002\003\001\000\001\243\201\365\060\201\362\060 -\116\006\003\125\035\040\004\107\060\105\060\103\006\005\140\114 -\001\001\000\060\072\060\070\006\010\053\006\001\005\005\007\002 -\001\026\054\150\164\164\160\072\057\057\141\143\162\141\151\172 -\056\151\143\160\142\162\141\163\151\154\056\147\157\166\056\142 -\162\057\104\120\103\141\143\162\141\151\172\056\160\144\146\060 -\077\006\003\125\035\037\004\070\060\066\060\064\240\062\240\060 -\206\056\150\164\164\160\072\057\057\141\143\162\141\151\172\056 -\151\143\160\142\162\141\163\151\154\056\147\157\166\056\142\162 -\057\114\103\122\141\143\162\141\151\172\166\062\056\143\162\154 -\060\037\006\003\125\035\043\004\030\060\026\200\024\014\071\040 -\072\267\001\037\313\327\050\175\101\240\307\372\112\255\062\044 -\276\060\035\006\003\125\035\016\004\026\004\024\014\071\040\072 -\267\001\037\313\327\050\175\101\240\307\372\112\255\062\044\276 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\006\060\015\006\011\052\206\110\206\367\015\001\001\015\005\000 -\003\202\002\001\000\131\232\024\151\030\155\175\051\103\160\175 -\166\233\141\337\167\216\032\166\344\251\326\313\166\244\026\014 -\114\224\022\306\220\321\201\003\305\255\006\331\055\104\274\262 -\011\166\011\200\071\147\000\030\064\155\006\012\346\265\020\131 -\110\272\165\140\374\077\216\035\030\125\160\053\236\113\225\254 -\211\253\012\167\044\173\141\304\307\221\046\216\106\023\121\067 -\266\214\047\012\323\015\360\232\053\042\203\203\263\275\203\065 -\255\233\074\274\170\203\051\065\141\066\370\021\161\063\040\124 -\143\123\105\001\330\023\132\204\073\327\146\023\044\267\304\106 -\305\042\330\163\044\356\034\023\027\226\310\045\350\033\036\317 -\337\205\120\155\074\352\367\120\236\033\227\336\247\153\333\326 -\163\322\317\174\120\300\260\214\345\123\022\172\206\071\254\065 -\133\147\307\352\324\373\321\302\135\352\016\227\163\230\256\051 -\277\344\072\363\004\066\120\054\355\336\036\333\205\350\035\204 -\011\356\363\246\203\063\133\157\107\171\117\110\265\374\270\046 -\023\253\252\263\364\141\021\373\105\147\363\035\076\156\376\052 -\113\046\104\032\237\261\242\340\074\332\340\344\005\072\170\254 -\373\250\241\115\277\135\054\167\051\220\315\023\035\357\006\050 -\330\267\024\363\133\310\311\236\247\176\061\022\212\170\142\304 -\321\005\274\006\002\143\004\053\015\211\335\344\134\133\062\200 -\104\324\102\354\052\363\362\100\207\061\325\076\342\012\062\014 -\024\215\325\162\155\013\346\375\215\344\250\363\005\215\165\027 -\167\233\012\271\372\220\222\231\145\210\062\147\103\005\216\055 -\013\025\273\065\361\141\350\331\147\167\355\026\345\350\001\055 -\153\064\077\216\203\263\367\352\017\112\036\076\065\204\235\214 -\200\064\077\251\225\350\303\255\304\315\236\312\024\026\054\031 -\236\344\066\213\271\271\243\102\045\007\076\303\345\325\150\117 -\240\146\034\246\263\266\163\034\220\032\077\100\271\032\126\102 -\160\207\377\157\055\017\021\375\036\377\367\205\060\025\016\343 -\027\061\356\047\225\314\311\351\231\036\227\307\155\133\007\265 -\005\152\075\362\105\337\272\202\171\044\160\056\233\202\037\146 -\251\245\155\047\314\366\052\242\321\137\205\157\340\106\235\252 -\322\245\116\125\016 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "?Autoridade Certificadora Raiz Brasileira v2" -# Issuer: CN=Autoridade Certificadora Raiz Brasileira v2,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR -# Serial Number: 1 (0x1) -# Subject: CN=Autoridade Certificadora Raiz Brasileira v2,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR -# Not Valid Before: Mon Jun 21 19:04:57 2010 -# Not Valid After : Wed Jun 21 19:04:57 2023 -# Fingerprint (SHA-256): FB:47:D9:2A:99:09:FD:4F:A9:BE:C0:27:37:54:3E:1F:35:14:CE:D7:47:40:7A:8D:9C:FA:39:7B:09:15:06:7C -# Fingerprint (SHA1): A9:82:2E:6C:69:33:C6:3C:14:8C:2D:CA:A4:4A:5C:F1:AA:D2:C4:2E -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "?Autoridade Certificadora Raiz Brasileira v2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\251\202\056\154\151\063\306\074\024\214\055\312\244\112\134\361 -\252\322\304\056 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\000\021\256\163\025\373\055\155\210\330\103\275\264\266\114\137 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\227\061\013\060\011\006\003\125\004\006\023\002\102\122 -\061\023\060\021\006\003\125\004\012\023\012\111\103\120\055\102 -\162\141\163\151\154\061\075\060\073\006\003\125\004\013\023\064 -\111\156\163\164\151\164\165\164\157\040\116\141\143\151\157\156 -\141\154\040\144\145\040\124\145\143\156\157\154\157\147\151\141 -\040\144\141\040\111\156\146\157\162\155\141\143\141\157\040\055 -\040\111\124\111\061\064\060\062\006\003\125\004\003\023\053\101 -\165\164\157\162\151\144\141\144\145\040\103\145\162\164\151\146 -\151\143\141\144\157\162\141\040\122\141\151\172\040\102\162\141 -\163\151\154\145\151\162\141\040\166\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Actalis Authentication Root CA" # @@ -9192,212 +7678,70 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE # -# Certificate "Network Solutions" +# Certificate "Sectigo (CCA)" # -# Issuer: CN=Network Solutions Certificate Authority,O=Network Solutions L.L.C.,C=US -# Serial Number:1c:a0:2d:c1:52:3b:6a:6d:8b:5c:1f:95:4a:ed:ac:30 -# Subject: CN=Network Solutions Certificate Authority,O=Network Solutions L.L.C.,C=US +# Issuer: CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB +# Serial Number:20:a4:c4:7f:dd:df:e1:c7:53:63:07:13:88:77:60:12 +# Subject: CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB # Not Valid Before: Sat Jan 01 00:00:00 2011 # Not Valid After : Tue Dec 31 23:59:59 2030 -# Fingerprint (SHA-256): 00:16:86:CD:18:1F:83:A1:B1:21:7D:30:5B:36:5C:41:E3:47:0A:78:A1:D3:7B:13:4A:98:CD:54:7B:92:DA:B3 -# Fingerprint (SHA1): 71:89:9A:67:BF:33:AF:31:BE:FD:C0:71:F8:F7:33:B1:83:85:63:32 +# Fingerprint (SHA-256): 1A:0D:20:44:5D:E5:BA:18:62:D1:9E:F8:80:85:8C:BC:E5:01:02:B3:6E:8F:0A:04:0C:3C:69:E7:45:22:FE:6E +# Fingerprint (SHA1): EE:86:93:87:FF:FD:83:49:AB:5A:D1:43:22:58:87:89:A4:57:B0:12 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Network Solutions" +CKA_LABEL UTF8 "Sectigo (CCA)" CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 CKA_SUBJECT MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\041\060\037\006\003\125\004\012\023\030\116\145\164\167\157\162 -\153\040\123\157\154\165\164\151\157\156\163\040\114\056\114\056 -\103\056\061\060\060\056\006\003\125\004\003\023\047\116\145\164 -\167\157\162\153\040\123\157\154\165\164\151\157\156\163\040\103 -\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150\157 +\060\201\201\061\013\060\011\006\003\125\004\006\023\002\107\102 +\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 +\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 +\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 +\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 +\040\103\101\040\114\151\155\151\164\145\144\061\047\060\045\006 +\003\125\004\003\023\036\103\117\115\117\104\117\040\103\145\162 +\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157 \162\151\164\171 END CKA_ID UTF8 "0" CKA_ISSUER MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\041\060\037\006\003\125\004\012\023\030\116\145\164\167\157\162 -\153\040\123\157\154\165\164\151\157\156\163\040\114\056\114\056 -\103\056\061\060\060\056\006\003\125\004\003\023\047\116\145\164 -\167\157\162\153\040\123\157\154\165\164\151\157\156\163\040\103 -\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150\157 +\060\201\201\061\013\060\011\006\003\125\004\006\023\002\107\102 +\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 +\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 +\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 +\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 +\040\103\101\040\114\151\155\151\164\145\144\061\047\060\045\006 +\003\125\004\003\023\036\103\117\115\117\104\117\040\103\145\162 +\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157 \162\151\164\171 END CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\034\240\055\301\122\073\152\155\213\134\037\225\112\355 -\254\060 +\002\020\040\244\304\177\335\337\341\307\123\143\007\023\210\167 +\140\022 END CKA_VALUE MULTILINE_OCTAL -\060\202\003\220\060\202\002\170\240\003\002\001\002\002\020\034 -\240\055\301\122\073\152\155\213\134\037\225\112\355\254\060\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\142 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\041\060 -\037\006\003\125\004\012\023\030\116\145\164\167\157\162\153\040 -\123\157\154\165\164\151\157\156\163\040\114\056\114\056\103\056 -\061\060\060\056\006\003\125\004\003\023\047\116\145\164\167\157 -\162\153\040\123\157\154\165\164\151\157\156\163\040\103\145\162 -\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151 +\060\202\003\320\060\202\002\270\240\003\002\001\002\002\020\040 +\244\304\177\335\337\341\307\123\143\007\023\210\167\140\022\060 +\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\201 +\201\061\013\060\011\006\003\125\004\006\023\002\107\102\061\033 +\060\031\006\003\125\004\010\023\022\107\162\145\141\164\145\162 +\040\115\141\156\143\150\145\163\164\145\162\061\020\060\016\006 +\003\125\004\007\023\007\123\141\154\146\157\162\144\061\032\060 +\030\006\003\125\004\012\023\021\103\117\115\117\104\117\040\103 +\101\040\114\151\155\151\164\145\144\061\047\060\045\006\003\125 +\004\003\023\036\103\117\115\117\104\117\040\103\145\162\164\151 +\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 \164\171\060\036\027\015\061\061\060\061\060\061\060\060\060\060 \060\060\132\027\015\063\060\061\062\063\061\062\063\065\071\065 -\071\132\060\142\061\013\060\011\006\003\125\004\006\023\002\125 -\123\061\041\060\037\006\003\125\004\012\023\030\116\145\164\167 -\157\162\153\040\123\157\154\165\164\151\157\156\163\040\114\056 -\114\056\103\056\061\060\060\056\006\003\125\004\003\023\047\116 -\145\164\167\157\162\153\040\123\157\154\165\164\151\157\156\163 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\060\202\001\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\001\017\000\060\202 -\001\012\002\202\001\001\000\344\274\176\222\060\155\306\330\216 -\053\013\274\106\316\340\047\226\336\336\371\372\022\323\074\063 -\163\263\004\057\274\161\214\345\237\266\042\140\076\137\135\316 -\011\377\202\014\033\232\121\120\032\046\211\335\325\141\135\031 -\334\022\017\055\012\242\103\135\027\320\064\222\040\352\163\317 -\070\054\006\046\011\172\162\367\372\120\062\370\302\223\323\151 -\242\043\316\101\261\314\344\325\037\066\321\212\072\370\214\143 -\342\024\131\151\355\015\323\177\153\350\270\003\345\117\152\345 -\230\143\151\110\005\276\056\377\063\266\351\227\131\151\370\147 -\031\256\223\141\226\104\025\323\162\260\077\274\152\175\354\110 -\177\215\303\253\252\161\053\123\151\101\123\064\265\260\271\305 -\006\012\304\260\105\365\101\135\156\211\105\173\075\073\046\214 -\164\302\345\322\321\175\262\021\324\373\130\062\042\232\200\311 -\334\375\014\351\177\136\003\227\316\073\000\024\207\047\160\070 -\251\216\156\263\047\166\230\121\340\005\343\041\253\032\325\205 -\042\074\051\265\232\026\305\200\250\364\273\153\060\217\057\106 -\002\242\261\014\042\340\323\002\003\001\000\001\243\102\060\100 -\060\035\006\003\125\035\016\004\026\004\024\041\060\311\373\000 -\327\116\230\332\207\252\052\320\247\056\261\100\061\247\114\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003 -\202\001\001\000\302\211\204\240\350\214\146\375\377\023\005\033 -\303\072\216\230\111\212\370\252\000\134\046\375\162\152\243\176 -\022\033\224\256\124\370\041\217\247\223\117\367\026\357\271\271 -\263\062\300\045\041\061\146\067\054\011\260\376\062\260\067\354 -\074\270\316\217\010\252\010\220\007\134\165\325\341\116\054\313 -\002\044\351\242\136\351\365\170\065\042\006\034\362\037\210\261 -\341\134\314\226\124\372\157\111\314\215\361\126\003\355\317\054 -\237\047\336\345\312\203\104\276\106\100\371\127\056\322\177\061 -\055\316\203\334\376\160\153\204\320\243\237\377\227\320\250\327 -\002\354\261\054\360\357\163\070\075\231\254\304\117\001\277\325 -\152\352\306\056\062\051\027\012\313\346\151\236\321\112\265\366 -\337\216\031\370\225\351\105\251\016\315\155\101\131\040\236\163 -\306\154\161\034\234\324\115\060\250\163\011\240\025\363\240\105 -\046\303\133\375\273\271\330\055\327\037\365\005\060\031\366\256 -\017\216\142\217\337\310\117\206\331\035\141\026\263\311\360\273 -\373\307\365\257\001\042\107\354\330\332\317\034\363\123\146\272 -\123\011\001\371 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Network Solutions" -# Issuer: CN=Network Solutions Certificate Authority,O=Network Solutions L.L.C.,C=US -# Serial Number:1c:a0:2d:c1:52:3b:6a:6d:8b:5c:1f:95:4a:ed:ac:30 -# Subject: CN=Network Solutions Certificate Authority,O=Network Solutions L.L.C.,C=US -# Not Valid Before: Sat Jan 01 00:00:00 2011 -# Not Valid After : Tue Dec 31 23:59:59 2030 -# Fingerprint (SHA-256): 00:16:86:CD:18:1F:83:A1:B1:21:7D:30:5B:36:5C:41:E3:47:0A:78:A1:D3:7B:13:4A:98:CD:54:7B:92:DA:B3 -# Fingerprint (SHA1): 71:89:9A:67:BF:33:AF:31:BE:FD:C0:71:F8:F7:33:B1:83:85:63:32 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Network Solutions" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\161\211\232\147\277\063\257\061\276\375\300\161\370\367\063\261 -\203\205\143\062 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\275\244\035\066\336\302\172\212\004\067\313\362\000\246\145\124 -END -CKA_ISSUER MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\041\060\037\006\003\125\004\012\023\030\116\145\164\167\157\162 -\153\040\123\157\154\165\164\151\157\156\163\040\114\056\114\056 -\103\056\061\060\060\056\006\003\125\004\003\023\047\116\145\164 -\167\157\162\153\040\123\157\154\165\164\151\157\156\163\040\103 -\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150\157 -\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\034\240\055\301\122\073\152\155\213\134\037\225\112\355 -\254\060 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "Sectigo (CCA)" -# -# Issuer: CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Serial Number:20:a4:c4:7f:dd:df:e1:c7:53:63:07:13:88:77:60:12 -# Subject: CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Not Valid Before: Sat Jan 01 00:00:00 2011 -# Not Valid After : Tue Dec 31 23:59:59 2030 -# Fingerprint (SHA-256): 1A:0D:20:44:5D:E5:BA:18:62:D1:9E:F8:80:85:8C:BC:E5:01:02:B3:6E:8F:0A:04:0C:3C:69:E7:45:22:FE:6E -# Fingerprint (SHA1): EE:86:93:87:FF:FD:83:49:AB:5A:D1:43:22:58:87:89:A4:57:B0:12 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Sectigo (CCA)" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\201\061\013\060\011\006\003\125\004\006\023\002\107\102 -\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 -\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 -\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 -\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 -\040\103\101\040\114\151\155\151\164\145\144\061\047\060\045\006 -\003\125\004\003\023\036\103\117\115\117\104\117\040\103\145\162 -\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157 -\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\201\061\013\060\011\006\003\125\004\006\023\002\107\102 -\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 -\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 -\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 -\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 -\040\103\101\040\114\151\155\151\164\145\144\061\047\060\045\006 -\003\125\004\003\023\036\103\117\115\117\104\117\040\103\145\162 -\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157 -\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\040\244\304\177\335\337\341\307\123\143\007\023\210\167 -\140\022 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\320\060\202\002\270\240\003\002\001\002\002\020\040 -\244\304\177\335\337\341\307\123\143\007\023\210\167\140\022\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\201 -\201\061\013\060\011\006\003\125\004\006\023\002\107\102\061\033 -\060\031\006\003\125\004\010\023\022\107\162\145\141\164\145\162 -\040\115\141\156\143\150\145\163\164\145\162\061\020\060\016\006 -\003\125\004\007\023\007\123\141\154\146\157\162\144\061\032\060 -\030\006\003\125\004\012\023\021\103\117\115\117\104\117\040\103 -\101\040\114\151\155\151\164\145\144\061\047\060\045\006\003\125 -\004\003\023\036\103\117\115\117\104\117\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\060\036\027\015\061\061\060\061\060\061\060\060\060\060 -\060\060\132\027\015\063\060\061\062\063\061\062\063\065\071\065 -\071\132\060\201\201\061\013\060\011\006\003\125\004\006\023\002 -\107\102\061\033\060\031\006\003\125\004\010\023\022\107\162\145 -\141\164\145\162\040\115\141\156\143\150\145\163\164\145\162\061 -\020\060\016\006\003\125\004\007\023\007\123\141\154\146\157\162 -\144\061\032\060\030\006\003\125\004\012\023\021\103\117\115\117 -\104\117\040\103\101\040\114\151\155\151\164\145\144\061\047\060 -\045\006\003\125\004\003\023\036\103\117\115\117\104\117\040\103 -\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164 +\071\132\060\201\201\061\013\060\011\006\003\125\004\006\023\002 +\107\102\061\033\060\031\006\003\125\004\010\023\022\107\162\145 +\141\164\145\162\040\115\141\156\143\150\145\163\164\145\162\061 +\020\060\016\006\003\125\004\007\023\007\123\141\154\146\157\162 +\144\061\032\060\030\006\003\125\004\012\023\021\103\117\115\117 +\104\117\040\103\101\040\114\151\155\151\164\145\144\061\047\060 +\045\006\003\125\004\003\023\036\103\117\115\117\104\117\040\103 +\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164 \150\157\162\151\164\171\060\202\001\042\060\015\006\011\052\206 \110\206\367\015\001\001\001\005\000\003\202\001\017\000\060\202 \001\012\002\202\001\001\000\320\100\213\213\162\343\221\033\367 @@ -9485,261 +7829,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "AC1 RAIZ MTIN" -# -# Issuer: C=ES,L=MADRID,O=MINISTERIO DE TRABAJO E INMIGRACION,OU=SUBDIRECCION GENERAL DE PROCESO DE DATOS,OU=PRESTADOR DE SERVICIOS DE CERTIFICACION MTIN,serialNumber=S2819001E,CN=AC1 RAIZ MTIN -# Serial Number:05:0b:41:5e:82:7b -# Subject: C=ES,L=MADRID,O=MINISTERIO DE TRABAJO E INMIGRACION,OU=SUBDIRECCION GENERAL DE PROCESO DE DATOS,OU=PRESTADOR DE SERVICIOS DE CERTIFICACION MTIN,serialNumber=S2819001E,CN=AC1 RAIZ MTIN -# Not Valid Before: Thu Nov 05 16:17:45 2009 -# Not Valid After : Sun Nov 03 16:17:45 2019 -# Fingerprint (SHA-256): 5B:1D:9D:24:DE:0A:FE:A8:B3:5B:A0:4A:1C:3E:25:D0:81:2C:DF:7C:46:25:DE:0A:89:AF:9F:E4:BB:D1:BB:15 -# Fingerprint (SHA1): 6A:D2:3B:9D:C4:8E:37:5F:85:9A:D9:CA:B5:85:32:5C:23:89:40:71 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "AC1 RAIZ MTIN" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\342\061\026\060\024\006\003\125\004\003\023\015\101\103 -\061\040\122\101\111\132\040\115\124\111\116\061\022\060\020\006 -\003\125\004\005\023\011\123\062\070\061\071\060\060\061\105\061 -\065\060\063\006\003\125\004\013\023\054\120\122\105\123\124\101 -\104\117\122\040\104\105\040\123\105\122\126\111\103\111\117\123 -\040\104\105\040\103\105\122\124\111\106\111\103\101\103\111\117 -\116\040\115\124\111\116\061\061\060\057\006\003\125\004\013\023 -\050\123\125\102\104\111\122\105\103\103\111\117\116\040\107\105 -\116\105\122\101\114\040\104\105\040\120\122\117\103\105\123\117 -\040\104\105\040\104\101\124\117\123\061\054\060\052\006\003\125 -\004\012\023\043\115\111\116\111\123\124\105\122\111\117\040\104 -\105\040\124\122\101\102\101\112\117\040\105\040\111\116\115\111 -\107\122\101\103\111\117\116\061\017\060\015\006\003\125\004\007 -\023\006\115\101\104\122\111\104\061\013\060\011\006\003\125\004 -\006\023\002\105\123 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\342\061\026\060\024\006\003\125\004\003\023\015\101\103 -\061\040\122\101\111\132\040\115\124\111\116\061\022\060\020\006 -\003\125\004\005\023\011\123\062\070\061\071\060\060\061\105\061 -\065\060\063\006\003\125\004\013\023\054\120\122\105\123\124\101 -\104\117\122\040\104\105\040\123\105\122\126\111\103\111\117\123 -\040\104\105\040\103\105\122\124\111\106\111\103\101\103\111\117 -\116\040\115\124\111\116\061\061\060\057\006\003\125\004\013\023 -\050\123\125\102\104\111\122\105\103\103\111\117\116\040\107\105 -\116\105\122\101\114\040\104\105\040\120\122\117\103\105\123\117 -\040\104\105\040\104\101\124\117\123\061\054\060\052\006\003\125 -\004\012\023\043\115\111\116\111\123\124\105\122\111\117\040\104 -\105\040\124\122\101\102\101\112\117\040\105\040\111\116\115\111 -\107\122\101\103\111\117\116\061\017\060\015\006\003\125\004\007 -\023\006\115\101\104\122\111\104\061\013\060\011\006\003\125\004 -\006\023\002\105\123 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\006\005\013\101\136\202\173 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\011\111\060\202\007\061\240\003\002\001\002\002\006\005 -\013\101\136\202\173\060\015\006\011\052\206\110\206\367\015\001 -\001\005\005\000\060\201\342\061\026\060\024\006\003\125\004\003 -\023\015\101\103\061\040\122\101\111\132\040\115\124\111\116\061 -\022\060\020\006\003\125\004\005\023\011\123\062\070\061\071\060 -\060\061\105\061\065\060\063\006\003\125\004\013\023\054\120\122 -\105\123\124\101\104\117\122\040\104\105\040\123\105\122\126\111 -\103\111\117\123\040\104\105\040\103\105\122\124\111\106\111\103 -\101\103\111\117\116\040\115\124\111\116\061\061\060\057\006\003 -\125\004\013\023\050\123\125\102\104\111\122\105\103\103\111\117 -\116\040\107\105\116\105\122\101\114\040\104\105\040\120\122\117 -\103\105\123\117\040\104\105\040\104\101\124\117\123\061\054\060 -\052\006\003\125\004\012\023\043\115\111\116\111\123\124\105\122 -\111\117\040\104\105\040\124\122\101\102\101\112\117\040\105\040 -\111\116\115\111\107\122\101\103\111\117\116\061\017\060\015\006 -\003\125\004\007\023\006\115\101\104\122\111\104\061\013\060\011 -\006\003\125\004\006\023\002\105\123\060\036\027\015\060\071\061 -\061\060\065\061\066\061\067\064\065\132\027\015\061\071\061\061 -\060\063\061\066\061\067\064\065\132\060\201\342\061\026\060\024 -\006\003\125\004\003\023\015\101\103\061\040\122\101\111\132\040 -\115\124\111\116\061\022\060\020\006\003\125\004\005\023\011\123 -\062\070\061\071\060\060\061\105\061\065\060\063\006\003\125\004 -\013\023\054\120\122\105\123\124\101\104\117\122\040\104\105\040 -\123\105\122\126\111\103\111\117\123\040\104\105\040\103\105\122 -\124\111\106\111\103\101\103\111\117\116\040\115\124\111\116\061 -\061\060\057\006\003\125\004\013\023\050\123\125\102\104\111\122 -\105\103\103\111\117\116\040\107\105\116\105\122\101\114\040\104 -\105\040\120\122\117\103\105\123\117\040\104\105\040\104\101\124 -\117\123\061\054\060\052\006\003\125\004\012\023\043\115\111\116 -\111\123\124\105\122\111\117\040\104\105\040\124\122\101\102\101 -\112\117\040\105\040\111\116\115\111\107\122\101\103\111\117\116 -\061\017\060\015\006\003\125\004\007\023\006\115\101\104\122\111 -\104\061\013\060\011\006\003\125\004\006\023\002\105\123\060\202 -\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005 -\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000\334 -\315\315\261\277\336\045\365\377\034\063\163\231\074\033\241\155 -\365\240\304\175\233\070\146\215\011\337\003\154\127\065\264\023 -\101\376\343\137\346\042\004\130\030\271\116\151\063\004\077\225 -\307\331\116\377\063\064\247\062\100\062\223\127\376\201\257\045 -\103\134\035\375\173\127\013\142\010\147\147\142\264\343\345\130 -\045\200\346\252\206\142\100\347\117\020\141\051\111\046\253\115 -\174\241\253\133\141\061\201\006\152\144\224\115\047\370\113\036 -\321\325\103\342\327\261\155\366\366\377\264\160\125\366\010\231 -\267\164\001\340\363\236\265\174\344\004\210\010\120\131\170\037 -\032\224\333\357\310\311\211\323\067\270\363\075\206\321\031\313 -\203\132\020\007\010\117\231\164\002\007\360\062\121\310\373\346 -\320\074\046\166\175\162\176\254\166\067\301\212\165\040\134\100 -\334\204\077\320\111\174\115\147\256\071\357\344\316\200\341\312 -\235\346\055\253\056\346\022\225\332\371\373\337\343\342\214\075 -\207\373\105\156\104\253\366\170\222\047\024\241\135\153\117\160 -\173\127\163\357\371\135\250\017\165\237\357\021\140\031\204\260 -\144\100\356\330\251\206\372\245\327\105\364\021\157\361\206\310 -\064\133\210\110\316\272\335\315\233\335\210\343\001\066\350\254 -\152\350\022\013\260\340\173\220\036\205\013\111\211\001\366\377 -\202\337\130\145\042\203\110\326\007\320\034\146\374\146\050\072 -\304\303\345\370\231\145\047\122\130\363\153\361\157\002\104\204 -\165\320\244\343\150\123\141\162\357\366\057\251\263\254\365\364 -\366\320\134\334\151\114\314\171\322\244\033\310\163\006\064\164 -\264\361\152\312\051\050\307\064\204\133\043\330\272\000\214\314 -\011\301\307\157\135\004\253\267\117\046\167\251\065\317\040\326 -\263\377\061\151\320\064\373\045\354\150\226\012\242\335\203\037 -\312\074\217\164\066\045\124\357\365\030\173\302\044\061\321\373 -\202\004\256\004\202\326\365\002\051\161\341\222\161\164\216\333 -\252\161\035\304\073\306\142\046\154\206\074\043\125\353\051\321 -\037\253\312\036\143\347\263\163\264\247\270\052\072\366\037\373 -\207\145\210\374\363\237\376\277\353\325\035\266\250\003\351\145 -\203\031\214\340\030\355\027\330\034\015\075\234\212\130\177\002 -\003\001\000\001\243\202\003\001\060\202\002\375\060\067\006\010 -\053\006\001\005\005\007\001\001\004\053\060\051\060\047\006\010 -\053\006\001\005\005\007\060\001\206\033\150\164\164\160\072\057 -\057\143\141\056\155\164\151\156\056\145\163\057\155\164\151\156 -\057\157\143\163\160\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\033\006\003\125\035\021\004\024\060\022 -\201\020\141\144\155\151\156\137\143\141\100\155\164\151\156\056 -\145\163\060\033\006\003\125\035\022\004\024\060\022\201\020\141 -\144\155\151\156\137\143\141\100\155\164\151\156\056\145\163\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\162\006\003\125\035\037\004\153\060\151\060\062\240\060\240 -\056\206\054\150\164\164\160\072\057\057\143\141\056\155\164\151 -\156\056\145\163\057\155\164\151\156\057\143\162\154\057\115\124 -\111\116\101\165\164\157\162\151\144\141\144\122\141\151\172\060 -\063\240\061\240\057\206\055\150\164\164\160\072\057\057\143\141 -\062\056\155\164\151\156\056\145\163\057\155\164\151\156\057\143 -\162\154\057\115\124\111\116\101\165\164\157\162\151\144\141\144 -\122\141\151\172\060\201\271\006\003\125\035\040\004\201\261\060 -\201\256\060\201\253\006\013\053\006\001\004\001\201\331\005\002 -\004\001\060\201\233\060\060\006\010\053\006\001\005\005\007\002 -\001\026\044\150\164\164\160\072\057\057\143\141\056\155\164\151 -\156\056\145\163\057\155\164\151\156\057\104\120\103\171\120\157 -\154\151\164\151\143\141\163\060\147\006\010\053\006\001\005\005 -\007\002\002\060\133\032\131\103\145\162\164\151\146\151\143\141 -\144\157\040\162\141\355\172\056\040\103\157\156\163\165\154\164 -\145\040\154\141\163\040\143\157\156\144\151\143\151\157\156\145 -\163\040\144\145\040\165\163\157\040\145\156\040\150\164\164\160 -\072\057\057\143\141\056\155\164\151\156\056\145\163\057\155\164 -\151\156\057\104\120\103\171\120\157\154\151\164\151\143\141\163 -\060\035\006\003\125\035\016\004\026\004\024\063\103\030\263\304 -\113\035\313\037\371\360\116\374\337\112\344\025\140\310\203\060 -\202\001\026\006\003\125\035\043\004\202\001\015\060\202\001\011 -\200\024\063\103\030\263\304\113\035\313\037\371\360\116\374\337 -\112\344\025\140\310\203\241\201\350\244\201\345\060\201\342\061 -\026\060\024\006\003\125\004\003\023\015\101\103\061\040\122\101 -\111\132\040\115\124\111\116\061\022\060\020\006\003\125\004\005 -\023\011\123\062\070\061\071\060\060\061\105\061\065\060\063\006 -\003\125\004\013\023\054\120\122\105\123\124\101\104\117\122\040 -\104\105\040\123\105\122\126\111\103\111\117\123\040\104\105\040 -\103\105\122\124\111\106\111\103\101\103\111\117\116\040\115\124 -\111\116\061\061\060\057\006\003\125\004\013\023\050\123\125\102 -\104\111\122\105\103\103\111\117\116\040\107\105\116\105\122\101 -\114\040\104\105\040\120\122\117\103\105\123\117\040\104\105\040 -\104\101\124\117\123\061\054\060\052\006\003\125\004\012\023\043 -\115\111\116\111\123\124\105\122\111\117\040\104\105\040\124\122 -\101\102\101\112\117\040\105\040\111\116\115\111\107\122\101\103 -\111\117\116\061\017\060\015\006\003\125\004\007\023\006\115\101 -\104\122\111\104\061\013\060\011\006\003\125\004\006\023\002\105 -\123\202\006\005\013\101\136\202\173\060\015\006\011\052\206\110 -\206\367\015\001\001\005\005\000\003\202\002\001\000\231\343\252 -\016\221\323\222\251\352\377\104\147\323\240\055\040\147\363\020 -\017\032\067\167\135\122\106\346\152\270\367\210\363\202\303\052 -\364\141\015\054\237\057\206\055\141\351\140\131\275\267\117\257 -\223\011\034\371\063\167\100\234\241\174\145\334\136\220\225\251 -\364\276\202\364\374\202\035\036\305\075\340\134\256\336\055\325 -\143\166\253\361\354\044\247\040\370\036\350\317\161\202\003\335 -\216\166\142\052\265\051\210\023\044\255\134\364\240\112\270\352 -\023\212\126\215\152\057\150\071\162\206\130\304\244\253\165\174 -\104\347\032\204\014\215\021\334\031\271\034\066\356\363\377\121 -\233\263\103\310\045\176\347\016\110\243\344\117\006\055\025\036 -\240\246\107\220\127\073\370\057\055\333\043\272\353\043\223\260 -\270\122\033\140\034\324\031\260\155\170\217\113\235\247\013\050 -\147\112\335\170\110\275\261\076\230\324\273\025\376\263\137\155 -\035\165\310\036\317\017\256\112\032\135\207\054\006\164\154\012 -\205\123\044\136\172\311\240\174\161\233\222\135\157\110\177\266 -\130\161\262\114\246\032\011\043\064\120\161\025\153\107\333\373 -\276\032\155\302\214\224\057\007\147\040\042\147\143\267\253\306 -\031\234\226\015\142\352\010\244\032\160\357\251\271\357\116\305 -\100\274\342\207\127\363\003\312\050\231\032\300\125\140\165\173 -\143\276\144\077\226\116\113\217\375\055\246\164\300\337\111\072 -\354\125\176\146\323\272\375\357\223\261\143\362\133\077\355\166 -\241\331\323\014\376\056\157\012\246\123\113\357\321\363\107\255 -\271\036\354\114\037\276\320\203\123\303\233\025\105\377\056\007 -\321\332\152\222\105\346\154\127\133\044\056\121\151\311\060\317 -\327\373\244\001\065\132\315\247\353\024\157\264\267\140\042\010 -\305\161\310\223\342\276\045\137\365\014\372\130\121\075\173\310 -\057\067\371\223\034\052\011\340\147\375\226\211\102\312\353\066 -\260\326\033\246\120\017\132\235\166\377\244\117\306\354\015\304 -\341\320\347\130\076\326\171\300\167\115\014\325\263\344\230\115 -\335\106\056\122\260\342\017\015\102\066\245\020\044\122\050\276 -\142\065\102\071\311\172\226\037\356\346\113\131\077\044\163\213 -\277\042\113\146\362\333\017\065\361\067\235\240\044 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "AC1 RAIZ MTIN" -# Issuer: C=ES,L=MADRID,O=MINISTERIO DE TRABAJO E INMIGRACION,OU=SUBDIRECCION GENERAL DE PROCESO DE DATOS,OU=PRESTADOR DE SERVICIOS DE CERTIFICACION MTIN,serialNumber=S2819001E,CN=AC1 RAIZ MTIN -# Serial Number:05:0b:41:5e:82:7b -# Subject: C=ES,L=MADRID,O=MINISTERIO DE TRABAJO E INMIGRACION,OU=SUBDIRECCION GENERAL DE PROCESO DE DATOS,OU=PRESTADOR DE SERVICIOS DE CERTIFICACION MTIN,serialNumber=S2819001E,CN=AC1 RAIZ MTIN -# Not Valid Before: Thu Nov 05 16:17:45 2009 -# Not Valid After : Sun Nov 03 16:17:45 2019 -# Fingerprint (SHA-256): 5B:1D:9D:24:DE:0A:FE:A8:B3:5B:A0:4A:1C:3E:25:D0:81:2C:DF:7C:46:25:DE:0A:89:AF:9F:E4:BB:D1:BB:15 -# Fingerprint (SHA1): 6A:D2:3B:9D:C4:8E:37:5F:85:9A:D9:CA:B5:85:32:5C:23:89:40:71 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "AC1 RAIZ MTIN" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\152\322\073\235\304\216\067\137\205\232\331\312\265\205\062\134 -\043\211\100\161 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\047\023\325\054\160\006\076\025\173\323\142\131\062\352\001\005 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\342\061\026\060\024\006\003\125\004\003\023\015\101\103 -\061\040\122\101\111\132\040\115\124\111\116\061\022\060\020\006 -\003\125\004\005\023\011\123\062\070\061\071\060\060\061\105\061 -\065\060\063\006\003\125\004\013\023\054\120\122\105\123\124\101 -\104\117\122\040\104\105\040\123\105\122\126\111\103\111\117\123 -\040\104\105\040\103\105\122\124\111\106\111\103\101\103\111\117 -\116\040\115\124\111\116\061\061\060\057\006\003\125\004\013\023 -\050\123\125\102\104\111\122\105\103\103\111\117\116\040\107\105 -\116\105\122\101\114\040\104\105\040\120\122\117\103\105\123\117 -\040\104\105\040\104\101\124\117\123\061\054\060\052\006\003\125 -\004\012\023\043\115\111\116\111\123\124\105\122\111\117\040\104 -\105\040\124\122\101\102\101\112\117\040\105\040\111\116\115\111 -\107\122\101\103\111\117\116\061\017\060\015\006\003\125\004\007 -\023\006\115\101\104\122\111\104\061\013\060\011\006\003\125\004 -\006\023\002\105\123 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\006\005\013\101\136\202\173 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Microsoft Root Certificate Authority 2011" # @@ -10256,158 +8345,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Estonian Certification Centre Root CA" -# -# Issuer: E=pki@sk.ee,CN=EE Certification Centre Root CA,O=AS Sertifitseerimiskeskus,C=EE -# Serial Number:54:80:f9:a0:73:ed:3f:00:4c:ca:89:d8:e3:71:e6:4a -# Subject: E=pki@sk.ee,CN=EE Certification Centre Root CA,O=AS Sertifitseerimiskeskus,C=EE -# Not Valid Before: Sat Oct 30 10:10:30 2010 -# Not Valid After : Tue Dec 17 23:59:59 2030 -# Fingerprint (SHA-256): 3E:84:BA:43:42:90:85:16:E7:75:73:C0:99:2F:09:79:CA:08:4E:46:85:68:1F:F1:95:CC:BA:8A:22:9B:8A:76 -# Fingerprint (SHA1): C9:A8:B9:E7:55:80:5E:58:E3:53:77:A7:25:EB:AF:C3:7B:27:CC:D7 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Estonian Certification Centre Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\165\061\013\060\011\006\003\125\004\006\023\002\105\105\061 -\042\060\040\006\003\125\004\012\014\031\101\123\040\123\145\162 -\164\151\146\151\164\163\145\145\162\151\155\151\163\153\145\163 -\153\165\163\061\050\060\046\006\003\125\004\003\014\037\105\105 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\103 -\145\156\164\162\145\040\122\157\157\164\040\103\101\061\030\060 -\026\006\011\052\206\110\206\367\015\001\011\001\026\011\160\153 -\151\100\163\153\056\145\145 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\165\061\013\060\011\006\003\125\004\006\023\002\105\105\061 -\042\060\040\006\003\125\004\012\014\031\101\123\040\123\145\162 -\164\151\146\151\164\163\145\145\162\151\155\151\163\153\145\163 -\153\165\163\061\050\060\046\006\003\125\004\003\014\037\105\105 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\103 -\145\156\164\162\145\040\122\157\157\164\040\103\101\061\030\060 -\026\006\011\052\206\110\206\367\015\001\011\001\026\011\160\153 -\151\100\163\153\056\145\145 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\124\200\371\240\163\355\077\000\114\312\211\330\343\161 -\346\112 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\003\060\202\002\353\240\003\002\001\002\002\020\124 -\200\371\240\163\355\077\000\114\312\211\330\343\161\346\112\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\165 -\061\013\060\011\006\003\125\004\006\023\002\105\105\061\042\060 -\040\006\003\125\004\012\014\031\101\123\040\123\145\162\164\151 -\146\151\164\163\145\145\162\151\155\151\163\153\145\163\153\165 -\163\061\050\060\046\006\003\125\004\003\014\037\105\105\040\103 -\145\162\164\151\146\151\143\141\164\151\157\156\040\103\145\156 -\164\162\145\040\122\157\157\164\040\103\101\061\030\060\026\006 -\011\052\206\110\206\367\015\001\011\001\026\011\160\153\151\100 -\163\153\056\145\145\060\042\030\017\062\060\061\060\061\060\063 -\060\061\060\061\060\063\060\132\030\017\062\060\063\060\061\062 -\061\067\062\063\065\071\065\071\132\060\165\061\013\060\011\006 -\003\125\004\006\023\002\105\105\061\042\060\040\006\003\125\004 -\012\014\031\101\123\040\123\145\162\164\151\146\151\164\163\145 -\145\162\151\155\151\163\153\145\163\153\165\163\061\050\060\046 -\006\003\125\004\003\014\037\105\105\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\103\145\156\164\162\145\040\122 -\157\157\164\040\103\101\061\030\060\026\006\011\052\206\110\206 -\367\015\001\011\001\026\011\160\153\151\100\163\153\056\145\145 -\060\202\001\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\001\017\000\060\202\001\012\002\202\001\001 -\000\310\040\300\354\340\305\113\253\007\170\225\363\104\356\373 -\013\014\377\164\216\141\273\261\142\352\043\330\253\241\145\062 -\172\353\216\027\117\226\330\012\173\221\242\143\154\307\214\114 -\056\171\277\251\005\374\151\134\225\215\142\371\271\160\355\303 -\121\175\320\223\346\154\353\060\113\341\274\175\277\122\233\316 -\156\173\145\362\070\261\300\242\062\357\142\262\150\340\141\123 -\301\066\225\377\354\224\272\066\256\234\034\247\062\017\345\174 -\264\306\157\164\375\173\030\350\254\127\355\006\040\113\062\060 -\130\133\375\315\250\346\241\374\160\274\216\222\163\333\227\247 -\174\041\256\075\301\365\110\207\154\047\275\237\045\164\201\125 -\260\367\165\366\075\244\144\153\326\117\347\316\100\255\017\335 -\062\323\274\212\022\123\230\311\211\373\020\035\115\176\315\176 -\037\126\015\041\160\205\366\040\203\037\366\272\037\004\217\352 -\167\210\065\304\377\352\116\241\213\115\077\143\033\104\303\104 -\324\045\166\312\267\215\327\036\112\146\144\315\134\305\234\203 -\341\302\010\210\232\354\116\243\361\076\034\054\331\154\035\241 -\113\002\003\001\000\001\243\201\212\060\201\207\060\017\006\003 -\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006 -\003\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006 -\003\125\035\016\004\026\004\024\022\362\132\076\352\126\034\277 -\315\006\254\361\361\045\311\251\113\324\024\231\060\105\006\003 -\125\035\045\004\076\060\074\006\010\053\006\001\005\005\007\003 -\002\006\010\053\006\001\005\005\007\003\001\006\010\053\006\001 -\005\005\007\003\003\006\010\053\006\001\005\005\007\003\004\006 -\010\053\006\001\005\005\007\003\010\006\010\053\006\001\005\005 -\007\003\011\060\015\006\011\052\206\110\206\367\015\001\001\005 -\005\000\003\202\001\001\000\173\366\344\300\015\252\031\107\267 -\115\127\243\376\255\273\261\152\325\017\236\333\344\143\305\216 -\241\120\126\223\226\270\070\300\044\042\146\274\123\024\141\225 -\277\320\307\052\226\071\077\175\050\263\020\100\041\152\304\257 -\260\122\167\030\341\226\330\126\135\343\335\066\136\035\247\120 -\124\240\305\052\344\252\214\224\212\117\235\065\377\166\244\006 -\023\221\242\242\175\000\104\077\125\323\202\074\032\325\133\274 -\126\114\042\056\106\103\212\044\100\055\363\022\270\073\160\032 -\244\226\271\032\257\207\101\032\152\030\015\006\117\307\076\156 -\271\051\115\015\111\211\021\207\062\133\346\113\004\310\344\134 -\346\164\163\224\135\026\230\023\225\376\373\333\261\104\345\072 -\160\254\067\153\346\263\063\162\050\311\263\127\240\366\002\026 -\210\006\013\266\246\113\040\050\324\336\075\213\255\067\005\123 -\164\376\156\314\274\103\027\161\136\371\305\314\032\251\141\356 -\367\166\014\363\162\364\162\255\317\162\002\066\007\107\317\357 -\031\120\211\140\314\351\044\225\017\302\313\035\362\157\166\220 -\307\314\165\301\226\305\235 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Estonian Certification Centre Root CA" -# Issuer: E=pki@sk.ee,CN=EE Certification Centre Root CA,O=AS Sertifitseerimiskeskus,C=EE -# Serial Number:54:80:f9:a0:73:ed:3f:00:4c:ca:89:d8:e3:71:e6:4a -# Subject: E=pki@sk.ee,CN=EE Certification Centre Root CA,O=AS Sertifitseerimiskeskus,C=EE -# Not Valid Before: Sat Oct 30 10:10:30 2010 -# Not Valid After : Tue Dec 17 23:59:59 2030 -# Fingerprint (SHA-256): 3E:84:BA:43:42:90:85:16:E7:75:73:C0:99:2F:09:79:CA:08:4E:46:85:68:1F:F1:95:CC:BA:8A:22:9B:8A:76 -# Fingerprint (SHA1): C9:A8:B9:E7:55:80:5E:58:E3:53:77:A7:25:EB:AF:C3:7B:27:CC:D7 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Estonian Certification Centre Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\311\250\271\347\125\200\136\130\343\123\167\247\045\353\257\303 -\173\047\314\327 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\103\136\210\324\175\032\112\176\375\204\056\122\353\001\324\157 -END -CKA_ISSUER MULTILINE_OCTAL -\060\165\061\013\060\011\006\003\125\004\006\023\002\105\105\061 -\042\060\040\006\003\125\004\012\014\031\101\123\040\123\145\162 -\164\151\146\151\164\163\145\145\162\151\155\151\163\153\145\163 -\153\165\163\061\050\060\046\006\003\125\004\003\014\037\105\105 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\103 -\145\156\164\162\145\040\122\157\157\164\040\103\101\061\030\060 -\026\006\011\052\206\110\206\367\015\001\011\001\026\011\160\153 -\151\100\163\153\056\145\145 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\124\200\371\240\163\355\077\000\114\312\211\330\343\161 -\346\112 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Sectigo ECC" # @@ -11197,216 +9134,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Colegio de Registradores Mercantiles" -# -# Issuer: CN=Registradores de Espa..a - CA Ra..z,OU=Certificado Propio,O=Colegio de Registradores de la Propiedad y Mercantiles de Espa..a,C=ES -# Serial Number:2d:e4:0a:e1:9b:d1:c2:aa:4c:f4:00:ac:81:35:f9 -# Subject: CN=Registradores de Espa..a - CA Ra..z,OU=Certificado Propio,O=Colegio de Registradores de la Propiedad y Mercantiles de Espa..a,C=ES -# Not Valid Before: Tue Jan 09 17:00:39 2007 -# Not Valid After : Thu Jan 09 17:00:39 2031 -# Fingerprint (SHA-256): 7D:2B:F3:48:9E:BC:9A:D3:44:8B:8B:08:27:71:5A:3C:BF:E3:D5:23:E3:B5:6A:9B:5F:C1:D2:A2:DA:2F:20:FE -# Fingerprint (SHA1): 21:11:65:CA:37:9F:BB:5E:D8:01:E3:1C:43:0A:62:AA:C1:09:BC:B4 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Colegio de Registradores Mercantiles" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\244\061\013\060\011\006\003\125\004\006\023\002\105\123 -\061\112\060\110\006\003\125\004\012\014\101\103\157\154\145\147 -\151\157\040\144\145\040\122\145\147\151\163\164\162\141\144\157 -\162\145\163\040\144\145\040\154\141\040\120\162\157\160\151\145 -\144\141\144\040\171\040\115\145\162\143\141\156\164\151\154\145 -\163\040\144\145\040\105\163\160\141\303\261\141\061\033\060\031 -\006\003\125\004\013\014\022\103\145\162\164\151\146\151\143\141 -\144\157\040\120\162\157\160\151\157\061\054\060\052\006\003\125 -\004\003\014\043\122\145\147\151\163\164\162\141\144\157\162\145 -\163\040\144\145\040\105\163\160\141\303\261\141\040\055\040\103 -\101\040\122\141\303\255\172 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\244\061\013\060\011\006\003\125\004\006\023\002\105\123 -\061\112\060\110\006\003\125\004\012\014\101\103\157\154\145\147 -\151\157\040\144\145\040\122\145\147\151\163\164\162\141\144\157 -\162\145\163\040\144\145\040\154\141\040\120\162\157\160\151\145 -\144\141\144\040\171\040\115\145\162\143\141\156\164\151\154\145 -\163\040\144\145\040\105\163\160\141\303\261\141\061\033\060\031 -\006\003\125\004\013\014\022\103\145\162\164\151\146\151\143\141 -\144\157\040\120\162\157\160\151\157\061\054\060\052\006\003\125 -\004\003\014\043\122\145\147\151\163\164\162\141\144\157\162\145 -\163\040\144\145\040\105\163\160\141\303\261\141\040\055\040\103 -\101\040\122\141\303\255\172 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\055\344\012\341\233\321\302\252\114\364\000\254\201\065 -\371 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\007\023\060\202\004\373\240\003\002\001\002\002\017\055 -\344\012\341\233\321\302\252\114\364\000\254\201\065\371\060\015 -\006\011\052\206\110\206\367\015\001\001\005\005\000\060\201\244 -\061\013\060\011\006\003\125\004\006\023\002\105\123\061\112\060 -\110\006\003\125\004\012\014\101\103\157\154\145\147\151\157\040 -\144\145\040\122\145\147\151\163\164\162\141\144\157\162\145\163 -\040\144\145\040\154\141\040\120\162\157\160\151\145\144\141\144 -\040\171\040\115\145\162\143\141\156\164\151\154\145\163\040\144 -\145\040\105\163\160\141\303\261\141\061\033\060\031\006\003\125 -\004\013\014\022\103\145\162\164\151\146\151\143\141\144\157\040 -\120\162\157\160\151\157\061\054\060\052\006\003\125\004\003\014 -\043\122\145\147\151\163\164\162\141\144\157\162\145\163\040\144 -\145\040\105\163\160\141\303\261\141\040\055\040\103\101\040\122 -\141\303\255\172\060\036\027\015\060\067\060\061\060\071\061\067 -\060\060\063\071\132\027\015\063\061\060\061\060\071\061\067\060 -\060\063\071\132\060\201\244\061\013\060\011\006\003\125\004\006 -\023\002\105\123\061\112\060\110\006\003\125\004\012\014\101\103 -\157\154\145\147\151\157\040\144\145\040\122\145\147\151\163\164 -\162\141\144\157\162\145\163\040\144\145\040\154\141\040\120\162 -\157\160\151\145\144\141\144\040\171\040\115\145\162\143\141\156 -\164\151\154\145\163\040\144\145\040\105\163\160\141\303\261\141 -\061\033\060\031\006\003\125\004\013\014\022\103\145\162\164\151 -\146\151\143\141\144\157\040\120\162\157\160\151\157\061\054\060 -\052\006\003\125\004\003\014\043\122\145\147\151\163\164\162\141 -\144\157\162\145\163\040\144\145\040\105\163\160\141\303\261\141 -\040\055\040\103\101\040\122\141\303\255\172\060\202\002\042\060 -\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202 -\002\017\000\060\202\002\012\002\202\002\001\000\254\120\033\016 -\222\316\270\174\025\152\370\344\017\235\174\174\174\166\344\013 -\046\072\121\006\315\050\263\355\017\076\331\221\173\314\374\207 -\203\102\367\173\260\135\270\172\147\376\064\041\142\277\271\051 -\303\336\132\361\003\362\353\362\342\022\302\145\144\166\247\365 -\346\313\061\243\150\362\171\353\235\124\305\122\377\237\075\203 -\143\016\346\277\035\050\002\175\374\043\364\104\223\243\251\103 -\234\330\350\045\032\040\065\365\265\260\316\353\125\053\372\331 -\136\260\241\104\053\345\000\054\044\017\067\177\062\064\204\262 -\310\025\157\212\365\362\350\056\367\103\216\002\270\062\233\200 -\032\123\035\001\231\110\153\164\363\132\160\112\244\350\367\002 -\321\272\221\243\153\207\276\020\136\176\124\271\130\262\012\366 -\073\012\343\016\070\363\200\135\367\101\216\370\217\066\271\203 -\233\021\114\341\013\261\305\223\212\063\262\277\233\266\236\104 -\267\037\376\052\201\050\071\174\317\324\257\065\145\256\147\136 -\215\041\337\000\140\021\053\324\074\344\047\120\237\223\267\005 -\361\322\016\024\334\051\202\226\361\052\242\033\103\005\160\263 -\320\134\036\003\101\125\376\026\070\305\122\115\223\265\264\074 -\166\042\115\251\053\254\025\304\251\113\164\271\245\043\330\315 -\053\110\301\342\357\315\336\370\112\260\337\240\343\356\206\065 -\277\133\162\224\157\262\106\112\352\112\123\256\061\346\221\265 -\164\230\105\232\244\175\354\161\052\345\220\121\066\103\371\111 -\324\327\050\006\003\261\375\171\207\326\006\370\254\241\371\277 -\024\170\015\313\043\113\315\273\056\062\364\175\274\151\273\266 -\065\176\171\317\275\113\162\176\141\253\052\176\100\307\014\345 -\262\220\265\114\014\326\127\007\174\227\314\371\331\167\333\173 -\347\214\023\176\314\176\030\117\114\113\043\216\256\032\307\352 -\137\037\246\027\335\070\266\117\336\012\156\122\120\131\254\155 -\315\326\061\031\275\044\351\240\130\317\331\324\262\103\171\077 -\137\326\157\252\145\310\106\362\322\325\176\371\056\103\030\302 -\230\344\150\337\301\323\137\105\057\151\321\035\356\221\044\110 -\322\353\000\016\302\020\113\322\235\275\243\115\027\243\067\232 -\257\357\227\061\201\332\211\261\141\172\143\247\002\003\001\000 -\001\243\202\001\076\060\202\001\072\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\006\060\035\006\003\125\035 -\016\004\026\004\024\033\215\131\034\263\267\130\142\144\146\254 -\342\344\244\366\242\031\022\366\345\060\201\367\006\003\125\035 -\040\004\201\357\060\201\354\060\201\351\006\004\125\035\040\000 -\060\201\340\060\074\006\010\053\006\001\005\005\007\002\001\026 -\060\150\164\164\160\072\057\057\160\153\151\056\162\145\147\151 -\163\164\162\141\144\157\162\145\163\056\157\162\147\057\156\157 -\162\155\141\164\151\166\141\057\151\156\144\145\170\056\150\164 -\155\060\201\237\006\010\053\006\001\005\005\007\002\002\060\201 -\222\032\201\217\103\145\162\164\151\146\151\143\141\144\157\040 -\163\165\152\145\164\157\040\141\040\154\141\040\104\145\143\154 -\141\162\141\143\151\363\156\040\144\145\040\120\162\341\143\164 -\151\143\141\163\040\144\145\040\103\145\162\164\151\146\151\143 -\141\143\151\363\156\040\144\145\154\040\103\157\154\145\147\151 -\157\040\144\145\040\122\145\147\151\163\164\162\141\144\157\162 -\145\163\040\144\145\040\154\141\040\120\162\157\160\151\145\144 -\141\144\040\171\040\115\145\162\143\141\156\164\151\154\145\163 -\040\144\145\040\105\163\160\141\361\141\040\050\251\040\062\060 -\060\066\051\060\015\006\011\052\206\110\206\367\015\001\001\005 -\005\000\003\202\002\001\000\077\037\326\054\031\166\100\222\234 -\046\346\236\130\006\022\075\022\302\053\072\336\345\330\211\167 -\100\037\306\121\252\164\211\226\305\306\303\235\361\372\274\151 -\023\240\006\165\027\046\211\374\145\071\215\163\171\353\317\167 -\247\273\325\110\046\171\061\221\060\047\230\101\245\027\340\137 -\134\033\132\052\174\272\255\026\145\000\121\175\207\336\272\272 -\143\326\143\264\065\340\327\116\031\105\176\277\121\151\110\157 -\076\210\156\122\125\203\360\213\304\114\364\012\324\021\041\256 -\051\140\350\133\213\237\370\302\354\267\166\077\200\302\164\056 -\107\170\142\121\236\333\214\365\255\137\205\005\350\375\232\173 -\275\160\150\013\223\302\060\176\022\364\113\117\164\342\211\217 -\271\103\164\017\326\204\136\172\336\160\124\244\023\066\137\144 -\176\323\004\016\376\335\031\157\044\123\225\355\351\311\016\324 -\246\361\223\241\133\011\343\242\322\127\116\076\032\316\175\254 -\304\367\123\320\315\250\222\355\244\311\227\042\146\370\306\242 -\362\165\345\021\176\057\165\022\226\367\217\157\317\007\345\312 -\314\007\076\365\074\213\355\274\174\062\140\076\343\017\324\021 -\203\064\015\166\206\144\275\063\227\116\160\355\366\040\070\137 -\232\151\307\300\117\026\312\205\202\217\001\266\272\023\136\320 -\361\355\351\050\335\052\275\045\216\320\372\023\014\026\017\167 -\237\166\051\064\160\154\353\171\113\235\357\116\064\360\105\273 -\045\054\165\222\104\137\247\233\304\252\322\263\157\056\274\141 -\353\206\001\114\331\172\271\165\147\213\003\113\307\063\122\170 -\236\005\300\355\217\164\170\035\022\043\266\062\374\121\120\136 -\055\336\120\276\020\074\216\357\010\205\365\072\372\362\336\347 -\330\114\072\345\022\353\364\066\164\230\132\122\212\224\032\146 -\251\156\105\076\024\053\215\064\010\252\357\005\023\141\022\220 -\204\150\015\021\132\054\257\171\236\160\224\237\305\144\313\314 -\170\366\123\134\340\327\015\261\076\343\026\013\363\246\354\064 -\102\076\165\020\204\245\330\275\261\343\352\141\346\044\234\302 -\201\332\036\330\157\374\170\055\026\343\104\055\300\322\075\136 -\175\240\322\126\324\140\067\161\376\114\216\145\234\326\073\332 -\066\334\330\063\147\320\001 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Colegio de Registradores Mercantiles" -# Issuer: CN=Registradores de Espa..a - CA Ra..z,OU=Certificado Propio,O=Colegio de Registradores de la Propiedad y Mercantiles de Espa..a,C=ES -# Serial Number:2d:e4:0a:e1:9b:d1:c2:aa:4c:f4:00:ac:81:35:f9 -# Subject: CN=Registradores de Espa..a - CA Ra..z,OU=Certificado Propio,O=Colegio de Registradores de la Propiedad y Mercantiles de Espa..a,C=ES -# Not Valid Before: Tue Jan 09 17:00:39 2007 -# Not Valid After : Thu Jan 09 17:00:39 2031 -# Fingerprint (SHA-256): 7D:2B:F3:48:9E:BC:9A:D3:44:8B:8B:08:27:71:5A:3C:BF:E3:D5:23:E3:B5:6A:9B:5F:C1:D2:A2:DA:2F:20:FE -# Fingerprint (SHA1): 21:11:65:CA:37:9F:BB:5E:D8:01:E3:1C:43:0A:62:AA:C1:09:BC:B4 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Colegio de Registradores Mercantiles" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\041\021\145\312\067\237\273\136\330\001\343\034\103\012\142\252 -\301\011\274\264 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\323\123\166\343\316\130\305\260\362\237\364\052\005\360\241\362 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\244\061\013\060\011\006\003\125\004\006\023\002\105\123 -\061\112\060\110\006\003\125\004\012\014\101\103\157\154\145\147 -\151\157\040\144\145\040\122\145\147\151\163\164\162\141\144\157 -\162\145\163\040\144\145\040\154\141\040\120\162\157\160\151\145 -\144\141\144\040\171\040\115\145\162\143\141\156\164\151\154\145 -\163\040\144\145\040\105\163\160\141\303\261\141\061\033\060\031 -\006\003\125\004\013\014\022\103\145\162\164\151\146\151\143\141 -\144\157\040\120\162\157\160\151\157\061\054\060\052\006\003\125 -\004\003\014\043\122\145\147\151\163\164\162\141\144\157\162\145 -\163\040\144\145\040\105\163\160\141\303\261\141\040\055\040\103 -\101\040\122\141\303\255\172 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\055\344\012\341\233\321\302\252\114\364\000\254\201\065 -\371 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "TeliaSonera Root CA v1" # @@ -11567,220 +9294,51 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE # -# Certificate "PostSignum Root QCA 2" +# Certificate "Amazon Services Root Certificate Authority -- G2" # -# Issuer: CN=PostSignum Root QCA 2,O="..esk.. po..ta, s.p. [I.. 47114983]",C=CZ -# Serial Number: 100 (0x64) -# Subject: CN=PostSignum Root QCA 2,O="..esk.. po..ta, s.p. [I.. 47114983]",C=CZ -# Not Valid Before: Tue Jan 19 08:04:31 2010 -# Not Valid After : Sun Jan 19 08:04:31 2025 -# Fingerprint (SHA-256): AD:01:6F:95:80:50:E0:E7:E4:6F:AE:7D:CC:50:19:7E:D8:E3:FF:0A:4B:26:2E:5D:DC:DB:3E:DD:DC:7D:65:78 -# Fingerprint (SHA1): A0:F8:DB:3F:0B:F4:17:69:3B:28:2E:B7:4A:6A:D8:6D:F9:D4:48:A3 +# Issuer: CN=Starfield Services Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US +# Serial Number: 0 (0x0) +# Subject: CN=Starfield Services Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US +# Not Valid Before: Tue Sep 01 00:00:00 2009 +# Not Valid After : Thu Dec 31 23:59:59 2037 +# Fingerprint (SHA-256): 56:8D:69:05:A2:C8:87:08:A4:B3:02:51:90:ED:CF:ED:B1:97:4A:60:6A:13:C6:E5:29:0F:CB:2A:E6:3E:DA:B5 +# Fingerprint (SHA1): 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "PostSignum Root QCA 2" +CKA_LABEL UTF8 "Amazon Services Root Certificate Authority -- G2" CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 CKA_SUBJECT MULTILINE_OCTAL -\060\133\061\013\060\011\006\003\125\004\006\023\002\103\132\061 -\054\060\052\006\003\125\004\012\014\043\304\214\145\163\153\303 -\241\040\160\157\305\241\164\141\054\040\163\056\160\056\040\133 -\111\304\214\040\064\067\061\061\064\071\070\063\135\061\036\060 -\034\006\003\125\004\003\023\025\120\157\163\164\123\151\147\156 -\165\155\040\122\157\157\164\040\121\103\101\040\062 +\060\201\230\061\013\060\011\006\003\125\004\006\023\002\125\123 +\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 +\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 +\164\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012 +\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150 +\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061\073 +\060\071\006\003\125\004\003\023\062\123\164\141\162\146\151\145 +\154\144\040\123\145\162\166\151\143\145\163\040\122\157\157\164 +\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 +\150\157\162\151\164\171\040\055\040\107\062 END CKA_ID UTF8 "0" CKA_ISSUER MULTILINE_OCTAL -\060\133\061\013\060\011\006\003\125\004\006\023\002\103\132\061 -\054\060\052\006\003\125\004\012\014\043\304\214\145\163\153\303 -\241\040\160\157\305\241\164\141\054\040\163\056\160\056\040\133 -\111\304\214\040\064\067\061\061\064\071\070\063\135\061\036\060 -\034\006\003\125\004\003\023\025\120\157\163\164\123\151\147\156 -\165\155\040\122\157\157\164\040\121\103\101\040\062 +\060\201\230\061\013\060\011\006\003\125\004\006\023\002\125\123 +\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 +\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 +\164\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012 +\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150 +\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061\073 +\060\071\006\003\125\004\003\023\062\123\164\141\162\146\151\145 +\154\144\040\123\145\162\166\151\143\145\163\040\122\157\157\164 +\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 +\150\157\162\151\164\171\040\055\040\107\062 END CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\144 +\002\001\000 END CKA_VALUE MULTILINE_OCTAL -\060\202\005\234\060\202\004\204\240\003\002\001\002\002\001\144 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\133\061\013\060\011\006\003\125\004\006\023\002\103\132\061\054 -\060\052\006\003\125\004\012\014\043\304\214\145\163\153\303\241 -\040\160\157\305\241\164\141\054\040\163\056\160\056\040\133\111 -\304\214\040\064\067\061\061\064\071\070\063\135\061\036\060\034 -\006\003\125\004\003\023\025\120\157\163\164\123\151\147\156\165 -\155\040\122\157\157\164\040\121\103\101\040\062\060\036\027\015 -\061\060\060\061\061\071\060\070\060\064\063\061\132\027\015\062 -\065\060\061\061\071\060\070\060\064\063\061\132\060\133\061\013 -\060\011\006\003\125\004\006\023\002\103\132\061\054\060\052\006 -\003\125\004\012\014\043\304\214\145\163\153\303\241\040\160\157 -\305\241\164\141\054\040\163\056\160\056\040\133\111\304\214\040 -\064\067\061\061\064\071\070\063\135\061\036\060\034\006\003\125 -\004\003\023\025\120\157\163\164\123\151\147\156\165\155\040\122 -\157\157\164\040\121\103\101\040\062\060\202\001\042\060\015\006 -\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017 -\000\060\202\001\012\002\202\001\001\000\240\134\374\310\034\137 -\332\007\365\270\335\006\031\171\047\274\141\360\272\272\151\340 -\274\067\144\365\231\007\251\304\004\061\243\110\142\027\053\103 -\253\351\166\267\145\077\255\124\064\336\121\110\323\327\175\306 -\355\133\071\324\076\263\375\050\126\313\357\123\355\255\137\351 -\162\047\152\107\260\310\130\374\075\075\004\165\236\055\003\046 -\315\141\321\024\073\367\122\206\015\226\275\114\237\145\365\307 -\322\071\246\146\156\252\120\074\264\125\362\220\176\054\226\162 -\024\021\213\360\061\353\065\332\123\157\227\336\025\301\176\364 -\114\257\231\172\316\014\130\124\004\304\313\020\237\070\263\075 -\153\225\072\226\032\162\010\067\366\032\016\235\075\316\102\313 -\244\060\140\141\251\140\104\165\177\062\306\260\337\154\265\333 -\255\223\011\117\327\160\307\123\124\251\351\156\162\302\327\313 -\243\006\032\127\126\352\070\347\100\105\260\050\047\272\274\054 -\356\204\006\074\210\126\275\067\230\133\254\075\243\002\073\067 -\004\237\174\313\345\166\237\222\163\067\351\132\255\166\152\263 -\211\144\176\335\104\100\122\012\204\323\002\003\001\000\001\243 -\202\002\151\060\202\002\145\060\201\245\006\003\125\035\037\004 -\201\235\060\201\232\060\061\240\057\240\055\206\053\150\164\164 -\160\072\057\057\167\167\167\056\160\157\163\164\163\151\147\156 -\165\155\056\143\172\057\143\162\154\057\160\163\162\157\157\164 -\161\143\141\062\056\143\162\154\060\062\240\060\240\056\206\054 -\150\164\164\160\072\057\057\167\167\167\062\056\160\157\163\164 -\163\151\147\156\165\155\056\143\172\057\143\162\154\057\160\163 -\162\157\157\164\161\143\141\062\056\143\162\154\060\061\240\057 -\240\055\206\053\150\164\164\160\072\057\057\160\157\163\164\163 -\151\147\156\165\155\056\164\164\143\056\143\172\057\143\162\154 -\057\160\163\162\157\157\164\161\143\141\062\056\143\162\154\060 -\201\361\006\003\125\035\040\004\201\351\060\201\346\060\201\343 -\006\004\125\035\040\000\060\201\332\060\201\327\006\010\053\006 -\001\005\005\007\002\002\060\201\312\032\201\307\124\145\156\164 -\157\040\153\166\141\154\151\146\151\153\157\166\141\156\171\040 -\163\171\163\164\145\155\157\166\171\040\143\145\162\164\151\146 -\151\153\141\164\040\142\171\154\040\166\171\144\141\156\040\160 -\157\144\154\145\040\172\141\153\157\156\141\040\062\062\067\057 -\062\060\060\060\123\142\056\040\141\040\156\141\166\141\172\156 -\171\143\150\040\160\162\145\144\160\151\163\165\057\124\150\151 -\163\040\161\165\141\154\151\146\151\145\144\040\163\171\163\164 -\145\155\040\143\145\162\164\151\146\151\143\141\164\145\040\167 -\141\163\040\151\163\163\165\145\144\040\141\143\143\157\162\144 -\151\156\147\040\164\157\040\114\141\167\040\116\157\040\062\062 -\067\057\062\060\060\060\103\157\154\154\056\040\141\156\144\040 -\162\145\154\141\164\145\144\040\162\145\147\165\154\141\164\151 -\157\156\163\060\022\006\003\125\035\023\001\001\377\004\010\060 -\006\001\001\377\002\001\001\060\016\006\003\125\035\017\001\001 -\377\004\004\003\002\001\006\060\035\006\003\125\035\016\004\026 -\004\024\025\051\214\305\105\151\253\270\263\303\352\376\113\270 -\061\330\334\360\347\166\060\201\203\006\003\125\035\043\004\174 -\060\172\200\024\025\051\214\305\105\151\253\270\263\303\352\376 -\113\270\061\330\334\360\347\166\241\137\244\135\060\133\061\013 -\060\011\006\003\125\004\006\023\002\103\132\061\054\060\052\006 -\003\125\004\012\014\043\304\214\145\163\153\303\241\040\160\157 -\305\241\164\141\054\040\163\056\160\056\040\133\111\304\214\040 -\064\067\061\061\064\071\070\063\135\061\036\060\034\006\003\125 -\004\003\023\025\120\157\163\164\123\151\147\156\165\155\040\122 -\157\157\164\040\121\103\101\040\062\202\001\144\060\015\006\011 -\052\206\110\206\367\015\001\001\013\005\000\003\202\001\001\000 -\136\052\332\013\100\241\152\130\221\040\054\334\117\155\003\115 -\344\344\343\156\223\223\020\111\052\332\061\110\322\325\041\265 -\034\177\377\254\360\272\242\102\315\363\277\052\250\040\122\261 -\301\161\257\206\127\372\227\160\334\315\002\134\255\310\316\365 -\174\313\377\127\010\013\366\000\107\114\337\310\024\214\065\323 -\102\133\162\042\066\337\041\120\115\321\177\122\201\037\053\371 -\276\040\127\342\257\024\221\213\302\321\021\027\127\035\061\033 -\277\014\114\134\214\331\125\171\150\132\365\372\341\114\026\265 -\376\023\277\016\133\002\203\343\320\355\131\332\134\270\150\304 -\300\117\146\276\313\354\365\363\205\041\271\237\350\033\043\060 -\170\206\244\230\123\073\063\264\153\066\110\271\323\270\342\110 -\264\363\271\241\114\012\234\226\071\176\324\054\210\163\143\254 -\112\166\156\142\100\270\323\274\114\147\330\224\357\124\050\105 -\143\350\324\273\361\264\314\007\113\311\345\070\275\245\335\102 -\155\100\360\001\042\044\364\335\321\237\113\003\022\372\112\255 -\242\255\242\315\067\176\276\067\041\012\376\333\067\230\362\313 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "PostSignum Root QCA 2" -# Issuer: CN=PostSignum Root QCA 2,O="..esk.. po..ta, s.p. [I.. 47114983]",C=CZ -# Serial Number: 100 (0x64) -# Subject: CN=PostSignum Root QCA 2,O="..esk.. po..ta, s.p. [I.. 47114983]",C=CZ -# Not Valid Before: Tue Jan 19 08:04:31 2010 -# Not Valid After : Sun Jan 19 08:04:31 2025 -# Fingerprint (SHA-256): AD:01:6F:95:80:50:E0:E7:E4:6F:AE:7D:CC:50:19:7E:D8:E3:FF:0A:4B:26:2E:5D:DC:DB:3E:DD:DC:7D:65:78 -# Fingerprint (SHA1): A0:F8:DB:3F:0B:F4:17:69:3B:28:2E:B7:4A:6A:D8:6D:F9:D4:48:A3 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "PostSignum Root QCA 2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\240\370\333\077\013\364\027\151\073\050\056\267\112\152\330\155 -\371\324\110\243 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\131\163\146\050\121\053\230\264\020\377\175\006\372\042\326\310 -END -CKA_ISSUER MULTILINE_OCTAL -\060\133\061\013\060\011\006\003\125\004\006\023\002\103\132\061 -\054\060\052\006\003\125\004\012\014\043\304\214\145\163\153\303 -\241\040\160\157\305\241\164\141\054\040\163\056\160\056\040\133 -\111\304\214\040\064\067\061\061\064\071\070\063\135\061\036\060 -\034\006\003\125\004\003\023\025\120\157\163\164\123\151\147\156 -\165\155\040\122\157\157\164\040\121\103\101\040\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\144 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "Amazon Services Root Certificate Authority -- G2" -# -# Issuer: CN=Starfield Services Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US -# Serial Number: 0 (0x0) -# Subject: CN=Starfield Services Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US -# Not Valid Before: Tue Sep 01 00:00:00 2009 -# Not Valid After : Thu Dec 31 23:59:59 2037 -# Fingerprint (SHA-256): 56:8D:69:05:A2:C8:87:08:A4:B3:02:51:90:ED:CF:ED:B1:97:4A:60:6A:13:C6:E5:29:0F:CB:2A:E6:3E:DA:B5 -# Fingerprint (SHA1): 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Amazon Services Root Certificate Authority -- G2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\230\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 -\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 -\164\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012 -\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150 -\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061\073 -\060\071\006\003\125\004\003\023\062\123\164\141\162\146\151\145 -\154\144\040\123\145\162\166\151\143\145\163\040\122\157\157\164 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\040\055\040\107\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\230\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 -\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 -\164\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012 -\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150 -\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061\073 -\060\071\006\003\125\004\003\023\062\123\164\141\162\146\151\145 -\154\144\040\123\145\162\166\151\143\145\163\040\122\157\157\164 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\040\055\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\357\060\202\002\327\240\003\002\001\002\002\001\000 +\060\202\003\357\060\202\002\327\240\003\002\001\002\002\001\000 \060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 \201\230\061\013\060\011\006\003\125\004\006\023\002\125\123\061 \020\060\016\006\003\125\004\010\023\007\101\162\151\172\157\156 @@ -13328,170 +10886,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Autoridade Certificadora da Raiz Brasileira v1 - ICP-Brasil" -# -# Issuer: CN=Autoridade Certificadora Raiz Brasileira v1,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR -# Serial Number: 1 (0x1) -# Subject: CN=Autoridade Certificadora Raiz Brasileira v1,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR -# Not Valid Before: Tue Jul 29 19:17:10 2008 -# Not Valid After : Thu Jul 29 19:17:10 2021 -# Fingerprint (SHA-256): CB:D8:ED:38:D4:A2:D6:77:D4:53:D7:0D:D8:89:0A:F4:F6:37:4C:BA:62:99:94:3F:1A:B3:A6:93:6C:6F:D7:95 -# Fingerprint (SHA1): 70:5D:2B:45:65:C7:04:7A:54:06:94:A7:9A:F7:AB:B8:42:BD:C1:61 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Autoridade Certificadora da Raiz Brasileira v1 - ICP-Brasil" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\227\061\013\060\011\006\003\125\004\006\023\002\102\122 -\061\023\060\021\006\003\125\004\012\023\012\111\103\120\055\102 -\162\141\163\151\154\061\075\060\073\006\003\125\004\013\023\064 -\111\156\163\164\151\164\165\164\157\040\116\141\143\151\157\156 -\141\154\040\144\145\040\124\145\143\156\157\154\157\147\151\141 -\040\144\141\040\111\156\146\157\162\155\141\143\141\157\040\055 -\040\111\124\111\061\064\060\062\006\003\125\004\003\023\053\101 -\165\164\157\162\151\144\141\144\145\040\103\145\162\164\151\146 -\151\143\141\144\157\162\141\040\122\141\151\172\040\102\162\141 -\163\151\154\145\151\162\141\040\166\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\227\061\013\060\011\006\003\125\004\006\023\002\102\122 -\061\023\060\021\006\003\125\004\012\023\012\111\103\120\055\102 -\162\141\163\151\154\061\075\060\073\006\003\125\004\013\023\064 -\111\156\163\164\151\164\165\164\157\040\116\141\143\151\157\156 -\141\154\040\144\145\040\124\145\143\156\157\154\157\147\151\141 -\040\144\141\040\111\156\146\157\162\155\141\143\141\157\040\055 -\040\111\124\111\061\064\060\062\006\003\125\004\003\023\053\101 -\165\164\157\162\151\144\141\144\145\040\103\145\162\164\151\146 -\151\143\141\144\157\162\141\040\122\141\151\172\040\102\162\141 -\163\151\154\145\151\162\141\040\166\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\200\060\202\003\150\240\003\002\001\002\002\001\001 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\201\227\061\013\060\011\006\003\125\004\006\023\002\102\122\061 -\023\060\021\006\003\125\004\012\023\012\111\103\120\055\102\162 -\141\163\151\154\061\075\060\073\006\003\125\004\013\023\064\111 -\156\163\164\151\164\165\164\157\040\116\141\143\151\157\156\141 -\154\040\144\145\040\124\145\143\156\157\154\157\147\151\141\040 -\144\141\040\111\156\146\157\162\155\141\143\141\157\040\055\040 -\111\124\111\061\064\060\062\006\003\125\004\003\023\053\101\165 -\164\157\162\151\144\141\144\145\040\103\145\162\164\151\146\151 -\143\141\144\157\162\141\040\122\141\151\172\040\102\162\141\163 -\151\154\145\151\162\141\040\166\061\060\036\027\015\060\070\060 -\067\062\071\061\071\061\067\061\060\132\027\015\062\061\060\067 -\062\071\061\071\061\067\061\060\132\060\201\227\061\013\060\011 -\006\003\125\004\006\023\002\102\122\061\023\060\021\006\003\125 -\004\012\023\012\111\103\120\055\102\162\141\163\151\154\061\075 -\060\073\006\003\125\004\013\023\064\111\156\163\164\151\164\165 -\164\157\040\116\141\143\151\157\156\141\154\040\144\145\040\124 -\145\143\156\157\154\157\147\151\141\040\144\141\040\111\156\146 -\157\162\155\141\143\141\157\040\055\040\111\124\111\061\064\060 -\062\006\003\125\004\003\023\053\101\165\164\157\162\151\144\141 -\144\145\040\103\145\162\164\151\146\151\143\141\144\157\162\141 -\040\122\141\151\172\040\102\162\141\163\151\154\145\151\162\141 -\040\166\061\060\202\001\042\060\015\006\011\052\206\110\206\367 -\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012\002 -\202\001\001\000\316\034\350\276\223\064\316\311\261\344\124\356 -\011\366\354\244\010\205\240\077\306\212\306\160\060\247\200\214 -\355\076\001\124\007\214\031\043\073\237\273\307\264\213\040\261 -\342\367\101\026\055\136\207\146\272\260\007\335\157\321\077\074 -\332\310\131\063\235\025\260\237\222\310\126\124\130\212\072\047 -\242\064\036\233\170\265\267\315\345\233\351\300\056\022\236\160 -\170\007\372\216\362\114\300\370\345\162\174\036\251\251\140\003 -\127\046\107\333\203\166\303\316\310\022\273\321\377\357\256\263 -\142\175\232\240\344\274\156\175\001\056\064\140\334\207\340\137 -\177\005\160\134\060\025\054\302\165\243\077\120\003\146\043\146 -\054\347\164\167\170\333\146\027\337\371\037\015\202\150\217\165 -\207\367\351\061\172\123\117\317\130\142\273\100\242\064\317\300 -\160\204\120\227\025\332\040\113\351\373\114\102\255\053\150\216 -\243\331\255\005\142\376\010\164\304\350\301\314\205\023\316\255 -\050\060\120\335\336\300\201\301\111\260\136\056\046\070\351\143 -\004\063\167\265\200\166\315\052\177\362\074\254\135\223\102\071 -\364\242\163\105\002\003\001\000\001\243\201\324\060\201\321\060 -\116\006\003\125\035\040\004\107\060\105\060\103\006\005\140\114 -\001\001\000\060\072\060\070\006\010\053\006\001\005\005\007\002 -\001\026\054\150\164\164\160\072\057\057\141\143\162\141\151\172 -\056\151\143\160\142\162\141\163\151\154\056\147\157\166\056\142 -\162\057\104\120\103\141\143\162\141\151\172\056\160\144\146\060 -\077\006\003\125\035\037\004\070\060\066\060\064\240\062\240\060 -\206\056\150\164\164\160\072\057\057\141\143\162\141\151\172\056 -\151\143\160\142\162\141\163\151\154\056\147\157\166\056\142\162 -\057\114\103\122\141\143\162\141\151\172\166\061\056\143\162\154 -\060\035\006\003\125\035\016\004\026\004\024\102\262\054\134\164 -\001\007\276\233\377\125\063\073\356\051\273\135\221\277\006\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003 -\202\001\001\000\131\154\212\166\351\031\161\127\203\376\247\364 -\172\017\236\201\320\317\007\034\014\043\351\044\015\121\313\063 -\350\052\011\303\172\377\016\243\200\206\140\301\160\227\340\300 -\012\125\335\244\145\114\217\247\107\260\127\267\363\253\304\303 -\031\343\230\354\015\260\033\121\221\311\331\011\326\351\152\263 -\347\014\260\262\222\207\373\216\115\025\354\022\024\031\170\014 -\142\352\024\071\030\012\305\125\333\123\205\334\173\050\372\025 -\161\243\312\164\045\202\017\147\047\064\327\256\122\023\002\373 -\305\357\232\200\045\245\122\236\071\016\355\072\364\170\007\137 -\325\050\172\012\112\365\320\303\147\367\214\130\027\157\012\000 -\243\046\020\264\140\042\072\112\110\245\332\340\251\204\336\103 -\333\237\103\247\077\050\004\107\222\057\367\347\144\165\041\322 -\117\201\316\252\076\144\016\343\016\255\125\232\176\224\233\064 -\301\320\256\151\116\036\243\331\263\207\127\332\160\302\132\175 -\207\315\371\277\067\336\355\126\065\367\267\042\016\117\222\270 -\077\010\337\234\236\230\136\362\157\271\372\233\054\370\315\105 -\330\162\262\040 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Autoridade Certificadora da Raiz Brasileira v1 - ICP-Brasil" -# Issuer: CN=Autoridade Certificadora Raiz Brasileira v1,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR -# Serial Number: 1 (0x1) -# Subject: CN=Autoridade Certificadora Raiz Brasileira v1,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR -# Not Valid Before: Tue Jul 29 19:17:10 2008 -# Not Valid After : Thu Jul 29 19:17:10 2021 -# Fingerprint (SHA-256): CB:D8:ED:38:D4:A2:D6:77:D4:53:D7:0D:D8:89:0A:F4:F6:37:4C:BA:62:99:94:3F:1A:B3:A6:93:6C:6F:D7:95 -# Fingerprint (SHA1): 70:5D:2B:45:65:C7:04:7A:54:06:94:A7:9A:F7:AB:B8:42:BD:C1:61 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Autoridade Certificadora da Raiz Brasileira v1 - ICP-Brasil" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\160\135\053\105\145\307\004\172\124\006\224\247\232\367\253\270 -\102\275\301\141 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\223\361\255\064\013\053\347\250\124\140\342\163\214\244\224\061 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\227\061\013\060\011\006\003\125\004\006\023\002\102\122 -\061\023\060\021\006\003\125\004\012\023\012\111\103\120\055\102 -\162\141\163\151\154\061\075\060\073\006\003\125\004\013\023\064 -\111\156\163\164\151\164\165\164\157\040\116\141\143\151\157\156 -\141\154\040\144\145\040\124\145\143\156\157\154\157\147\151\141 -\040\144\141\040\111\156\146\157\162\155\141\143\141\157\040\055 -\040\111\124\111\061\064\060\062\006\003\125\004\003\023\053\101 -\165\164\157\162\151\144\141\144\145\040\103\145\162\164\151\146 -\151\143\141\144\157\162\141\040\122\141\151\172\040\102\162\141 -\163\151\154\145\151\162\141\040\166\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Entrust.net" # @@ -13661,381 +11055,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "ECRaizEstado" -# -# Issuer: CN=ECRaizEstado,O=SCEE,C=PT -# Serial Number:42:ea:5b:0a:51:11:26:7c:d8:27:74:b7:df:7f:71 -# Subject: CN=ECRaizEstado,O=SCEE,C=PT -# Not Valid Before: Fri Jun 23 13:41:27 2006 -# Not Valid After : Sun Jun 23 13:41:27 2030 -# Fingerprint (SHA-256): 48:8E:13:4F:30:C5:DB:56:B7:64:73:E6:08:08:68:42:BF:21:AF:8A:B3:CD:7A:C6:7E:BD:F1:25:D5:31:83:4E -# Fingerprint (SHA1): 39:13:85:3E:45:C4:39:A2:DA:71:8C:DF:B6:F3:E0:33:E0:4F:EE:71 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "ECRaizEstado" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\063\061\013\060\011\006\003\125\004\006\023\002\120\124\061 -\015\060\013\006\003\125\004\012\014\004\123\103\105\105\061\025 -\060\023\006\003\125\004\003\014\014\105\103\122\141\151\172\105 -\163\164\141\144\157 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\063\061\013\060\011\006\003\125\004\006\023\002\120\124\061 -\015\060\013\006\003\125\004\012\014\004\123\103\105\105\061\025 -\060\023\006\003\125\004\003\014\014\105\103\122\141\151\172\105 -\163\164\141\144\157 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\102\352\133\012\121\021\046\174\330\047\164\267\337\177 -\161 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\156\060\202\003\126\240\003\002\001\002\002\017\102 -\352\133\012\121\021\046\174\330\047\164\267\337\177\161\060\015 -\006\011\052\206\110\206\367\015\001\001\005\005\000\060\063\061 -\013\060\011\006\003\125\004\006\023\002\120\124\061\015\060\013 -\006\003\125\004\012\014\004\123\103\105\105\061\025\060\023\006 -\003\125\004\003\014\014\105\103\122\141\151\172\105\163\164\141 -\144\157\060\036\027\015\060\066\060\066\062\063\061\063\064\061 -\062\067\132\027\015\063\060\060\066\062\063\061\063\064\061\062 -\067\132\060\063\061\013\060\011\006\003\125\004\006\023\002\120 -\124\061\015\060\013\006\003\125\004\012\014\004\123\103\105\105 -\061\025\060\023\006\003\125\004\003\014\014\105\103\122\141\151 -\172\105\163\164\141\144\157\060\202\002\042\060\015\006\011\052 -\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060 -\202\002\012\002\202\002\001\000\333\357\242\103\156\310\251\375 -\156\327\337\254\242\222\204\241\310\131\240\014\232\123\376\357 -\256\314\031\015\162\212\244\302\063\043\357\347\006\162\352\155 -\113\072\101\122\017\311\110\016\055\347\272\144\356\242\072\114 -\143\134\146\051\213\337\251\210\305\275\350\361\367\216\113\374 -\001\074\104\022\071\052\160\242\300\333\305\242\337\137\307\113 -\306\250\334\075\141\174\112\130\301\104\062\223\336\160\231\241 -\043\046\126\077\243\341\352\137\060\106\330\170\365\060\243\226 -\011\211\260\075\361\206\223\005\266\022\152\030\215\360\245\144 -\073\053\207\144\136\075\027\216\013\156\346\230\314\227\070\070 -\040\214\160\132\151\053\275\145\215\315\067\131\134\154\321\162 -\164\131\006\116\310\267\001\327\167\277\360\110\206\250\263\032 -\135\101\324\067\027\021\020\137\112\156\215\165\305\003\100\175 -\041\256\000\360\333\374\237\154\072\146\244\337\367\312\337\200 -\146\132\331\330\177\024\242\046\031\364\256\013\041\340\312\076 -\005\335\026\330\176\131\332\241\260\151\303\235\064\023\372\145 -\111\071\207\356\166\057\215\275\074\047\031\003\116\255\016\013 -\053\054\306\056\161\023\065\051\127\351\160\334\033\121\352\315 -\227\361\225\215\262\206\372\046\006\057\200\032\225\361\230\073 -\356\366\345\206\245\316\033\001\345\364\351\063\312\017\125\104 -\137\150\212\054\307\133\146\050\335\226\113\203\235\136\035\176 -\030\325\376\262\140\373\232\121\150\303\226\214\037\150\113\120 -\122\013\066\346\061\047\344\327\051\014\033\332\033\057\341\004 -\123\270\324\171\111\260\073\201\136\010\210\042\167\342\051\300 -\256\162\252\253\264\162\122\275\154\273\365\272\170\331\234\270 -\040\157\060\215\112\235\062\371\364\001\346\142\171\230\102\100 -\005\172\157\034\052\077\265\373\337\315\030\100\216\345\020\304 -\071\133\126\361\074\127\005\253\322\071\115\077\370\213\043\307 -\153\271\100\261\342\376\377\263\034\012\151\037\233\214\017\264 -\037\340\012\336\110\375\215\137\217\231\365\001\166\005\066\135 -\216\334\063\216\121\156\021\342\101\375\314\267\215\052\137\076 -\222\345\362\261\340\244\043\342\242\267\306\215\030\233\051\112 -\321\106\177\364\144\040\030\335\002\003\001\000\001\243\177\060 -\175\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\006\060\035\006\003\125\035\016\004\026\004\024\161\177\065 -\336\365\167\161\155\035\022\234\341\220\244\272\360\251\203\217 -\200\060\073\006\003\125\035\040\004\064\060\062\060\060\006\004 -\125\035\040\000\060\050\060\046\006\010\053\006\001\005\005\007 -\002\001\026\032\150\164\164\160\072\057\057\167\167\167\056\145 -\143\145\145\056\147\157\166\056\160\164\057\144\160\143\060\015 -\006\011\052\206\110\206\367\015\001\001\005\005\000\003\202\002 -\001\000\214\255\234\162\245\265\147\166\147\070\207\351\072\214 -\376\235\131\065\276\220\361\003\000\240\130\330\230\321\277\374 -\374\363\120\334\264\145\325\332\272\360\214\056\174\015\346\011 -\221\137\115\243\366\135\170\234\130\135\152\160\224\243\257\333 -\057\000\311\003\100\153\337\121\003\026\031\214\053\274\231\066 -\366\300\255\222\030\023\214\247\355\035\322\337\003\220\005\354 -\260\223\230\233\367\115\132\023\370\347\233\367\066\166\336\174 -\046\370\021\070\117\111\116\263\163\037\137\047\133\341\236\062 -\036\366\300\230\033\331\040\054\134\226\215\206\311\013\105\327 -\222\255\212\275\352\127\242\243\126\266\040\074\354\262\307\071 -\176\260\200\376\275\121\053\052\264\303\162\151\303\371\107\056 -\156\377\234\207\355\334\165\313\020\210\340\264\316\056\016\123 -\035\013\350\156\036\102\114\320\276\071\170\165\311\024\336\047 -\221\163\252\354\152\200\360\360\027\226\142\117\276\004\313\342 -\247\345\135\017\223\105\313\131\110\046\023\336\335\261\365\012 -\332\026\261\250\035\217\176\130\033\267\325\011\336\210\153\316 -\204\076\250\276\122\142\312\322\241\241\307\313\074\026\340\166 -\126\060\077\346\017\153\006\167\376\144\235\132\152\163\174\356 -\336\041\351\232\111\227\067\266\204\177\242\221\076\105\373\327 -\132\006\305\207\065\334\272\110\114\206\001\010\107\066\266\070 -\120\225\021\231\163\321\067\111\012\372\102\117\057\020\124\323 -\101\220\372\310\334\273\021\334\015\314\175\174\233\334\016\221 -\161\206\115\270\362\025\232\053\070\027\021\241\362\236\250\154 -\234\343\316\256\342\346\113\213\362\212\006\073\007\167\002\021 -\356\203\352\235\146\206\312\360\142\251\325\127\203\244\025\361 -\105\024\376\032\165\177\245\017\334\122\164\131\165\012\370\373 -\125\101\251\134\215\061\104\335\315\224\116\063\321\033\101\252 -\333\327\241\074\360\305\110\155\105\101\065\265\171\203\346\371 -\115\361\126\070\327\277\100\042\373\040\200\343\034\302\131\106 -\007\143\002\141\000\073\233\120\273\103\303\260\351\012\232\270 -\166\364\107\141\125\144\160\117\067\331\234\021\243\023\262\341 -\335\100\102\273\230\327\240\006\213\346\150\127\113\016\070\150 -\177\272 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "ECRaizEstado" -# Issuer: CN=ECRaizEstado,O=SCEE,C=PT -# Serial Number:42:ea:5b:0a:51:11:26:7c:d8:27:74:b7:df:7f:71 -# Subject: CN=ECRaizEstado,O=SCEE,C=PT -# Not Valid Before: Fri Jun 23 13:41:27 2006 -# Not Valid After : Sun Jun 23 13:41:27 2030 -# Fingerprint (SHA-256): 48:8E:13:4F:30:C5:DB:56:B7:64:73:E6:08:08:68:42:BF:21:AF:8A:B3:CD:7A:C6:7E:BD:F1:25:D5:31:83:4E -# Fingerprint (SHA1): 39:13:85:3E:45:C4:39:A2:DA:71:8C:DF:B6:F3:E0:33:E0:4F:EE:71 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "ECRaizEstado" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\071\023\205\076\105\304\071\242\332\161\214\337\266\363\340\063 -\340\117\356\161 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\302\333\253\216\226\122\305\356\256\362\125\000\211\155\125\225 -END -CKA_ISSUER MULTILINE_OCTAL -\060\063\061\013\060\011\006\003\125\004\006\023\002\120\124\061 -\015\060\013\006\003\125\004\012\014\004\123\103\105\105\061\025 -\060\023\006\003\125\004\003\014\014\105\103\122\141\151\172\105 -\163\164\141\144\157 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\102\352\133\012\121\021\046\174\330\047\164\267\337\177 -\161 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "Posta CA Root" -# -# Issuer: CN=Posta CA Root,CN=AIA,CN=Public Key Services,CN=Services,CN=Configuration,DC=ca,DC=posta,DC=rs -# Serial Number: 1224507125 (0x48fc7ef5) -# Subject: CN=Posta CA Root,CN=AIA,CN=Public Key Services,CN=Services,CN=Configuration,DC=ca,DC=posta,DC=rs -# Not Valid Before: Mon Oct 20 12:22:08 2008 -# Not Valid After : Fri Oct 20 12:52:08 2028 -# Fingerprint (SHA-256): CD:20:12:56:FE:5C:ED:0B:FF:F8:DF:59:5F:FF:36:B1:41:6D:53:13:A9:99:F5:32:EF:4A:99:15:DF:96:DE:E0 -# Fingerprint (SHA1): D6:BF:79:94:F4:2B:E5:FA:29:DA:0B:D7:58:7B:59:1F:47:A4:4F:22 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Posta CA Root" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\256\061\022\060\020\006\012\011\222\046\211\223\362\054 -\144\001\031\026\002\162\163\061\025\060\023\006\012\011\222\046 -\211\223\362\054\144\001\031\026\005\160\157\163\164\141\061\022 -\060\020\006\012\011\222\046\211\223\362\054\144\001\031\026\002 -\143\141\061\026\060\024\006\003\125\004\003\023\015\103\157\156 -\146\151\147\165\162\141\164\151\157\156\061\021\060\017\006\003 -\125\004\003\023\010\123\145\162\166\151\143\145\163\061\034\060 -\032\006\003\125\004\003\023\023\120\165\142\154\151\143\040\113 -\145\171\040\123\145\162\166\151\143\145\163\061\014\060\012\006 -\003\125\004\003\023\003\101\111\101\061\026\060\024\006\003\125 -\004\003\023\015\120\157\163\164\141\040\103\101\040\122\157\157 -\164 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\256\061\022\060\020\006\012\011\222\046\211\223\362\054 -\144\001\031\026\002\162\163\061\025\060\023\006\012\011\222\046 -\211\223\362\054\144\001\031\026\005\160\157\163\164\141\061\022 -\060\020\006\012\011\222\046\211\223\362\054\144\001\031\026\002 -\143\141\061\026\060\024\006\003\125\004\003\023\015\103\157\156 -\146\151\147\165\162\141\164\151\157\156\061\021\060\017\006\003 -\125\004\003\023\010\123\145\162\166\151\143\145\163\061\034\060 -\032\006\003\125\004\003\023\023\120\165\142\154\151\143\040\113 -\145\171\040\123\145\162\166\151\143\145\163\061\014\060\012\006 -\003\125\004\003\023\003\101\111\101\061\026\060\024\006\003\125 -\004\003\023\015\120\157\163\164\141\040\103\101\040\122\157\157 -\164 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\110\374\176\365 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\007\037\060\202\006\007\240\003\002\001\002\002\004\110 -\374\176\365\060\015\006\011\052\206\110\206\367\015\001\001\005 -\005\000\060\201\256\061\022\060\020\006\012\011\222\046\211\223 -\362\054\144\001\031\026\002\162\163\061\025\060\023\006\012\011 -\222\046\211\223\362\054\144\001\031\026\005\160\157\163\164\141 -\061\022\060\020\006\012\011\222\046\211\223\362\054\144\001\031 -\026\002\143\141\061\026\060\024\006\003\125\004\003\023\015\103 -\157\156\146\151\147\165\162\141\164\151\157\156\061\021\060\017 -\006\003\125\004\003\023\010\123\145\162\166\151\143\145\163\061 -\034\060\032\006\003\125\004\003\023\023\120\165\142\154\151\143 -\040\113\145\171\040\123\145\162\166\151\143\145\163\061\014\060 -\012\006\003\125\004\003\023\003\101\111\101\061\026\060\024\006 -\003\125\004\003\023\015\120\157\163\164\141\040\103\101\040\122 -\157\157\164\060\036\027\015\060\070\061\060\062\060\061\062\062 -\062\060\070\132\027\015\062\070\061\060\062\060\061\062\065\062 -\060\070\132\060\201\256\061\022\060\020\006\012\011\222\046\211 -\223\362\054\144\001\031\026\002\162\163\061\025\060\023\006\012 -\011\222\046\211\223\362\054\144\001\031\026\005\160\157\163\164 -\141\061\022\060\020\006\012\011\222\046\211\223\362\054\144\001 -\031\026\002\143\141\061\026\060\024\006\003\125\004\003\023\015 -\103\157\156\146\151\147\165\162\141\164\151\157\156\061\021\060 -\017\006\003\125\004\003\023\010\123\145\162\166\151\143\145\163 -\061\034\060\032\006\003\125\004\003\023\023\120\165\142\154\151 -\143\040\113\145\171\040\123\145\162\166\151\143\145\163\061\014 -\060\012\006\003\125\004\003\023\003\101\111\101\061\026\060\024 -\006\003\125\004\003\023\015\120\157\163\164\141\040\103\101\040 -\122\157\157\164\060\202\001\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012 -\002\202\001\001\000\250\362\275\210\276\300\257\104\276\233\112 -\242\143\034\326\126\253\035\051\262\034\252\025\036\105\321\254 -\235\240\141\325\065\371\344\132\203\066\143\103\336\070\127\025 -\374\360\224\142\364\007\200\127\203\127\250\263\025\274\373\115 -\043\170\137\332\366\307\201\026\276\253\337\347\334\203\123\163 -\053\266\335\143\210\215\105\363\015\335\175\277\350\210\260\146 -\301\103\135\067\322\155\241\234\232\106\303\263\077\320\302\240 -\212\224\056\203\246\074\303\140\275\054\314\036\213\143\202\166 -\101\050\344\025\153\134\014\141\071\125\070\101\312\310\146\350 -\307\270\227\122\020\046\160\267\007\267\011\036\246\023\136\256 -\231\132\046\157\144\075\354\304\323\245\271\134\166\144\255\143 -\175\210\203\342\113\314\015\336\324\306\323\010\102\365\133\027 -\365\161\341\221\055\003\237\236\034\334\213\162\244\350\107\144 -\020\207\144\060\163\330\362\264\361\127\046\223\127\313\266\307 -\015\210\213\035\317\005\060\135\004\326\166\067\350\040\062\127 -\277\017\234\063\306\010\214\366\264\302\251\006\260\133\060\241 -\036\055\022\272\077\002\003\001\000\001\243\202\003\101\060\202 -\003\075\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\201\272\006\003\125\035\040\004\201\262\060\201 -\257\060\201\254\006\013\053\006\001\004\001\372\070\012\012\001 -\001\060\201\234\060\060\006\010\053\006\001\005\005\007\002\001 -\026\044\150\164\164\160\072\057\057\167\167\167\056\143\141\056 -\160\157\163\164\141\056\162\163\057\144\157\153\165\155\145\156 -\164\141\143\151\152\141\060\150\006\010\053\006\001\005\005\007 -\002\002\060\134\032\132\117\166\157\040\152\145\040\145\154\145 -\153\164\162\157\156\163\153\151\040\163\145\162\164\151\146\151 -\153\141\164\040\122\117\117\124\040\103\101\040\163\145\162\166 -\145\162\141\040\123\145\162\164\151\146\151\153\141\143\151\157 -\156\157\147\040\164\145\154\141\040\120\157\163\164\145\072\040 -\042\120\157\163\164\141\040\103\101\040\122\157\157\164\042\056 -\060\021\006\011\140\206\110\001\206\370\102\001\001\004\004\003 -\002\000\007\060\202\001\274\006\003\125\035\037\004\202\001\263 -\060\202\001\257\060\201\311\240\201\306\240\201\303\244\201\300 -\060\201\275\061\022\060\020\006\012\011\222\046\211\223\362\054 -\144\001\031\026\002\162\163\061\025\060\023\006\012\011\222\046 -\211\223\362\054\144\001\031\026\005\160\157\163\164\141\061\022 -\060\020\006\012\011\222\046\211\223\362\054\144\001\031\026\002 -\143\141\061\026\060\024\006\003\125\004\003\023\015\103\157\156 -\146\151\147\165\162\141\164\151\157\156\061\021\060\017\006\003 -\125\004\003\023\010\123\145\162\166\151\143\145\163\061\034\060 -\032\006\003\125\004\003\023\023\120\165\142\154\151\143\040\113 -\145\171\040\123\145\162\166\151\143\145\163\061\014\060\012\006 -\003\125\004\003\023\003\101\111\101\061\026\060\024\006\003\125 -\004\003\023\015\120\157\163\164\141\040\103\101\040\122\157\157 -\164\061\015\060\013\006\003\125\004\003\023\004\103\122\114\061 -\060\201\340\240\201\335\240\201\332\206\201\243\154\144\141\160 -\072\057\057\154\144\141\160\056\143\141\056\160\157\163\164\141 -\056\162\163\057\143\156\075\120\157\163\164\141\045\062\060\103 -\101\045\062\060\122\157\157\164\054\143\156\075\101\111\101\054 -\143\156\075\120\165\142\154\151\143\045\062\060\113\145\171\045 -\062\060\123\145\162\166\151\143\145\163\054\143\156\075\123\145 -\162\166\151\143\145\163\054\143\156\075\103\157\156\146\151\147 -\165\162\141\164\151\157\156\054\144\143\075\143\141\054\144\143 -\075\160\157\163\164\141\054\144\143\075\162\163\077\143\145\162 -\164\151\146\151\143\141\164\145\122\145\166\157\143\141\164\151 -\157\156\114\151\163\164\045\063\102\142\151\156\141\162\171\206 -\062\150\164\164\160\072\057\057\163\145\162\164\151\146\151\153 -\141\164\151\056\143\141\056\160\157\163\164\141\056\162\163\057 -\143\162\154\057\120\157\163\164\141\103\101\122\157\157\164\056 -\143\162\154\060\053\006\003\125\035\020\004\044\060\042\200\017 -\062\060\060\070\061\060\062\060\061\062\062\062\060\070\132\201 -\017\062\060\062\070\061\060\062\060\061\062\065\062\060\070\132 -\060\037\006\003\125\035\043\004\030\060\026\200\024\362\313\215 -\342\065\357\020\103\304\332\173\312\372\353\211\003\241\042\257 -\270\060\035\006\003\125\035\016\004\026\004\024\362\313\215\342 -\065\357\020\103\304\332\173\312\372\353\211\003\241\042\257\270 -\060\035\006\011\052\206\110\206\366\175\007\101\000\004\020\060 -\016\033\010\126\067\056\061\072\064\056\060\003\002\004\220\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003\202 -\001\001\000\160\106\241\310\344\027\005\146\017\235\342\103\061 -\110\035\222\220\031\304\205\001\205\026\156\370\222\316\173\256 -\122\026\304\227\215\012\050\175\325\313\154\343\325\345\016\062 -\117\310\150\055\064\010\075\163\250\223\102\051\063\106\014\104 -\147\361\320\232\234\151\001\345\221\361\015\311\151\074\063\113 -\116\031\223\143\063\005\051\041\241\330\377\076\124\253\236\366 -\241\172\002\327\334\377\245\076\124\170\371\323\301\312\022\225 -\371\211\236\024\342\362\241\104\262\313\351\055\165\065\314\226 -\125\273\070\013\210\046\332\326\254\357\323\122\242\013\113\072 -\123\332\113\042\123\314\312\052\044\232\142\252\304\062\232\176 -\334\314\301\262\154\315\217\331\264\300\317\365\002\300\214\053 -\204\133\033\100\274\020\320\120\341\141\326\146\126\232\004\221 -\245\343\325\275\240\056\042\201\261\331\070\332\344\250\207\137 -\074\106\004\226\336\311\232\073\277\255\170\154\035\111\111\264 -\151\271\160\017\005\222\126\266\375\257\256\370\040\055\107\043 -\317\266\034\315\304\233\200\116\371\277\061\300\124\276\273\061 -\177\363\076 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Posta CA Root" -# Issuer: CN=Posta CA Root,CN=AIA,CN=Public Key Services,CN=Services,CN=Configuration,DC=ca,DC=posta,DC=rs -# Serial Number: 1224507125 (0x48fc7ef5) -# Subject: CN=Posta CA Root,CN=AIA,CN=Public Key Services,CN=Services,CN=Configuration,DC=ca,DC=posta,DC=rs -# Not Valid Before: Mon Oct 20 12:22:08 2008 -# Not Valid After : Fri Oct 20 12:52:08 2028 -# Fingerprint (SHA-256): CD:20:12:56:FE:5C:ED:0B:FF:F8:DF:59:5F:FF:36:B1:41:6D:53:13:A9:99:F5:32:EF:4A:99:15:DF:96:DE:E0 -# Fingerprint (SHA1): D6:BF:79:94:F4:2B:E5:FA:29:DA:0B:D7:58:7B:59:1F:47:A4:4F:22 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Posta CA Root" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\326\277\171\224\364\053\345\372\051\332\013\327\130\173\131\037 -\107\244\117\042 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\030\002\260\001\047\003\152\031\033\062\073\203\336\232\251\205 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\256\061\022\060\020\006\012\011\222\046\211\223\362\054 -\144\001\031\026\002\162\163\061\025\060\023\006\012\011\222\046 -\211\223\362\054\144\001\031\026\005\160\157\163\164\141\061\022 -\060\020\006\012\011\222\046\211\223\362\054\144\001\031\026\002 -\143\141\061\026\060\024\006\003\125\004\003\023\015\103\157\156 -\146\151\147\165\162\141\164\151\157\156\061\021\060\017\006\003 -\125\004\003\023\010\123\145\162\166\151\143\145\163\061\034\060 -\032\006\003\125\004\003\023\023\120\165\142\154\151\143\040\113 -\145\171\040\123\145\162\166\151\143\145\163\061\014\060\012\006 -\003\125\004\003\023\003\101\111\101\061\026\060\024\006\003\125 -\004\003\023\015\120\157\163\164\141\040\103\101\040\122\157\157 -\164 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\110\374\176\365 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "TWCA Root Certification Authority 1" # @@ -15969,166 +12988,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "VRK Gov. Root CA" -# -# Issuer: CN=VRK Gov. Root CA,OU=Varmennepalvelut,OU=Certification Authority Services,O=Vaestorekisterikeskus CA,ST=Finland,C=FI -# Serial Number: 100000 (0x186a0) -# Subject: CN=VRK Gov. Root CA,OU=Varmennepalvelut,OU=Certification Authority Services,O=Vaestorekisterikeskus CA,ST=Finland,C=FI -# Not Valid Before: Wed Dec 18 13:53:00 2002 -# Not Valid After : Mon Dec 18 13:51:08 2023 -# Fingerprint (SHA-256): F0:08:73:3E:C5:00:DC:49:87:63:CC:92:64:C6:FC:EA:40:EC:22:00:0E:92:7D:05:3C:E9:C9:0B:FA:04:6C:B2 -# Fingerprint (SHA1): FA:A7:D9:FB:31:B7:46:F2:00:A8:5E:65:79:76:13:D8:16:E0:63:B5 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "VRK Gov. Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\243\061\013\060\011\006\003\125\004\006\023\002\106\111 -\061\020\060\016\006\003\125\004\010\023\007\106\151\156\154\141 -\156\144\061\041\060\037\006\003\125\004\012\023\030\126\141\145 -\163\164\157\162\145\153\151\163\164\145\162\151\153\145\163\153 -\165\163\040\103\101\061\051\060\047\006\003\125\004\013\023\040 -\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165 -\164\150\157\162\151\164\171\040\123\145\162\166\151\143\145\163 -\061\031\060\027\006\003\125\004\013\023\020\126\141\162\155\145 -\156\156\145\160\141\154\166\145\154\165\164\061\031\060\027\006 -\003\125\004\003\023\020\126\122\113\040\107\157\166\056\040\122 -\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\243\061\013\060\011\006\003\125\004\006\023\002\106\111 -\061\020\060\016\006\003\125\004\010\023\007\106\151\156\154\141 -\156\144\061\041\060\037\006\003\125\004\012\023\030\126\141\145 -\163\164\157\162\145\153\151\163\164\145\162\151\153\145\163\153 -\165\163\040\103\101\061\051\060\047\006\003\125\004\013\023\040 -\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165 -\164\150\157\162\151\164\171\040\123\145\162\166\151\143\145\163 -\061\031\060\027\006\003\125\004\013\023\020\126\141\162\155\145 -\156\156\145\160\141\154\166\145\154\165\164\061\031\060\027\006 -\003\125\004\003\023\020\126\122\113\040\107\157\166\056\040\122 -\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\001\206\240 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\032\060\202\003\002\240\003\002\001\002\002\003\001 -\206\240\060\015\006\011\052\206\110\206\367\015\001\001\005\005 -\000\060\201\243\061\013\060\011\006\003\125\004\006\023\002\106 -\111\061\020\060\016\006\003\125\004\010\023\007\106\151\156\154 -\141\156\144\061\041\060\037\006\003\125\004\012\023\030\126\141 -\145\163\164\157\162\145\153\151\163\164\145\162\151\153\145\163 -\153\165\163\040\103\101\061\051\060\047\006\003\125\004\013\023 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171\040\123\145\162\166\151\143\145 -\163\061\031\060\027\006\003\125\004\013\023\020\126\141\162\155 -\145\156\156\145\160\141\154\166\145\154\165\164\061\031\060\027 -\006\003\125\004\003\023\020\126\122\113\040\107\157\166\056\040 -\122\157\157\164\040\103\101\060\036\027\015\060\062\061\062\061 -\070\061\063\065\063\060\060\132\027\015\062\063\061\062\061\070 -\061\063\065\061\060\070\132\060\201\243\061\013\060\011\006\003 -\125\004\006\023\002\106\111\061\020\060\016\006\003\125\004\010 -\023\007\106\151\156\154\141\156\144\061\041\060\037\006\003\125 -\004\012\023\030\126\141\145\163\164\157\162\145\153\151\163\164 -\145\162\151\153\145\163\153\165\163\040\103\101\061\051\060\047 -\006\003\125\004\013\023\040\103\145\162\164\151\146\151\143\141 -\164\151\157\156\040\101\165\164\150\157\162\151\164\171\040\123 -\145\162\166\151\143\145\163\061\031\060\027\006\003\125\004\013 -\023\020\126\141\162\155\145\156\156\145\160\141\154\166\145\154 -\165\164\061\031\060\027\006\003\125\004\003\023\020\126\122\113 -\040\107\157\166\056\040\122\157\157\164\040\103\101\060\202\001 -\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000 -\003\202\001\017\000\060\202\001\012\002\202\001\001\000\260\205 -\025\332\310\003\067\320\243\106\067\154\033\036\226\060\302\132 -\205\022\147\043\362\273\237\347\212\201\140\047\370\023\251\074 -\274\367\206\252\252\364\363\045\051\264\376\165\256\036\201\206 -\212\005\262\035\145\262\070\350\264\314\050\232\373\027\066\361 -\223\325\171\316\301\203\213\041\117\303\015\255\101\337\170\235 -\110\343\037\102\104\374\074\155\041\040\153\255\042\204\044\102 -\217\027\115\302\120\037\144\315\055\071\042\126\210\375\262\143 -\235\124\332\102\151\300\310\117\327\030\342\076\310\151\204\224 -\075\054\200\306\174\316\275\327\123\037\353\210\271\246\313\273 -\205\127\357\127\166\135\014\213\323\136\022\101\237\041\300\071 -\364\046\155\010\372\070\263\241\167\261\356\026\330\320\150\332 -\264\230\245\240\145\106\112\153\215\176\252\115\140\270\370\310 -\015\374\161\076\356\071\207\201\264\331\370\156\220\356\077\016 -\141\327\035\053\150\346\056\341\102\104\046\170\054\130\362\175 -\026\177\141\300\111\044\052\211\207\266\135\057\051\031\370\246 -\347\216\122\236\101\113\132\016\252\270\302\146\102\123\002\003 -\001\000\001\243\125\060\123\060\017\006\003\125\035\023\001\001 -\377\004\005\060\003\001\001\377\060\021\006\011\140\206\110\001 -\206\370\102\001\001\004\004\003\002\000\007\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\306\060\035\006\003\125 -\035\016\004\026\004\024\333\351\341\233\322\321\044\013\374\253 -\343\240\147\352\256\234\113\167\364\260\060\015\006\011\052\206 -\110\206\367\015\001\001\005\005\000\003\202\001\001\000\255\175 -\110\017\124\021\236\130\356\257\015\233\022\057\041\244\315\233 -\272\204\107\346\311\045\125\043\343\337\030\130\052\054\333\136 -\367\315\124\365\121\044\173\142\147\341\261\037\111\257\064\320 -\353\261\314\331\242\015\122\177\102\113\210\140\227\317\045\162 -\267\117\051\055\142\237\117\241\300\125\127\126\016\304\150\227 -\221\037\234\144\302\051\062\001\351\324\310\332\270\201\230\050 -\056\030\307\054\374\353\233\122\226\337\364\310\220\031\055\043 -\363\361\273\161\332\236\205\043\275\032\357\056\344\172\171\267 -\303\235\206\111\055\143\271\055\164\317\145\017\062\146\211\337 -\073\041\356\051\157\071\143\331\025\301\156\366\337\200\076\120 -\170\031\212\335\003\243\024\245\067\247\265\054\174\266\021\207 -\347\005\362\274\266\336\324\377\227\201\050\204\376\376\154\106 -\205\020\101\237\115\165\214\007\324\231\147\157\165\212\157\344 -\120\222\366\231\325\020\270\304\251\173\367\027\215\113\277\327 -\225\237\011\334\104\017\036\062\303\300\317\323\171\015\344\307 -\073\207\360\220\064\210\041\142\111\222\004\004\037\274 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "VRK Gov. Root CA" -# Issuer: CN=VRK Gov. Root CA,OU=Varmennepalvelut,OU=Certification Authority Services,O=Vaestorekisterikeskus CA,ST=Finland,C=FI -# Serial Number: 100000 (0x186a0) -# Subject: CN=VRK Gov. Root CA,OU=Varmennepalvelut,OU=Certification Authority Services,O=Vaestorekisterikeskus CA,ST=Finland,C=FI -# Not Valid Before: Wed Dec 18 13:53:00 2002 -# Not Valid After : Mon Dec 18 13:51:08 2023 -# Fingerprint (SHA-256): F0:08:73:3E:C5:00:DC:49:87:63:CC:92:64:C6:FC:EA:40:EC:22:00:0E:92:7D:05:3C:E9:C9:0B:FA:04:6C:B2 -# Fingerprint (SHA1): FA:A7:D9:FB:31:B7:46:F2:00:A8:5E:65:79:76:13:D8:16:E0:63:B5 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "VRK Gov. Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\372\247\331\373\061\267\106\362\000\250\136\145\171\166\023\330 -\026\340\143\265 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\367\266\141\253\003\302\134\106\076\055\054\364\241\044\330\124 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\243\061\013\060\011\006\003\125\004\006\023\002\106\111 -\061\020\060\016\006\003\125\004\010\023\007\106\151\156\154\141 -\156\144\061\041\060\037\006\003\125\004\012\023\030\126\141\145 -\163\164\157\162\145\153\151\163\164\145\162\151\153\145\163\153 -\165\163\040\103\101\061\051\060\047\006\003\125\004\013\023\040 -\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165 -\164\150\157\162\151\164\171\040\123\145\162\166\151\143\145\163 -\061\031\060\027\006\003\125\004\013\023\020\126\141\162\155\145 -\156\156\145\160\141\154\166\145\154\165\164\061\031\060\027\006 -\003\125\004\003\023\020\126\122\113\040\107\157\166\056\040\122 -\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\001\206\240 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Visa Information Delivery Root CA" # @@ -16811,176 +13670,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE # -# Certificate "SwissSign Platinum G2 Root CA" -# -# Issuer: CN=SwissSign Platinum CA - G2,O=SwissSign AG,C=CH -# Serial Number:4e:b2:00:67:0c:03:5d:4f -# Subject: CN=SwissSign Platinum CA - G2,O=SwissSign AG,C=CH -# Not Valid Before: Wed Oct 25 08:36:00 2006 -# Not Valid After : Sat Oct 25 08:36:00 2036 -# Fingerprint (SHA-256): 3B:22:2E:56:67:11:E9:92:30:0D:C0:B1:5A:B9:47:3D:AF:DE:F8:C8:4D:0C:EF:7D:33:17:B4:C1:82:1D:14:36 -# Fingerprint (SHA1): 56:E0:FA:C0:3B:8F:18:23:55:18:E5:D3:11:CA:E8:C2:43:31:AB:66 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SwissSign Platinum G2 Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\111\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\043\060\041\006\003\125\004\003\023 -\032\123\167\151\163\163\123\151\147\156\040\120\154\141\164\151 -\156\165\155\040\103\101\040\055\040\107\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\111\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\043\060\041\006\003\125\004\003\023 -\032\123\167\151\163\163\123\151\147\156\040\120\154\141\164\151 -\156\165\155\040\103\101\040\055\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\116\262\000\147\014\003\135\117 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\301\060\202\003\251\240\003\002\001\002\002\010\116 -\262\000\147\014\003\135\117\060\015\006\011\052\206\110\206\367 -\015\001\001\005\005\000\060\111\061\013\060\011\006\003\125\004 -\006\023\002\103\110\061\025\060\023\006\003\125\004\012\023\014 -\123\167\151\163\163\123\151\147\156\040\101\107\061\043\060\041 -\006\003\125\004\003\023\032\123\167\151\163\163\123\151\147\156 -\040\120\154\141\164\151\156\165\155\040\103\101\040\055\040\107 -\062\060\036\027\015\060\066\061\060\062\065\060\070\063\066\060 -\060\132\027\015\063\066\061\060\062\065\060\070\063\066\060\060 -\132\060\111\061\013\060\011\006\003\125\004\006\023\002\103\110 -\061\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163 -\123\151\147\156\040\101\107\061\043\060\041\006\003\125\004\003 -\023\032\123\167\151\163\163\123\151\147\156\040\120\154\141\164 -\151\156\165\155\040\103\101\040\055\040\107\062\060\202\002\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\002\017\000\060\202\002\012\002\202\002\001\000\312\337\242 -\002\342\332\370\374\007\026\261\336\140\252\336\226\134\144\037 -\307\057\176\317\147\372\104\102\326\166\143\225\256\353\257\162 -\040\212\105\107\206\142\170\206\326\040\071\046\364\256\243\375 -\043\347\245\234\265\042\041\031\267\067\223\042\300\120\234\202 -\173\324\325\004\104\134\313\264\302\237\222\276\044\330\173\147 -\042\342\151\137\345\005\170\324\207\331\161\160\063\045\123\264 -\207\073\051\220\050\066\232\125\104\060\150\244\203\227\177\015 -\036\234\166\377\025\235\140\227\000\215\212\205\003\354\200\276 -\352\054\156\020\121\222\314\176\325\243\063\330\326\111\336\130 -\052\257\366\026\353\113\173\220\062\227\271\272\235\130\361\370 -\127\111\004\036\242\135\006\160\335\161\333\371\335\213\232\033 -\214\317\075\243\115\316\313\174\366\273\234\240\372\011\316\043 -\142\262\351\015\037\342\162\050\217\237\254\150\040\175\157\073 -\250\205\061\011\177\013\307\350\145\351\343\170\016\011\147\060 -\213\064\202\373\135\340\314\235\201\155\142\356\010\036\004\054 -\116\233\354\376\251\117\137\375\151\170\357\011\037\241\264\277 -\372\363\357\220\036\114\005\213\036\352\172\221\172\303\327\345 -\373\060\274\154\033\020\130\230\367\032\137\320\051\062\003\023 -\106\115\141\152\205\114\122\164\057\006\037\173\021\342\204\227 -\306\231\363\155\177\327\147\203\176\023\150\330\161\050\132\330 -\316\335\350\020\024\232\376\155\043\207\156\216\132\160\074\325 -\215\011\000\247\252\274\260\061\067\155\310\204\024\036\133\275 -\105\143\040\153\113\164\214\275\333\072\016\301\317\132\026\217 -\245\230\362\166\211\262\023\022\073\013\167\167\254\273\345\074 -\051\112\222\162\312\141\032\053\136\114\342\203\164\167\372\065 -\110\172\205\115\215\232\123\304\337\170\312\227\221\110\053\105 -\053\001\367\034\032\242\355\030\272\012\275\203\372\157\274\215 -\127\223\073\324\324\246\316\036\361\240\261\316\253\375\053\050 -\232\117\033\327\303\162\333\244\304\277\135\114\365\335\173\226 -\151\356\150\200\346\347\230\272\066\267\376\156\355\053\275\040 -\370\145\031\332\125\011\176\045\334\376\141\142\162\371\176\030 -\002\357\143\264\320\373\257\345\073\143\214\147\217\002\003\001 -\000\001\243\201\254\060\201\251\060\016\006\003\125\035\017\001 -\001\377\004\004\003\002\001\006\060\017\006\003\125\035\023\001 -\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035\016 -\004\026\004\024\120\257\314\007\207\025\107\157\070\305\264\145 -\321\336\225\252\351\337\234\314\060\037\006\003\125\035\043\004 -\030\060\026\200\024\120\257\314\007\207\025\107\157\070\305\264 -\145\321\336\225\252\351\337\234\314\060\106\006\003\125\035\040 -\004\077\060\075\060\073\006\011\140\205\164\001\131\001\001\001 -\001\060\056\060\054\006\010\053\006\001\005\005\007\002\001\026 -\040\150\164\164\160\072\057\057\162\145\160\157\163\151\164\157 -\162\171\056\163\167\151\163\163\163\151\147\156\056\143\157\155 -\057\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000 -\003\202\002\001\000\010\205\246\365\026\014\374\104\032\301\143 -\340\371\125\106\010\374\160\034\102\050\226\216\267\305\301\101 -\165\116\011\161\171\345\155\226\312\113\245\210\140\320\060\164 -\270\312\010\334\264\060\236\100\007\026\153\145\225\167\001\256 -\244\267\065\013\201\332\161\025\251\164\027\070\173\130\312\371 -\057\373\300\145\166\215\133\001\271\175\336\202\075\144\270\276 -\024\164\243\012\124\323\054\225\030\027\065\365\121\153\077\217 -\242\226\141\071\170\153\113\345\246\240\370\123\337\121\020\223 -\142\347\200\057\342\321\340\274\216\066\106\167\063\354\270\373 -\216\232\054\211\115\061\021\017\046\236\004\273\267\004\215\013 -\362\271\374\132\235\073\026\267\057\310\230\253\376\212\120\131 -\056\243\073\374\051\135\213\301\113\311\342\212\023\035\261\277 -\273\102\035\122\335\116\330\024\136\020\306\061\007\357\161\047 -\367\033\071\011\334\202\352\213\263\225\206\136\375\365\332\135 -\061\246\340\061\266\224\346\104\111\164\305\026\345\367\037\003 -\141\050\305\310\313\022\240\102\113\371\153\210\010\215\264\062 -\030\363\165\237\304\177\000\117\005\225\234\243\027\002\303\263 -\123\233\252\040\071\051\053\146\372\235\257\136\263\222\322\265 -\246\341\032\371\055\101\151\201\024\264\264\265\355\211\075\316 -\373\251\235\065\102\104\261\034\024\163\201\317\052\001\065\232 -\061\325\055\217\155\204\337\200\115\127\343\077\305\204\165\332 -\211\306\060\273\353\217\313\042\010\240\256\252\361\003\154\072 -\113\115\011\245\016\162\306\126\153\041\102\116\043\045\024\150 -\256\166\012\174\014\007\160\144\371\232\057\366\005\071\046\306 -\014\217\031\177\103\136\156\364\133\025\057\333\141\135\346\147 -\057\077\010\224\371\140\264\230\061\332\164\361\204\223\161\115 -\137\373\140\130\321\373\304\301\155\211\242\273\040\037\235\161 -\221\313\062\233\023\075\076\175\222\122\065\254\222\224\242\323 -\030\302\174\307\352\257\166\005\026\335\147\047\302\176\034\007 -\042\041\363\100\012\033\064\007\104\023\302\204\152\216\337\031 -\132\277\177\353\035\342\032\070\321\134\257\107\222\153\200\265 -\060\245\311\215\330\253\061\201\037\337\302\146\067\323\223\251 -\205\206\171\145\322 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SwissSign Platinum G2 Root CA" -# Issuer: CN=SwissSign Platinum CA - G2,O=SwissSign AG,C=CH -# Serial Number:4e:b2:00:67:0c:03:5d:4f -# Subject: CN=SwissSign Platinum CA - G2,O=SwissSign AG,C=CH -# Not Valid Before: Wed Oct 25 08:36:00 2006 -# Not Valid After : Sat Oct 25 08:36:00 2036 -# Fingerprint (SHA-256): 3B:22:2E:56:67:11:E9:92:30:0D:C0:B1:5A:B9:47:3D:AF:DE:F8:C8:4D:0C:EF:7D:33:17:B4:C1:82:1D:14:36 -# Fingerprint (SHA1): 56:E0:FA:C0:3B:8F:18:23:55:18:E5:D3:11:CA:E8:C2:43:31:AB:66 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SwissSign Platinum G2 Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\126\340\372\300\073\217\030\043\125\030\345\323\021\312\350\302 -\103\061\253\146 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\311\230\047\167\050\036\075\016\025\074\204\000\270\205\003\346 -END -CKA_ISSUER MULTILINE_OCTAL -\060\111\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\043\060\041\006\003\125\004\003\023 -\032\123\167\151\163\163\123\151\147\156\040\120\154\141\164\151 -\156\165\155\040\103\101\040\055\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\116\262\000\147\014\003\135\117 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "SwissSign" +# Certificate "SwissSign" # # Issuer: CN=SwissSign Gold CA - G2,O=SwissSign AG,C=CH # Serial Number:00:bb:40:1c:43:f5:5e:4f:b0 @@ -18890,180 +15580,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "DIRECCION GENERAL DE LA POLICIA" -# -# Issuer: CN=AC RAIZ DNIE,OU=DNIE,O=DIRECCION GENERAL DE LA POLICIA,C=ES -# Serial Number:00:d2:85:70:fd:ae:a7:d6:5f:11:84:15:c6:31:b5:cb -# Subject: CN=AC RAIZ DNIE,OU=DNIE,O=DIRECCION GENERAL DE LA POLICIA,C=ES -# Not Valid Before: Thu Feb 16 10:37:25 2006 -# Not Valid After : Fri Feb 08 22:59:59 2036 -# Fingerprint (SHA-256): 73:97:10:C5:24:5E:33:EC:8A:24:3A:1B:20:04:8F:C9:D5:F4:52:85:99:21:38:45:C1:64:D0:04:B8:B6:67:F9 -# Fingerprint (SHA1): B3:8F:EC:EC:0B:14:8A:A6:86:C3:D0:0F:01:EC:C8:84:8E:80:85:EB -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DIRECCION GENERAL DE LA POLICIA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\135\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\050\060\046\006\003\125\004\012\014\037\104\111\122\105\103\103 -\111\117\116\040\107\105\116\105\122\101\114\040\104\105\040\114 -\101\040\120\117\114\111\103\111\101\061\015\060\013\006\003\125 -\004\013\014\004\104\116\111\105\061\025\060\023\006\003\125\004 -\003\014\014\101\103\040\122\101\111\132\040\104\116\111\105 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\135\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\050\060\046\006\003\125\004\012\014\037\104\111\122\105\103\103 -\111\117\116\040\107\105\116\105\122\101\114\040\104\105\040\114 -\101\040\120\117\114\111\103\111\101\061\015\060\013\006\003\125 -\004\013\014\004\104\116\111\105\061\025\060\023\006\003\125\004 -\003\014\014\101\103\040\122\101\111\132\040\104\116\111\105 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\000\322\205\160\375\256\247\326\137\021\204\025\306\061 -\265\313 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\277\060\202\003\247\240\003\002\001\002\002\020\000 -\322\205\160\375\256\247\326\137\021\204\025\306\061\265\313\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\135 -\061\013\060\011\006\003\125\004\006\023\002\105\123\061\050\060 -\046\006\003\125\004\012\014\037\104\111\122\105\103\103\111\117 -\116\040\107\105\116\105\122\101\114\040\104\105\040\114\101\040 -\120\117\114\111\103\111\101\061\015\060\013\006\003\125\004\013 -\014\004\104\116\111\105\061\025\060\023\006\003\125\004\003\014 -\014\101\103\040\122\101\111\132\040\104\116\111\105\060\036\027 -\015\060\066\060\062\061\066\061\060\063\067\062\065\132\027\015 -\063\066\060\062\060\070\062\062\065\071\065\071\132\060\135\061 -\013\060\011\006\003\125\004\006\023\002\105\123\061\050\060\046 -\006\003\125\004\012\014\037\104\111\122\105\103\103\111\117\116 -\040\107\105\116\105\122\101\114\040\104\105\040\114\101\040\120 -\117\114\111\103\111\101\061\015\060\013\006\003\125\004\013\014 -\004\104\116\111\105\061\025\060\023\006\003\125\004\003\014\014 -\101\103\040\122\101\111\132\040\104\116\111\105\060\202\002\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\002\017\000\060\202\002\012\002\202\002\001\000\200\000\255 -\014\303\243\040\007\243\143\377\367\064\240\315\356\152\124\010 -\027\135\261\001\025\247\346\271\137\212\161\377\014\302\035\352 -\067\363\336\223\177\326\005\115\204\262\325\327\034\014\364\304 -\221\160\100\016\132\310\230\244\200\350\015\063\300\007\363\267 -\365\254\241\070\172\300\146\124\044\374\122\314\060\052\362\303 -\304\241\054\166\277\301\300\277\202\361\233\360\150\172\023\100 -\310\227\274\034\045\007\010\012\267\226\357\314\051\124\340\346 -\145\055\352\262\056\261\011\151\022\116\060\325\330\370\274\000 -\200\057\115\223\017\315\056\127\033\063\273\237\060\116\304\245 -\313\171\247\373\342\064\030\266\040\236\033\237\135\247\311\072 -\255\105\144\263\030\316\021\022\234\155\036\125\105\050\204\234 -\127\147\115\371\313\342\213\217\130\011\324\071\377\310\066\322 -\070\342\014\145\177\025\016\175\301\007\335\251\042\337\221\000 -\304\154\161\064\164\334\071\352\352\117\104\151\177\130\333\130 -\012\122\161\053\354\251\035\120\164\063\371\051\152\372\376\231 -\364\347\314\105\105\155\312\132\045\242\022\343\316\327\070\005 -\071\360\032\011\365\166\131\316\142\157\172\064\015\054\321\274 -\004\022\354\075\123\310\372\320\002\313\316\075\041\265\305\340 -\071\063\145\317\071\123\311\233\106\371\235\063\363\131\200\010 -\101\276\157\113\240\372\112\316\244\166\034\205\342\257\257\024 -\235\145\254\367\177\227\344\063\111\246\257\276\316\053\067\361 -\056\301\163\005\234\234\140\114\235\060\015\227\124\236\201\142 -\273\347\340\057\367\024\007\024\251\167\221\351\334\221\225\216 -\323\210\220\063\107\157\161\303\024\151\372\246\055\001\036\033 -\352\323\056\342\177\013\334\317\347\042\360\361\101\243\001\222 -\345\200\323\276\251\142\250\125\210\013\064\064\354\334\041\025 -\252\357\326\042\136\211\365\121\222\023\052\157\200\026\331\261 -\015\331\056\370\020\270\302\376\122\105\063\234\035\070\174\334 -\025\151\064\163\277\240\054\273\021\173\224\315\370\067\055\157 -\075\357\203\132\306\036\233\164\111\217\331\302\215\276\026\166 -\120\310\132\321\045\026\366\366\314\214\234\132\060\236\145\276 -\320\232\110\223\327\372\150\015\165\061\207\371\367\002\003\001 -\000\001\243\173\060\171\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\016\006\003\125\035\017\001\001 -\377\004\004\003\002\001\006\060\035\006\003\125\035\016\004\026 -\004\024\216\105\364\237\163\305\377\057\033\005\333\001\107\140 -\033\003\212\201\267\272\060\067\006\003\125\035\040\004\060\060 -\056\060\054\006\004\125\035\040\000\060\044\060\042\006\010\053 -\006\001\005\005\007\002\001\026\026\150\164\164\160\072\057\057 -\167\167\167\056\144\156\151\145\056\145\163\057\144\160\143\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003\202 -\002\001\000\165\345\163\311\121\121\057\213\031\240\207\351\377 -\256\066\066\246\374\101\037\343\036\327\161\140\031\306\157\232 -\002\060\275\142\161\255\163\376\221\055\116\344\046\100\104\251 -\256\170\046\043\061\151\334\232\163\226\036\111\121\013\340\357 -\301\270\103\357\161\234\356\101\267\305\120\037\062\204\236\042 -\206\361\367\037\217\331\255\053\116\332\227\050\227\273\226\232 -\032\370\261\331\172\004\363\124\231\022\031\226\025\200\147\071 -\377\002\137\172\374\125\102\120\132\346\271\242\377\270\250\142 -\036\024\315\331\077\276\243\145\110\305\073\327\067\316\015\372 -\050\220\332\277\371\343\121\107\045\175\112\323\147\115\207\252 -\142\274\136\354\172\200\104\174\367\237\012\275\145\127\224\312 -\362\021\146\326\122\177\344\072\160\165\004\315\073\227\324\066 -\162\367\121\126\277\064\365\322\101\341\264\332\250\103\376\153 -\022\111\022\264\135\317\042\102\226\214\010\043\046\214\262\020 -\116\135\252\123\356\001\057\165\345\271\242\021\063\304\327\152 -\375\370\016\312\156\202\331\347\273\131\043\116\265\371\021\035 -\057\153\043\365\173\021\040\352\101\022\220\062\106\333\061\073 -\251\301\133\163\150\072\106\033\214\376\227\267\126\271\141\231 -\314\116\360\203\372\067\361\336\034\235\034\161\213\003\223\303 -\304\163\202\056\250\230\035\144\242\232\214\367\124\010\115\317 -\352\201\313\365\133\011\231\143\257\165\214\226\370\171\065\325 -\334\353\101\201\171\070\204\136\157\361\157\142\166\333\221\316 -\132\205\140\071\035\133\342\052\057\103\045\333\302\172\044\323 -\025\260\242\361\214\240\175\153\110\011\023\377\242\114\146\212 -\354\160\122\011\123\214\060\314\270\325\272\044\334\060\231\076 -\241\136\267\337\201\254\354\067\276\116\233\047\130\336\176\241 -\233\124\177\006\266\057\344\062\120\375\347\020\273\250\315\332 -\030\033\324\143\146\075\352\121\161\071\364\234\076\337\132\364 -\332\307\114\046\355\213\265\041\272\064\171\002\163\141\020\332 -\230\061\250\140\313\176\007\247\320\267\005\103\211\133\315\205 -\046\331\260\121\257\367\214\122\252\022\247\130\337\222\233\147 -\362\235\362\346\364\151\061\364\026\347\336\167\133\036\335\232 -\005\001\255 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DIRECCION GENERAL DE LA POLICIA" -# Issuer: CN=AC RAIZ DNIE,OU=DNIE,O=DIRECCION GENERAL DE LA POLICIA,C=ES -# Serial Number:00:d2:85:70:fd:ae:a7:d6:5f:11:84:15:c6:31:b5:cb -# Subject: CN=AC RAIZ DNIE,OU=DNIE,O=DIRECCION GENERAL DE LA POLICIA,C=ES -# Not Valid Before: Thu Feb 16 10:37:25 2006 -# Not Valid After : Fri Feb 08 22:59:59 2036 -# Fingerprint (SHA-256): 73:97:10:C5:24:5E:33:EC:8A:24:3A:1B:20:04:8F:C9:D5:F4:52:85:99:21:38:45:C1:64:D0:04:B8:B6:67:F9 -# Fingerprint (SHA1): B3:8F:EC:EC:0B:14:8A:A6:86:C3:D0:0F:01:EC:C8:84:8E:80:85:EB -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DIRECCION GENERAL DE LA POLICIA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\263\217\354\354\013\024\212\246\206\303\320\017\001\354\310\204 -\216\200\205\353 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\025\136\365\021\172\242\301\025\016\222\176\146\376\073\204\303 -END -CKA_ISSUER MULTILINE_OCTAL -\060\135\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\050\060\046\006\003\125\004\012\014\037\104\111\122\105\103\103 -\111\117\116\040\107\105\116\105\122\101\114\040\104\105\040\114 -\101\040\120\117\114\111\103\111\101\061\015\060\013\006\003\125 -\004\013\014\004\104\116\111\105\061\025\060\023\006\003\125\004 -\003\014\014\101\103\040\122\101\111\132\040\104\116\111\105 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\000\322\205\160\375\256\247\326\137\021\204\025\306\061 -\265\313 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Agencia Catalana de Certificacio (NIF Q-0801176-I)" # @@ -19261,144 +15777,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "KISA RootCA 1" -# -# Issuer: CN=KISA RootCA 1,OU=Korea Certification Authority Central,O=KISA,C=KR -# Serial Number: 4 (0x4) -# Subject: CN=KISA RootCA 1,OU=Korea Certification Authority Central,O=KISA,C=KR -# Not Valid Before: Wed Aug 24 08:05:46 2005 -# Not Valid After : Sun Aug 24 08:05:46 2025 -# Fingerprint (SHA-256): 6F:DB:3F:76:C8:B8:01:A7:53:38:D8:A5:0A:7C:02:87:9F:61:98:B5:7E:59:4D:31:8D:38:32:90:0F:ED:CD:79 -# Fingerprint (SHA1): 02:72:68:29:3E:5F:5D:17:AA:A4:B3:C3:E6:36:1E:1F:92:57:5E:AA -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "KISA RootCA 1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\144\061\013\060\011\006\003\125\004\006\023\002\113\122\061 -\015\060\013\006\003\125\004\012\014\004\113\111\123\101\061\056 -\060\054\006\003\125\004\013\014\045\113\157\162\145\141\040\103 -\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164 -\150\157\162\151\164\171\040\103\145\156\164\162\141\154\061\026 -\060\024\006\003\125\004\003\014\015\113\111\123\101\040\122\157 -\157\164\103\101\040\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\144\061\013\060\011\006\003\125\004\006\023\002\113\122\061 -\015\060\013\006\003\125\004\012\014\004\113\111\123\101\061\056 -\060\054\006\003\125\004\013\014\045\113\157\162\145\141\040\103 -\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164 -\150\157\162\151\164\171\040\103\145\156\164\162\141\154\061\026 -\060\024\006\003\125\004\003\014\015\113\111\123\101\040\122\157 -\157\164\103\101\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\004 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\163\060\202\002\133\240\003\002\001\002\002\001\004 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\144\061\013\060\011\006\003\125\004\006\023\002\113\122\061\015 -\060\013\006\003\125\004\012\014\004\113\111\123\101\061\056\060 -\054\006\003\125\004\013\014\045\113\157\162\145\141\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150 -\157\162\151\164\171\040\103\145\156\164\162\141\154\061\026\060 -\024\006\003\125\004\003\014\015\113\111\123\101\040\122\157\157 -\164\103\101\040\061\060\036\027\015\060\065\060\070\062\064\060 -\070\060\065\064\066\132\027\015\062\065\060\070\062\064\060\070 -\060\065\064\066\132\060\144\061\013\060\011\006\003\125\004\006 -\023\002\113\122\061\015\060\013\006\003\125\004\012\014\004\113 -\111\123\101\061\056\060\054\006\003\125\004\013\014\045\113\157 -\162\145\141\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\040\103\145\156\164 -\162\141\154\061\026\060\024\006\003\125\004\003\014\015\113\111 -\123\101\040\122\157\157\164\103\101\040\061\060\202\001\040\060 -\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202 -\001\015\000\060\202\001\010\002\202\001\001\000\274\004\344\372 -\023\071\360\064\226\040\153\154\150\273\372\333\167\377\047\367 -\254\354\057\347\375\360\177\155\157\214\052\315\045\011\133\044 -\364\241\150\374\050\354\311\045\342\254\355\336\310\063\204\365 -\260\245\011\072\247\261\107\110\305\314\117\214\171\234\371\006 -\127\175\335\356\070\366\317\024\262\234\352\323\300\135\167\142 -\360\107\015\271\032\100\123\134\144\160\257\010\132\300\367\317 -\165\371\154\215\144\050\036\040\376\267\033\031\323\132\146\203 -\162\342\260\233\275\323\045\025\015\062\157\144\067\224\205\106 -\310\162\276\167\325\156\037\050\057\307\151\355\347\203\211\063 -\130\323\336\240\277\100\350\103\120\356\334\115\153\274\245\352 -\246\310\141\216\365\303\144\257\006\025\334\051\213\077\165\214 -\274\161\104\333\374\255\265\027\035\155\211\203\317\306\063\275 -\277\105\242\376\012\237\243\021\137\017\271\037\234\032\302\106 -\314\234\050\146\237\160\046\074\056\337\252\200\376\214\305\004 -\011\045\117\315\223\107\074\067\352\002\147\222\376\374\042\044 -\134\254\322\054\340\134\001\063\212\301\031\333\002\001\003\243 -\062\060\060\060\035\006\003\125\035\016\004\026\004\024\277\266 -\047\330\003\132\166\145\114\141\001\101\126\061\345\213\173\072 -\331\314\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\015\006\011\052\206\110\206\367\015\001\001\005 -\005\000\003\202\001\001\000\023\257\121\013\336\212\152\133\346 -\232\012\310\261\220\112\116\241\002\235\314\210\322\253\146\275 -\075\354\273\261\102\225\152\262\134\132\377\241\143\144\226\251 -\150\025\177\045\136\212\370\244\163\301\200\212\205\012\016\122 -\350\062\347\105\370\116\145\200\221\231\164\103\345\105\235\111 -\052\360\224\225\335\351\341\060\322\023\156\311\116\261\167\345 -\004\317\255\132\036\224\011\132\327\074\010\034\256\172\351\024 -\062\301\105\255\322\046\110\162\254\250\101\332\360\041\207\071 -\136\337\374\144\377\141\164\052\234\331\233\213\137\302\067\223 -\330\243\067\057\073\223\153\262\033\007\247\177\011\120\357\323 -\072\276\041\153\212\220\073\047\112\121\116\153\236\234\207\235 -\370\170\220\061\355\021\047\306\250\131\276\374\030\013\373\216 -\176\056\102\341\355\347\011\041\275\271\023\305\126\147\364\046 -\246\102\103\220\104\124\264\161\233\166\344\032\022\254\032\050 -\000\337\233\301\325\370\333\134\243\370\222\261\275\264\324\371 -\120\331\000\002\117\333\203\320\021\117\244\102\126\141\072\176 -\023\062\323\204\037\311\272 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "KISA RootCA 1" -# Issuer: CN=KISA RootCA 1,OU=Korea Certification Authority Central,O=KISA,C=KR -# Serial Number: 4 (0x4) -# Subject: CN=KISA RootCA 1,OU=Korea Certification Authority Central,O=KISA,C=KR -# Not Valid Before: Wed Aug 24 08:05:46 2005 -# Not Valid After : Sun Aug 24 08:05:46 2025 -# Fingerprint (SHA-256): 6F:DB:3F:76:C8:B8:01:A7:53:38:D8:A5:0A:7C:02:87:9F:61:98:B5:7E:59:4D:31:8D:38:32:90:0F:ED:CD:79 -# Fingerprint (SHA1): 02:72:68:29:3E:5F:5D:17:AA:A4:B3:C3:E6:36:1E:1F:92:57:5E:AA -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "KISA RootCA 1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\002\162\150\051\076\137\135\027\252\244\263\303\346\066\036\037 -\222\127\136\252 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\150\233\027\306\124\340\340\340\231\125\026\102\367\132\206\330 -END -CKA_ISSUER MULTILINE_OCTAL -\060\144\061\013\060\011\006\003\125\004\006\023\002\113\122\061 -\015\060\013\006\003\125\004\012\014\004\113\111\123\101\061\056 -\060\054\006\003\125\004\013\014\045\113\157\162\145\141\040\103 -\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164 -\150\157\162\151\164\171\040\103\145\156\164\162\141\154\061\026 -\060\024\006\003\125\004\003\014\015\113\111\123\101\040\122\157 -\157\164\103\101\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\004 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Go Daddy Class 2 Certification Authority" # @@ -19756,527 +16134,95 @@ CKA_VALUE MULTILINE_OCTAL \167\056\170\162\141\155\160\163\145\143\165\162\151\164\171\056 \143\157\155\061\044\060\042\006\003\125\004\012\023\033\130\122 \141\155\160\040\123\145\143\165\162\151\164\171\040\123\145\162 -\166\151\143\145\163\040\111\156\143\061\055\060\053\006\003\125 -\004\003\023\044\130\122\141\155\160\040\107\154\157\142\141\154 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171\060\202\001\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017\000 -\060\202\001\012\002\202\001\001\000\230\044\036\275\025\264\272 -\337\307\214\245\047\266\070\013\151\363\266\116\250\054\056\041 -\035\134\104\337\041\135\176\043\164\376\136\176\264\112\267\246 -\255\037\256\340\006\026\342\233\133\331\147\164\153\135\200\217 -\051\235\206\033\331\234\015\230\155\166\020\050\130\344\145\260 -\177\112\230\171\237\340\303\061\176\200\053\265\214\300\100\073 -\021\206\320\313\242\206\066\140\244\325\060\202\155\331\156\320 -\017\022\004\063\227\137\117\141\132\360\344\371\221\253\347\035 -\073\274\350\317\364\153\055\064\174\342\110\141\034\216\363\141 -\104\314\157\240\112\251\224\260\115\332\347\251\064\172\162\070 -\250\101\314\074\224\021\175\353\310\246\214\267\206\313\312\063 -\073\331\075\067\213\373\172\076\206\054\347\163\327\012\127\254 -\144\233\031\353\364\017\004\010\212\254\003\027\031\144\364\132 -\045\042\215\064\054\262\366\150\035\022\155\323\212\036\024\332 -\304\217\246\342\043\205\325\172\015\275\152\340\351\354\354\027 -\273\102\033\147\252\045\355\105\203\041\374\301\311\174\325\142 -\076\372\362\305\055\323\375\324\145\002\003\001\000\001\243\201 -\237\060\201\234\060\023\006\011\053\006\001\004\001\202\067\024 -\002\004\006\036\004\000\103\000\101\060\013\006\003\125\035\017 -\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026 -\004\024\306\117\242\075\006\143\204\011\234\316\142\344\004\254 -\215\134\265\351\266\033\060\066\006\003\125\035\037\004\057\060 -\055\060\053\240\051\240\047\206\045\150\164\164\160\072\057\057 -\143\162\154\056\170\162\141\155\160\163\145\143\165\162\151\164 -\171\056\143\157\155\057\130\107\103\101\056\143\162\154\060\020 -\006\011\053\006\001\004\001\202\067\025\001\004\003\002\001\001 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003 -\202\001\001\000\221\025\071\003\001\033\147\373\112\034\371\012 -\140\133\241\332\115\227\142\371\044\123\047\327\202\144\116\220 -\056\303\111\033\053\232\334\374\250\170\147\065\361\035\360\021 -\275\267\110\343\020\366\015\337\077\322\311\266\252\125\244\110 -\272\002\333\336\131\056\025\133\073\235\026\175\107\327\067\352 -\137\115\166\022\066\273\037\327\241\201\004\106\040\243\054\155 -\251\236\001\176\077\051\316\000\223\337\375\311\222\163\211\211 -\144\236\347\053\344\034\221\054\322\271\316\175\316\157\061\231 -\323\346\276\322\036\220\360\011\024\171\134\043\253\115\322\332 -\041\037\115\231\171\235\341\317\047\237\020\233\034\210\015\260 -\212\144\101\061\270\016\154\220\044\244\233\134\161\217\272\273 -\176\034\033\333\152\200\017\041\274\351\333\246\267\100\364\262 -\213\251\261\344\357\232\032\320\075\151\231\356\250\050\243\341 -\074\263\360\262\021\234\317\174\100\346\335\347\103\175\242\330 -\072\265\251\215\362\064\231\304\324\020\341\006\375\011\204\020 -\073\356\304\114\364\354\047\174\102\302\164\174\202\212\011\311 -\264\003\045\274 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Trustwave" -# Issuer: CN=XRamp Global Certification Authority,O=XRamp Security Services Inc,OU=www.xrampsecurity.com,C=US -# Serial Number:50:94:6c:ec:18:ea:d5:9c:4d:d5:97:ef:75:8f:a0:ad -# Subject: CN=XRamp Global Certification Authority,O=XRamp Security Services Inc,OU=www.xrampsecurity.com,C=US -# Not Valid Before: Mon Nov 01 17:14:04 2004 -# Not Valid After : Mon Jan 01 05:37:19 2035 -# Fingerprint (SHA-256): CE:CD:DC:90:50:99:D8:DA:DF:C5:B1:D2:09:B7:37:CB:E2:C1:8C:FB:2C:10:C0:FF:0B:CF:0D:32:86:FC:1A:A2 -# Fingerprint (SHA1): B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Trustwave" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\270\001\206\321\353\234\206\245\101\004\317\060\124\363\114\122 -\267\345\130\306 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\241\013\104\263\312\020\330\000\156\235\017\330\017\222\012\321 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\036\060\034\006\003\125\004\013\023\025\167\167\167\056\170 -\162\141\155\160\163\145\143\165\162\151\164\171\056\143\157\155 -\061\044\060\042\006\003\125\004\012\023\033\130\122\141\155\160 -\040\123\145\143\165\162\151\164\171\040\123\145\162\166\151\143 -\145\163\040\111\156\143\061\055\060\053\006\003\125\004\003\023 -\044\130\122\141\155\160\040\107\154\157\142\141\154\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150 -\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\120\224\154\354\030\352\325\234\115\325\227\357\165\217 -\240\255 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "SECOM Trust Systems CO LTD" -# -# Issuer: OU=Security Communication RootCA1,O=SECOM Trust.net,C=JP -# Serial Number: 0 (0x0) -# Subject: OU=Security Communication RootCA1,O=SECOM Trust.net,C=JP -# Not Valid Before: Tue Sep 30 04:20:49 2003 -# Not Valid After : Sat Sep 30 04:20:49 2023 -# Fingerprint (SHA-256): E7:5E:72:ED:9F:56:0E:EC:6E:B4:80:00:73:A4:3F:C3:AD:19:19:5A:39:22:82:01:78:95:97:4A:99:02:6B:6C -# Fingerprint (SHA1): 36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SECOM Trust Systems CO LTD" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\030\060\026\006\003\125\004\012\023\017\123\105\103\117\115\040 -\124\162\165\163\164\056\156\145\164\061\047\060\045\006\003\125 -\004\013\023\036\123\145\143\165\162\151\164\171\040\103\157\155 -\155\165\156\151\143\141\164\151\157\156\040\122\157\157\164\103 -\101\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\030\060\026\006\003\125\004\012\023\017\123\105\103\117\115\040 -\124\162\165\163\164\056\156\145\164\061\047\060\045\006\003\125 -\004\013\023\036\123\145\143\165\162\151\164\171\040\103\157\155 -\155\165\156\151\143\141\164\151\157\156\040\122\157\157\164\103 -\101\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\132\060\202\002\102\240\003\002\001\002\002\001\000 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\120\061\013\060\011\006\003\125\004\006\023\002\112\120\061\030 -\060\026\006\003\125\004\012\023\017\123\105\103\117\115\040\124 -\162\165\163\164\056\156\145\164\061\047\060\045\006\003\125\004 -\013\023\036\123\145\143\165\162\151\164\171\040\103\157\155\155 -\165\156\151\143\141\164\151\157\156\040\122\157\157\164\103\101 -\061\060\036\027\015\060\063\060\071\063\060\060\064\062\060\064 -\071\132\027\015\062\063\060\071\063\060\060\064\062\060\064\071 -\132\060\120\061\013\060\011\006\003\125\004\006\023\002\112\120 -\061\030\060\026\006\003\125\004\012\023\017\123\105\103\117\115 -\040\124\162\165\163\164\056\156\145\164\061\047\060\045\006\003 -\125\004\013\023\036\123\145\143\165\162\151\164\171\040\103\157 -\155\155\165\156\151\143\141\164\151\157\156\040\122\157\157\164 -\103\101\061\060\202\001\042\060\015\006\011\052\206\110\206\367 -\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012\002 -\202\001\001\000\263\263\376\177\323\155\261\357\026\174\127\245 -\014\155\166\212\057\113\277\144\373\114\356\212\360\363\051\174 -\365\377\356\052\340\351\351\272\133\144\042\232\232\157\054\072 -\046\151\121\005\231\046\334\325\034\152\161\306\232\175\036\235 -\335\174\154\306\214\147\147\112\076\370\161\260\031\047\251\011 -\014\246\225\277\113\214\014\372\125\230\073\330\350\042\241\113 -\161\070\171\254\227\222\151\263\211\176\352\041\150\006\230\024 -\226\207\322\141\066\274\155\047\126\236\127\356\300\300\126\375 -\062\317\244\331\216\302\043\327\215\250\363\330\045\254\227\344 -\160\070\364\266\072\264\235\073\227\046\103\243\241\274\111\131 -\162\114\043\060\207\001\130\366\116\276\034\150\126\146\257\315 -\101\135\310\263\115\052\125\106\253\037\332\036\342\100\075\333 -\315\175\271\222\200\234\067\335\014\226\144\235\334\042\367\144 -\213\337\141\336\025\224\122\025\240\175\122\311\113\250\041\311 -\306\261\355\313\303\225\140\321\017\360\253\160\370\337\313\115 -\176\354\326\372\253\331\275\177\124\362\245\351\171\372\331\326 -\166\044\050\163\002\003\001\000\001\243\077\060\075\060\035\006 -\003\125\035\016\004\026\004\024\240\163\111\231\150\334\205\133 -\145\343\233\050\057\127\237\275\063\274\007\110\060\013\006\003 -\125\035\017\004\004\003\002\001\006\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\015\006\011\052\206 -\110\206\367\015\001\001\005\005\000\003\202\001\001\000\150\100 -\251\250\273\344\117\135\171\263\005\265\027\263\140\023\353\306 -\222\135\340\321\323\152\376\373\276\233\155\277\307\005\155\131 -\040\304\034\360\267\332\204\130\002\143\372\110\026\357\117\245 -\013\367\112\230\362\077\236\033\255\107\153\143\316\010\107\353 -\122\077\170\234\257\115\256\370\325\117\317\232\230\052\020\101 -\071\122\304\335\331\233\016\357\223\001\256\262\056\312\150\102 -\044\102\154\260\263\072\076\315\351\332\110\304\025\313\351\371 -\007\017\222\120\111\212\335\061\227\137\311\351\067\252\073\131 -\145\227\224\062\311\263\237\076\072\142\130\305\111\255\142\016 -\161\245\062\252\057\306\211\166\103\100\023\023\147\075\242\124 -\045\020\313\361\072\362\331\372\333\111\126\273\246\376\247\101 -\065\303\340\210\141\311\210\307\337\066\020\042\230\131\352\260 -\112\373\126\026\163\156\254\115\367\042\241\117\255\035\172\055 -\105\047\345\060\301\136\362\332\023\313\045\102\121\225\107\003 -\214\154\041\314\164\102\355\123\377\063\213\217\017\127\001\026 -\057\317\246\356\311\160\042\024\275\375\276\154\013\003 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SECOM Trust Systems CO LTD" -# Issuer: OU=Security Communication RootCA1,O=SECOM Trust.net,C=JP -# Serial Number: 0 (0x0) -# Subject: OU=Security Communication RootCA1,O=SECOM Trust.net,C=JP -# Not Valid Before: Tue Sep 30 04:20:49 2003 -# Not Valid After : Sat Sep 30 04:20:49 2023 -# Fingerprint (SHA-256): E7:5E:72:ED:9F:56:0E:EC:6E:B4:80:00:73:A4:3F:C3:AD:19:19:5A:39:22:82:01:78:95:97:4A:99:02:6B:6C -# Fingerprint (SHA1): 36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SECOM Trust Systems CO LTD" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\066\261\053\111\371\201\236\327\114\236\274\070\017\306\126\217 -\135\254\262\367 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\361\274\143\152\124\340\265\047\365\315\347\032\343\115\156\112 -END -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\030\060\026\006\003\125\004\012\023\017\123\105\103\117\115\040 -\124\162\165\163\164\056\156\145\164\061\047\060\045\006\003\125 -\004\013\023\036\123\145\143\165\162\151\164\171\040\103\157\155 -\155\165\156\151\143\141\164\151\157\156\040\122\157\157\164\103 -\101\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "TW Government Root Certification Authority" -# -# Issuer: O=Government Root Certification Authority,C=TW -# Serial Number:1f:9d:59:5a:d7:2f:c2:06:44:a5:80:08:69:e3:5e:f6 -# Subject: O=Government Root Certification Authority,C=TW -# Not Valid Before: Thu Dec 05 13:23:33 2002 -# Not Valid After : Sun Dec 05 13:23:33 2032 -# Fingerprint (SHA-256): 76:00:29:5E:EF:E8:5B:9E:1F:D6:24:DB:76:06:2A:AA:AE:59:81:8A:54:D2:77:4C:D4:C0:B2:C0:11:31:E1:B3 -# Fingerprint (SHA1): F4:8B:11:BF:DE:AB:BE:94:54:20:71:E6:41:DE:6B:BE:88:2B:40:B9 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TW Government Root Certification Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\077\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\060\060\056\006\003\125\004\012\014\047\107\157\166\145\162\156 -\155\145\156\164\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\077\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\060\060\056\006\003\125\004\012\014\047\107\157\166\145\162\156 -\155\145\156\164\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\037\235\131\132\327\057\302\006\104\245\200\010\151\343 -\136\366 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\162\060\202\003\132\240\003\002\001\002\002\020\037 -\235\131\132\327\057\302\006\104\245\200\010\151\343\136\366\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\077 -\061\013\060\011\006\003\125\004\006\023\002\124\127\061\060\060 -\056\006\003\125\004\012\014\047\107\157\166\145\162\156\155\145 -\156\164\040\122\157\157\164\040\103\145\162\164\151\146\151\143 -\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171\060 -\036\027\015\060\062\061\062\060\065\061\063\062\063\063\063\132 -\027\015\063\062\061\062\060\065\061\063\062\063\063\063\132\060 -\077\061\013\060\011\006\003\125\004\006\023\002\124\127\061\060 -\060\056\006\003\125\004\012\014\047\107\157\166\145\162\156\155 -\145\156\164\040\122\157\157\164\040\103\145\162\164\151\146\151 -\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\232\045\270\354\314\242\165\250\173\367\316\133\131\212\311 -\321\206\022\010\124\354\234\362\347\106\366\210\363\174\351\245 -\337\114\107\066\244\033\001\034\177\036\127\212\215\303\305\321 -\041\343\332\044\077\110\053\373\237\056\241\224\347\054\034\223 -\321\277\033\001\207\123\231\316\247\365\012\041\166\167\377\251 -\267\306\163\224\117\106\367\020\111\067\372\250\131\111\135\152 -\201\007\126\362\212\371\006\320\367\160\042\115\264\267\101\271 -\062\270\261\360\261\303\234\077\160\375\123\335\201\252\330\143 -\170\366\330\123\156\241\254\152\204\044\162\124\206\306\322\262 -\312\034\016\171\201\326\265\160\142\010\001\056\116\117\016\325 -\021\257\251\257\345\232\277\334\314\207\155\046\344\311\127\242 -\373\226\371\314\341\077\123\214\154\114\176\233\123\010\013\154 -\027\373\147\310\302\255\261\315\200\264\227\334\166\001\026\025 -\351\152\327\244\341\170\107\316\206\325\373\061\363\372\061\276 -\064\252\050\373\160\114\035\111\307\257\054\235\155\146\246\266 -\215\144\176\265\040\152\235\073\201\266\217\100\000\147\113\211 -\206\270\314\145\376\025\123\351\004\301\326\137\035\104\327\012 -\057\047\232\106\175\241\015\165\255\124\206\025\334\111\073\361 -\226\316\017\233\240\354\243\172\135\276\325\052\165\102\345\173 -\336\245\266\252\257\050\254\254\220\254\070\267\325\150\065\046 -\172\334\367\073\363\375\105\233\321\273\103\170\156\157\361\102 -\124\152\230\360\015\255\227\351\122\136\351\325\152\162\336\152 -\367\033\140\024\364\245\344\266\161\147\252\037\352\342\115\301 -\102\100\376\147\106\027\070\057\107\077\161\234\256\345\041\312 -\141\055\155\007\250\204\174\055\356\121\045\361\143\220\236\375 -\341\127\210\153\357\212\043\155\261\346\275\077\255\321\075\226 -\013\205\215\315\153\047\273\267\005\233\354\273\221\251\012\007 -\022\002\227\116\040\220\360\377\015\036\342\101\073\323\100\072 -\347\215\135\332\146\344\002\260\007\122\230\134\016\216\063\234 -\302\246\225\373\125\031\156\114\216\256\113\017\275\301\070\115 -\136\217\204\035\146\315\305\140\226\264\122\132\005\211\216\225 -\172\230\301\221\074\225\043\262\016\364\171\264\311\174\301\112 -\041\002\003\001\000\001\243\152\060\150\060\035\006\003\125\035 -\016\004\026\004\024\314\314\357\314\051\140\244\073\261\222\266 -\074\372\062\142\217\254\045\025\073\060\014\006\003\125\035\023 -\004\005\060\003\001\001\377\060\071\006\004\147\052\007\000\004 -\061\060\057\060\055\002\001\000\060\011\006\005\053\016\003\002 -\032\005\000\060\007\006\005\147\052\003\000\000\004\024\003\233 -\360\042\023\377\225\050\066\323\334\236\300\062\373\061\072\212 -\121\145\060\015\006\011\052\206\110\206\367\015\001\001\005\005 -\000\003\202\002\001\000\100\200\112\372\046\311\316\136\060\335 -\117\206\164\166\130\365\256\263\203\063\170\244\172\164\027\031 -\116\351\122\265\271\340\012\164\142\252\150\312\170\240\114\232 -\216\054\043\056\325\152\022\044\277\324\150\323\212\320\330\234 -\237\264\037\014\336\070\176\127\070\374\215\342\117\136\014\237 -\253\073\322\377\165\227\313\244\343\147\010\377\345\300\026\265 -\110\001\175\351\371\012\377\033\345\152\151\277\170\041\250\302 -\247\043\251\206\253\166\126\350\016\014\366\023\335\052\146\212 -\144\111\075\032\030\207\220\004\237\102\122\267\117\313\376\107 -\101\166\065\357\377\000\166\066\105\062\233\306\106\205\135\342 -\044\260\036\343\110\226\230\127\107\224\125\172\017\101\261\104 -\044\363\301\376\032\153\277\210\375\301\246\332\223\140\136\201 -\112\231\040\234\110\146\031\265\000\171\124\017\270\054\057\113 -\274\251\135\133\140\177\214\207\245\340\122\143\052\276\330\073 -\205\100\025\376\036\266\145\077\305\113\332\176\265\172\065\051 -\243\056\172\230\140\042\243\364\175\047\116\055\352\264\164\074 -\351\017\244\063\017\020\021\274\023\001\326\345\016\323\277\265 -\022\242\341\105\043\300\314\010\156\141\267\211\253\203\343\044 -\036\346\135\007\347\037\040\076\317\147\310\347\254\060\155\047 -\113\150\156\113\052\134\002\010\064\333\370\166\344\147\243\046 -\234\077\242\062\302\112\305\201\030\061\020\126\252\204\357\055 -\012\377\270\037\167\322\277\245\130\240\142\344\327\113\221\165 -\215\211\200\230\176\155\313\123\116\136\257\366\262\227\205\227 -\271\332\125\006\271\044\356\327\306\070\036\143\033\022\073\225 -\341\130\254\362\337\204\325\137\231\057\015\125\133\346\070\333 -\056\077\162\351\110\205\313\273\051\023\217\036\070\125\271\363 -\262\304\060\231\043\116\135\362\110\241\022\014\334\022\220\011 -\220\124\221\003\074\107\345\325\311\145\340\267\113\175\354\107 -\323\263\013\076\255\236\320\164\000\016\353\275\121\255\300\336 -\054\300\303\152\376\357\334\013\247\372\106\337\140\333\234\246 -\131\120\165\043\151\163\223\262\371\374\002\323\107\346\161\316 -\020\002\356\047\214\204\377\254\105\015\023\134\203\062\340\045 -\245\206\054\174\364\022 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TW Government Root Certification Authority" -# Issuer: O=Government Root Certification Authority,C=TW -# Serial Number:1f:9d:59:5a:d7:2f:c2:06:44:a5:80:08:69:e3:5e:f6 -# Subject: O=Government Root Certification Authority,C=TW -# Not Valid Before: Thu Dec 05 13:23:33 2002 -# Not Valid After : Sun Dec 05 13:23:33 2032 -# Fingerprint (SHA-256): 76:00:29:5E:EF:E8:5B:9E:1F:D6:24:DB:76:06:2A:AA:AE:59:81:8A:54:D2:77:4C:D4:C0:B2:C0:11:31:E1:B3 -# Fingerprint (SHA1): F4:8B:11:BF:DE:AB:BE:94:54:20:71:E6:41:DE:6B:BE:88:2B:40:B9 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TW Government Root Certification Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\364\213\021\277\336\253\276\224\124\040\161\346\101\336\153\276 -\210\053\100\271 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\067\205\104\123\062\105\037\040\360\363\225\341\045\304\103\116 -END -CKA_ISSUER MULTILINE_OCTAL -\060\077\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\060\060\056\006\003\125\004\012\014\047\107\157\166\145\162\156 -\155\145\156\164\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\037\235\131\132\327\057\302\006\104\245\200\010\151\343 -\136\366 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "Trustis FPS Root CA" -# -# Issuer: OU=Trustis FPS Root CA,O=Trustis Limited,C=GB -# Serial Number:1b:1f:ad:b6:20:f9:24:d3:36:6b:f7:c7:f1:8c:a0:59 -# Subject: OU=Trustis FPS Root CA,O=Trustis Limited,C=GB -# Not Valid Before: Tue Dec 23 12:14:06 2003 -# Not Valid After : Sun Jan 21 11:36:54 2024 -# Fingerprint (SHA-256): C1:B4:82:99:AB:A5:20:8F:E9:63:0A:CE:55:CA:68:A0:3E:DA:5A:51:9C:88:02:A0:D3:A6:73:BE:8F:8E:55:7D -# Fingerprint (SHA1): 3B:C0:38:0B:33:C3:F6:A6:0C:86:15:22:93:D9:DF:F5:4B:81:C0:04 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Trustis FPS Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\124\162\165\163\164\151 -\163\040\114\151\155\151\164\145\144\061\034\060\032\006\003\125 -\004\013\023\023\124\162\165\163\164\151\163\040\106\120\123\040 -\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\124\162\165\163\164\151 -\163\040\114\151\155\151\164\145\144\061\034\060\032\006\003\125 -\004\013\023\023\124\162\165\163\164\151\163\040\106\120\123\040 -\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\033\037\255\266\040\371\044\323\066\153\367\307\361\214 -\240\131 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\147\060\202\002\117\240\003\002\001\002\002\020\033 -\037\255\266\040\371\044\323\066\153\367\307\361\214\240\131\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\105 -\061\013\060\011\006\003\125\004\006\023\002\107\102\061\030\060 -\026\006\003\125\004\012\023\017\124\162\165\163\164\151\163\040 -\114\151\155\151\164\145\144\061\034\060\032\006\003\125\004\013 -\023\023\124\162\165\163\164\151\163\040\106\120\123\040\122\157 -\157\164\040\103\101\060\036\027\015\060\063\061\062\062\063\061 -\062\061\064\060\066\132\027\015\062\064\060\061\062\061\061\061 -\063\066\065\064\132\060\105\061\013\060\011\006\003\125\004\006 -\023\002\107\102\061\030\060\026\006\003\125\004\012\023\017\124 -\162\165\163\164\151\163\040\114\151\155\151\164\145\144\061\034 -\060\032\006\003\125\004\013\023\023\124\162\165\163\164\151\163 -\040\106\120\123\040\122\157\157\164\040\103\101\060\202\001\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\001\017\000\060\202\001\012\002\202\001\001\000\305\120\173 -\236\073\065\320\337\304\214\315\216\233\355\243\300\066\231\364 -\102\352\247\076\200\203\017\246\247\131\207\311\220\105\103\176 -\000\352\206\171\052\003\275\075\067\231\211\146\267\345\212\126 -\206\223\234\150\113\150\004\214\223\223\002\076\060\322\067\072 -\042\141\211\034\205\116\175\217\325\257\173\065\366\176\050\107 -\211\061\334\016\171\144\037\231\322\133\272\376\177\140\277\255 -\353\347\074\070\051\152\057\345\221\013\125\377\354\157\130\325 -\055\311\336\114\146\161\217\014\327\004\332\007\346\036\030\343 -\275\051\002\250\372\034\341\133\271\203\250\101\110\274\032\161 -\215\347\142\345\055\262\353\337\174\317\333\253\132\312\061\361 -\114\042\363\005\023\367\202\371\163\171\014\276\327\113\034\300 -\321\025\074\223\101\144\321\346\276\043\027\042\000\211\136\037 -\153\245\254\156\247\113\214\355\243\162\346\257\143\115\057\205 -\322\024\065\232\056\116\214\352\062\230\050\206\241\221\011\101 -\072\264\341\343\362\372\360\311\012\242\101\335\251\343\003\307 -\210\025\073\034\324\032\224\327\237\144\131\022\155\002\003\001 -\000\001\243\123\060\121\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\037\006\003\125\035\043\004\030 -\060\026\200\024\272\372\161\045\171\213\127\101\045\041\206\013 -\161\353\262\144\016\213\041\147\060\035\006\003\125\035\016\004 -\026\004\024\272\372\161\045\171\213\127\101\045\041\206\013\161 -\353\262\144\016\213\041\147\060\015\006\011\052\206\110\206\367 -\015\001\001\005\005\000\003\202\001\001\000\176\130\377\375\065 -\031\175\234\030\117\236\260\053\274\216\214\024\377\054\240\332 -\107\133\303\357\201\055\257\005\352\164\110\133\363\076\116\007 -\307\155\305\263\223\317\042\065\134\266\077\165\047\137\011\226 -\315\240\376\276\100\014\134\022\125\370\223\202\312\051\351\136 -\077\126\127\213\070\066\367\105\032\114\050\315\236\101\270\355 -\126\114\204\244\100\310\270\260\245\053\151\160\004\152\303\370 -\324\022\062\371\016\303\261\334\062\204\104\054\157\313\106\017 -\352\146\101\017\117\361\130\245\246\015\015\017\141\336\245\236 -\135\175\145\241\074\027\347\250\125\116\357\240\307\355\306\104 -\177\124\365\243\340\217\360\174\125\042\217\051\266\201\243\341 -\155\116\054\033\200\147\354\255\040\237\014\142\141\325\227\377 -\103\355\055\301\332\135\051\052\205\077\254\145\356\206\017\005 -\215\220\137\337\356\237\364\277\356\035\373\230\344\177\220\053 -\204\170\020\016\154\111\123\357\025\133\145\106\112\135\257\272 -\373\072\162\035\315\366\045\210\036\227\314\041\234\051\001\015 -\145\353\127\331\363\127\226\273\110\315\201 +\166\151\143\145\163\040\111\156\143\061\055\060\053\006\003\125 +\004\003\023\044\130\122\141\155\160\040\107\154\157\142\141\154 +\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 +\165\164\150\157\162\151\164\171\060\202\001\042\060\015\006\011 +\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017\000 +\060\202\001\012\002\202\001\001\000\230\044\036\275\025\264\272 +\337\307\214\245\047\266\070\013\151\363\266\116\250\054\056\041 +\035\134\104\337\041\135\176\043\164\376\136\176\264\112\267\246 +\255\037\256\340\006\026\342\233\133\331\147\164\153\135\200\217 +\051\235\206\033\331\234\015\230\155\166\020\050\130\344\145\260 +\177\112\230\171\237\340\303\061\176\200\053\265\214\300\100\073 +\021\206\320\313\242\206\066\140\244\325\060\202\155\331\156\320 +\017\022\004\063\227\137\117\141\132\360\344\371\221\253\347\035 +\073\274\350\317\364\153\055\064\174\342\110\141\034\216\363\141 +\104\314\157\240\112\251\224\260\115\332\347\251\064\172\162\070 +\250\101\314\074\224\021\175\353\310\246\214\267\206\313\312\063 +\073\331\075\067\213\373\172\076\206\054\347\163\327\012\127\254 +\144\233\031\353\364\017\004\010\212\254\003\027\031\144\364\132 +\045\042\215\064\054\262\366\150\035\022\155\323\212\036\024\332 +\304\217\246\342\043\205\325\172\015\275\152\340\351\354\354\027 +\273\102\033\147\252\045\355\105\203\041\374\301\311\174\325\142 +\076\372\362\305\055\323\375\324\145\002\003\001\000\001\243\201 +\237\060\201\234\060\023\006\011\053\006\001\004\001\202\067\024 +\002\004\006\036\004\000\103\000\101\060\013\006\003\125\035\017 +\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377 +\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026 +\004\024\306\117\242\075\006\143\204\011\234\316\142\344\004\254 +\215\134\265\351\266\033\060\066\006\003\125\035\037\004\057\060 +\055\060\053\240\051\240\047\206\045\150\164\164\160\072\057\057 +\143\162\154\056\170\162\141\155\160\163\145\143\165\162\151\164 +\171\056\143\157\155\057\130\107\103\101\056\143\162\154\060\020 +\006\011\053\006\001\004\001\202\067\025\001\004\003\002\001\001 +\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003 +\202\001\001\000\221\025\071\003\001\033\147\373\112\034\371\012 +\140\133\241\332\115\227\142\371\044\123\047\327\202\144\116\220 +\056\303\111\033\053\232\334\374\250\170\147\065\361\035\360\021 +\275\267\110\343\020\366\015\337\077\322\311\266\252\125\244\110 +\272\002\333\336\131\056\025\133\073\235\026\175\107\327\067\352 +\137\115\166\022\066\273\037\327\241\201\004\106\040\243\054\155 +\251\236\001\176\077\051\316\000\223\337\375\311\222\163\211\211 +\144\236\347\053\344\034\221\054\322\271\316\175\316\157\061\231 +\323\346\276\322\036\220\360\011\024\171\134\043\253\115\322\332 +\041\037\115\231\171\235\341\317\047\237\020\233\034\210\015\260 +\212\144\101\061\270\016\154\220\044\244\233\134\161\217\272\273 +\176\034\033\333\152\200\017\041\274\351\333\246\267\100\364\262 +\213\251\261\344\357\232\032\320\075\151\231\356\250\050\243\341 +\074\263\360\262\021\234\317\174\100\346\335\347\103\175\242\330 +\072\265\251\215\362\064\231\304\324\020\341\006\375\011\204\020 +\073\356\304\114\364\354\047\174\102\302\164\174\202\212\011\311 +\264\003\045\274 END CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE -# Trust for "Trustis FPS Root CA" -# Issuer: OU=Trustis FPS Root CA,O=Trustis Limited,C=GB -# Serial Number:1b:1f:ad:b6:20:f9:24:d3:36:6b:f7:c7:f1:8c:a0:59 -# Subject: OU=Trustis FPS Root CA,O=Trustis Limited,C=GB -# Not Valid Before: Tue Dec 23 12:14:06 2003 -# Not Valid After : Sun Jan 21 11:36:54 2024 -# Fingerprint (SHA-256): C1:B4:82:99:AB:A5:20:8F:E9:63:0A:CE:55:CA:68:A0:3E:DA:5A:51:9C:88:02:A0:D3:A6:73:BE:8F:8E:55:7D -# Fingerprint (SHA1): 3B:C0:38:0B:33:C3:F6:A6:0C:86:15:22:93:D9:DF:F5:4B:81:C0:04 +# Trust for "Trustwave" +# Issuer: CN=XRamp Global Certification Authority,O=XRamp Security Services Inc,OU=www.xrampsecurity.com,C=US +# Serial Number:50:94:6c:ec:18:ea:d5:9c:4d:d5:97:ef:75:8f:a0:ad +# Subject: CN=XRamp Global Certification Authority,O=XRamp Security Services Inc,OU=www.xrampsecurity.com,C=US +# Not Valid Before: Mon Nov 01 17:14:04 2004 +# Not Valid After : Mon Jan 01 05:37:19 2035 +# Fingerprint (SHA-256): CE:CD:DC:90:50:99:D8:DA:DF:C5:B1:D2:09:B7:37:CB:E2:C1:8C:FB:2C:10:C0:FF:0B:CF:0D:32:86:FC:1A:A2 +# Fingerprint (SHA1): B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Trustis FPS Root CA" +CKA_LABEL UTF8 "Trustwave" CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\073\300\070\013\063\303\366\246\014\206\025\042\223\331\337\365 -\113\201\300\004 +\270\001\206\321\353\234\206\245\101\004\317\060\124\363\114\122 +\267\345\130\306 END CKA_CERT_MD5_HASH MULTILINE_OCTAL -\060\311\347\036\153\346\024\353\145\262\026\151\040\061\147\115 +\241\013\104\263\312\020\330\000\156\235\017\330\017\222\012\321 END CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\124\162\165\163\164\151 -\163\040\114\151\155\151\164\145\144\061\034\060\032\006\003\125 -\004\013\023\023\124\162\165\163\164\151\163\040\106\120\123\040 -\122\157\157\164\040\103\101 +\060\201\202\061\013\060\011\006\003\125\004\006\023\002\125\123 +\061\036\060\034\006\003\125\004\013\023\025\167\167\167\056\170 +\162\141\155\160\163\145\143\165\162\151\164\171\056\143\157\155 +\061\044\060\042\006\003\125\004\012\023\033\130\122\141\155\160 +\040\123\145\143\165\162\151\164\171\040\123\145\162\166\151\143 +\145\163\040\111\156\143\061\055\060\053\006\003\125\004\003\023 +\044\130\122\141\155\160\040\107\154\157\142\141\154\040\103\145 +\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150 +\157\162\151\164\171 END CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\033\037\255\266\040\371\044\323\066\153\367\307\361\214 -\240\131 +\002\020\120\224\154\354\030\352\325\234\115\325\227\357\165\217 +\240\255 END CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR @@ -20449,168 +16395,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Chambersign Global Root" -# -# Issuer: CN=Global Chambersign Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU -# Serial Number: 0 (0x0) -# Subject: CN=Global Chambersign Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU -# Not Valid Before: Tue Sep 30 16:14:18 2003 -# Not Valid After : Wed Sep 30 16:14:18 2037 -# Fingerprint (SHA-256): EF:3C:B4:17:FC:8E:BF:6F:97:87:6C:9E:4E:CE:39:DE:1E:A5:FE:64:91:41:D1:02:8B:7D:11:C0:B2:29:8C:ED -# Fingerprint (SHA1): 33:9B:6B:14:50:24:9B:55:7A:01:87:72:84:D9:E0:2F:C3:D2:D8:E9 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Chambersign Global Root" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\175\061\013\060\011\006\003\125\004\006\023\002\105\125\061 -\047\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155 -\145\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101 -\070\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004 -\013\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150 -\141\155\142\145\162\163\151\147\156\056\157\162\147\061\040\060 -\036\006\003\125\004\003\023\027\107\154\157\142\141\154\040\103 -\150\141\155\142\145\162\163\151\147\156\040\122\157\157\164 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\175\061\013\060\011\006\003\125\004\006\023\002\105\125\061 -\047\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155 -\145\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101 -\070\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004 -\013\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150 -\141\155\142\145\162\163\151\147\156\056\157\162\147\061\040\060 -\036\006\003\125\004\003\023\027\107\154\157\142\141\154\040\103 -\150\141\155\142\145\162\163\151\147\156\040\122\157\157\164 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\305\060\202\003\255\240\003\002\001\002\002\001\000 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\175\061\013\060\011\006\003\125\004\006\023\002\105\125\061\047 -\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155\145 -\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101\070 -\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004\013 -\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150\141 -\155\142\145\162\163\151\147\156\056\157\162\147\061\040\060\036 -\006\003\125\004\003\023\027\107\154\157\142\141\154\040\103\150 -\141\155\142\145\162\163\151\147\156\040\122\157\157\164\060\036 -\027\015\060\063\060\071\063\060\061\066\061\064\061\070\132\027 -\015\063\067\060\071\063\060\061\066\061\064\061\070\132\060\175 -\061\013\060\011\006\003\125\004\006\023\002\105\125\061\047\060 -\045\006\003\125\004\012\023\036\101\103\040\103\141\155\145\162 -\146\151\162\155\141\040\123\101\040\103\111\106\040\101\070\062 -\067\064\063\062\070\067\061\043\060\041\006\003\125\004\013\023 -\032\150\164\164\160\072\057\057\167\167\167\056\143\150\141\155 -\142\145\162\163\151\147\156\056\157\162\147\061\040\060\036\006 -\003\125\004\003\023\027\107\154\157\142\141\154\040\103\150\141 -\155\142\145\162\163\151\147\156\040\122\157\157\164\060\202\001 -\040\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000 -\003\202\001\015\000\060\202\001\010\002\202\001\001\000\242\160 -\242\320\237\102\256\133\027\307\330\175\317\024\203\374\117\311 -\241\267\023\257\212\327\236\076\004\012\222\213\140\126\372\264 -\062\057\210\115\241\140\010\364\267\011\116\240\111\057\111\326 -\323\337\235\227\132\237\224\004\160\354\077\131\331\267\314\146 -\213\230\122\050\011\002\337\305\057\204\215\172\227\167\277\354 -\100\235\045\162\253\265\077\062\230\373\267\267\374\162\204\345 -\065\207\371\125\372\243\037\016\157\056\050\335\151\240\331\102 -\020\306\370\265\104\302\320\103\177\333\274\344\242\074\152\125 -\170\012\167\251\330\352\031\062\267\057\376\134\077\033\356\261 -\230\354\312\255\172\151\105\343\226\017\125\366\346\355\165\352 -\145\350\062\126\223\106\211\250\045\212\145\006\356\153\277\171 -\007\320\361\267\257\355\054\115\222\273\300\250\137\247\147\175 -\004\362\025\010\160\254\222\326\175\004\322\063\373\114\266\013 -\013\373\032\311\304\215\003\251\176\134\362\120\253\022\245\241 -\317\110\120\245\357\322\310\032\023\372\260\177\261\202\034\167 -\152\017\137\334\013\225\217\357\103\176\346\105\011\045\002\001 -\003\243\202\001\120\060\202\001\114\060\022\006\003\125\035\023 -\001\001\377\004\010\060\006\001\001\377\002\001\014\060\077\006 -\003\125\035\037\004\070\060\066\060\064\240\062\240\060\206\056 -\150\164\164\160\072\057\057\143\162\154\056\143\150\141\155\142 -\145\162\163\151\147\156\056\157\162\147\057\143\150\141\155\142 -\145\162\163\151\147\156\162\157\157\164\056\143\162\154\060\035 -\006\003\125\035\016\004\026\004\024\103\234\066\237\260\236\060 -\115\306\316\137\255\020\253\345\003\245\372\251\024\060\016\006 -\003\125\035\017\001\001\377\004\004\003\002\001\006\060\021\006 -\011\140\206\110\001\206\370\102\001\001\004\004\003\002\000\007 -\060\052\006\003\125\035\021\004\043\060\041\201\037\143\150\141 -\155\142\145\162\163\151\147\156\162\157\157\164\100\143\150\141 -\155\142\145\162\163\151\147\156\056\157\162\147\060\052\006\003 -\125\035\022\004\043\060\041\201\037\143\150\141\155\142\145\162 -\163\151\147\156\162\157\157\164\100\143\150\141\155\142\145\162 -\163\151\147\156\056\157\162\147\060\133\006\003\125\035\040\004 -\124\060\122\060\120\006\013\053\006\001\004\001\201\207\056\012 -\001\001\060\101\060\077\006\010\053\006\001\005\005\007\002\001 -\026\063\150\164\164\160\072\057\057\143\160\163\056\143\150\141 -\155\142\145\162\163\151\147\156\056\157\162\147\057\143\160\163 -\057\143\150\141\155\142\145\162\163\151\147\156\162\157\157\164 -\056\150\164\155\154\060\015\006\011\052\206\110\206\367\015\001 -\001\005\005\000\003\202\001\001\000\074\073\160\221\371\004\124 -\047\221\341\355\355\376\150\177\141\135\345\101\145\117\062\361 -\030\005\224\152\034\336\037\160\333\076\173\062\002\064\265\014 -\154\241\212\174\245\364\217\377\324\330\255\027\325\055\004\321 -\077\130\200\342\201\131\210\276\300\343\106\223\044\376\220\275 -\046\242\060\055\350\227\046\127\065\211\164\226\030\366\025\342 -\257\044\031\126\002\002\262\272\017\024\352\306\212\146\301\206 -\105\125\213\276\222\276\234\244\004\307\111\074\236\350\051\172 -\211\327\376\257\377\150\365\245\027\220\275\254\231\314\245\206 -\127\011\147\106\333\326\026\302\106\361\344\251\120\365\217\321 -\222\025\323\137\076\306\000\111\072\156\130\262\321\321\047\015 -\045\310\062\370\040\021\315\175\062\063\110\224\124\114\335\334 -\171\304\060\237\353\216\270\125\265\327\210\134\305\152\044\075 -\262\323\005\003\121\306\007\357\314\024\162\164\075\156\162\316 -\030\050\214\112\240\167\345\011\053\105\104\107\254\267\147\177 -\001\212\005\132\223\276\241\301\377\370\347\016\147\244\107\111 -\166\135\165\220\032\365\046\217\360 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Chambersign Global Root" -# Issuer: CN=Global Chambersign Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU -# Serial Number: 0 (0x0) -# Subject: CN=Global Chambersign Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU -# Not Valid Before: Tue Sep 30 16:14:18 2003 -# Not Valid After : Wed Sep 30 16:14:18 2037 -# Fingerprint (SHA-256): EF:3C:B4:17:FC:8E:BF:6F:97:87:6C:9E:4E:CE:39:DE:1E:A5:FE:64:91:41:D1:02:8B:7D:11:C0:B2:29:8C:ED -# Fingerprint (SHA1): 33:9B:6B:14:50:24:9B:55:7A:01:87:72:84:D9:E0:2F:C3:D2:D8:E9 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Chambersign Global Root" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\063\233\153\024\120\044\233\125\172\001\207\162\204\331\340\057 -\303\322\330\351 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\305\346\173\277\006\320\117\103\355\304\172\145\212\373\153\031 -END -CKA_ISSUER MULTILINE_OCTAL -\060\175\061\013\060\011\006\003\125\004\006\023\002\105\125\061 -\047\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155 -\145\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101 -\070\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004 -\013\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150 -\141\155\142\145\162\163\151\147\156\056\157\162\147\061\040\060 -\036\006\003\125\004\003\023\027\107\154\157\142\141\154\040\103 -\150\141\155\142\145\162\163\151\147\156\040\122\157\157\164 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Sectigo (AAA)" # @@ -20764,169 +16548,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "GeoTrust Universal CA" -# -# Issuer: CN=GeoTrust Universal CA,O=GeoTrust Inc.,C=US -# Serial Number: 1 (0x1) -# Subject: CN=GeoTrust Universal CA,O=GeoTrust Inc.,C=US -# Not Valid Before: Thu Mar 04 05:00:00 2004 -# Not Valid After : Sun Mar 04 05:00:00 2029 -# Fingerprint (SHA-256): A0:45:9B:9F:63:B2:25:59:F5:FA:5D:4C:6D:B3:F9:F7:2F:F1:93:42:03:35:78:F0:73:BF:1D:1B:46:CB:B9:12 -# Fingerprint (SHA1): E6:21:F3:35:43:79:05:9A:4B:68:30:9D:8A:2F:74:22:15:87:EC:79 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GeoTrust Universal CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\026\060\024\006\003\125\004\012\023\015\107\145\157\124\162\165 -\163\164\040\111\156\143\056\061\036\060\034\006\003\125\004\003 -\023\025\107\145\157\124\162\165\163\164\040\125\156\151\166\145 -\162\163\141\154\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\026\060\024\006\003\125\004\012\023\015\107\145\157\124\162\165 -\163\164\040\111\156\143\056\061\036\060\034\006\003\125\004\003 -\023\025\107\145\157\124\162\165\163\164\040\125\156\151\166\145 -\162\163\141\154\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\150\060\202\003\120\240\003\002\001\002\002\001\001 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\105\061\013\060\011\006\003\125\004\006\023\002\125\123\061\026 -\060\024\006\003\125\004\012\023\015\107\145\157\124\162\165\163 -\164\040\111\156\143\056\061\036\060\034\006\003\125\004\003\023 -\025\107\145\157\124\162\165\163\164\040\125\156\151\166\145\162 -\163\141\154\040\103\101\060\036\027\015\060\064\060\063\060\064 -\060\065\060\060\060\060\132\027\015\062\071\060\063\060\064\060 -\065\060\060\060\060\132\060\105\061\013\060\011\006\003\125\004 -\006\023\002\125\123\061\026\060\024\006\003\125\004\012\023\015 -\107\145\157\124\162\165\163\164\040\111\156\143\056\061\036\060 -\034\006\003\125\004\003\023\025\107\145\157\124\162\165\163\164 -\040\125\156\151\166\145\162\163\141\154\040\103\101\060\202\002 -\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000 -\003\202\002\017\000\060\202\002\012\002\202\002\001\000\246\025 -\125\240\243\306\340\037\214\235\041\120\327\301\276\053\133\265 -\244\236\241\331\162\130\275\000\033\114\277\141\311\024\035\105 -\202\253\306\035\200\326\075\353\020\234\072\257\155\044\370\274 -\161\001\236\006\365\174\137\036\301\016\125\312\203\232\131\060 -\256\031\313\060\110\225\355\042\067\215\364\112\232\162\146\076 -\255\225\300\340\026\000\340\020\037\053\061\016\327\224\124\323 -\102\063\240\064\035\036\105\166\335\117\312\030\067\354\205\025 -\172\031\010\374\325\307\234\360\362\251\056\020\251\222\346\075 -\130\075\251\026\150\074\057\165\041\030\177\050\167\245\341\141 -\027\267\246\351\370\036\231\333\163\156\364\012\242\041\154\356 -\332\252\205\222\146\257\366\172\153\202\332\272\042\010\065\017 -\317\102\361\065\372\152\356\176\053\045\314\072\021\344\155\257 -\163\262\166\035\255\320\262\170\147\032\244\071\034\121\013\147 -\126\203\375\070\135\015\316\335\360\273\053\226\037\336\173\062 -\122\375\035\273\265\006\241\262\041\136\245\326\225\150\177\360 -\231\236\334\105\010\076\347\322\011\015\065\224\335\200\116\123 -\227\327\265\011\104\040\144\026\027\003\002\114\123\015\150\336 -\325\252\162\115\223\155\202\016\333\234\275\317\264\363\134\135 -\124\172\151\011\226\326\333\021\301\215\165\250\264\317\071\310 -\316\074\274\044\174\346\142\312\341\275\175\247\275\127\145\013 -\344\376\045\355\266\151\020\334\050\032\106\275\001\035\320\227 -\265\341\230\073\300\067\144\326\075\224\356\013\341\365\050\256 -\013\126\277\161\213\043\051\101\216\206\305\113\122\173\330\161 -\253\037\212\025\246\073\203\132\327\130\001\121\306\114\101\331 -\177\330\101\147\162\242\050\337\140\203\251\236\310\173\374\123 -\163\162\131\365\223\172\027\166\016\316\367\345\134\331\013\125 -\064\242\252\133\265\152\124\347\023\312\127\354\227\155\364\136 -\006\057\105\213\130\324\043\026\222\344\026\156\050\143\131\060 -\337\120\001\234\143\211\032\237\333\027\224\202\160\067\303\044 -\236\232\107\326\132\312\116\250\151\211\162\037\221\154\333\176 -\236\033\255\307\037\163\335\054\117\031\145\375\177\223\100\020 -\056\322\360\355\074\236\056\050\076\151\046\063\305\173\002\003 -\001\000\001\243\143\060\141\060\017\006\003\125\035\023\001\001 -\377\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004 -\026\004\024\332\273\056\252\260\014\270\210\046\121\164\134\155 -\003\323\300\330\217\172\326\060\037\006\003\125\035\043\004\030 -\060\026\200\024\332\273\056\252\260\014\270\210\046\121\164\134 -\155\003\323\300\330\217\172\326\060\016\006\003\125\035\017\001 -\001\377\004\004\003\002\001\206\060\015\006\011\052\206\110\206 -\367\015\001\001\005\005\000\003\202\002\001\000\061\170\346\307 -\265\337\270\224\100\311\161\304\250\065\354\106\035\302\205\363 -\050\130\206\260\013\374\216\262\071\217\104\125\253\144\204\134 -\151\251\320\232\070\074\372\345\037\065\345\104\343\200\171\224 -\150\244\273\304\237\075\341\064\315\060\106\213\124\053\225\245 -\357\367\077\231\204\375\065\346\317\061\306\334\152\277\247\327 -\043\010\341\230\136\303\132\010\166\251\246\257\167\057\267\140 -\275\104\106\152\357\227\377\163\225\301\216\350\223\373\375\061 -\267\354\127\021\021\105\233\060\361\032\210\071\301\117\074\247 -\000\325\307\374\253\155\200\042\160\245\014\340\135\004\051\002 -\373\313\240\221\321\174\326\303\176\120\325\235\130\276\101\070 -\353\271\165\074\025\331\233\311\112\203\131\300\332\123\375\063 -\273\066\030\233\205\017\025\335\356\055\254\166\223\271\331\001 -\215\110\020\250\373\365\070\206\361\333\012\306\275\204\243\043 -\101\336\326\167\157\205\324\205\034\120\340\256\121\212\272\215 -\076\166\342\271\312\047\362\137\237\357\156\131\015\006\330\053 -\027\244\322\174\153\273\137\024\032\110\217\032\114\347\263\107 -\034\216\114\105\053\040\356\110\337\347\335\011\216\030\250\332 -\100\215\222\046\021\123\141\163\135\353\275\347\304\115\051\067 -\141\353\254\071\055\147\056\026\326\365\000\203\205\241\314\177 -\166\304\175\344\267\113\146\357\003\105\140\151\266\014\122\226 -\222\204\136\246\243\265\244\076\053\331\314\330\033\107\252\362 -\104\332\117\371\003\350\360\024\313\077\363\203\336\320\301\124 -\343\267\350\012\067\115\213\040\131\003\060\031\241\054\310\275 -\021\037\337\256\311\112\305\363\047\146\146\206\254\150\221\377 -\331\346\123\034\017\213\134\151\145\012\046\310\036\064\303\135 -\121\173\327\251\234\006\241\066\335\325\211\224\274\331\344\055 -\014\136\011\154\010\227\174\243\075\174\223\377\077\241\024\247 -\317\265\135\353\333\333\034\304\166\337\210\271\275\105\005\225 -\033\256\374\106\152\114\257\110\343\316\256\017\322\176\353\346 -\154\234\117\201\152\172\144\254\273\076\325\347\313\166\056\305 -\247\110\301\134\220\017\313\310\077\372\346\062\341\215\033\157 -\244\346\216\330\371\051\110\212\316\163\376\054 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GeoTrust Universal CA" -# Issuer: CN=GeoTrust Universal CA,O=GeoTrust Inc.,C=US -# Serial Number: 1 (0x1) -# Subject: CN=GeoTrust Universal CA,O=GeoTrust Inc.,C=US -# Not Valid Before: Thu Mar 04 05:00:00 2004 -# Not Valid After : Sun Mar 04 05:00:00 2029 -# Fingerprint (SHA-256): A0:45:9B:9F:63:B2:25:59:F5:FA:5D:4C:6D:B3:F9:F7:2F:F1:93:42:03:35:78:F0:73:BF:1D:1B:46:CB:B9:12 -# Fingerprint (SHA1): E6:21:F3:35:43:79:05:9A:4B:68:30:9D:8A:2F:74:22:15:87:EC:79 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GeoTrust Universal CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\346\041\363\065\103\171\005\232\113\150\060\235\212\057\164\042 -\025\207\354\171 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\222\145\130\213\242\032\061\162\163\150\134\264\245\172\007\110 -END -CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\026\060\024\006\003\125\004\012\023\015\107\145\157\124\162\165 -\163\164\040\111\156\143\056\061\036\060\034\006\003\125\004\003 -\023\025\107\145\157\124\162\165\163\164\040\125\156\151\166\145 -\162\163\141\154\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Certum" # @@ -22421,225 +18042,54 @@ CKA_VALUE MULTILINE_OCTAL \361\344\017\264\304\114\245\141\223\370\227\020\007\052\060\045 \251\271\310\161\270\357\150\314\055\176\365\340\176\017\202\250 \157\266\272\154\203\103\167\315\212\222\027\241\236\133\170\026 -\075\105\342\063\162\335\341\146\312\231\323\311\305\046\375\015 -\150\004\106\256\266\331\233\214\276\031\276\261\306\362\031\343 -\134\002\312\054\330\157\112\007\331\311\065\332\100\165\362\304 -\247\031\157\236\102\020\230\165\346\225\213\140\274\355\305\022 -\327\212\316\325\230\134\126\226\003\305\356\167\006\065\377\317 -\344\356\077\023\141\356\333\332\055\205\360\315\256\235\262\030 -\011\105\303\222\241\162\027\374\107\266\240\013\054\361\304\336 -\103\150\010\152\137\073\360\166\143\373\314\006\054\246\306\342 -\016\265\271\276\044\217 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Certum Trusted Network CA 2" -# Issuer: CN=Certum Trusted Network CA 2,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL -# Serial Number:21:d6:d0:4a:4f:25:0f:c9:32:37:fc:aa:5e:12:8d:e9 -# Subject: CN=Certum Trusted Network CA 2,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL -# Not Valid Before: Thu Oct 06 08:39:56 2011 -# Not Valid After : Sat Oct 06 08:39:56 2046 -# Fingerprint (SHA-256): B6:76:F2:ED:DA:E8:77:5C:D3:6C:B0:F6:3C:D1:D4:60:39:61:F4:9E:62:65:BA:01:3A:2F:03:07:B6:D0:B8:04 -# Fingerprint (SHA1): D3:DD:48:3E:2B:BF:4C:05:E8:AF:10:F5:FA:76:26:CF:D3:DC:30:92 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certum Trusted Network CA 2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\323\335\110\076\053\277\114\005\350\257\020\365\372\166\046\317 -\323\334\060\222 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\155\106\236\331\045\155\010\043\133\136\164\175\036\047\333\362 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\200\061\013\060\011\006\003\125\004\006\023\002\120\114 -\061\042\060\040\006\003\125\004\012\023\031\125\156\151\172\145 -\164\157\040\124\145\143\150\156\157\154\157\147\151\145\163\040 -\123\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103 -\145\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\165\164\150\157\162\151\164\171\061\044\060 -\042\006\003\125\004\003\023\033\103\145\162\164\165\155\040\124 -\162\165\163\164\145\144\040\116\145\164\167\157\162\153\040\103 -\101\040\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\041\326\320\112\117\045\017\311\062\067\374\252\136\022 -\215\351 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "LuxTrust Global Root 2" -# -# Issuer: CN=LuxTrust Global Root 2,O=LuxTrust S.A.,C=LU -# Serial Number:0a:7e:a6:df:4b:44:9e:da:6a:24:85:9e:e6:b8:15:d3:16:7f:bb:b1 -# Subject: CN=LuxTrust Global Root 2,O=LuxTrust S.A.,C=LU -# Not Valid Before: Thu Mar 05 13:21:57 2015 -# Not Valid After : Mon Mar 05 13:21:57 2035 -# Fingerprint (SHA-256): 54:45:5F:71:29:C2:0B:14:47:C4:18:F9:97:16:8F:24:C5:8F:C5:02:3B:F5:DA:5B:E2:EB:6E:1D:D8:90:2E:D5 -# Fingerprint (SHA1): 1E:0E:56:19:0A:D1:8B:25:98:B2:04:44:FF:66:8A:04:17:99:5F:3F -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "LuxTrust Global Root 2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\106\061\013\060\011\006\003\125\004\006\023\002\114\125\061 -\026\060\024\006\003\125\004\012\014\015\114\165\170\124\162\165 -\163\164\040\123\056\101\056\061\037\060\035\006\003\125\004\003 -\014\026\114\165\170\124\162\165\163\164\040\107\154\157\142\141 -\154\040\122\157\157\164\040\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\106\061\013\060\011\006\003\125\004\006\023\002\114\125\061 -\026\060\024\006\003\125\004\012\014\015\114\165\170\124\162\165 -\163\164\040\123\056\101\056\061\037\060\035\006\003\125\004\003 -\014\026\114\165\170\124\162\165\163\164\040\107\154\157\142\141 -\154\040\122\157\157\164\040\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\012\176\246\337\113\104\236\332\152\044\205\236\346\270 -\025\323\026\177\273\261 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\303\060\202\003\253\240\003\002\001\002\002\024\012 -\176\246\337\113\104\236\332\152\044\205\236\346\270\025\323\026 -\177\273\261\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\106\061\013\060\011\006\003\125\004\006\023\002\114 -\125\061\026\060\024\006\003\125\004\012\014\015\114\165\170\124 -\162\165\163\164\040\123\056\101\056\061\037\060\035\006\003\125 -\004\003\014\026\114\165\170\124\162\165\163\164\040\107\154\157 -\142\141\154\040\122\157\157\164\040\062\060\036\027\015\061\065 -\060\063\060\065\061\063\062\061\065\067\132\027\015\063\065\060 -\063\060\065\061\063\062\061\065\067\132\060\106\061\013\060\011 -\006\003\125\004\006\023\002\114\125\061\026\060\024\006\003\125 -\004\012\014\015\114\165\170\124\162\165\163\164\040\123\056\101 -\056\061\037\060\035\006\003\125\004\003\014\026\114\165\170\124 -\162\165\163\164\040\107\154\157\142\141\154\040\122\157\157\164 -\040\062\060\202\002\042\060\015\006\011\052\206\110\206\367\015 -\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202 -\002\001\000\327\205\227\277\021\230\351\360\142\203\114\074\207 -\371\123\152\067\013\362\017\074\207\316\157\334\046\051\275\305 -\211\272\311\203\075\367\356\312\133\306\155\111\163\264\311\106 -\243\033\064\023\077\301\211\105\127\364\331\261\373\066\145\113 -\373\010\342\110\161\021\310\156\073\236\235\337\211\145\067\246 -\205\366\073\104\030\266\306\067\060\142\104\222\227\151\175\102 -\060\044\344\015\014\211\153\143\336\305\341\337\116\251\024\154 -\123\340\141\316\366\027\057\035\074\275\346\042\114\035\223\365 -\020\304\241\166\354\152\336\305\154\337\226\264\126\100\102\300 -\142\222\060\241\055\025\224\240\322\040\006\011\156\152\155\345 -\353\267\276\324\360\361\025\174\213\346\116\272\023\314\113\047 -\136\231\074\027\135\217\201\177\063\075\117\323\077\033\354\134 -\077\360\074\114\165\156\362\246\325\235\332\055\007\143\002\306 -\162\351\224\274\114\111\225\117\210\122\310\333\350\151\202\370 -\314\064\133\042\360\206\247\211\275\110\012\155\146\201\155\310 -\310\144\373\001\341\364\341\336\331\236\335\333\133\324\052\231 -\046\025\033\036\114\222\051\202\236\325\222\201\222\101\160\031 -\367\244\345\223\113\274\167\147\061\335\034\375\061\160\015\027 -\231\014\371\014\071\031\052\027\265\060\161\125\325\017\256\130 -\341\075\057\064\233\317\237\366\170\205\302\223\172\162\076\146 -\217\234\026\021\140\217\236\211\157\147\276\340\107\132\073\014 -\232\147\213\317\106\306\256\070\243\362\247\274\346\326\205\153 -\063\044\160\042\113\313\010\233\273\310\370\002\051\035\276\040 -\014\106\277\153\207\233\263\052\146\102\065\106\154\252\272\255 -\371\230\173\351\120\125\024\061\277\261\332\055\355\200\255\150 -\044\373\151\253\330\161\023\060\346\147\263\207\100\375\211\176 -\362\103\321\021\337\057\145\057\144\316\137\024\271\261\277\061 -\275\207\170\132\131\145\210\252\374\131\062\110\206\326\114\271 -\051\113\225\323\166\363\167\045\155\102\034\070\203\115\375\243 -\137\233\177\055\254\171\033\016\102\061\227\143\244\373\212\151 -\325\042\015\064\220\060\056\250\264\340\155\266\224\254\274\213 -\116\327\160\374\305\070\216\144\045\341\115\071\220\316\311\207 -\204\130\161\002\003\001\000\001\243\201\250\060\201\245\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\102\006\003\125\035\040\004\073\060\071\060\067\006\007\053\201 -\053\001\001\001\012\060\054\060\052\006\010\053\006\001\005\005 -\007\002\001\026\036\150\164\164\160\163\072\057\057\162\145\160 -\157\163\151\164\157\162\171\056\154\165\170\164\162\165\163\164 -\056\154\165\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\037\006\003\125\035\043\004\030\060\026\200\024 -\377\030\050\166\371\110\005\054\241\256\361\053\033\053\262\123 -\370\113\174\263\060\035\006\003\125\035\016\004\026\004\024\377 -\030\050\166\371\110\005\054\241\256\361\053\033\053\262\123\370 -\113\174\263\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\003\202\002\001\000\152\031\024\355\156\171\301\054\207 -\324\015\160\176\327\366\170\311\013\004\116\304\261\316\223\160 -\376\260\124\300\062\315\231\060\144\027\277\017\345\342\063\375 -\007\066\100\162\016\032\266\152\131\326\000\345\150\040\335\056 -\162\015\037\152\144\061\040\204\175\111\246\132\067\353\105\311 -\205\365\324\307\027\231\007\346\233\125\344\014\350\251\264\316 -\214\133\265\021\134\317\212\016\015\326\254\167\201\376\062\234 -\044\236\162\316\124\363\320\157\242\126\326\354\303\067\054\145 -\130\276\127\000\032\362\065\372\353\173\061\135\302\301\022\075 -\226\201\210\226\211\301\131\134\172\346\177\160\064\347\203\342 -\261\341\341\270\130\357\324\225\344\140\234\360\226\227\162\214 -\353\204\002\056\145\217\244\267\322\177\147\335\310\323\236\134 -\252\251\244\240\045\024\006\233\354\117\176\055\013\177\035\165 -\361\063\330\355\316\270\165\155\076\133\271\230\035\061\015\126 -\330\103\017\060\221\262\004\153\335\126\276\225\200\125\147\276 -\330\315\203\331\030\356\056\017\206\055\222\236\160\023\354\336 -\121\311\103\170\002\245\115\310\371\137\304\221\130\106\026\167 -\132\164\252\100\274\007\237\060\271\261\367\022\027\335\343\377 -\044\100\035\172\152\321\117\030\012\252\220\035\353\100\036\337 -\241\036\104\222\020\232\362\215\341\321\113\106\236\350\105\102 -\227\352\105\231\363\354\146\325\002\372\362\246\112\044\252\336 -\316\271\312\371\077\223\157\371\243\272\352\245\076\231\255\375 -\377\173\231\365\145\356\360\131\050\147\327\220\225\244\023\204 -\251\204\301\350\316\316\165\223\143\032\274\074\352\325\144\037 -\055\052\022\071\306\303\132\062\355\107\221\026\016\274\070\301 -\120\336\217\312\052\220\064\034\356\101\224\234\136\031\056\370 -\105\111\231\164\221\260\004\157\343\004\132\261\253\052\253\376 -\307\320\226\266\332\341\112\144\006\156\140\115\275\102\116\377 -\170\332\044\312\033\264\327\226\071\154\256\361\016\252\247\175 -\110\213\040\114\317\144\326\270\227\106\260\116\321\052\126\072 -\240\223\275\257\200\044\340\012\176\347\312\325\312\350\205\125 -\334\066\052\341\224\150\223\307\146\162\104\017\200\041\062\154 -\045\307\043\200\203\012\353 +\075\105\342\063\162\335\341\146\312\231\323\311\305\046\375\015 +\150\004\106\256\266\331\233\214\276\031\276\261\306\362\031\343 +\134\002\312\054\330\157\112\007\331\311\065\332\100\165\362\304 +\247\031\157\236\102\020\230\165\346\225\213\140\274\355\305\022 +\327\212\316\325\230\134\126\226\003\305\356\167\006\065\377\317 +\344\356\077\023\141\356\333\332\055\205\360\315\256\235\262\030 +\011\105\303\222\241\162\027\374\107\266\240\013\054\361\304\336 +\103\150\010\152\137\073\360\166\143\373\314\006\054\246\306\342 +\016\265\271\276\044\217 END CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE -# Trust for "LuxTrust Global Root 2" -# Issuer: CN=LuxTrust Global Root 2,O=LuxTrust S.A.,C=LU -# Serial Number:0a:7e:a6:df:4b:44:9e:da:6a:24:85:9e:e6:b8:15:d3:16:7f:bb:b1 -# Subject: CN=LuxTrust Global Root 2,O=LuxTrust S.A.,C=LU -# Not Valid Before: Thu Mar 05 13:21:57 2015 -# Not Valid After : Mon Mar 05 13:21:57 2035 -# Fingerprint (SHA-256): 54:45:5F:71:29:C2:0B:14:47:C4:18:F9:97:16:8F:24:C5:8F:C5:02:3B:F5:DA:5B:E2:EB:6E:1D:D8:90:2E:D5 -# Fingerprint (SHA1): 1E:0E:56:19:0A:D1:8B:25:98:B2:04:44:FF:66:8A:04:17:99:5F:3F +# Trust for "Certum Trusted Network CA 2" +# Issuer: CN=Certum Trusted Network CA 2,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL +# Serial Number:21:d6:d0:4a:4f:25:0f:c9:32:37:fc:aa:5e:12:8d:e9 +# Subject: CN=Certum Trusted Network CA 2,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL +# Not Valid Before: Thu Oct 06 08:39:56 2011 +# Not Valid After : Sat Oct 06 08:39:56 2046 +# Fingerprint (SHA-256): B6:76:F2:ED:DA:E8:77:5C:D3:6C:B0:F6:3C:D1:D4:60:39:61:F4:9E:62:65:BA:01:3A:2F:03:07:B6:D0:B8:04 +# Fingerprint (SHA1): D3:DD:48:3E:2B:BF:4C:05:E8:AF:10:F5:FA:76:26:CF:D3:DC:30:92 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "LuxTrust Global Root 2" +CKA_LABEL UTF8 "Certum Trusted Network CA 2" CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\036\016\126\031\012\321\213\045\230\262\004\104\377\146\212\004 -\027\231\137\077 +\323\335\110\076\053\277\114\005\350\257\020\365\372\166\046\317 +\323\334\060\222 END CKA_CERT_MD5_HASH MULTILINE_OCTAL -\262\341\011\000\141\257\367\361\221\157\304\255\215\136\073\174 +\155\106\236\331\045\155\010\043\133\136\164\175\036\047\333\362 END CKA_ISSUER MULTILINE_OCTAL -\060\106\061\013\060\011\006\003\125\004\006\023\002\114\125\061 -\026\060\024\006\003\125\004\012\014\015\114\165\170\124\162\165 -\163\164\040\123\056\101\056\061\037\060\035\006\003\125\004\003 -\014\026\114\165\170\124\162\165\163\164\040\107\154\157\142\141 -\154\040\122\157\157\164\040\062 +\060\201\200\061\013\060\011\006\003\125\004\006\023\002\120\114 +\061\042\060\040\006\003\125\004\012\023\031\125\156\151\172\145 +\164\157\040\124\145\143\150\156\157\154\157\147\151\145\163\040 +\123\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103 +\145\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164 +\151\157\156\040\101\165\164\150\157\162\151\164\171\061\044\060 +\042\006\003\125\004\003\023\033\103\145\162\164\165\155\040\124 +\162\165\163\164\145\144\040\116\145\164\167\157\162\153\040\103 +\101\040\062 END CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\012\176\246\337\113\104\236\332\152\044\205\236\346\270 -\025\323\026\177\273\261 +\002\020\041\326\320\112\117\045\017\311\062\067\374\252\136\022 +\215\351 END CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR @@ -23876,323 +19326,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Network Solutions RSA Certificate Authority" -# -# Issuer: CN=Network Solutions RSA Certificate Authority,O=Network Solutions L.L.C.,L=Jacksonville,ST=FL,C=US -# Serial Number:4c:03:4b:ac:67:18:4c:7f:af:44:08:4d:82:96:c7:b2 -# Subject: CN=Network Solutions RSA Certificate Authority,O=Network Solutions L.L.C.,L=Jacksonville,ST=FL,C=US -# Not Valid Before: Wed Nov 18 00:00:00 2015 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): DD:BF:14:97:33:BC:2B:F8:A0:9D:7F:01:2B:01:A6:DE:A1:1D:7B:AE:26:71:37:83:EF:64:07:A2:49:5B:F1:89 -# Fingerprint (SHA1): 8E:92:8C:0F:C2:7B:B7:AB:A3:4E:6B:C0:CA:12:50:CB:57:B6:0F:84 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Network Solutions RSA Certificate Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\212\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\013\060\011\006\003\125\004\010\023\002\106\114\061\025\060 -\023\006\003\125\004\007\023\014\112\141\143\153\163\157\156\166 -\151\154\154\145\061\041\060\037\006\003\125\004\012\023\030\116 -\145\164\167\157\162\153\040\123\157\154\165\164\151\157\156\163 -\040\114\056\114\056\103\056\061\064\060\062\006\003\125\004\003 -\023\053\116\145\164\167\157\162\153\040\123\157\154\165\164\151 -\157\156\163\040\122\123\101\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\212\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\013\060\011\006\003\125\004\010\023\002\106\114\061\025\060 -\023\006\003\125\004\007\023\014\112\141\143\153\163\157\156\166 -\151\154\154\145\061\041\060\037\006\003\125\004\012\023\030\116 -\145\164\167\157\162\153\040\123\157\154\165\164\151\157\156\163 -\040\114\056\114\056\103\056\061\064\060\062\006\003\125\004\003 -\023\053\116\145\164\167\157\162\153\040\123\157\154\165\164\151 -\157\156\163\040\122\123\101\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\114\003\113\254\147\030\114\177\257\104\010\115\202\226 -\307\262 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\342\060\202\003\312\240\003\002\001\002\002\020\114 -\003\113\254\147\030\114\177\257\104\010\115\202\226\307\262\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\201 -\212\061\013\060\011\006\003\125\004\006\023\002\125\123\061\013 -\060\011\006\003\125\004\010\023\002\106\114\061\025\060\023\006 -\003\125\004\007\023\014\112\141\143\153\163\157\156\166\151\154 -\154\145\061\041\060\037\006\003\125\004\012\023\030\116\145\164 -\167\157\162\153\040\123\157\154\165\164\151\157\156\163\040\114 -\056\114\056\103\056\061\064\060\062\006\003\125\004\003\023\053 -\116\145\164\167\157\162\153\040\123\157\154\165\164\151\157\156 -\163\040\122\123\101\040\103\145\162\164\151\146\151\143\141\164 -\145\040\101\165\164\150\157\162\151\164\171\060\036\027\015\061 -\065\061\061\061\070\060\060\060\060\060\060\132\027\015\063\070 -\060\061\061\070\062\063\065\071\065\071\132\060\201\212\061\013 -\060\011\006\003\125\004\006\023\002\125\123\061\013\060\011\006 -\003\125\004\010\023\002\106\114\061\025\060\023\006\003\125\004 -\007\023\014\112\141\143\153\163\157\156\166\151\154\154\145\061 -\041\060\037\006\003\125\004\012\023\030\116\145\164\167\157\162 -\153\040\123\157\154\165\164\151\157\156\163\040\114\056\114\056 -\103\056\061\064\060\062\006\003\125\004\003\023\053\116\145\164 -\167\157\162\153\040\123\157\154\165\164\151\157\156\163\040\122 -\123\101\040\103\145\162\164\151\146\151\143\141\164\145\040\101 -\165\164\150\157\162\151\164\171\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\204\337\250\246\243\214\013 -\170\036\310\115\031\225\335\051\220\222\040\065\220\052\224\215 -\202\063\055\160\022\130\245\010\212\236\301\010\363\223\326\150 -\300\057\024\276\171\244\374\175\314\325\274\076\217\355\234\112 -\002\141\131\075\252\303\157\164\000\322\370\032\064\324\124\236 -\152\164\107\232\057\340\322\367\017\367\303\335\077\245\277\301 -\372\175\102\151\140\000\200\354\074\346\273\201\067\244\036\006 -\024\075\127\217\220\244\065\112\064\163\207\266\032\303\135\220 -\357\006\115\160\166\066\074\202\211\355\317\144\031\203\045\103 -\116\034\342\361\152\122\206\376\121\344\176\070\337\025\215\114 -\154\140\101\112\117\260\100\125\106\071\165\311\201\071\000\163 -\212\142\352\017\145\267\217\117\227\100\316\317\356\301\152\050 -\240\161\251\231\047\321\075\311\065\163\172\200\231\370\175\206 -\271\235\171\072\355\323\052\372\176\246\270\377\127\052\163\262 -\246\277\332\211\272\006\033\332\145\240\346\276\140\224\210\366 -\337\146\341\047\152\033\376\320\136\251\215\040\213\012\304\037 -\176\210\101\057\262\301\320\363\266\150\355\310\073\361\357\252 -\007\336\176\327\042\340\201\366\245\352\173\026\364\102\124\235 -\226\176\366\142\026\123\315\375\012\253\262\102\241\116\052\210 -\102\165\203\275\214\345\115\172\347\035\343\114\270\336\343\253 -\140\070\055\147\051\376\344\137\256\302\250\350\277\256\154\371 -\353\263\122\361\177\351\354\302\057\331\235\312\027\236\102\372 -\073\130\301\076\210\142\117\137\223\301\227\155\146\217\034\042 -\363\232\301\364\355\271\153\032\176\066\204\310\061\270\360\136 -\053\176\225\344\171\317\165\114\302\330\004\277\070\216\050\263 -\335\133\266\330\117\043\156\222\350\067\225\256\203\256\326\374 -\071\052\106\006\037\361\204\165\041\326\270\116\246\052\227\130 -\145\365\232\030\001\327\365\303\177\051\311\020\356\163\112\103 -\166\173\321\246\060\121\377\326\053\035\036\142\204\276\371\276 -\151\227\231\307\015\347\174\044\120\165\027\375\244\040\347\065 -\150\003\140\224\247\331\015\306\032\054\345\342\116\325\314\016 -\300\172\060\126\357\140\222\276\331\056\365\307\360\350\105\317 -\332\206\256\357\330\167\251\022\047\002\003\001\000\001\243\102 -\060\100\060\035\006\003\125\035\016\004\026\004\024\017\361\112 -\112\165\164\005\021\014\035\330\133\231\353\277\376\252\175\136 -\327\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\206\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\015\006\011\052\206\110\206\367\015\001\001\014\005 -\000\003\202\002\001\000\075\313\322\106\170\365\366\072\027\350 -\303\173\144\321\305\273\220\170\215\365\117\271\304\055\227\373 -\013\346\305\270\361\266\352\350\130\113\064\255\167\171\054\065 -\037\162\175\002\076\356\265\320\026\212\006\067\226\265\357\103 -\320\011\020\054\227\146\307\201\037\036\346\047\305\202\221\130 -\136\363\310\133\101\150\200\203\221\271\234\201\370\047\372\105 -\337\356\171\362\134\155\160\002\124\356\300\123\330\103\353\005 -\172\314\364\121\335\251\324\042\175\152\073\362\376\210\324\122 -\111\072\205\222\144\123\370\152\123\140\210\217\362\133\324\256 -\053\122\340\352\377\124\176\241\344\357\206\033\247\203\013\006 -\146\136\060\200\214\125\240\107\063\377\153\036\104\110\113\141 -\252\036\076\350\114\144\307\330\155\175\016\256\074\074\102\075 -\312\044\032\160\361\141\024\234\072\030\325\360\006\051\221\042 -\262\072\072\241\026\124\143\032\371\063\225\104\237\044\243\041 -\144\004\010\342\233\325\336\010\122\034\142\034\123\026\107\065 -\102\046\307\247\014\375\363\133\023\167\002\214\134\342\026\360 -\030\037\331\175\365\337\002\044\210\172\363\136\377\027\016\263 -\142\147\241\253\261\027\216\075\072\106\260\365\106\214\253\204 -\330\365\016\241\040\353\302\360\231\164\075\216\263\003\330\044 -\305\154\353\153\014\123\277\140\151\335\214\050\305\157\317\273 -\322\201\167\053\306\174\261\304\112\154\025\020\067\051\135\256 -\370\261\021\005\304\024\215\354\023\243\104\375\115\213\150\270 -\301\377\235\325\067\056\110\370\050\174\334\371\163\123\331\266 -\001\165\102\172\277\013\337\121\120\270\123\262\341\356\164\220 -\313\274\252\320\161\203\242\253\116\311\020\266\075\034\357\100 -\327\117\103\220\063\271\001\226\124\135\052\325\006\133\222\206 -\270\006\020\201\006\310\221\333\051\040\262\123\275\363\113\133 -\114\333\151\037\211\156\124\077\327\211\135\347\265\315\014\276 -\077\175\170\070\001\322\266\147\246\317\130\110\224\032\105\375 -\220\163\111\312\265\103\240\041\142\215\111\004\046\252\370\037 -\056\077\362\056\241\362\253\364\006\036\260\055\304\301\160\102 -\075\375\303\121\111\210\000\016\312\202\015\233\171\002\342\300 -\056\223\337\344\362\361 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Network Solutions RSA Certificate Authority" -# Issuer: CN=Network Solutions RSA Certificate Authority,O=Network Solutions L.L.C.,L=Jacksonville,ST=FL,C=US -# Serial Number:4c:03:4b:ac:67:18:4c:7f:af:44:08:4d:82:96:c7:b2 -# Subject: CN=Network Solutions RSA Certificate Authority,O=Network Solutions L.L.C.,L=Jacksonville,ST=FL,C=US -# Not Valid Before: Wed Nov 18 00:00:00 2015 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): DD:BF:14:97:33:BC:2B:F8:A0:9D:7F:01:2B:01:A6:DE:A1:1D:7B:AE:26:71:37:83:EF:64:07:A2:49:5B:F1:89 -# Fingerprint (SHA1): 8E:92:8C:0F:C2:7B:B7:AB:A3:4E:6B:C0:CA:12:50:CB:57:B6:0F:84 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Network Solutions RSA Certificate Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\216\222\214\017\302\173\267\253\243\116\153\300\312\022\120\313 -\127\266\017\204 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\132\057\130\274\203\054\055\231\264\233\170\044\324\217\371\147 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\212\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\013\060\011\006\003\125\004\010\023\002\106\114\061\025\060 -\023\006\003\125\004\007\023\014\112\141\143\153\163\157\156\166 -\151\154\154\145\061\041\060\037\006\003\125\004\012\023\030\116 -\145\164\167\157\162\153\040\123\157\154\165\164\151\157\156\163 -\040\114\056\114\056\103\056\061\064\060\062\006\003\125\004\003 -\023\053\116\145\164\167\157\162\153\040\123\157\154\165\164\151 -\157\156\163\040\122\123\101\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\114\003\113\254\147\030\114\177\257\104\010\115\202\226 -\307\262 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - -# -# Certificate "Network Solutions ECC Certificate Authority" -# -# Issuer: CN=Network Solutions ECC Certificate Authority,O=Network Solutions L.L.C.,L=Jacksonville,ST=FL,C=US -# Serial Number:79:38:4b:b4:19:1a:8d:74:22:cc:ff:85:32:f2:e4:ba -# Subject: CN=Network Solutions ECC Certificate Authority,O=Network Solutions L.L.C.,L=Jacksonville,ST=FL,C=US -# Not Valid Before: Wed Nov 18 00:00:00 2015 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): 21:93:CF:EA:38:12:11:A1:AE:AA:2D:E9:84:E6:30:64:3A:87:16:0B:12:08:11:81:45:EA:FB:8E:1B:C6:99:58 -# Fingerprint (SHA1): 80:F9:5B:74:1C:38:39:94:95:C3:4F:20:C2:3E:73:36:31:4D:3C:6B -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Network Solutions ECC Certificate Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\212\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\013\060\011\006\003\125\004\010\023\002\106\114\061\025\060 -\023\006\003\125\004\007\023\014\112\141\143\153\163\157\156\166 -\151\154\154\145\061\041\060\037\006\003\125\004\012\023\030\116 -\145\164\167\157\162\153\040\123\157\154\165\164\151\157\156\163 -\040\114\056\114\056\103\056\061\064\060\062\006\003\125\004\003 -\023\053\116\145\164\167\157\162\153\040\123\157\154\165\164\151 -\157\156\163\040\105\103\103\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\212\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\013\060\011\006\003\125\004\010\023\002\106\114\061\025\060 -\023\006\003\125\004\007\023\014\112\141\143\153\163\157\156\166 -\151\154\154\145\061\041\060\037\006\003\125\004\012\023\030\116 -\145\164\167\157\162\153\040\123\157\154\165\164\151\157\156\163 -\040\114\056\114\056\103\056\061\064\060\062\006\003\125\004\003 -\023\053\116\145\164\167\157\162\153\040\123\157\154\165\164\151 -\157\156\163\040\105\103\103\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\171\070\113\264\031\032\215\164\042\314\377\205\062\362 -\344\272 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\224\060\202\002\031\240\003\002\001\002\002\020\171 -\070\113\264\031\032\215\164\042\314\377\205\062\362\344\272\060 -\012\006\010\052\206\110\316\075\004\003\003\060\201\212\061\013 -\060\011\006\003\125\004\006\023\002\125\123\061\013\060\011\006 -\003\125\004\010\023\002\106\114\061\025\060\023\006\003\125\004 -\007\023\014\112\141\143\153\163\157\156\166\151\154\154\145\061 -\041\060\037\006\003\125\004\012\023\030\116\145\164\167\157\162 -\153\040\123\157\154\165\164\151\157\156\163\040\114\056\114\056 -\103\056\061\064\060\062\006\003\125\004\003\023\053\116\145\164 -\167\157\162\153\040\123\157\154\165\164\151\157\156\163\040\105 -\103\103\040\103\145\162\164\151\146\151\143\141\164\145\040\101 -\165\164\150\157\162\151\164\171\060\036\027\015\061\065\061\061 -\061\070\060\060\060\060\060\060\132\027\015\063\070\060\061\061 -\070\062\063\065\071\065\071\132\060\201\212\061\013\060\011\006 -\003\125\004\006\023\002\125\123\061\013\060\011\006\003\125\004 -\010\023\002\106\114\061\025\060\023\006\003\125\004\007\023\014 -\112\141\143\153\163\157\156\166\151\154\154\145\061\041\060\037 -\006\003\125\004\012\023\030\116\145\164\167\157\162\153\040\123 -\157\154\165\164\151\157\156\163\040\114\056\114\056\103\056\061 -\064\060\062\006\003\125\004\003\023\053\116\145\164\167\157\162 -\153\040\123\157\154\165\164\151\157\156\163\040\105\103\103\040 -\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150 -\157\162\151\164\171\060\166\060\020\006\007\052\206\110\316\075 -\002\001\006\005\053\201\004\000\042\003\142\000\004\024\341\003 -\013\145\157\255\131\326\036\356\311\277\264\114\305\306\134\057 -\060\307\237\122\333\150\141\300\151\020\342\222\172\032\303\277 -\222\250\211\071\212\373\347\240\273\161\244\240\303\337\167\326 -\224\067\023\137\176\123\135\120\272\343\114\010\307\145\342\101 -\260\346\131\362\234\370\300\262\167\301\012\221\046\167\362\151 -\266\273\320\101\074\052\210\032\224\221\026\306\076\243\102\060 -\100\060\035\006\003\125\035\016\004\026\004\024\233\173\353\310 -\377\203\362\122\230\107\060\012\126\370\070\276\343\353\000\316 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\012\006\010\052\206\110\316\075\004\003\003\003\151\000 -\060\146\002\061\000\251\144\130\367\234\271\023\146\042\111\177 -\262\321\002\351\023\374\034\373\244\064\222\344\312\007\015\267 -\261\122\170\050\064\313\362\041\126\221\206\206\310\212\013\257 -\062\204\124\145\211\002\061\000\354\171\015\235\211\360\014\030 -\352\173\127\122\255\013\346\324\171\133\313\233\342\006\105\165 -\030\275\320\374\247\335\307\341\307\042\266\343\101\044\135\043 -\346\250\237\000\152\120\062\045 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Network Solutions ECC Certificate Authority" -# Issuer: CN=Network Solutions ECC Certificate Authority,O=Network Solutions L.L.C.,L=Jacksonville,ST=FL,C=US -# Serial Number:79:38:4b:b4:19:1a:8d:74:22:cc:ff:85:32:f2:e4:ba -# Subject: CN=Network Solutions ECC Certificate Authority,O=Network Solutions L.L.C.,L=Jacksonville,ST=FL,C=US -# Not Valid Before: Wed Nov 18 00:00:00 2015 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): 21:93:CF:EA:38:12:11:A1:AE:AA:2D:E9:84:E6:30:64:3A:87:16:0B:12:08:11:81:45:EA:FB:8E:1B:C6:99:58 -# Fingerprint (SHA1): 80:F9:5B:74:1C:38:39:94:95:C3:4F:20:C2:3E:73:36:31:4D:3C:6B -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Network Solutions ECC Certificate Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\200\371\133\164\034\070\071\224\225\303\117\040\302\076\163\066 -\061\115\074\153 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\245\250\314\343\034\101\021\214\152\214\070\275\242\107\376\262 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\212\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\013\060\011\006\003\125\004\010\023\002\106\114\061\025\060 -\023\006\003\125\004\007\023\014\112\141\143\153\163\157\156\166 -\151\154\154\145\061\041\060\037\006\003\125\004\012\023\030\116 -\145\164\167\157\162\153\040\123\157\154\165\164\151\157\156\163 -\040\114\056\114\056\103\056\061\064\060\062\006\003\125\004\003 -\023\053\116\145\164\167\157\162\153\040\123\157\154\165\164\151 -\157\156\163\040\105\103\103\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\171\070\113\264\031\032\215\164\042\314\377\205\062\362 -\344\272 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "Australian Defence Public Root CA" # @@ -28237,181 +23370,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "RCSC RootCA" -# -# Issuer: CN=RCSC RootCA,O=VI Registru centras- i.k. 124110246,OU=RCSC,C=LT -# Serial Number:4f:00:1b:a1:24:bd:cb:88:48:be:bd:3f:2b:62:c7:c5 -# Subject: CN=RCSC RootCA,O=VI Registru centras- i.k. 124110246,OU=RCSC,C=LT -# Not Valid Before: Tue May 23 08:36:51 2017 -# Not Valid After : Mon May 23 08:36:51 2044 -# Fingerprint (SHA-256): 77:07:BB:2B:E9:F7:CE:05:70:60:B8:30:8C:3B:C0:87:B5:65:29:B3:63:8E:AF:5B:2A:80:49:C8:E1:5E:D7:20 -# Fingerprint (SHA1): FD:E7:C6:FD:B3:2B:B8:E6:39:39:84:0D:6A:E0:52:C3:D8:B7:3B:87 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "RCSC RootCA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\140\061\013\060\011\006\003\125\004\006\023\002\114\124\061 -\015\060\013\006\003\125\004\013\023\004\122\103\123\103\061\054 -\060\052\006\003\125\004\012\023\043\126\111\040\122\145\147\151 -\163\164\162\165\040\143\145\156\164\162\141\163\055\040\151\056 -\153\056\040\061\062\064\061\061\060\062\064\066\061\024\060\022 -\006\003\125\004\003\023\013\122\103\123\103\040\122\157\157\164 -\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\140\061\013\060\011\006\003\125\004\006\023\002\114\124\061 -\015\060\013\006\003\125\004\013\023\004\122\103\123\103\061\054 -\060\052\006\003\125\004\012\023\043\126\111\040\122\145\147\151 -\163\164\162\165\040\143\145\156\164\162\141\163\055\040\151\056 -\153\056\040\061\062\064\061\061\060\062\064\066\061\024\060\022 -\006\003\125\004\003\023\013\122\103\123\103\040\122\157\157\164 -\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\117\000\033\241\044\275\313\210\110\276\275\077\053\142 -\307\305 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\236\060\202\003\206\240\003\002\001\002\002\020\117 -\000\033\241\044\275\313\210\110\276\275\077\053\142\307\305\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\140 -\061\013\060\011\006\003\125\004\006\023\002\114\124\061\015\060 -\013\006\003\125\004\013\023\004\122\103\123\103\061\054\060\052 -\006\003\125\004\012\023\043\126\111\040\122\145\147\151\163\164 -\162\165\040\143\145\156\164\162\141\163\055\040\151\056\153\056 -\040\061\062\064\061\061\060\062\064\066\061\024\060\022\006\003 -\125\004\003\023\013\122\103\123\103\040\122\157\157\164\103\101 -\060\036\027\015\061\067\060\065\062\063\060\070\063\066\065\061 -\132\027\015\064\064\060\065\062\063\060\070\063\066\065\061\132 -\060\140\061\013\060\011\006\003\125\004\006\023\002\114\124\061 -\015\060\013\006\003\125\004\013\023\004\122\103\123\103\061\054 -\060\052\006\003\125\004\012\023\043\126\111\040\122\145\147\151 -\163\164\162\165\040\143\145\156\164\162\141\163\055\040\151\056 -\153\056\040\061\062\064\061\061\060\062\064\066\061\024\060\022 -\006\003\125\004\003\023\013\122\103\123\103\040\122\157\157\164 -\103\101\060\202\002\042\060\015\006\011\052\206\110\206\367\015 -\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202 -\002\001\000\316\152\252\110\012\103\227\131\306\362\254\366\035 -\356\022\332\176\066\210\347\363\110\233\371\270\156\103\255\273 -\327\021\102\326\036\235\150\010\332\352\270\242\172\345\175\075 -\062\317\224\200\356\277\076\346\116\251\236\035\307\111\077\047 -\006\374\031\357\267\330\217\031\222\301\102\070\233\115\100\313 -\206\001\277\255\221\071\214\213\037\243\253\156\150\241\263\323 -\172\331\154\050\003\164\133\111\007\310\100\241\126\255\265\101 -\113\045\245\271\123\163\201\106\141\125\004\340\047\263\253\120 -\344\037\010\262\345\363\222\176\254\205\034\333\235\372\147\172 -\060\377\356\057\362\061\263\203\220\202\245\031\352\313\312\355 -\101\351\200\142\257\060\320\205\034\065\255\042\131\030\125\326 -\024\070\200\233\232\257\212\004\010\306\355\211\265\277\010\026 -\177\261\155\133\030\331\072\210\304\031\027\064\342\112\105\303 -\112\241\005\211\167\204\317\354\044\077\041\360\115\302\273\322 -\163\013\113\253\213\367\132\220\137\114\026\245\250\117\310\351 -\276\162\016\274\315\270\014\054\316\200\272\005\366\344\111\307 -\236\157\074\120\116\072\024\105\124\252\160\050\144\144\162\103 -\032\126\305\311\063\136\171\357\170\213\303\224\357\045\073\345 -\073\313\123\333\263\154\373\236\005\102\377\171\072\363\265\071 -\377\316\076\143\032\373\027\353\275\074\216\205\070\027\344\004 -\232\332\123\342\231\071\065\254\230\175\205\203\265\243\213\011 -\351\071\370\177\075\220\061\303\026\176\334\257\277\051\364\103 -\171\245\304\375\137\133\322\365\313\126\363\333\026\327\032\254 -\363\346\140\375\121\323\074\214\125\050\021\000\325\104\316\314 -\321\235\055\343\006\152\302\131\313\164\056\342\203\130\144\126 -\237\376\016\000\055\115\045\360\122\213\130\336\146\172\357\300 -\124\077\123\337\021\155\147\262\311\056\270\302\251\026\234\304 -\064\207\111\357\103\371\261\020\303\330\056\233\060\333\103\052 -\311\217\112\003\020\203\167\316\063\326\026\161\316\042\260\026 -\010\311\227\263\325\051\320\115\016\054\102\255\056\375\327\327 -\165\276\061\372\330\137\047\265\153\275\000\060\316\162\234\273 -\100\022\040\240\026\105\257\055\142\306\227\031\135\103\070\117 -\264\372\301\002\003\001\000\001\243\124\060\122\060\016\006\003 -\125\035\017\001\001\377\004\004\003\002\001\006\060\017\006\003 -\125\035\023\001\001\377\004\005\060\003\001\001\377\060\035\006 -\003\125\035\016\004\026\004\024\032\046\001\117\043\361\017\240 -\017\334\125\041\073\336\223\273\314\376\056\036\060\020\006\011 -\053\006\001\004\001\202\067\025\001\004\003\002\001\000\060\015 -\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202\002 -\001\000\250\030\347\215\305\011\147\017\133\215\147\327\374\022 -\221\165\057\222\106\107\123\147\136\265\316\137\261\177\017\042 -\167\214\240\053\116\070\355\272\244\154\330\272\130\147\300\373 -\271\225\040\164\010\141\066\044\176\045\251\356\111\047\112\341 -\321\233\025\112\212\311\053\202\204\056\260\157\233\342\260\320 -\301\226\327\064\065\226\334\124\137\215\251\203\102\161\011\050 -\121\265\051\275\241\073\262\272\175\161\317\302\037\210\340\032 -\124\215\343\021\104\062\247\220\360\003\303\370\276\162\266\133 -\340\264\274\277\153\066\223\216\241\001\254\131\121\111\310\236 -\054\210\223\102\160\327\035\347\212\305\303\110\050\151\305\345 -\305\041\333\310\357\153\142\024\075\057\154\123\367\261\025\062 -\074\200\024\103\026\340\271\071\026\335\214\020\333\071\155\200 -\262\377\176\227\317\114\231\133\152\031\030\260\347\111\304\177 -\132\006\357\211\370\210\001\070\265\351\326\040\227\073\176\306 -\024\225\005\262\330\373\147\052\370\357\352\043\021\247\355\352 -\007\352\275\150\217\263\203\054\213\163\272\366\033\341\152\056 -\164\312\071\051\246\041\365\127\170\170\133\046\077\361\320\066 -\272\360\066\136\276\277\322\262\247\117\135\361\324\112\215\167 -\127\300\030\160\307\246\026\047\270\354\202\332\243\350\144\365 -\234\205\106\221\240\240\265\026\373\216\145\034\115\366\201\333 -\162\232\103\314\231\032\172\227\322\153\066\237\122\357\165\150 -\054\102\106\210\131\104\326\117\222\033\005\271\217\013\232\320 -\161\322\116\241\033\254\201\034\001\021\211\023\316\056\330\237 -\125\340\036\376\170\024\303\101\247\116\361\273\035\010\276\165 -\013\165\154\375\166\317\234\145\115\067\036\042\113\065\162\230 -\364\361\037\332\077\022\106\105\020\023\171\124\063\037\212\155 -\363\173\042\346\147\074\063\176\275\350\323\212\015\013\230\013 -\275\315\364\260\276\221\302\041\353\000\050\116\022\200\222\334 -\053\243\000\046\302\233\333\311\135\372\027\147\035\270\006\255 -\146\141\122\034\232\111\131\213\333\016\124\241\130\342\215\067 -\064\241\173\215\305\274\332\212\250\322\130\160\261\142\366\260 -\134\300\022\167\262\166\206\177\057\250\324\035\321\174\247\342 -\232\360 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "RCSC RootCA" -# Issuer: CN=RCSC RootCA,O=VI Registru centras- i.k. 124110246,OU=RCSC,C=LT -# Serial Number:4f:00:1b:a1:24:bd:cb:88:48:be:bd:3f:2b:62:c7:c5 -# Subject: CN=RCSC RootCA,O=VI Registru centras- i.k. 124110246,OU=RCSC,C=LT -# Not Valid Before: Tue May 23 08:36:51 2017 -# Not Valid After : Mon May 23 08:36:51 2044 -# Fingerprint (SHA-256): 77:07:BB:2B:E9:F7:CE:05:70:60:B8:30:8C:3B:C0:87:B5:65:29:B3:63:8E:AF:5B:2A:80:49:C8:E1:5E:D7:20 -# Fingerprint (SHA1): FD:E7:C6:FD:B3:2B:B8:E6:39:39:84:0D:6A:E0:52:C3:D8:B7:3B:87 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "RCSC RootCA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\375\347\306\375\263\053\270\346\071\071\204\015\152\340\122\303 -\330\267\073\207 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\013\010\222\006\231\145\312\170\047\010\143\252\060\121\052\327 -END -CKA_ISSUER MULTILINE_OCTAL -\060\140\061\013\060\011\006\003\125\004\006\023\002\114\124\061 -\015\060\013\006\003\125\004\013\023\004\122\103\123\103\061\054 -\060\052\006\003\125\004\012\023\043\126\111\040\122\145\147\151 -\163\164\162\165\040\143\145\156\164\162\141\163\055\040\151\056 -\153\056\040\061\062\064\061\061\060\062\064\066\061\024\060\022 -\006\003\125\004\003\023\013\122\103\123\103\040\122\157\157\164 -\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\117\000\033\241\044\275\313\210\110\276\275\077\053\142 -\307\305 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "VRK Gov. Root CA - G2" # @@ -29047,174 +24005,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Digidentity Services Root CA" -# -# Issuer: C=NL,O=Digidentity B.V.,CN=Digidentity Services Root CA -# Serial Number:12:81:b9:18:f3:79:3a:42:93:ce:91:58:61:e4:ed:5c -# Subject: C=NL,O=Digidentity B.V.,CN=Digidentity Services Root CA -# Not Valid Before: Tue Jul 10 10:05:42 2018 -# Not Valid After : Sat Jul 04 10:05:42 2043 -# Fingerprint (SHA-256): E2:80:97:72:1A:8C:AB:88:80:AF:80:FD:EF:89:02:B1:F1:5B:C7:47:3A:D6:8E:C2:29:91:25:7A:91:0D:9E:A2 -# Fingerprint (SHA1): 7B:3F:B2:77:EE:31:1C:1E:D5:60:CA:B9:6E:4F:ED:77:5E:6A:3E:ED -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Digidentity Services Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\117\061\045\060\043\006\003\125\004\003\014\034\104\151\147 -\151\144\145\156\164\151\164\171\040\123\145\162\166\151\143\145 -\163\040\122\157\157\164\040\103\101\061\031\060\027\006\003\125 -\004\012\014\020\104\151\147\151\144\145\156\164\151\164\171\040 -\102\056\126\056\061\013\060\011\006\003\125\004\006\023\002\116 -\114 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\117\061\045\060\043\006\003\125\004\003\014\034\104\151\147 -\151\144\145\156\164\151\164\171\040\123\145\162\166\151\143\145 -\163\040\122\157\157\164\040\103\101\061\031\060\027\006\003\125 -\004\012\014\020\104\151\147\151\144\145\156\164\151\164\171\040 -\102\056\126\056\061\013\060\011\006\003\125\004\006\023\002\116 -\114 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\022\201\271\030\363\171\072\102\223\316\221\130\141\344 -\355\134 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\152\060\202\003\122\240\003\002\001\002\002\020\022 -\201\271\030\363\171\072\102\223\316\221\130\141\344\355\134\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\117 -\061\045\060\043\006\003\125\004\003\014\034\104\151\147\151\144 -\145\156\164\151\164\171\040\123\145\162\166\151\143\145\163\040 -\122\157\157\164\040\103\101\061\031\060\027\006\003\125\004\012 -\014\020\104\151\147\151\144\145\156\164\151\164\171\040\102\056 -\126\056\061\013\060\011\006\003\125\004\006\023\002\116\114\060 -\036\027\015\061\070\060\067\061\060\061\060\060\065\064\062\132 -\027\015\064\063\060\067\060\064\061\060\060\065\064\062\132\060 -\117\061\045\060\043\006\003\125\004\003\014\034\104\151\147\151 -\144\145\156\164\151\164\171\040\123\145\162\166\151\143\145\163 -\040\122\157\157\164\040\103\101\061\031\060\027\006\003\125\004 -\012\014\020\104\151\147\151\144\145\156\164\151\164\171\040\102 -\056\126\056\061\013\060\011\006\003\125\004\006\023\002\116\114 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\222\007\073\005\363\075\325\301\312\346\346\307\006\372\171 -\250\077\150\147\104\167\063\144\303\037\135\330\162\131\203\143 -\317\223\314\245\223\023\001\101\304\012\017\246\317\147\032\062 -\064\240\272\100\234\107\276\102\254\336\033\007\134\110\043\063 -\122\235\051\363\267\134\306\065\102\152\206\164\147\310\311\232 -\023\125\223\120\137\106\057\100\051\360\246\236\174\173\132\124 -\332\212\052\362\001\233\112\215\356\317\154\020\105\365\360\040 -\021\072\275\216\130\172\230\102\227\223\003\142\017\074\174\141 -\050\232\332\125\115\044\300\174\317\013\313\331\035\331\315\151 -\272\213\315\216\064\305\364\165\127\106\053\202\215\156\074\345 -\010\225\172\157\112\213\175\343\204\177\176\102\052\331\261\041 -\240\046\342\232\070\027\261\252\335\062\344\114\246\253\371\304 -\046\007\136\006\225\271\317\255\237\311\377\313\043\322\071\350 -\044\110\210\022\261\325\317\264\304\354\075\213\376\165\157\307 -\021\162\022\350\272\332\232\322\175\161\153\136\331\214\176\061 -\206\337\130\335\054\231\112\254\260\055\315\312\334\140\057\153 -\060\242\132\213\074\313\033\060\374\021\063\111\111\331\126\326 -\350\041\336\264\272\074\172\327\030\045\036\200\366\213\346\005 -\227\165\324\164\150\205\103\012\164\213\034\261\055\271\237\004 -\330\241\227\324\246\064\122\314\215\062\204\255\211\355\346\370 -\105\214\163\234\035\065\346\016\347\255\230\367\111\311\012\231 -\226\120\242\056\215\177\356\251\032\036\251\254\047\266\314\131 -\313\112\222\350\362\327\216\247\215\135\116\325\165\007\240\324 -\170\043\331\265\037\132\343\261\100\032\240\361\176\155\150\304 -\174\071\132\276\112\322\065\223\365\146\064\326\375\013\224\252 -\230\256\242\055\056\100\162\300\253\256\000\163\212\067\210\172 -\374\102\232\205\335\172\262\062\376\335\304\206\064\204\177\173 -\032\151\300\267\076\264\223\334\006\261\340\030\342\176\207\262 -\050\305\325\151\116\361\313\303\323\122\074\005\041\234\331\145 -\254\031\253\377\261\145\054\070\172\152\004\063\247\254\237\050 -\056\316\302\114\223\230\360\302\001\252\220\030\107\323\272\053 -\060\251\315\151\125\330\037\143\074\067\063\074\145\357\357\347 -\035\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125 -\035\016\004\026\004\024\302\170\147\027\153\217\076\116\261\130 -\226\216\172\102\332\147\077\304\027\135\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\006\060\015\006\011\052\206 -\110\206\367\015\001\001\013\005\000\003\202\002\001\000\036\242 -\063\120\006\170\074\272\322\254\036\122\166\305\107\073\316\275 -\072\252\244\300\257\265\134\247\165\054\343\040\144\263\265\205 -\127\011\337\076\223\317\226\006\062\036\326\116\063\027\077\350 -\242\010\271\135\252\200\056\235\357\122\136\027\017\340\007\174 -\211\343\101\030\355\214\124\256\126\262\174\100\210\026\053\174 -\305\105\256\302\346\117\066\370\163\375\264\016\231\100\111\205 -\257\041\276\022\223\323\376\146\100\374\321\123\240\045\177\235 -\166\021\140\110\060\114\235\254\211\334\210\044\277\242\123\063 -\261\212\313\342\336\141\103\170\177\172\341\355\044\216\174\010 -\277\064\316\063\224\165\163\156\364\317\050\062\337\275\042\030 -\315\041\274\244\034\336\260\244\377\216\032\043\307\137\164\123 -\171\266\000\173\154\062\177\134\355\073\161\260\032\004\342\016 -\343\243\157\177\123\275\146\177\265\271\037\033\254\163\323\223 -\122\243\131\003\070\255\133\147\150\142\032\047\311\366\275\177 -\035\255\235\060\166\024\130\073\363\060\252\102\171\107\020\263 -\177\331\072\312\331\231\112\107\234\133\204\022\237\145\370\307 -\200\265\364\077\034\320\136\131\374\170\104\201\247\211\076\210 -\135\222\226\261\164\142\246\354\351\142\165\133\315\351\102\021 -\054\213\024\042\232\007\214\006\344\203\250\312\127\222\131\006 -\150\262\071\072\232\121\010\105\342\006\003\345\066\117\210\136 -\224\275\024\074\257\125\370\062\165\063\137\313\121\273\022\031 -\106\145\001\163\101\146\005\214\277\030\113\377\071\071\217\156 -\340\342\131\326\360\234\274\014\076\072\170\201\117\044\131\332 -\104\112\327\117\266\257\232\354\104\365\167\233\333\303\043\220 -\366\106\030\275\277\057\321\176\050\100\024\061\175\272\040\005 -\170\244\166\335\026\016\012\172\254\151\106\376\360\001\356\152 -\322\155\016\216\073\025\056\174\043\217\167\341\345\175\374\030 -\003\224\336\041\224\046\333\106\211\124\370\043\263\130\053\376 -\057\366\364\226\033\223\145\255\171\003\054\304\337\041\070\164 -\344\232\035\366\105\107\071\162\325\161\135\373\276\010\155\026 -\325\250\267\141\143\052\247\050\300\007\246\265\336\225\355\222 -\252\154\373\315\134\115\131\132\346\135\040\233\206\227 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Digidentity Services Root CA" -# Issuer: C=NL,O=Digidentity B.V.,CN=Digidentity Services Root CA -# Serial Number:12:81:b9:18:f3:79:3a:42:93:ce:91:58:61:e4:ed:5c -# Subject: C=NL,O=Digidentity B.V.,CN=Digidentity Services Root CA -# Not Valid Before: Tue Jul 10 10:05:42 2018 -# Not Valid After : Sat Jul 04 10:05:42 2043 -# Fingerprint (SHA-256): E2:80:97:72:1A:8C:AB:88:80:AF:80:FD:EF:89:02:B1:F1:5B:C7:47:3A:D6:8E:C2:29:91:25:7A:91:0D:9E:A2 -# Fingerprint (SHA1): 7B:3F:B2:77:EE:31:1C:1E:D5:60:CA:B9:6E:4F:ED:77:5E:6A:3E:ED -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Digidentity Services Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\173\077\262\167\356\061\034\036\325\140\312\271\156\117\355\167 -\136\152\076\355 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\046\177\371\026\347\311\347\204\373\314\314\111\216\014\070\355 -END -CKA_ISSUER MULTILINE_OCTAL -\060\117\061\045\060\043\006\003\125\004\003\014\034\104\151\147 -\151\144\145\156\164\151\164\171\040\123\145\162\166\151\143\145 -\163\040\122\157\157\164\040\103\101\061\031\060\027\006\003\125 -\004\012\014\020\104\151\147\151\144\145\156\164\151\164\171\040 -\102\056\126\056\061\013\060\011\006\003\125\004\006\023\002\116 -\114 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\022\201\271\030\363\171\072\102\223\316\221\130\141\344 -\355\134 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "HiPKI Root CA - G1" # @@ -29383,207 +24173,6 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "TrustFactory SSL Root Certificate Authority" -# -# Issuer: CN=TrustFactory SSL Root Certificate Authority,OU=TrustFactory PKI Operations,O=TrustFactory(Pty)Ltd,L=Johannesburg,ST=Gauteng,C=ZA -# Serial Number:68:5d:cc:26:39:e0:23:66:e4:4a:9d:64:d3:8e:04:35 -# Subject: CN=TrustFactory SSL Root Certificate Authority,OU=TrustFactory PKI Operations,O=TrustFactory(Pty)Ltd,L=Johannesburg,ST=Gauteng,C=ZA -# Not Valid Before: Tue Dec 05 10:59:29 2017 -# Not Valid After : Thu Nov 28 10:59:29 2047 -# Fingerprint (SHA-256): 60:81:42:DA:5C:67:5D:D4:7C:1A:A3:A2:6E:E3:29:E2:4E:81:D5:FF:3B:94:01:7B:C1:C1:A0:C3:7D:B4:C1:A0 -# Fingerprint (SHA1): D1:14:78:E8:E5:FB:62:54:05:93:D2:2C:51:57:0D:01:4E:AC:76:D8 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustFactory SSL Root Certificate Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\261\061\013\060\011\006\003\125\004\006\023\002\132\101 -\061\020\060\016\006\003\125\004\010\014\007\107\141\165\164\145 -\156\147\061\025\060\023\006\003\125\004\007\014\014\112\157\150 -\141\156\156\145\163\142\165\162\147\061\035\060\033\006\003\125 -\004\012\014\024\124\162\165\163\164\106\141\143\164\157\162\171 -\050\120\164\171\051\114\164\144\061\044\060\042\006\003\125\004 -\013\014\033\124\162\165\163\164\106\141\143\164\157\162\171\040 -\120\113\111\040\117\160\145\162\141\164\151\157\156\163\061\064 -\060\062\006\003\125\004\003\014\053\124\162\165\163\164\106\141 -\143\164\157\162\171\040\123\123\114\040\122\157\157\164\040\103 -\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150\157 -\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\261\061\013\060\011\006\003\125\004\006\023\002\132\101 -\061\020\060\016\006\003\125\004\010\014\007\107\141\165\164\145 -\156\147\061\025\060\023\006\003\125\004\007\014\014\112\157\150 -\141\156\156\145\163\142\165\162\147\061\035\060\033\006\003\125 -\004\012\014\024\124\162\165\163\164\106\141\143\164\157\162\171 -\050\120\164\171\051\114\164\144\061\044\060\042\006\003\125\004 -\013\014\033\124\162\165\163\164\106\141\143\164\157\162\171\040 -\120\113\111\040\117\160\145\162\141\164\151\157\156\163\061\064 -\060\062\006\003\125\004\003\014\053\124\162\165\163\164\106\141 -\143\164\157\162\171\040\123\123\114\040\122\157\157\164\040\103 -\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150\157 -\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\150\135\314\046\071\340\043\146\344\112\235\144\323\216 -\004\065 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\121\060\202\004\071\240\003\002\001\002\002\020\150 -\135\314\046\071\340\043\146\344\112\235\144\323\216\004\065\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\201 -\261\061\013\060\011\006\003\125\004\006\023\002\132\101\061\020 -\060\016\006\003\125\004\010\014\007\107\141\165\164\145\156\147 -\061\025\060\023\006\003\125\004\007\014\014\112\157\150\141\156 -\156\145\163\142\165\162\147\061\035\060\033\006\003\125\004\012 -\014\024\124\162\165\163\164\106\141\143\164\157\162\171\050\120 -\164\171\051\114\164\144\061\044\060\042\006\003\125\004\013\014 -\033\124\162\165\163\164\106\141\143\164\157\162\171\040\120\113 -\111\040\117\160\145\162\141\164\151\157\156\163\061\064\060\062 -\006\003\125\004\003\014\053\124\162\165\163\164\106\141\143\164 -\157\162\171\040\123\123\114\040\122\157\157\164\040\103\145\162 -\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151 -\164\171\060\036\027\015\061\067\061\062\060\065\061\060\065\071 -\062\071\132\027\015\064\067\061\061\062\070\061\060\065\071\062 -\071\132\060\201\261\061\013\060\011\006\003\125\004\006\023\002 -\132\101\061\020\060\016\006\003\125\004\010\014\007\107\141\165 -\164\145\156\147\061\025\060\023\006\003\125\004\007\014\014\112 -\157\150\141\156\156\145\163\142\165\162\147\061\035\060\033\006 -\003\125\004\012\014\024\124\162\165\163\164\106\141\143\164\157 -\162\171\050\120\164\171\051\114\164\144\061\044\060\042\006\003 -\125\004\013\014\033\124\162\165\163\164\106\141\143\164\157\162 -\171\040\120\113\111\040\117\160\145\162\141\164\151\157\156\163 -\061\064\060\062\006\003\125\004\003\014\053\124\162\165\163\164 -\106\141\143\164\157\162\171\040\123\123\114\040\122\157\157\164 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\060\202\002\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 -\002\012\002\202\002\001\000\225\321\107\050\356\360\124\274\353 -\275\325\253\006\176\045\244\003\252\375\140\172\316\067\271\151 -\332\051\171\167\154\075\177\202\064\302\135\376\102\244\015\101 -\132\000\322\203\244\152\155\301\345\310\121\142\372\153\325\306 -\107\334\070\156\021\220\214\150\025\317\351\272\130\346\232\213 -\205\201\020\055\317\347\123\111\351\243\067\042\014\274\164\262 -\266\045\122\021\317\242\041\074\211\240\327\244\035\043\020\153 -\035\131\073\067\364\135\066\070\100\265\165\102\257\055\032\007 -\274\215\143\024\330\112\370\042\231\357\300\132\111\157\253\222 -\077\113\354\244\152\030\077\121\056\323\040\347\117\056\203\006 -\072\136\177\025\213\317\372\065\056\123\271\152\032\317\247\370 -\074\271\311\163\027\072\375\255\015\130\315\222\165\352\077\377 -\271\206\363\376\325\240\365\145\352\143\326\372\206\021\264\164 -\325\265\130\204\252\055\135\112\027\276\354\246\044\327\240\275 -\267\030\070\026\147\156\021\205\133\137\140\122\213\321\317\345 -\102\320\234\136\365\216\205\275\362\206\154\250\125\334\353\035 -\172\375\254\050\360\304\322\307\251\007\327\135\076\027\126\224 -\106\356\233\312\304\260\214\032\152\327\317\233\316\246\114\055 -\200\370\235\361\043\100\232\100\053\070\125\036\065\003\335\165 -\333\061\324\116\212\047\157\227\216\234\314\166\231\035\126\256 -\062\114\027\331\031\257\250\244\314\013\312\002\165\001\116\075 -\274\024\364\252\073\233\320\117\267\347\376\132\304\316\326\014 -\163\063\254\251\315\054\213\035\015\041\371\141\346\241\166\342 -\256\360\164\111\001\374\071\337\250\023\222\310\143\211\136\265 -\020\361\035\041\366\323\030\373\167\114\151\342\152\314\340\171 -\254\116\233\144\317\350\342\363\042\242\207\236\236\033\044\014 -\161\146\345\351\166\344\144\124\233\315\015\366\121\175\273\237 -\000\132\036\164\264\320\253\215\035\253\010\357\053\302\333\275 -\203\141\327\311\144\274\017\156\027\306\062\337\014\363\246\136 -\356\354\040\014\052\317\172\105\120\173\030\326\373\022\166\341 -\257\131\037\201\332\064\202\066\105\277\222\311\125\245\326\165 -\006\131\207\233\244\203\336\255\170\171\154\074\250\217\235\356 -\134\354\074\343\211\242\053\002\003\001\000\001\243\143\060\141 -\060\035\006\003\125\035\016\004\026\004\024\102\072\136\066\132 -\334\033\252\320\242\352\365\361\104\177\164\045\163\351\275\060 -\037\006\003\125\035\043\004\030\060\026\200\024\102\072\136\066 -\132\334\033\252\320\242\352\365\361\104\177\164\045\163\351\275 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\006\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000 -\003\202\002\001\000\006\072\042\152\034\374\033\172\335\150\277 -\325\112\250\276\013\142\330\152\147\111\064\140\034\133\263\355 -\045\276\066\016\040\127\165\003\207\350\146\167\254\167\325\167 -\141\224\155\350\164\161\124\153\364\374\266\362\213\212\147\137 -\035\004\010\077\376\201\040\355\217\074\327\107\166\130\102\321 -\152\307\061\164\176\064\115\246\173\105\121\160\023\370\106\104 -\107\317\015\332\226\024\306\202\126\076\205\032\350\262\245\237 -\177\315\017\154\203\202\342\030\007\334\146\134\212\312\135\250 -\204\057\124\214\203\360\305\074\100\040\062\342\117\350\126\353 -\225\302\344\306\120\376\042\350\257\001\122\053\225\256\206\126 -\225\247\173\036\306\067\356\065\366\367\373\066\320\340\052\335 -\060\062\303\155\024\045\307\125\322\153\043\157\220\052\012\143 -\226\172\146\350\335\200\262\171\377\223\150\155\017\261\024\123 -\345\316\173\114\320\301\043\013\072\203\344\314\216\373\334\056 -\331\164\122\340\120\275\272\111\370\166\064\026\037\151\053\364 -\050\206\035\114\064\025\027\332\164\250\160\226\135\077\302\035 -\307\004\207\125\242\153\261\262\365\065\126\142\273\273\365\107 -\354\202\264\146\152\023\110\170\124\143\317\137\200\354\230\106 -\304\111\311\364\244\053\225\045\307\300\243\333\126\134\275\252 -\366\271\067\342\332\104\345\015\113\207\171\235\246\235\037\255 -\017\375\316\351\146\255\361\004\224\125\110\327\253\047\226\141 -\125\371\066\335\065\337\210\126\065\366\152\261\223\130\130\145 -\052\264\245\335\017\115\213\007\031\275\202\252\165\264\102\314 -\125\131\336\247\162\050\201\176\254\253\033\354\200\034\230\127 -\022\031\337\267\046\051\061\322\372\220\015\134\036\060\057\052 -\206\056\105\143\325\236\345\174\160\177\002\145\056\031\364\001 -\106\336\334\270\127\235\276\171\076\124\177\056\203\116\162\305 -\315\131\141\075\367\240\266\223\224\153\135\011\060\046\163\070 -\126\374\127\170\207\357\355\070\302\015\126\060\204\211\233\026 -\216\172\010\265\177\046\022\303\120\365\033\052\262\157\220\070 -\066\340\065\021\114\331\036\036\373\341\270\214\105\254\140\341 -\371\265\271\354\277\301\011\172\051\045\303\351\041\313\320\357 -\203\254\042\074\150 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TrustFactory SSL Root Certificate Authority" -# Issuer: CN=TrustFactory SSL Root Certificate Authority,OU=TrustFactory PKI Operations,O=TrustFactory(Pty)Ltd,L=Johannesburg,ST=Gauteng,C=ZA -# Serial Number:68:5d:cc:26:39:e0:23:66:e4:4a:9d:64:d3:8e:04:35 -# Subject: CN=TrustFactory SSL Root Certificate Authority,OU=TrustFactory PKI Operations,O=TrustFactory(Pty)Ltd,L=Johannesburg,ST=Gauteng,C=ZA -# Not Valid Before: Tue Dec 05 10:59:29 2017 -# Not Valid After : Thu Nov 28 10:59:29 2047 -# Fingerprint (SHA-256): 60:81:42:DA:5C:67:5D:D4:7C:1A:A3:A2:6E:E3:29:E2:4E:81:D5:FF:3B:94:01:7B:C1:C1:A0:C3:7D:B4:C1:A0 -# Fingerprint (SHA1): D1:14:78:E8:E5:FB:62:54:05:93:D2:2C:51:57:0D:01:4E:AC:76:D8 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustFactory SSL Root Certificate Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\321\024\170\350\345\373\142\124\005\223\322\054\121\127\015\001 -\116\254\166\330 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\272\224\236\216\200\351\110\235\106\253\251\023\077\132\240\340 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\261\061\013\060\011\006\003\125\004\006\023\002\132\101 -\061\020\060\016\006\003\125\004\010\014\007\107\141\165\164\145 -\156\147\061\025\060\023\006\003\125\004\007\014\014\112\157\150 -\141\156\156\145\163\142\165\162\147\061\035\060\033\006\003\125 -\004\012\014\024\124\162\165\163\164\106\141\143\164\157\162\171 -\050\120\164\171\051\114\164\144\061\044\060\042\006\003\125\004 -\013\014\033\124\162\165\163\164\106\141\143\164\157\162\171\040 -\120\113\111\040\117\160\145\162\141\164\151\157\156\163\061\064 -\060\062\006\003\125\004\003\014\053\124\162\165\163\164\106\141 -\143\164\157\162\171\040\123\123\114\040\122\157\157\164\040\103 -\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150\157 -\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\150\135\314\046\071\340\043\146\344\112\235\144\323\216 -\004\065 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - - # # Certificate "A-Trust-Root-07" # diff --git a/SPECS/cert-manager/CVE-2024-45338.patch b/SPECS/cert-manager/CVE-2024-45338.patch deleted file mode 100644 index ead0b39789..0000000000 --- a/SPECS/cert-manager/CVE-2024-45338.patch +++ /dev/null @@ -1,63 +0,0 @@ -From bda2595d9dbcd7805b5b78466753b9d1849945d2 Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Thu, 2 Jan 2025 10:22:12 +0000 -Subject: [PATCH] Fix CVE CVE-2024-45338 in cert-manager - ---- - cmd/ctl/vendor/golang.org/x/net/html/doctype.go | 2 +- - cmd/ctl/vendor/golang.org/x/net/html/foreign.go | 3 +-- - cmd/ctl/vendor/golang.org/x/net/html/parse.go | 4 ++-- - 3 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/cmd/ctl/vendor/golang.org/x/net/html/doctype.go b/cmd/ctl/vendor/golang.org/x/net/html/doctype.go -index c484e5a..bca3ae9 100644 ---- a/cmd/ctl/vendor/golang.org/x/net/html/doctype.go -+++ b/cmd/ctl/vendor/golang.org/x/net/html/doctype.go -@@ -87,7 +87,7 @@ func parseDoctype(s string) (n *Node, quirks bool) { - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && -- strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { -+ strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") { - quirks = true - } - } -diff --git a/cmd/ctl/vendor/golang.org/x/net/html/foreign.go b/cmd/ctl/vendor/golang.org/x/net/html/foreign.go -index 9da9e9d..e8515d8 100644 ---- a/cmd/ctl/vendor/golang.org/x/net/html/foreign.go -+++ b/cmd/ctl/vendor/golang.org/x/net/html/foreign.go -@@ -40,8 +40,7 @@ func htmlIntegrationPoint(n *Node) bool { - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { -- val := strings.ToLower(a.Val) -- if val == "text/html" || val == "application/xhtml+xml" { -+ if strings.EqualFold(a.Val, "text/html") || strings.EqualFold(a.Val, "application/xhtml+xml") { - return true - } - } -diff --git a/cmd/ctl/vendor/golang.org/x/net/html/parse.go b/cmd/ctl/vendor/golang.org/x/net/html/parse.go -index 46a89ed..5b8374b 100644 ---- a/cmd/ctl/vendor/golang.org/x/net/html/parse.go -+++ b/cmd/ctl/vendor/golang.org/x/net/html/parse.go -@@ -1031,7 +1031,7 @@ func inBodyIM(p *parser) bool { - if p.tok.DataAtom == a.Input { - for _, t := range p.tok.Attr { - if t.Key == "type" { -- if strings.ToLower(t.Val) == "hidden" { -+ if strings.EqualFold(t.Val, "hidden") { - // Skip setting framesetOK = false - return true - } -@@ -1459,7 +1459,7 @@ func inTableIM(p *parser) bool { - return inHeadIM(p) - case a.Input: - for _, t := range p.tok.Attr { -- if t.Key == "type" && strings.ToLower(t.Val) == "hidden" { -+ if t.Key == "type" && strings.EqualFold(t.Val, "hidden") { - p.addElement() - p.oe.pop() - return true --- -2.39.4 - diff --git a/SPECS/cert-manager/CVE-2025-22868.patch b/SPECS/cert-manager/CVE-2025-22868.patch deleted file mode 100644 index 895a0dba84..0000000000 --- a/SPECS/cert-manager/CVE-2025-22868.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 681b4d8edca1bcfea5bce685d77ea7b82ed3e7b3 Mon Sep 17 00:00:00 2001 -From: Neal Patel -Date: Thu, 30 Jan 2025 14:10:09 -0500 -Subject: [PATCH] jws: split token into fixed number of parts - -Thanks to 'jub0bs' for reporting this issue. - -Fixes #71490 -Fixes CVE-2025-22868 - -Change-Id: I2552731f46d4907f29aafe7863c558387b6bd6e2 -Reviewed-on: https://go-review.googlesource.com/c/oauth2/+/652155 -Auto-Submit: Gopher Robot -Reviewed-by: Damien Neil -Reviewed-by: Roland Shoemaker -LUCI-TryBot-Result: Go LUCI ---- - cmd/controller/vendor/golang.org/x/oauth2/jws/jws.go | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/cmd/controller/vendor/golang.org/x/oauth2/jws/jws.go b/cmd/controller/vendor/golang.org/x/oauth2/jws/jws.go -index 95015648b..6f03a49d3 100644 ---- a/cmd/controller/vendor/golang.org/x/oauth2/jws/jws.go -+++ b/cmd/controller/vendor/golang.org/x/oauth2/jws/jws.go -@@ -165,11 +165,11 @@ func Encode(header *Header, c *ClaimSet, key *rsa.PrivateKey) (string, error) { - // Verify tests whether the provided JWT token's signature was produced by the private key - // associated with the supplied public key. - func Verify(token string, key *rsa.PublicKey) error { -- parts := strings.Split(token, ".") -- if len(parts) != 3 { -+ if strings.Count(token, ".") != 2 { - return errors.New("jws: invalid token received, token must have 3 parts") - } - -+ parts := strings.SplitN(token, ".", 3) - signedContent := parts[0] + "." + parts[1] - signatureString, err := base64.RawURLEncoding.DecodeString(parts[2]) - if err != nil { diff --git a/SPECS/cert-manager/CVE-2025-22869.patch b/SPECS/cert-manager/CVE-2025-22869.patch deleted file mode 100644 index 738a99080e..0000000000 --- a/SPECS/cert-manager/CVE-2025-22869.patch +++ /dev/null @@ -1,140 +0,0 @@ -From 041b89a18f81265899e42e6801f830c101a96120 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Sun, 2 Mar 2025 13:46:00 +0000 -Subject: [PATCH] CVE-2025-22869 - -Upstream Reference : https://github.com/golang/crypto/commit/7292932d45d55c7199324ab0027cc86e8198aa22 - -ssh: limit the size of the internal packet queue while waiting for KEX - -In the SSH protocol, clients and servers execute the key exchange to -generate one-time session keys used for encryption and authentication. -The key exchange is performed initially after the connection is -established and then periodically after a configurable amount of data. -While a key exchange is in progress, we add the received packets to an -internal queue until we receive SSH_MSG_KEXINIT from the other side. -This can result in high memory usage if the other party is slow to -respond to the SSH_MSG_KEXINIT packet, or memory exhaustion if a -malicious client never responds to an SSH_MSG_KEXINIT packet during a -large file transfer. -We now limit the internal queue to 64 packets: this means 2MB with the -typical 32KB packet size. -When the internal queue is full we block further writes until the -pending key exchange is completed or there is a read or write error. - -Thanks to Yuichi Watanabe for reporting this issue. - -Change-Id: I1ce2214cc16e08b838d4bc346c74c72addafaeec -Reviewed-on: https://go-review.googlesource.com/c/crypto/+/652135 -Reviewed-by: Neal Patel -Auto-Submit: Gopher Robot -Reviewed-by: Roland Shoemaker -LUCI-TryBot-Result: Go LUCI - ---- - cmd/controller/vendor/golang.org/x/crypto/ssh/handshake.go | 47 ++++++++++++++++----- - 1 file changed, 37 insertions(+), 10 deletions(-) - -diff --git a/cmd/controller/vendor/golang.org/x/crypto/ssh/handshake.go b/cmd/controller/vendor/golang.org/x/crypto/ssh/handshake.go -index 70a7369..e14eb6c 100644 ---- a/cmd/controller/vendor/golang.org/x/crypto/ssh/handshake.go -+++ b/cmd/controller/vendor/golang.org/x/crypto/ssh/handshake.go -@@ -24,6 +24,11 @@ const debugHandshake = false - // quickly. - const chanSize = 16 - -+// maxPendingPackets sets the maximum number of packets to queue while waiting -+// for KEX to complete. This limits the total pending data to maxPendingPackets -+// * maxPacket bytes, which is ~16.8MB. -+const maxPendingPackets = 64 -+ - // keyingTransport is a packet based transport that supports key - // changes. It need not be thread-safe. It should pass through - // msgNewKeys in both directions. -@@ -58,11 +63,19 @@ type handshakeTransport struct { - incoming chan []byte - readError error - -- mu sync.Mutex -- writeError error -- sentInitPacket []byte -- sentInitMsg *kexInitMsg -- pendingPackets [][]byte // Used when a key exchange is in progress. -+ mu sync.Mutex -+ // Condition for the above mutex. It is used to notify a completed key -+ // exchange or a write failure. Writes can wait for this condition while a -+ // key exchange is in progress. -+ writeCond *sync.Cond -+ writeError error -+ sentInitPacket []byte -+ sentInitMsg *kexInitMsg -+ // Used to queue writes when a key exchange is in progress. The length is -+ // limited by pendingPacketsSize. Once full, writes will block until the key -+ // exchange is completed or an error occurs. If not empty, it is emptied -+ // all at once when the key exchange is completed in kexLoop. -+ pendingPackets [][]byte - writePacketsLeft uint32 - writeBytesLeft int64 - -@@ -114,6 +127,7 @@ func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, - - config: config, - } -+ t.writeCond = sync.NewCond(&t.mu) - t.resetReadThresholds() - t.resetWriteThresholds() - -@@ -236,6 +250,7 @@ func (t *handshakeTransport) recordWriteError(err error) { - defer t.mu.Unlock() - if t.writeError == nil && err != nil { - t.writeError = err -+ t.writeCond.Broadcast() - } - } - -@@ -339,6 +354,8 @@ write: - } - } - t.pendingPackets = t.pendingPackets[:0] -+ // Unblock writePacket if waiting for KEX. -+ t.writeCond.Broadcast() - t.mu.Unlock() - } - -@@ -526,11 +543,20 @@ func (t *handshakeTransport) writePacket(p []byte) error { - } - - if t.sentInitMsg != nil { -- // Copy the packet so the writer can reuse the buffer. -- cp := make([]byte, len(p)) -- copy(cp, p) -- t.pendingPackets = append(t.pendingPackets, cp) -- return nil -+ if len(t.pendingPackets) < maxPendingPackets { -+ // Copy the packet so the writer can reuse the buffer. -+ cp := make([]byte, len(p)) -+ copy(cp, p) -+ t.pendingPackets = append(t.pendingPackets, cp) -+ return nil -+ } -+ for t.sentInitMsg != nil { -+ // Block and wait for KEX to complete or an error. -+ t.writeCond.Wait() -+ if t.writeError != nil { -+ return t.writeError -+ } -+ } - } - - if t.writeBytesLeft > 0 { -@@ -547,6 +573,7 @@ func (t *handshakeTransport) writePacket(p []byte) error { - - if err := t.pushPacket(p); err != nil { - t.writeError = err -+ t.writeCond.Broadcast() - } - - return nil --- -2.45.2 - diff --git a/SPECS/cert-manager/CVE-2025-22872.patch b/SPECS/cert-manager/CVE-2025-22872.patch deleted file mode 100644 index af3845d83b..0000000000 --- a/SPECS/cert-manager/CVE-2025-22872.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 160cea2aabe42233d5840bcdd246e0232bee0035 Mon Sep 17 00:00:00 2001 -From: Kevin Lockwood -Date: Thu, 8 May 2025 12:53:56 -0700 -Subject: [PATCH] Patch CVE-2025-22872 - -Upstream Patch Reference: https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9.patch ---- - cmd/ctl/vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/cmd/ctl/vendor/golang.org/x/net/html/token.go b/cmd/ctl/vendor/golang.org/x/net/html/token.go -index 3c57880..6598c1f 100644 ---- a/cmd/ctl/vendor/golang.org/x/net/html/token.go -+++ b/cmd/ctl/vendor/golang.org/x/net/html/token.go -@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType { - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } -- // Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken --- -2.34.1 - diff --git a/SPECS/cert-manager/CVE-2025-27144.patch b/SPECS/cert-manager/CVE-2025-27144.patch deleted file mode 100644 index 89e37594d5..0000000000 --- a/SPECS/cert-manager/CVE-2025-27144.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 46c92791edfab05377ba880024389a356d58ea20 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Fri, 28 Feb 2025 09:39:10 +0000 -Subject: [PATCH] CVE-2025-27144 - ---- - cmd/controller/vendor/github.com/go-jose/go-jose/v3/jwe.go | 5 +++-- - cmd/controller/vendor/github.com/go-jose/go-jose/v3/jws.go | 5 +++-- - 2 files changed, 6 insertions(+), 4 deletions(-) - -diff --git a/cmd/controller/vendor/github.com/go-jose/go-jose/v3/jwe.go b/cmd/controller/vendor/github.com/go-jose/go-jose/v3/jwe.go -index 4267ac7..1ba4ae0 100644 ---- a/cmd/controller/vendor/github.com/go-jose/go-jose/v3/jwe.go -+++ b/cmd/controller/vendor/github.com/go-jose/go-jose/v3/jwe.go -@@ -202,10 +202,11 @@ func (parsed *rawJSONWebEncryption) sanitized() (*JSONWebEncryption, error) { - - // parseEncryptedCompact parses a message in compact format. - func parseEncryptedCompact(input string) (*JSONWebEncryption, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 5 { -+ // Five parts is four separators -+ if strings.Count(input, ".") != 4 { - return nil, fmt.Errorf("go-jose/go-jose: compact JWE format must have five parts") - } -+ parts := strings.SplitN(input, ".", 5) - - rawProtected, err := base64URLDecode(parts[0]) - if err != nil { -diff --git a/cmd/controller/vendor/github.com/go-jose/go-jose/v3/jws.go b/cmd/controller/vendor/github.com/go-jose/go-jose/v3/jws.go -index e37007d..401fc18 100644 ---- a/cmd/controller/vendor/github.com/go-jose/go-jose/v3/jws.go -+++ b/cmd/controller/vendor/github.com/go-jose/go-jose/v3/jws.go -@@ -275,10 +275,11 @@ func (parsed *rawJSONWebSignature) sanitized() (*JSONWebSignature, error) { - - // parseSignedCompact parses a message in compact format. - func parseSignedCompact(input string, payload []byte) (*JSONWebSignature, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 3 { -+ // Three parts is two separators -+ if strings.Count(input, ".") != 2 { - return nil, fmt.Errorf("go-jose/go-jose: compact JWS format must have three parts") - } -+ parts := strings.SplitN(input, ".", 3) - - if parts[1] != "" && payload != nil { - return nil, fmt.Errorf("go-jose/go-jose: payload is not detached") --- -2.45.2 - diff --git a/SPECS/cert-manager/CVE-2025-30204.patch b/SPECS/cert-manager/CVE-2025-30204.patch deleted file mode 100644 index cc389d54b3..0000000000 --- a/SPECS/cert-manager/CVE-2025-30204.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 20e897717946a5bb7750e795c245012bddcfa312 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Fri, 28 Mar 2025 21:29:08 +0000 -Subject: [PATCH] CVE-2025-30204 - -Upstream Patch Reference : v4: https://github.com/golang-jwt/jwt/commit/2f0e9add62078527821828c76865661aa7718a84 ---- - github.com/golang-jwt/jwt/v4/parser.go | 36 +++++++++++++++++++++++--- - 1 file changed, 33 insertions(+), 3 deletions(-) - -diff --git a/cmd/controller/vendor/github.com/golang-jwt/jwt/v4/parser.go b/cmd/controller/vendor/github.com/golang-jwt/jwt/v4/parser.go -index 2f61a69..9484f28 100644 ---- a/cmd/controller/vendor/github.com/golang-jwt/jwt/v4/parser.go -+++ b/cmd/controller/vendor/github.com/golang-jwt/jwt/v4/parser.go -@@ -7,6 +7,8 @@ import ( - "strings" - ) - -+const tokenDelimiter = "." -+ - type Parser struct { - // If populated, only these methods will be considered valid. - // -@@ -116,9 +118,10 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - // It's only ever useful in cases where you know the signature is valid (because it has - // been checked previously in the stack) and you want to extract values from it. - func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { -- parts = strings.Split(tokenString, ".") -- if len(parts) != 3 { -- return nil, parts, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) -+ var ok bool -+ parts, ok = splitToken(tokenString) -+ if !ok { -+ return nil, nil, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) - } - - token = &Token{Raw: tokenString} -@@ -168,3 +171,30 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke - - return token, parts, nil - } -+ -+// splitToken splits a token string into three parts: header, claims, and signature. It will only -+// return true if the token contains exactly two delimiters and three parts. In all other cases, it -+// will return nil parts and false. -+func splitToken(token string) ([]string, bool) { -+ parts := make([]string, 3) -+ header, remain, ok := strings.Cut(token, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[0] = header -+ claims, remain, ok := strings.Cut(remain, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[1] = claims -+ // One more cut to ensure the signature is the last part of the token and there are no more -+ // delimiters. This avoids an issue where malicious input could contain additional delimiters -+ // causing unecessary overhead parsing tokens. -+ signature, _, unexpected := strings.Cut(remain, tokenDelimiter) -+ if unexpected { -+ return nil, false -+ } -+ parts[2] = signature -+ -+ return parts, true -+} --- -2.45.2 - diff --git a/SPECS/cert-manager/CVE-2025-32386.patch b/SPECS/cert-manager/CVE-2025-32386.patch deleted file mode 100644 index 9f7253f228..0000000000 --- a/SPECS/cert-manager/CVE-2025-32386.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 8374e59e76c401229470d6f3840cdbbdfa1512a8 Mon Sep 17 00:00:00 2001 -From: Kevin Lockwood -Date: Wed, 21 May 2025 13:29:45 -0700 -Subject: [PATCH] Fix CVE-2025-32387 - -Upstream Link: https://github.com/helm/helm/commit/d8ca55fc669645c10c0681d49723f4bb8c0b1ce7.patch ---- - .../helm/v3/pkg/chart/loader/archive.go | 32 ++++++++++++++++++- - .../helm/v3/pkg/chart/loader/directory.go | 4 +++ - 2 files changed, 35 insertions(+), 1 deletion(-) - -diff --git a/cmd/ctl/vendor/helm.sh/helm/v3/pkg/chart/loader/archive.go b/cmd/ctl/vendor/helm.sh/helm/v3/pkg/chart/loader/archive.go -index 196e5f8..4cb994c 100644 ---- a/cmd/ctl/vendor/helm.sh/helm/v3/pkg/chart/loader/archive.go -+++ b/cmd/ctl/vendor/helm.sh/helm/v3/pkg/chart/loader/archive.go -@@ -33,6 +33,15 @@ import ( - "helm.sh/helm/v3/pkg/chart" - ) - -+// MaxDecompressedChartSize is the maximum size of a chart archive that will be -+// decompressed. This is the decompressed size of all the files. -+// The default value is 100 MiB. -+var MaxDecompressedChartSize int64 = 100 * 1024 * 1024 // Default 100 MiB -+ -+// MaxDecompressedFileSize is the size of the largest file that Helm will attempt to load. -+// The size of the file is the decompressed version of it when it is stored in an archive. -+var MaxDecompressedFileSize int64 = 5 * 1024 * 1024 // Default 5 MiB -+ - var drivePathPattern = regexp.MustCompile(`^[a-zA-Z]:/`) - - // FileLoader loads a chart from a file -@@ -119,6 +128,7 @@ func LoadArchiveFiles(in io.Reader) ([]*BufferedFile, error) { - - files := []*BufferedFile{} - tr := tar.NewReader(unzipped) -+ remainingSize := MaxDecompressedChartSize - for { - b := bytes.NewBuffer(nil) - hd, err := tr.Next() -@@ -178,10 +188,30 @@ func LoadArchiveFiles(in io.Reader) ([]*BufferedFile, error) { - return nil, errors.New("chart yaml not in base directory") - } - -- if _, err := io.Copy(b, tr); err != nil { -+ if hd.Size > remainingSize { -+ return nil, fmt.Errorf("decompressed chart is larger than the maximum size %d", MaxDecompressedChartSize) -+ } -+ -+ if hd.Size > MaxDecompressedFileSize { -+ return nil, fmt.Errorf("decompressed chart file %q is larger than the maximum file size %d", hd.Name, MaxDecompressedFileSize) -+ } -+ -+ limitedReader := io.LimitReader(tr, remainingSize) -+ -+ bytesWritten, err := io.Copy(b, limitedReader) -+ if err != nil { - return nil, err - } - -+ remainingSize -= bytesWritten -+ // When the bytesWritten are less than the file size it means the limit reader ended -+ // copying early. Here we report that error. This is important if the last file extracted -+ // is the one that goes over the limit. It assumes the Size stored in the tar header -+ // is correct, something many applications do. -+ if bytesWritten < hd.Size || remainingSize <= 0 { -+ return nil, fmt.Errorf("decompressed chart is larger than the maximum size %d", MaxDecompressedChartSize) -+ } -+ - data := bytes.TrimPrefix(b.Bytes(), utf8bom) - - files = append(files, &BufferedFile{Name: n, Data: data}) -diff --git a/cmd/ctl/vendor/helm.sh/helm/v3/pkg/chart/loader/directory.go b/cmd/ctl/vendor/helm.sh/helm/v3/pkg/chart/loader/directory.go -index 9bcbee6..fd8e02e 100644 ---- a/cmd/ctl/vendor/helm.sh/helm/v3/pkg/chart/loader/directory.go -+++ b/cmd/ctl/vendor/helm.sh/helm/v3/pkg/chart/loader/directory.go -@@ -101,6 +101,10 @@ func LoadDir(dir string) (*chart.Chart, error) { - return fmt.Errorf("cannot load irregular file %s as it has file mode type bits set", name) - } - -+ if fi.Size() > MaxDecompressedFileSize { -+ return fmt.Errorf("chart file %q is larger than the maximum file size %d", fi.Name(), MaxDecompressedFileSize) -+ } -+ - data, err := os.ReadFile(name) - if err != nil { - return errors.Wrapf(err, "error reading %s", n) --- -2.34.1 - diff --git a/SPECS/cert-manager/cert-manager.signatures.json b/SPECS/cert-manager/cert-manager.signatures.json deleted file mode 100644 index 01eaffd161..0000000000 --- a/SPECS/cert-manager/cert-manager.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "cert-manager-1.12.15.tar.gz": "2c556e4c47753a5cd48510297bc5cab2b0943b7de1b3898df598a0ee969c8e72", - "cert-manager-1.12.15-vendor.tar.gz": "20afae660bffb8a636185aa920c1ada8bd345bae773ebe9e277b490ddc1bad49" - } -} diff --git a/SPECS/cert-manager/cert-manager.spec b/SPECS/cert-manager/cert-manager.spec deleted file mode 100644 index e49571240c..0000000000 --- a/SPECS/cert-manager/cert-manager.spec +++ /dev/null @@ -1,211 +0,0 @@ -Summary: Automatically provision and manage TLS certificates in Kubernetes -Name: cert-manager -Version: 1.12.15 -Release: 5%{?dist} -License: ASL 2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -URL: https://github.com/jetstack/cert-manager -Source0: https://github.com/jetstack/%{name}/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -# Below is a manually created tarball, no download link. -# We're using pre-populated GO dependencies from this tarball, since network is disabled during build time. -# How to re-build this file: -# 1. wget https://github.com/jetstack/%%{name}/archive/refs/tags/v%%{version}.tar.gz -O %%{name}-%%{version}.tar.gz -# 2. /SPECS/cert-manager/generate_source_tarball.sh --srcTarball %%{name}-%%{version}.tar.gz --pkgVersion %%{version} -Source1: %{name}-%{version}-vendor.tar.gz -Patch0: CVE-2024-45338.patch -Patch1: CVE-2025-27144.patch -Patch2: CVE-2025-22868.patch -Patch3: CVE-2025-22869.patch -Patch4: CVE-2025-30204.patch -Patch5: CVE-2025-32386.patch -Patch6: CVE-2025-22872.patch - -BuildRequires: golang -Requires: %{name}-acmesolver -Requires: %{name}-cainjector -Requires: %{name}-cmctl -Requires: %{name}-controller -Requires: %{name}-webhook - -%description -cert-manager is a Kubernetes add-on to automate the management and issuance -of TLS certificates from various issuing sources. - -%package acmesolver -Summary: cert-manager's acmesolver binary - -%description acmesolver -HTTP server used to solve ACME challenges. - -%package cainjector -Summary: cert-manager's cainjector binary - -%description cainjector -cert-manager CA injector is a Kubernetes addon to automate the injection of CA data into -webhooks and APIServices from cert-manager certificates. - -%package controller -Summary: cert-manager's controller binary - -%description controller -cert-manager is a Kubernetes addon to automate the management and issuance of -TLS certificates from various issuing sources. - -%package cmctl -Summary: cert-manager's cmctl binary - -%description cmctl -cmctl is a CLI tool manage and configure cert-manager resources for Kubernetes - -%package webhook -Summary: cert-manager's webhook binary - -%description webhook -Webhook component providing API validation, mutation and conversion functionality for cert-manager. - -%prep -%autosetup -a 1 -p1 - -%build - -LOCAL_BIN_DIR=$(realpath bin) -go -C cmd/acmesolver build -mod=vendor -o "${LOCAL_BIN_DIR}"/acmesolver main.go -go -C cmd/controller build -mod=vendor -o "${LOCAL_BIN_DIR}"/controller main.go -go -C cmd/cainjector build -mod=vendor -o "${LOCAL_BIN_DIR}"/cainjector main.go -go -C cmd/ctl build -mod=vendor -o "${LOCAL_BIN_DIR}"/cmctl main.go -go -C cmd/webhook build -mod=vendor -o "${LOCAL_BIN_DIR}"/webhook main.go - -%install -mkdir -p %{buildroot}%{_bindir} -install -D -m0755 bin/acmesolver %{buildroot}%{_bindir}/ -install -D -m0755 bin/cainjector %{buildroot}%{_bindir}/ -install -D -m0755 bin/controller %{buildroot}%{_bindir}/ -install -D -m0755 bin/cmctl %{buildroot}%{_bindir}/ -install -D -m0755 bin/webhook %{buildroot}%{_bindir}/ -%files - -%files acmesolver -%license LICENSE LICENSES -%doc README.md -%{_bindir}/acmesolver - -%files cainjector -%license LICENSE LICENSES -%doc README.md -%{_bindir}/cainjector - -%files controller -%license LICENSE LICENSES -%doc README.md -%{_bindir}/controller - -%files cmctl -%license LICENSE LICENSES -%doc README.md -%{_bindir}/cmctl - -%files webhook -%license LICENSE LICENSES -%doc README.md -%{_bindir}/webhook - -%changelog -* Mon Sep 8 2025 Lee Chee Yang - 1.12.15-5 -- merge from Azure Linux 3.0.20250910-3.0. -- Patch CVE-2025-32386 (also fixes CVE-2025-32387) -- Patch CVE-2025-22872 - -* Fri Apr 28 2025 Ranjan Dutta - 1.12.15-4 -- merge from Azure Linux 3.0.20250423. -- Patch CVE-2025-30204 - -* Fri Mar 21 2025 Anuj Mittal - 1.12.15-3 -- Bump Release to rebuild - -* Mon Mar 03 2025 Kanishk Bansal - 1.12.15-2 -- Fix CVE-2025-22868, CVE-2025-22869 & CVE-2025-27144 with an upstream patch - -* Mon Jan 27 2025 Rohit Rawat - 1.12.15-1 -- Upgrade to 1.12.15 - to fix CVE-2024-12401 -- Remove CVE-2024-45337.patch as it is fixed in 1.12.15 - -* Tue Dec 31 2024 Rohit Rawat - 1.12.13-3 -- Add patch for CVE-2024-45338 - -* Wed Jan 08 2025 Muhammad Falak - 1.12.13-2 -- Patch CVE-2024-45337 - -* Mon Sep 16 2024 Jiri Appl - 1.12.13-1 -- Upgrade to 1.12.13 which carries helm 3.14.2 to fix CVE-2024-26147 and CVE-2024-25620 - -* Wed Aug 07 2024 Bhagyashri Pathak - 1.12.12-2 -- Patch for CVE-2024-25620 - -* Wed Jul 10 2024 Tobias Brick - 1.12.12-1 -- Upgrade to 1.12.12 to fix CVE-2024-26147 and CVE-2023-45142 - -* Wed May 29 2024 Neha Agarwal - 1.11.2-8 -- Bump release to build with new helm to fix CVE-2024-25620 - -* Wed May 22 2024 Neha Agarwal - 1.11.2-7 -- Bump release to build with new helm to fix CVE-2024-26147 - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 1.11.2-6 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 1.11.2-5 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.11.2-4 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 1.11.2-3 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 1.11.2-2 -- Bump release to rebuild with go 1.19.10 - -* Mon May 15 2023 Aditya Dubey - 1.11.0-1 -- Upgrade to v1.11.2 -- Removed patch for CVE-2023-25165 -- This version uses helm v3.11.1, which fixes CVE-2023-25165 and thus we do not need the patch file anymore - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.7.3-10 -- Bump release to rebuild with go 1.19.8 - -* Wed Mar 29 2023 CBL-Mariner Servicing Account - 1.7.3-9 -- Add patch for CVE-2023-25165 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 1.7.3-8 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 1.7.3-7 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 1.7.3-6 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 1.7.3-5 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 1.7.3-4 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 1.7.3-3 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 1.7.3-2 -- Bump release to rebuild against Go 1.18.5 - -* Fri Aug 05 2022 Chris Gunn - 1.7.3-1 -- Update to v1.7.3 -- Split binaries into separate packages. - -* Tue Jun 14 2022 Muhammad Falak - 1.5.3-2 -- Add a hard BR on golang <= 1.17.10 -- Bump release to rebuild with golang 1.17.10 - -* Fri Sep 10 2021 Henry Li - 1.5.3-1 -- Original version for CBL-Mariner -- License Verified diff --git a/SPECS/cert-manager/generate_source_tarball.sh b/SPECS/cert-manager/generate_source_tarball.sh deleted file mode 100755 index 993e831002..0000000000 --- a/SPECS/cert-manager/generate_source_tarball.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -# Quit on failure -set -e - -PKG_VERSION="" -SRC_TARBALL="" -OUT_FOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# parameters: -# -# --srcTarball : src tarball file -# this file contains the 'initial' source code of the component -# and should be replaced with the new/modified src code -# --outFolder : folder where to copy the new tarball(s) -# --pkgVersion : package version -# -PARAMS="" -while (( "$#" )); do - case "$1" in - --srcTarball) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - SRC_TARBALL=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --outFolder) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - OUT_FOLDER=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --pkgVersion) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - PKG_VERSION=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - -*|--*=) # unsupported flags - echo "Error: Unsupported flag $1" >&2 - exit 1 - ;; - *) # preserve positional arguments - PARAMS="${PARAMS} $1" - shift - ;; - esac -done - -echo "--srcTarball -> ${SRC_TARBALL}" -echo "--outFolder -> ${OUT_FOLDER}" -echo "--pkgVersion -> ${PKG_VERSION}" - -if [ -z "${SRC_TARBALL}" ]; then - echo "--srcTarball parameter cannot be empty" - exit 1 -fi - -SRC_TARBALL=$(realpath "${SRC_TARBALL}") - -if [ -z "${PKG_VERSION}" ]; then - echo "--pkgVersion parameter cannot be empty" - exit 1 -fi - -echo "-- create temp folder" -tmpdir=$(mktemp -d) -function cleanup { - echo "+++ cleanup -> remove ${tmpdir}" - rm -rf ${tmpdir} -} -trap cleanup EXIT - -pushd "${tmpdir}" > /dev/null - -echo "Unpacking source tarball..." -tar -xf "${SRC_TARBALL}" - -cd "cert-manager-${PKG_VERSION}" - -# We need to individually vendor each cmd we will build -vendor_directories=() - -echo "Get vendored modules for each command" -for dir in cmd/*; do - if [ -d "${dir}" ]; then - echo "Vendoring '${dir}'" - pushd "${dir}" > /dev/null - go mod vendor - vendor_directories+=("${dir}/vendor") - popd > /dev/null - fi -done - -echo "Tar vendored modules" -VENDOR_TARBALL="${OUT_FOLDER}/cert-manager-${PKG_VERSION}-vendor.tar.gz" -tar --sort=name \ - --mtime="2021-04-26 00:00Z" \ - --owner=0 --group=0 --numeric-owner \ - --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ - -cf "${VENDOR_TARBALL}" ${vendor_directories[@]} - -popd > /dev/null -echo "cert-manager vendored modules are available at ${VENDOR_TARBALL}" diff --git a/SPECS/cf-cli/CVE-2024-45337.patch b/SPECS/cf-cli/CVE-2024-45337.patch deleted file mode 100644 index f7d2f6a672..0000000000 --- a/SPECS/cf-cli/CVE-2024-45337.patch +++ /dev/null @@ -1,77 +0,0 @@ -https://github.com/golang/crypto/commit/b4f1988a35dee11ec3e05d6bf3e90b695fbd8909.patch - -From b4f1988a35dee11ec3e05d6bf3e90b695fbd8909 Mon Sep 17 00:00:00 2001 -From: Roland Shoemaker -Date: Tue, 3 Dec 2024 09:03:03 -0800 -Subject: [PATCH] ssh: make the public key cache a 1-entry FIFO cache - -Users of the the ssh package seem to extremely commonly misuse the -PublicKeyCallback API, assuming that the key passed in the last call -before a connection is established is the key used for authentication. -Some users then make authorization decisions based on this key. This -property is not documented, and may not be correct, due to the caching -behavior of the package, resulting in users making incorrect -authorization decisions about the connection. - -This change makes the cache a one entry FIFO cache, making the assumed -property, that the last call to PublicKeyCallback represents the key -actually used for authentication, actually hold. - -Thanks to Damien Tournoud, Patrick Dawkins, Vince Parker, and -Jules Duvivier from the Platform.sh / Upsun engineering team -for reporting this issue. - -Fixes golang/go#70779 -Fixes CVE-2024-45337 - -Change-Id: Ife7c7b4045d8b6bcd7e3a417bdfae370c709797f -Reviewed-on: https://go-review.googlesource.com/c/crypto/+/635315 -Reviewed-by: Roland Shoemaker -Auto-Submit: Gopher Robot -Reviewed-by: Damien Neil -Reviewed-by: Nicola Murino -LUCI-TryBot-Result: Go LUCI ---- - vendor/golang.org/x/crypto/ssh/server.go | 15 ++++++++++---- - -diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go -index c0d1c29e6f..5b5ccd96f4 100644 ---- a/vendor/golang.org/x/crypto/ssh/server.go -+++ b/vendor/golang.org/x/crypto/ssh/server.go -@@ -142,7 +142,7 @@ func (s *ServerConfig) AddHostKey(key Signer) { - } - - // cachedPubKey contains the results of querying whether a public key is --// acceptable for a user. -+// acceptable for a user. This is a FIFO cache. - type cachedPubKey struct { - user string - pubKeyData []byte -@@ -150,7 +150,13 @@ type cachedPubKey struct { - perms *Permissions - } - --const maxCachedPubKeys = 16 -+// maxCachedPubKeys is the number of cache entries we store. -+// -+// Due to consistent misuse of the PublicKeyCallback API, we have reduced this -+// to 1, such that the only key in the cache is the most recently seen one. This -+// forces the behavior that the last call to PublicKeyCallback will always be -+// with the key that is used for authentication. -+const maxCachedPubKeys = 1 - - // pubKeyCache caches tests for public keys. Since SSH clients - // will query whether a public key is acceptable before attempting to -@@ -172,9 +178,10 @@ func (c *pubKeyCache) get(user string, pubKeyData []byte) (cachedPubKey, bool) { - - // add adds the given tuple to the cache. - func (c *pubKeyCache) add(candidate cachedPubKey) { -- if len(c.keys) < maxCachedPubKeys { -- c.keys = append(c.keys, candidate) -+ if len(c.keys) >= maxCachedPubKeys { -+ c.keys = c.keys[1:] - } -+ c.keys = append(c.keys, candidate) - } - - // ServerConn is an authenticated SSH connection, as seen from the diff --git a/SPECS/cf-cli/CVE-2024-45338.patch b/SPECS/cf-cli/CVE-2024-45338.patch deleted file mode 100644 index 1c967eac50..0000000000 --- a/SPECS/cf-cli/CVE-2024-45338.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 0d84094c36cc3a80da129773b966a3d5be4032ac Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Thu, 2 Jan 2025 10:22:13 +0000 -Subject: [PATCH] Fix CVE CVE-2024-45338 in cf-cli - ---- - vendor/golang.org/x/net/html/doctype.go | 2 +- - vendor/golang.org/x/net/html/foreign.go | 3 +-- - vendor/golang.org/x/net/html/parse.go | 4 ++-- - 3 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go -index c484e5a..bca3ae9 100644 ---- a/vendor/golang.org/x/net/html/doctype.go -+++ b/vendor/golang.org/x/net/html/doctype.go -@@ -87,7 +87,7 @@ func parseDoctype(s string) (n *Node, quirks bool) { - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && -- strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { -+ strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") { - quirks = true - } - } -diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go -index 9da9e9d..e8515d8 100644 ---- a/vendor/golang.org/x/net/html/foreign.go -+++ b/vendor/golang.org/x/net/html/foreign.go -@@ -40,8 +40,7 @@ func htmlIntegrationPoint(n *Node) bool { - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { -- val := strings.ToLower(a.Val) -- if val == "text/html" || val == "application/xhtml+xml" { -+ if strings.EqualFold(a.Val, "text/html") || strings.EqualFold(a.Val, "application/xhtml+xml") { - return true - } - } -diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go -index 46a89ed..5b8374b 100644 ---- a/vendor/golang.org/x/net/html/parse.go -+++ b/vendor/golang.org/x/net/html/parse.go -@@ -1031,7 +1031,7 @@ func inBodyIM(p *parser) bool { - if p.tok.DataAtom == a.Input { - for _, t := range p.tok.Attr { - if t.Key == "type" { -- if strings.ToLower(t.Val) == "hidden" { -+ if strings.EqualFold(t.Val, "hidden") { - // Skip setting framesetOK = false - return true - } -@@ -1459,7 +1459,7 @@ func inTableIM(p *parser) bool { - return inHeadIM(p) - case a.Input: - for _, t := range p.tok.Attr { -- if t.Key == "type" && strings.ToLower(t.Val) == "hidden" { -+ if t.Key == "type" && strings.EqualFold(t.Val, "hidden") { - p.addElement() - p.oe.pop() - return true --- -2.39.4 - diff --git a/SPECS/cf-cli/CVE-2025-22869.patch b/SPECS/cf-cli/CVE-2025-22869.patch deleted file mode 100644 index c0415fddb0..0000000000 --- a/SPECS/cf-cli/CVE-2025-22869.patch +++ /dev/null @@ -1,140 +0,0 @@ -From 041b89a18f81265899e42e6801f830c101a96120 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Sun, 2 Mar 2025 13:46:00 +0000 -Subject: [PATCH] CVE-2025-22869 - -Upstream Reference : https://github.com/golang/crypto/commit/7292932d45d55c7199324ab0027cc86e8198aa22 - -ssh: limit the size of the internal packet queue while waiting for KEX - -In the SSH protocol, clients and servers execute the key exchange to -generate one-time session keys used for encryption and authentication. -The key exchange is performed initially after the connection is -established and then periodically after a configurable amount of data. -While a key exchange is in progress, we add the received packets to an -internal queue until we receive SSH_MSG_KEXINIT from the other side. -This can result in high memory usage if the other party is slow to -respond to the SSH_MSG_KEXINIT packet, or memory exhaustion if a -malicious client never responds to an SSH_MSG_KEXINIT packet during a -large file transfer. -We now limit the internal queue to 64 packets: this means 2MB with the -typical 32KB packet size. -When the internal queue is full we block further writes until the -pending key exchange is completed or there is a read or write error. - -Thanks to Yuichi Watanabe for reporting this issue. - -Change-Id: I1ce2214cc16e08b838d4bc346c74c72addafaeec -Reviewed-on: https://go-review.googlesource.com/c/crypto/+/652135 -Reviewed-by: Neal Patel -Auto-Submit: Gopher Robot -Reviewed-by: Roland Shoemaker -LUCI-TryBot-Result: Go LUCI - ---- - vendor/golang.org/x/crypto/ssh/handshake.go | 47 ++++++++++++++++----- - 1 file changed, 37 insertions(+), 10 deletions(-) - -diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go -index 70a7369..e14eb6c 100644 ---- a/vendor/golang.org/x/crypto/ssh/handshake.go -+++ b/vendor/golang.org/x/crypto/ssh/handshake.go -@@ -24,6 +24,11 @@ const debugHandshake = false - // quickly. - const chanSize = 16 - -+// maxPendingPackets sets the maximum number of packets to queue while waiting -+// for KEX to complete. This limits the total pending data to maxPendingPackets -+// * maxPacket bytes, which is ~16.8MB. -+const maxPendingPackets = 64 -+ - // keyingTransport is a packet based transport that supports key - // changes. It need not be thread-safe. It should pass through - // msgNewKeys in both directions. -@@ -58,11 +63,19 @@ type handshakeTransport struct { - incoming chan []byte - readError error - -- mu sync.Mutex -- writeError error -- sentInitPacket []byte -- sentInitMsg *kexInitMsg -- pendingPackets [][]byte // Used when a key exchange is in progress. -+ mu sync.Mutex -+ // Condition for the above mutex. It is used to notify a completed key -+ // exchange or a write failure. Writes can wait for this condition while a -+ // key exchange is in progress. -+ writeCond *sync.Cond -+ writeError error -+ sentInitPacket []byte -+ sentInitMsg *kexInitMsg -+ // Used to queue writes when a key exchange is in progress. The length is -+ // limited by pendingPacketsSize. Once full, writes will block until the key -+ // exchange is completed or an error occurs. If not empty, it is emptied -+ // all at once when the key exchange is completed in kexLoop. -+ pendingPackets [][]byte - writePacketsLeft uint32 - writeBytesLeft int64 - -@@ -114,6 +127,7 @@ func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, - - config: config, - } -+ t.writeCond = sync.NewCond(&t.mu) - t.resetReadThresholds() - t.resetWriteThresholds() - -@@ -236,6 +250,7 @@ func (t *handshakeTransport) recordWriteError(err error) { - defer t.mu.Unlock() - if t.writeError == nil && err != nil { - t.writeError = err -+ t.writeCond.Broadcast() - } - } - -@@ -339,6 +354,8 @@ write: - } - } - t.pendingPackets = t.pendingPackets[:0] -+ // Unblock writePacket if waiting for KEX. -+ t.writeCond.Broadcast() - t.mu.Unlock() - } - -@@ -526,11 +543,20 @@ func (t *handshakeTransport) writePacket(p []byte) error { - } - - if t.sentInitMsg != nil { -- // Copy the packet so the writer can reuse the buffer. -- cp := make([]byte, len(p)) -- copy(cp, p) -- t.pendingPackets = append(t.pendingPackets, cp) -- return nil -+ if len(t.pendingPackets) < maxPendingPackets { -+ // Copy the packet so the writer can reuse the buffer. -+ cp := make([]byte, len(p)) -+ copy(cp, p) -+ t.pendingPackets = append(t.pendingPackets, cp) -+ return nil -+ } -+ for t.sentInitMsg != nil { -+ // Block and wait for KEX to complete or an error. -+ t.writeCond.Wait() -+ if t.writeError != nil { -+ return t.writeError -+ } -+ } - } - - if t.writeBytesLeft > 0 { -@@ -547,6 +573,7 @@ func (t *handshakeTransport) writePacket(p []byte) error { - - if err := t.pushPacket(p); err != nil { - t.writeError = err -+ t.writeCond.Broadcast() - } - - return nil --- -2.45.2 - diff --git a/SPECS/cf-cli/CVE-2025-22872.patch b/SPECS/cf-cli/CVE-2025-22872.patch deleted file mode 100644 index c86baa1694..0000000000 --- a/SPECS/cf-cli/CVE-2025-22872.patch +++ /dev/null @@ -1,42 +0,0 @@ -From c87c77a12e5554d376945bd488e56d4fc5b9e5ac Mon Sep 17 00:00:00 2001 -From: archana25-ms -Date: Tue, 22 Apr 2025 06:32:35 +0000 -Subject: [PATCH] Address CVE-2025-22872 -Upstream Patch Reference: https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9 - ---- - vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index 3c57880..6598c1f 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType { - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } -- // Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken --- -2.45.3 - diff --git a/SPECS/cf-cli/cf-cli.signatures.json b/SPECS/cf-cli/cf-cli.signatures.json deleted file mode 100644 index 0630944b2d..0000000000 --- a/SPECS/cf-cli/cf-cli.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "cli-8.7.11-vendor.tar.gz": "06cabd44750d1ab744d8675282d491591be596ffa43beab75e0545bc6608fbd3", - "cli-8.7.11.tar.gz": "ac3743d703b27f8fc72ac860dc750cf47344b7a171b99ade798a1b79849734be" - } -} diff --git a/SPECS/cf-cli/cf-cli.spec b/SPECS/cf-cli/cf-cli.spec deleted file mode 100644 index 1a9dca2739..0000000000 --- a/SPECS/cf-cli/cf-cli.spec +++ /dev/null @@ -1,150 +0,0 @@ -# NOTE(mfrw): Modify the CF_BUILD_SHA by running: `git rev-parse --short HEAD` on the release -%global cf_build_sha b1b4068ff - -Summary: The official command line client for Cloud Foundry. -Name: cf-cli -# Note: Upgrading the package also warrants an upgrade in the CF_BUILD_SHA -Version: 8.7.11 -Release: 5%{?dist} -License: Apache-2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Applications/Tools -URL: https://github.com/cloudfoundry/cli -Source0: https://github.com/cloudfoundry/cli/archive/refs/tags/v%{version}.tar.gz#/cli-%{version}.tar.gz -# Below is a manually created tarball, no download link. -# We're using pre-populated Go modules from this tarball, since network is disabled during build time. -# How to re-build this file: -# 1. wget https://github.com/cloudfoundry/cli/archive/refs/tags/v%%{version}.tar.gz -O cli-%%{version}.tar.gz -# 2. tar -xf cli-%%{version}.tar.gz -# 3. cd cli-%%{version} -# 4. go mod vendor -# 5. tar --sort=name \ -# --mtime="2021-04-26 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cf cli-%%{version}-vendor.tar.gz vendor -# -# NOTES: -# - You require GNU tar version 1.28+. -# - The additional options enable generation of a tarball with the same hash every time regardless of the environment. -# See: https://reproducible-builds.org/docs/archives/ -# - For the value of "--mtime" use the date "2021-04-26 00:00Z" to simplify future updates. -Source1: cli-%{version}-vendor.tar.gz - -Patch0: CVE-2024-45337.patch -Patch1: CVE-2024-45338.patch -Patch2: CVE-2025-22869.patch -Patch3: CVE-2025-22872.patch - -BuildRequires: golang < 1.25 -%global debug_package %{nil} -%define our_gopath %{_topdir}/.gopath - -%description -The official command line client for Cloud Foundry. - -%prep -%setup -q -n cli-%{version} -tar --no-same-owner -xf %{SOURCE1} -%autopatch -p1 - -%build -export GOPATH=%{our_gopath} -# No mod download use vendor cache locally -sed -i 's/GOFLAGS := -mod=mod/GOFLAGS := -mod=vendor/' ./Makefile -make build CF_BUILD_SHA=%{cf_build_sha} - -%install -install -m 755 -d %{buildroot}%{_bindir} -install -p -m 755 -t %{buildroot}%{_bindir} ./out/cf - -%check -./out/cf --version - -%files -%defattr(-,root,root) -%license LICENSE -%doc NOTICE README.md -%{_bindir}/cf - -%changelog -* Fri Oct 3 2025 Lee Chee Yang - 8.7.11-5 -- merge from Azure Linux 3.0.20250910-3.0 -- Set BR for golang to < 1.25 - -* Fri May 30 2025 Ranjan Dutta - 8.7.11-4 -- merge from Azure Linux 3.0.20250521-3.0 -- Fix CVE-2025-22872 with an upstream patch - -* Fri Mar 21 2025 Anuj Mittal - 8.7.11-3 -- Bump Release to rebuild - -* Mon Mar 03 2025 Kanishk Bansal - 8.7.11-2 -- Fix CVE-2025-22869 with an upstream patch - -* Wed Feb 26 2025 CBL-Mariner Servicing Account - 8.7.11-1 -- Auto-upgrade to 8.7.11 - address CVE-2023-44487 - -* Fri Feb 14 2025 Kanishk Bansal - 8.7.3-6 -- Address CVE-2023-45288 - -* Tue Dec 31 2024 Rohit Rawat - 8.7.3-5 -- Add patch for CVE-2024-45338 - -* Fri Dec 20 2024 Aurelien Bombo - 8.7.3-4 -- Add patch for CVE-2024-45337 - -* Mon Nov 25 2024 Bala - 8.7.3-3 -- Fix CVE-2024-24786 - -* Mon Jul 29 2024 Muhammad Falak - 8.7.3-2 -- Fix CF_BUILD_SHA to have correct build sha in the binary -- Move Source1 un-taring in prep section -- Address CVE-2023-39325 - -* Fri Oct 27 2023 CBL-Mariner Servicing Account - 8.7.3-1 -- Auto-upgrade to 8.7.3 - Azure Linux 3.0 - package upgrades - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 8.4.0-14 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 8.4.0-13 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 8.4.0-12 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 8.4.0-11 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 8.4.0-10 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 8.4.0-9 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 8.4.0-8 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 8.4.0-7 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 8.4.0-6 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 8.4.0-5 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 8.4.0-4 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 8.4.0-3 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 8.4.0-2 -- Bump release to rebuild against Go 1.18.5 - -* Fri Jun 24 2022 Suresh Babu Chalamalasetty - 8.4.0-1 -- Original version for CBL-Mariner. -- License verified. diff --git a/SPECS/cni-plugins/CVE-2024-45338.patch b/SPECS/cni-plugins/CVE-2024-45338.patch deleted file mode 100644 index c2fb46031c..0000000000 --- a/SPECS/cni-plugins/CVE-2024-45338.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 8e66b04771e35c4e4125e8c60334b34e2423effb Mon Sep 17 00:00:00 2001 -From: Roland Shoemaker -Date: Wed, 04 Dec 2024 09:35:55 -0800 -Subject: [PATCH] html: use strings.EqualFold instead of lowering ourselves - -Instead of using strings.ToLower and == to check case insensitive -equality, just use strings.EqualFold, even when the strings are only -ASCII. This prevents us unnecessarily lowering extremely long strings, -which can be a somewhat expensive operation, even if we're only -attempting to compare equality with five characters. - -Thanks to Guido Vranken for reporting this issue. - -Fixes golang/go#70906 -Fixes CVE-2024-45338 - -Change-Id: I323b919f912d60dab6a87cadfdcac3e6b54cd128 -Reviewed-on: https://go-review.googlesource.com/c/net/+/637536 -LUCI-TryBot-Result: Go LUCI -Auto-Submit: Gopher Robot -Reviewed-by: Roland Shoemaker -Reviewed-by: Tatiana Bradley ---- - vendor/golang.org/x/net/html/doctype.go | 2 +- - vendor/golang.org/x/net/html/foreign.go | 3 +-- - vendor/golang.org/x/net/html/parse.go | 4 ++-- - 3 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go -index c484e5a..bca3ae9 100644 ---- a/vendor/golang.org/x/net/html/doctype.go -+++ b/vendor/golang.org/x/net/html/doctype.go -@@ -87,7 +87,7 @@ func parseDoctype(s string) (n *Node, quirks bool) { - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && -- strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { -+ strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") { - quirks = true - } - } -diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go -index 9da9e9d..e8515d8 100644 ---- a/vendor/golang.org/x/net/html/foreign.go -+++ b/vendor/golang.org/x/net/html/foreign.go -@@ -40,8 +40,7 @@ func htmlIntegrationPoint(n *Node) bool { - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { -- val := strings.ToLower(a.Val) -- if val == "text/html" || val == "application/xhtml+xml" { -+ if strings.EqualFold(a.Val, "text/html") || strings.EqualFold(a.Val, "application/xhtml+xml") { - return true - } - } -diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go -index 038941d..cb012d8 100644 ---- a/vendor/golang.org/x/net/html/parse.go -+++ b/vendor/golang.org/x/net/html/parse.go -@@ -1031,7 +1031,7 @@ func inBodyIM(p *parser) bool { - if p.tok.DataAtom == a.Input { - for _, t := range p.tok.Attr { - if t.Key == "type" { -- if strings.ToLower(t.Val) == "hidden" { -+ if strings.EqualFold(t.Val, "hidden") { - // Skip setting framesetOK = false - return true - } -@@ -1459,7 +1459,7 @@ func inTableIM(p *parser) bool { - return inHeadIM(p) - case a.Input: - for _, t := range p.tok.Attr { -- if t.Key == "type" && strings.ToLower(t.Val) == "hidden" { -+ if t.Key == "type" && strings.EqualFold(t.Val, "hidden") { - p.addElement() - p.oe.pop() - return true --- -2.25.1 - diff --git a/SPECS/cni-plugins/CVE-2025-22872.patch b/SPECS/cni-plugins/CVE-2025-22872.patch deleted file mode 100644 index 2d63a81790..0000000000 --- a/SPECS/cni-plugins/CVE-2025-22872.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 1c0308205a333d387cf0ad2ddd9e7bec8d5f21b2 Mon Sep 17 00:00:00 2001 -From: Sreenivasulu Malavathula -Date: Mon, 28 Apr 2025 17:40:01 -0500 -Subject: [PATCH] Address CVE-2025-22872 -Upstream Patch Reference: https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9 - ---- - vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index de67f93..9bbdf7d 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType { - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } -- // Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken --- -2.45.2 - diff --git a/SPECS/cni-plugins/cni-plugins.signatures.json b/SPECS/cni-plugins/cni-plugins.signatures.json deleted file mode 100644 index 7d28f002cb..0000000000 --- a/SPECS/cni-plugins/cni-plugins.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "cni-plugins-1.4.0.tar.gz": "890e00a8ffc71c860e4f09ab4e1c452d85ec18cc4ac8ee3da11bbfc113355f5e" - } -} diff --git a/SPECS/cni-plugins/cni-plugins.spec b/SPECS/cni-plugins/cni-plugins.spec deleted file mode 100644 index 69de7da7ff..0000000000 --- a/SPECS/cni-plugins/cni-plugins.spec +++ /dev/null @@ -1,136 +0,0 @@ -Summary: Container Network Interface (CNI) plugins -Name: cni-plugins -Version: 1.4.0 -Release: 4%{?dist} -License: ASL 2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Development/Tools -# cni moved to https://github.com/containernetworking/cni/issues/667#issuecomment-491693752 -URL: https://github.com/containernetworking/plugins -#Source0: https://github.com/containernetworking/plugins/archive/v%{version}.tar.gz -Source0: %{name}-%{version}.tar.gz -Patch0: CVE-2024-45338.patch -Patch1: CVE-2025-22872.patch - -%define _default_cni_plugins_dir /opt/cni/bin -BuildRequires: golang >= 1.5 -Provides: kubernetes-cni - -%description -The CNI (Container Network Interface) project consists of a specification and libraries for writing plugins to configure network interfaces in Linux containers, along with a number of supported plugins. - -%prep -%autosetup -p1 -n plugins-%{version} - -%build -./build_linux.sh -ldflags "-X github.com/containernetworking/plugins/pkg/utils/buildversion.BuildVersion=v%{version}" - -%install -install -vdm 755 %{buildroot}%{_default_cni_plugins_dir} -install -vpm 0755 -t %{buildroot}%{_default_cni_plugins_dir} bin/* - -%check -make -k check |& tee %{_specdir}/%{name}-check-log || %{nocheck} - -%post -%postun - -%files -%defattr(-,root,root) -%license LICENSE -%{_default_cni_plugins_dir}/* - -%changelog -* Fri May 30 2025 Ranjan Dutta - 1.4.0-4 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22872 - -* Fri Mar 21 2025 Anuj Mittal - 1.4.0-3 -- Bump Release to rebuild - -* Thu Jan 23 2024 Kavya Sree Kaitepalli - 1.4.0-2 -- Patch CVE-2024-45338 - -* Mon Feb 12 2024 Betty Lakes - 1.4.0-1 -- Upgrade to version 1.4.0 - -* Wed Oct 18 2023 Mateusz Gozdek - 1.3.0-1 -- Make plugin binaries correctly print version -- Upgrade to version 1.3.0 - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 0.9.1-16 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 0.9.1-15 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 0.9.1-14 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 0.9.1-13 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 0.9.1-12 -- Bump release to rebuild with go 1.19.10 - -* Mon May 22 2023 Betty Lakes - 0.9.1-11 -- Added Provides for kubernetes-cni - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 0.9.1-10 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 0.9.1-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 0.9.1-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 0.9.1-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 0.9.1-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 0.9.1-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 0.9.1-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 0.9.1-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 0.9.1-2 -- Bump release to rebuild with golang 1.18.3 - -* Tue Aug 17 2021 Henry Li - 0.8.1-1 -- Rename package name from cni to cni-plugins -- Upgrade to version 0.9.1 - -* Thu Dec 10 2020 Andrew Phelps 0.7.5-5 -- Increment release to force republishing using golang 1.15. - -* Sat May 09 2020 Nick Samson 0.7.5-4 -- Added %%license line automatically - -* Thu Apr 30 2020 Emre Girgin 0.7.5-3 -- Renaming go to golang - -* Tue Mar 07 2020 Paul Monson 0.7.5-3 -- Fix Source0. License verified. - -* Tue Sep 03 2019 Mateusz Malisz 0.7.5-2 -- Initial CBL-Mariner import from Photon (license: Apache2). - -* Tue Apr 02 2019 Ashwin H 0.7.5-1 -- Update cni to v0.7.5 - -* Tue Dec 05 2017 Vinay Kulkarni 0.6.0-1 -- cni v0.6.0. - -* Fri Apr 7 2017 Alexey Makhalov 0.5.1-1 -- Version update - -* Thu Feb 16 2017 Vinay Kulkarni 0.4.0-1 -- Add CNI plugins package to PhotonOS. diff --git a/SPECS/cni/99-loopback.conf b/SPECS/cni/99-loopback.conf deleted file mode 100644 index 9e0b1aba98..0000000000 --- a/SPECS/cni/99-loopback.conf +++ /dev/null @@ -1,4 +0,0 @@ -{ - "cniVersion": "0.4.0", - "type": "loopback" -} diff --git a/SPECS/cni/CVE-2021-38561.patch b/SPECS/cni/CVE-2021-38561.patch deleted file mode 100644 index 135acb405a..0000000000 --- a/SPECS/cni/CVE-2021-38561.patch +++ /dev/null @@ -1,170 +0,0 @@ -From 383b2e75a7a4198c42f8f87833eefb772868a56f Mon Sep 17 00:00:00 2001 -From: Russ Cox -Date: Mon, 9 Aug 2021 15:09:12 -0400 -Subject: [PATCH] language: turn parsing panics into ErrSyntax - -We keep finding new panics in the language parser. -Limit the damage by reporting those inputs as syntax errors. - -Change-Id: I786fe127c3df7e4c8e042d15095d3acf3c4e4a50 -Reviewed-on: https://go-review.googlesource.com/c/text/+/340830 -Trust: Russ Cox -Run-TryBot: Russ Cox -TryBot-Result: Go Bot -Reviewed-by: Roland Shoemaker ---- - internal/language/language.go | 43 +++++++++++++++++++++++++++++++---- - internal/language/parse.go | 7 ++++++ - language/parse.go | 22 ++++++++++++++++++ - 3 files changed, 68 insertions(+), 4 deletions(-) - -diff --git a/vendor/golang.org/x/text/internal/language/language.go b/vendor/golang.org/x/text/internal/language/language.go -index f41aedc..6105bc7 100644 ---- a/vendor/golang.org/x/text/internal/language/language.go -+++ b/vendor/golang.org/x/text/internal/language/language.go -@@ -251,6 +251,13 @@ func (t Tag) Parent() Tag { - - // ParseExtension parses s as an extension and returns it on success. - func ParseExtension(s string) (ext string, err error) { -+ defer func() { -+ if recover() != nil { -+ ext = "" -+ err = ErrSyntax -+ } -+ }() -+ - scan := makeScannerString(s) - var end int - if n := len(scan.token); n != 1 { -@@ -461,7 +468,14 @@ func (t Tag) findTypeForKey(key string) (start, sep, end int, hasExt bool) { - // ParseBase parses a 2- or 3-letter ISO 639 code. - // It returns a ValueError if s is a well-formed but unknown language identifier - // or another error if another error occurred. --func ParseBase(s string) (Language, error) { -+func ParseBase(s string) (l Language, err error) { -+ defer func() { -+ if recover() != nil { -+ l = 0 -+ err = ErrSyntax -+ } -+ }() -+ - if n := len(s); n < 2 || 3 < n { - return 0, ErrSyntax - } -@@ -472,7 +486,14 @@ func ParseBase(s string) (Language, error) { - // ParseScript parses a 4-letter ISO 15924 code. - // It returns a ValueError if s is a well-formed but unknown script identifier - // or another error if another error occurred. --func ParseScript(s string) (Script, error) { -+func ParseScript(s string) (scr Script, err error) { -+ defer func() { -+ if recover() != nil { -+ scr = 0 -+ err = ErrSyntax -+ } -+ }() -+ - if len(s) != 4 { - return 0, ErrSyntax - } -@@ -489,7 +510,14 @@ func EncodeM49(r int) (Region, error) { - // ParseRegion parses a 2- or 3-letter ISO 3166-1 or a UN M.49 code. - // It returns a ValueError if s is a well-formed but unknown region identifier - // or another error if another error occurred. --func ParseRegion(s string) (Region, error) { -+func ParseRegion(s string) (r Region, err error) { -+ defer func() { -+ if recover() != nil { -+ r = 0 -+ err = ErrSyntax -+ } -+ }() -+ - if n := len(s); n < 2 || 3 < n { - return 0, ErrSyntax - } -@@ -578,7 +606,14 @@ type Variant struct { - - // ParseVariant parses and returns a Variant. An error is returned if s is not - // a valid variant. --func ParseVariant(s string) (Variant, error) { -+func ParseVariant(s string) (v Variant, err error) { -+ defer func() { -+ if recover() != nil { -+ v = Variant{} -+ err = ErrSyntax -+ } -+ }() -+ - s = strings.ToLower(s) - if id, ok := variantIndex[s]; ok { - return Variant{id, s}, nil -diff --git a/vendor/golang.org/x/text/internal/language/parse.go b/vendor/golang.org/x/text/internal/language/parse.go -index c696fd0..47ee0fe 100644 ---- a/vendor/golang.org/x/text/internal/language/parse.go -+++ b/vendor/golang.org/x/text/internal/language/parse.go -@@ -232,6 +232,13 @@ func Parse(s string) (t Tag, err error) { - if s == "" { - return Und, ErrSyntax - } -+ defer func() { -+ if recover() != nil { -+ t = Und -+ err = ErrSyntax -+ return -+ } -+ }() - if len(s) <= maxAltTaglen { - b := [maxAltTaglen]byte{} - for i, c := range s { -diff --git a/vendor/golang.org/x/text/language/parse.go b/vendor/golang.org/x/text/language/parse.go -index 11acfd8..59b0410 100644 ---- a/vendor/golang.org/x/text/language/parse.go -+++ b/vendor/golang.org/x/text/language/parse.go -@@ -43,6 +43,13 @@ func Parse(s string) (t Tag, err error) { - // https://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. - // The resulting tag is canonicalized using the canonicalization type c. - func (c CanonType) Parse(s string) (t Tag, err error) { -+ defer func() { -+ if recover() != nil { -+ t = Tag{} -+ err = language.ErrSyntax -+ } -+ }() -+ - tt, err := language.Parse(s) - if err != nil { - return makeTag(tt), err -@@ -79,6 +86,13 @@ func Compose(part ...interface{}) (t Tag, err error) { - // tag is returned after canonicalizing using CanonType c. If one or more errors - // are encountered, one of the errors is returned. - func (c CanonType) Compose(part ...interface{}) (t Tag, err error) { -+ defer func() { -+ if recover() != nil { -+ t = Tag{} -+ err = language.ErrSyntax -+ } -+ }() -+ - var b language.Builder - if err = update(&b, part...); err != nil { - return und, err -@@ -142,6 +156,14 @@ var errInvalidWeight = errors.New("ParseAcceptLanguage: invalid weight") - // Tags with a weight of zero will be dropped. An error will be returned if the - // input could not be parsed. - func ParseAcceptLanguage(s string) (tag []Tag, q []float32, err error) { -+ defer func() { -+ if recover() != nil { -+ tag = nil -+ q = nil -+ err = language.ErrSyntax -+ } -+ }() -+ - var entry string - for s != "" { - if entry, s = split(s, ','); entry == "" { --- -2.34.1 - diff --git a/SPECS/cni/CVE-2022-29526.patch b/SPECS/cni/CVE-2022-29526.patch deleted file mode 100644 index dfba477696..0000000000 --- a/SPECS/cni/CVE-2022-29526.patch +++ /dev/null @@ -1,47 +0,0 @@ -From e13d51dae376f08ea381869af4880ca312111086 Mon Sep 17 00:00:00 2001 -From: Damien Neil -Date: Tue, 12 Apr 2022 13:38:17 -0700 -Subject: [PATCH] [release-branch.go1.17] syscall: check correct group in - Faccessat - -The Faccessat call checks the user, group, or other permission bits of a -file to see if the calling process can access it. The test to see if the -group permissions should be used was made with the wrong group id, using -the process's group id rather than the file's group id. Fix this to use -the correct group id. - -No test since we cannot easily change file permissions when not running -as root and the test is meaningless if running as root. - -For #52313 -Fixes #52439 - -Change-Id: I4e2c84754b0af7830b40fd15dedcbc58374d75ee -Reviewed-on: https://go-review.googlesource.com/c/go/+/399539 -Reviewed-by: Ian Lance Taylor -Run-TryBot: Ian Lance Taylor -TryBot-Result: Gopher Robot -(cherry picked from commit f66925e854e71e0c54b581885380a490d7afa30c) -Reviewed-on: https://go-review.googlesource.com/c/go/+/401078 -Auto-Submit: Tatiana Bradley -Run-TryBot: Tatiana Bradley -Run-TryBot: Damien Neil -Auto-Submit: Damien Neil -Reviewed-by: Tatiana Bradley ---- - vendor/golang.org/x/sys/unix/syscall_linux.go | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/syscall/syscall_linux.go b/src/syscall/syscall_linux.go -index 3041f6f8fceda7..b2cc53e5c0dbe3 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux.go -@@ -106,7 +106,7 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { - gid = Getgid() - } - -- if uint32(gid) == st.Gid || isGroupMember(gid) { -+ if uint32(gid) == st.Gid || isGroupMember(int(st.Gid)) { - fmode = (st.Mode >> 3) & 7 - } else { - fmode = st.Mode & 7 diff --git a/SPECS/cni/CVE-2022-32149.patch b/SPECS/cni/CVE-2022-32149.patch deleted file mode 100644 index 7938e0831b..0000000000 --- a/SPECS/cni/CVE-2022-32149.patch +++ /dev/null @@ -1,65 +0,0 @@ -From a47ab91255e04dda4ca0d734afef58216c7479a2 Mon Sep 17 00:00:00 2001 -From: Roland Shoemaker -Date: Fri, 2 Sep 2022 09:35:37 -0700 -Subject: [PATCH] language: reject excessively large Accept-Language strings - -Backported to apply on vendor direcotry by @mfrw - -The BCP 47 tag parser has quadratic time complexity due to inherent -aspects of its design. Since the parser is, by design, exposed to -untrusted user input, this can be leveraged to force a program to -consume significant time parsing Accept-Language headers. - -The parser cannot be easily rewritten to fix this behavior for -various reasons. Instead the solution implemented in this CL is to -limit the total complexity of tags passed into ParseAcceptLanguage -by limiting the number of dashes in the string to 1000. This should -be more than enough for the majority of real world use cases, where -the number of tags being sent is likely to be in the single digits. - -Thanks to the OSS-Fuzz project for discovering this issue and to Adam -Korczynski (ADA Logics) for writing the fuzz case and for reporting the -issue. - -Fixes CVE-2022-32149 -Fixes golang/go#56152 - -Change-Id: I7bda1d84cee2b945039c203f26869d58ee9374ae -Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1565112 -Reviewed-by: Damien Neil -Reviewed-by: Tatiana Bradley -Reviewed-on: https://go-review.googlesource.com/c/text/+/442235 -TryBot-Result: Gopher Robot -Auto-Submit: Roland Shoemaker -Run-TryBot: Roland Shoemaker -Signed-off-by: Muhammad Falak R Wani ---- - vendor/golang.org/x/text/language/parse.go | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/vendor/golang.org/x/text/language/parse.go b/vendor/golang.org/x/text/language/parse.go -index 59b0410..b982d9e 100644 ---- a/vendor/golang.org/x/text/language/parse.go -+++ b/vendor/golang.org/x/text/language/parse.go -@@ -147,6 +147,7 @@ func update(b *language.Builder, part ...interface{}) (err error) { - } - - var errInvalidWeight = errors.New("ParseAcceptLanguage: invalid weight") -+var errTagListTooLarge = errors.New("tag list exceeds max length") - - // ParseAcceptLanguage parses the contents of an Accept-Language header as - // defined in http://www.ietf.org/rfc/rfc2616.txt and returns a list of Tags and -@@ -164,6 +165,10 @@ func ParseAcceptLanguage(s string) (tag []Tag, q []float32, err error) { - } - }() - -+ if strings.Count(s, "-") > 1000 { -+ return nil, nil, errTagListTooLarge -+ } -+ - var entry string - for s != "" { - if entry, s = split(s, ','); entry == "" { --- -2.40.1 - diff --git a/SPECS/cni/CVE-2024-45338.patch b/SPECS/cni/CVE-2024-45338.patch deleted file mode 100644 index c2fb46031c..0000000000 --- a/SPECS/cni/CVE-2024-45338.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 8e66b04771e35c4e4125e8c60334b34e2423effb Mon Sep 17 00:00:00 2001 -From: Roland Shoemaker -Date: Wed, 04 Dec 2024 09:35:55 -0800 -Subject: [PATCH] html: use strings.EqualFold instead of lowering ourselves - -Instead of using strings.ToLower and == to check case insensitive -equality, just use strings.EqualFold, even when the strings are only -ASCII. This prevents us unnecessarily lowering extremely long strings, -which can be a somewhat expensive operation, even if we're only -attempting to compare equality with five characters. - -Thanks to Guido Vranken for reporting this issue. - -Fixes golang/go#70906 -Fixes CVE-2024-45338 - -Change-Id: I323b919f912d60dab6a87cadfdcac3e6b54cd128 -Reviewed-on: https://go-review.googlesource.com/c/net/+/637536 -LUCI-TryBot-Result: Go LUCI -Auto-Submit: Gopher Robot -Reviewed-by: Roland Shoemaker -Reviewed-by: Tatiana Bradley ---- - vendor/golang.org/x/net/html/doctype.go | 2 +- - vendor/golang.org/x/net/html/foreign.go | 3 +-- - vendor/golang.org/x/net/html/parse.go | 4 ++-- - 3 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go -index c484e5a..bca3ae9 100644 ---- a/vendor/golang.org/x/net/html/doctype.go -+++ b/vendor/golang.org/x/net/html/doctype.go -@@ -87,7 +87,7 @@ func parseDoctype(s string) (n *Node, quirks bool) { - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && -- strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { -+ strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") { - quirks = true - } - } -diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go -index 9da9e9d..e8515d8 100644 ---- a/vendor/golang.org/x/net/html/foreign.go -+++ b/vendor/golang.org/x/net/html/foreign.go -@@ -40,8 +40,7 @@ func htmlIntegrationPoint(n *Node) bool { - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { -- val := strings.ToLower(a.Val) -- if val == "text/html" || val == "application/xhtml+xml" { -+ if strings.EqualFold(a.Val, "text/html") || strings.EqualFold(a.Val, "application/xhtml+xml") { - return true - } - } -diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go -index 038941d..cb012d8 100644 ---- a/vendor/golang.org/x/net/html/parse.go -+++ b/vendor/golang.org/x/net/html/parse.go -@@ -1031,7 +1031,7 @@ func inBodyIM(p *parser) bool { - if p.tok.DataAtom == a.Input { - for _, t := range p.tok.Attr { - if t.Key == "type" { -- if strings.ToLower(t.Val) == "hidden" { -+ if strings.EqualFold(t.Val, "hidden") { - // Skip setting framesetOK = false - return true - } -@@ -1459,7 +1459,7 @@ func inTableIM(p *parser) bool { - return inHeadIM(p) - case a.Input: - for _, t := range p.tok.Attr { -- if t.Key == "type" && strings.ToLower(t.Val) == "hidden" { -+ if t.Key == "type" && strings.EqualFold(t.Val, "hidden") { - p.addElement() - p.oe.pop() - return true --- -2.25.1 - diff --git a/SPECS/cni/build.sh b/SPECS/cni/build.sh deleted file mode 100644 index 024b8d7603..0000000000 --- a/SPECS/cni/build.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash -set -e - -ORG_PATH="github.com/containernetworking" -REPO_PATH="${ORG_PATH}/cni" - -if [ ! -h gopath/src/${REPO_PATH} ]; then - mkdir -p gopath/src/${ORG_PATH} - ln -s ../../../.. gopath/src/${REPO_PATH} || exit 255 -fi - -export GO17VENDOREXPERIMENT=1 -export GOPATH=${PWD}/gopath - -echo "Building API" -go build -mod vendor -v -buildmode=pie "$@" ${REPO_PATH}/libcni - -echo "Building reference CLI" -go build -mod vendor -v -buildmode=pie -o ${PWD}/bin/cnitool "$@" ${REPO_PATH}/cnitool - -echo "Building plugins" -PLUGINS="plugins/test/*" -for d in $PLUGINS; do - if [ -d $d ]; then - plugin=$(basename $d) - echo " " $plugin - go build -mod vendor -v -buildmode=pie -o ${PWD}/bin/$plugin "$@" ${REPO_PATH}/$d - fi -done diff --git a/SPECS/cni/cni.signatures.json b/SPECS/cni/cni.signatures.json deleted file mode 100644 index 78df0b264e..0000000000 --- a/SPECS/cni/cni.signatures.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Signatures": { - "99-loopback.conf": "82e03a3292ca327bcc86af3664a0d7b110cb1c39bca16d3cc703abd49c3c9a1b", - "build.sh": "1fc4529fae5bdf52cf6b9e5eb603c7703046f35e76c6c3a525085c63ef55a7ff", - "cni-1.1.2-vendor.tar.gz": "7a103582845d2a3a8a803f830bb0badf41c2db860a982541aba179f4d5f9ba97", - "cni-1.1.2.tar.gz": "7d4bcaf83acdd54b3dc216f7aa5b5e1b32cb797d9c6af601a2c26b97470ed743" - } -} diff --git a/SPECS/cni/cni.spec b/SPECS/cni/cni.spec deleted file mode 100644 index efc2bf927a..0000000000 --- a/SPECS/cni/cni.spec +++ /dev/null @@ -1,399 +0,0 @@ -# -# spec file for package cni -# -# Copyright (c) 2021 SUSE LLC -# -# All modifications and additions to the file contributed by third parties -# remain the property of their copyright owners, unless otherwise agreed -# upon. The license for this file, and modifications and additions to the -# file, is the same license as for the pristine package itself (unless the -# license for the pristine package is not an Open Source License, in which -# case the license is the MIT License). An "Open Source License" is a -# license that conforms to the Open Source Definition (Version 1.9) -# published by the Open Source Initiative. - -# Please submit bugfixes or comments via https://bugs.opensuse.org/ -# - - -%define cni_etc_dir %{_sysconfdir}/cni -%define cni_bin_dir %{_libexecdir}/cni -%define cni_doc_dir %{_docdir}/cni -# Remove stripping of Go binaries. -%define __arch_install_post export NO_BRP_STRIP_DEBUG=true -Summary: Container Network Interface - networking for Linux containers -Name: cni -Version: 1.1.2 -Release: 5%{?dist} -License: Apache-2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: System/Management -URL: https://github.com/containernetworking/cni -#Source0: https://github.com/containernetworking/cni/archive/refs/tags/v%{version}.tar.gz -Source0: %{name}-%{version}.tar.gz -Source1: 99-loopback.conf -Source2: build.sh -# Below is a manually created tarball, no download link. -# We're using pre-populated Go modules from this tarball, since network is disabled during build time. -# How to re-build this file: -# 1. wget https://github.com/containernetworking/cni/archive/refs/tags/v1.0.1.tar.gz -o %%{name}-%%{version}.tar.gz -# 2. tar -xf %%{name}-%%{version}.tar.gz -# 3. cd %%{name}-%%{version} -# 4. go mod vendor -# 5. tar --sort=name \ -# --mtime="2021-04-26 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cf %%{name}-%%{version}-vendor.tar.gz vendor -# -Source3: %{name}-%{version}-vendor.tar.gz -Patch0: CVE-2021-38561.patch -Patch1: CVE-2022-32149.patch -Patch2: CVE-2024-45338.patch -Patch3: CVE-2022-29526.patch -BuildRequires: golang -BuildRequires: systemd-rpm-macros -BuildRequires: xz -Requires: systemd -Requires(post): %fillup_prereq -Recommends: cni-plugins - -%description -The CNI (Container Network Interface) project consists of a -specification and libraries for writing plugins to configure -network interfaces in Linux containers, along with a number of -supported plugins. CNI concerns itself only with network -connectivity of containers and removing allocated resources when -the container is deleted. Because of this focus, CNI has a wide -range of support and the specification is simple to implement. - -%prep -%autosetup -N -cp %{SOURCE2} build.sh -# create vendor folder from the vendor tarball and set vendor mode -tar -xf %{SOURCE3} --no-same-owner -%autopatch -p1 - -%build -# go1.16+ default is GO111MODULE=on set to auto temporarily -# until using upstream release with go.mod -export GO111MODULE=auto -sh ./build.sh - -%install - -# install the plugins -install -m 755 -d "%{buildroot}%{cni_bin_dir}" -cp bin/noop "%{buildroot}%{cni_bin_dir}/" -cp bin/sleep "%{buildroot}%{cni_bin_dir}/" - -# undo a copy: cnitool must go to sbin/ -install -m 755 -d "%{buildroot}%{_sbindir}" -cp bin/cnitool "%{buildroot}%{_sbindir}/" - -# config -install -m 755 -d "%{buildroot}%{cni_etc_dir}" -install -m 755 -d "%{buildroot}%{cni_etc_dir}/net.d" -install -D -p -m 0644 %{SOURCE1} %{buildroot}%{cni_etc_dir}/net.d/99-loopback.conf.sample - -# documentation -install -m 755 -d "%{buildroot}%{cni_doc_dir}" - -%post -%{fillup_only -n %{name}} - -%files -%defattr(-,root,root) -%doc CONTRIBUTING.md README.md DCO -%license LICENSE -%dir %{cni_etc_dir} -%dir %{cni_etc_dir}/net.d -%config %{cni_etc_dir}/net.d/* -%dir %{cni_bin_dir} -%dir %{cni_doc_dir} -%{cni_bin_dir}/* -%{cni_etc_dir}/net.d/* -%{_sbindir}/cnitool - -%changelog -* Fri Mar 21 2025 Anuj Mittal - 1.1.2-5 -- Bump Release to rebuild - -* Thu Jan 23 2025 Kavya Sree Kaitepalli - 1.1.2-4 -- Patch CVE-2024-45338 and CVE-2022-29526 - -* Fri Sep 06 2024 Muhammad Falak R Wani - 1.1.2-3 -- Patch CVE-2022-32149 - -* Tue Jul 02 2024 Osama Esmail - 1.1.2-2 -- Patching CVE-2021-38561 - -* Fri Oct 27 2023 CBL-Mariner Servicing Account - 1.1.2-1 -- Auto-upgrade to 1.1.2 - Azure Linux 3.0 - package upgrades - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 1.0.1-15 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 1.0.1-14 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.0.1-13 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 1.0.1-12 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 1.0.1-11 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.0.1-10 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 1.0.1-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 1.0.1-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 1.0.1-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 1.0.1-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 1.0.1-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 1.0.1-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 1.0.1-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 1.0.1-2 -- Bump release to rebuild with golang 1.18.3 - -* Wed Feb 09 2022 Henry Li - 1.0.1-1 -- Upgrade to version 1.0.1 -- Add vendor source, which is required to build -- Modify build.sh to build using vendor source - -* Tue Aug 17 2021 Henry Li - 0.8.1-2 -- Initial CBL-Mariner import from openSUSE Tumbleweed (license: same as "License" tag). -- License Verified -- Remove shadow from BR -- Use systemd and fillup from runtime requirements -- Manually define fillup-related macros -- Remove buildroot definition - -* Mon May 31 2021 John Paul Adrian Glaubitz -- Update to version 0.8.1: - * This is a security release that fixes a single bug: - - Tighten up plugin-finding logic (#811). - -* Sat Apr 24 2021 Dirk Müller -- use buildmode=pie (cnitool is installed into sbindir) - -* Tue Mar 16 2021 Jeff Kowalczyk -- Set GO111MODULE=auto to build with go1.16+ - * Default changed to GO111MODULE=on in go1.16 - * Set temporarily until using upstream release with go.mod - * Drop BuildRequires: golang-packaging not currently using macros - * Add BuildRequires: golang(API) >= 1.13 recommended dependency expression - -* Thu Oct 1 2020 John Paul Adrian Glaubitz -- Update to version 0.8.0: - * Specification and Conventions changes - + docs: add ips and mac to well-known capabilities - + add interface name validation - + Add GUID to well known Capabilities - + Add DeviceID attribute to RuntimeConfig - + Typo fixes for infiniband GUID - + Fix linting issues in docs, add headers to json example, update errors into table - * Documentation changes - + Update cnitool docs - + Remove extra ',' chars which makes conflist examples invalid. - * libcni changes - + Remove Result.String method - + libcni: add config caching [v2] - + clean up : fix staticcheck warnings - + libcni: add InitCNIConfigWithCacheDir() and deprecate RuntimeConfig.CacheDir - + skel: clean up errors in skel and add some well-known error codes - + libcni: find plugin in exec - + validate containerID and networkName - + skel: remove needless functions and types - + libcni: also cache IfName - + libcni: fix cache file 'result' key name - + Bump Go version to 1.13 - + When CNI version isn't supplied in config, use default. - + intercept netplugin std error - + invoke: capture and return stderr if plugin exits unexpectedly - + Retry exec commands on text file busy - -* Mon Jan 13 2020 Sascha Grunert -- Set correct CNI version for 99-loopback.conf - -* Tue Jul 16 2019 John Paul Adrian Glaubitz -- Update to version 0.7.1 (bsc#1160460): - * Library changes: - + invoke : ensure custom envs of CNIArgs are prepended to process envs - + add GetNetworkListCachedResult to CNI interface - + delegate : allow delegation funcs override CNI_COMMAND env automatically in heritance - * Documentation & Convention changes: - + Update cnitool documentation for spec v0.4.0 - + Add cni-route-override to CNI plugin list - * Build and test changes: - + Release: 5%{?dist} - -* Fri May 17 2019 John Paul Adrian Glaubitz -- Update to version 0.7.0: - * Spec changes: - + Use more RFC2119 style language in specification (must, should...) - + add notes about ADD/DEL ordering - + Make the container ID required and unique. - + remove the version parameter from ADD and DEL commands. - + Network interface name matters - + be explicit about optional and required structure members - + add CHECK method - + Add a well-known error for "try again" - + SPEC.md: clarify meaning of 'routes' - * Library changes: - + pkg/types: Makes IPAM concrete type - + libcni: return error if Type is empty - + skel: VERSION shouldn't block on stdin - + non-pointer instances of types.Route now correctly marshal to JSON - + libcni: add ValidateNetwork and ValidateNetworkList functions - + pkg/skel: return error if JSON config has no network name - + skel: add support for plugin version string - + libcni: make exec handling an interface for better downstream testing - + libcni: api now takes a Context to allow operations to be timed out or cancelled - + types/version: add helper to parse PrevResult - + skel: only print about message, not errors - + skel,invoke,libcni: implementation of CHECK method - + cnitool: Honor interface name supplied via CNI_IFNAME environment variable. - + cnitool: validate correct number of args - + Don't copy gw from IP4.Gateway to Route.GW When converting from 0.2.0 - + add PrintTo method to Result interface - + Return a better error when the plugin returns none -- Install sleep binary into CNI plugin directory -- Restore build.sh script which was removed upstream - -* Tue Jun 5 2018 dcassany@suse.com -- Refactor %%license usage to a simpler form - -* Mon Jun 4 2018 dcassany@suse.com -- Make use of %%license macro - -* Wed Apr 4 2018 jmassaguerpla@suse.com -- Remove creating subvolumes. This should be in another package (kubernetes-kubelet) - -* Mon Jan 29 2018 kmacinnes@suse.com -- Use full/absolute path for mksubvolume -- Change snapper Requires to a Requires(post) - -* Thu Jan 18 2018 kmacinnes@suse.com -- Add snapper as a requirement, to provide mksubvolume - -* Mon Jan 15 2018 alvaro.saurin@suse.com -- Make /var/lib/cni writable - -* Tue Dec 19 2017 alvaro.saurin@suse.com -- Remove the dependency with the cni-plugins -- Recommend the cni-plugins - -* Mon Aug 28 2017 opensuse-packaging@opensuse.org -- Update to version 0.6.0: - * Conventions: add convention around chaining interfaces - * pkg/types: safer typecasting for TextUnmarshaler when loading args - * pkg/types: modify LoadArgs to return a named error when an unmarshalable condition is detected - * Update note about next Community Sync, 2017-06-21 - * types: fix marshalling of omitted "interfaces" key in IPConfig JSON - * Update and document release process - * scripts/release.sh: Add in s390x architecture - * cnitool: add support for CNI_ARGS - * README plugins list: add Linen CNI plugin - -* Mon Apr 10 2017 opensuse-packaging@opensuse.org -- Update to version 0.5.2: - * Rename build script to avoid conflict with bazel - * Enable s390x build - * Update community sync detail - * Added entry for CNI-Genie - * travis: shift forward to Go 1.8 and 1.7 - * spec/plugins: fix 'ip'->'ips' in the spec, bump to 0.3.1 - * libcni: Improved error messages. - * libcni: Fixed tests that were checking error strings. - * Documentation: Added documentation for `cnitool`. - -* Thu Mar 23 2017 opensuse-packaging@opensuse.org -- Update to version 0.5.1: - * readme.md: Add link to community sync - * pkg/ip: do not leak types from vendored netlink package - * pkg/ip: SetupVeth returns net.Interface - * pkg/ip: improve docstring for SetupVeth - * Added Romana to list of CNI providers... - * plugins/meta/flannel: If net config is missing do not return err on DEL - * plugins/*: Don't error if the device doesn't exist - -* Wed Mar 22 2017 alvaro.saurin@suse.com -- Update to version 0.5.0: - * Documentation: Add conventions doc - * noop: allow specifying debug file in config JSON - * Spec/Conventions: Update to include plugin config - * spec: add network configuration list specification - * api,libcni: add network config list-based plugin chaining - * Update CONVENTIONS.md - * skel: adds PluginMainWithError which returns a *types.Error - * testutils: pass netConf in for version operations; pass raw result out for tests - * types: make Result an interface and move existing Result to separate package - * macvlan/ipvlan: use common RenameLink method - * plugins/flannel: organize test JSON alphabetically - * pkg/ipam: add testcases - * spec/plugins: return interface details and multiple IP addresses to runtime - * spec, libcni, pkg/invoke: Use OS-agnostic separator when parsing CNI_PATH - * pkg/utils/sysctl/sysctl_linux.go: fix build tag. - * pkg/utils/sysctl/sysctl_linux.go: fix typo. - * invoke: Enable plugin file names with extensions - * CONVENTIONS.md: Update details on port-mappings - * Update with feedback - * More markups - * spec: Remove `routes` from Network Configuration - * docs: consolidate host-local documentation - * pkg/ns: refactored so that builds succeed on non-linux platforms - * Fix grammar - * plugins/main/ptp: set the Sandbox property on the response - * README: List multus as 3rd party plugin - * Replace Michael Bridgen with Bryan Boreham - * pkg/ns, pkg/types: refactored non linux build fix code to - * pkg/ip: refactored so that builds succeed on non-linux platforms - * vendor: Update vishvanana/netlink dependency - * libcni: up-convert a Config to a ConfigList when no other configs are found. - * docs: CNI versioning for 0.3.0 upgrade - * docs: Edits to v0.3.0 upgrade guidance - * docs: minor improvements to 0.3.0 upgrade guidance - * docs: add small upgrade instructions - * docs: minor improvements to spec-upgrades - * docs: fill-out and correct version conversion table - * docs: table formatting is hard - * pkg/testutils: return errors after restoring stdout - * pkg/types: misc current types testcase cleanups - * Minor rewording about default config version - * spec,libcni: add support for injecting runtimeConfig into plugin stdin data - * Check n.IPAM before use it in LoadIPAMConfig function - * do not error if last_reserved_ip is missing for host local ipam - * add test for ensuring initial subnet creation does not contain an error - * fix unrelated failing tests - -* Wed Mar 1 2017 opensuse-packaging@opensuse.org -- Update to version 0.4.0: - * plugins/noop: return a helpful message for test authors - * host-local: trim whitespace from container IDs and disk file contents - * travis: roll forward the versions of Go that we test - * MAINTAINERS: hi CaseyC! - * ipam/host-local: Move allocator and config to backend - * ipam/host-local: add ResolvConf argument for DNS configuration - * spec: notice of version - -* Thu Feb 23 2017 alvaro.saurin@suse.com -- Initial version diff --git a/SPECS/containerd2/CVE-2024-25621.patch b/SPECS/containerd2/CVE-2024-25621.patch new file mode 100644 index 0000000000..d07a78a129 --- /dev/null +++ b/SPECS/containerd2/CVE-2024-25621.patch @@ -0,0 +1,111 @@ +From 46223b256bfb3f42e193d947d1b1ef551260749f Mon Sep 17 00:00:00 2001 +From: Akihiro Suda +Date: Mon, 27 Oct 2025 16:42:59 +0900 +Subject: [PATCH] Fix directory permissions + +- Create /var/lib/containerd with 0o700 (was: 0o711). +- Create config.TempDir with 0o700 (was: 0o711). +- Create /run/containerd/io.containerd.grpc.v1.cri with 0o700 (was: 0o755). +- Create /run/containerd/io.containerd.sandbox.controller.v1.shim with 0o700 (was: 0o711). +- Leave /run/containerd and /run/containerd/io.containerd.runtime.v2.task created with 0o711, + as required by userns-remapped containers. + /run/containerd/io.containerd.runtime.v2.task// is created with: + - 0o700 for non-userns-remapped containers + - 0o710 for userns-remapped containers with the remapped root group as the owner group. + +Signed-off-by: Akihiro Suda +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/containerd/containerd/commit/7c59e8e9e970d38061a77b586b23655c352bfec5.patch +--- + cmd/containerd/server/server.go | 14 ++++++++++++-- + core/runtime/v2/task_manager.go | 2 ++ + plugins/cri/runtime/plugin.go | 7 +++++++ + plugins/sandbox/controller.go | 6 +++++- + 4 files changed, 26 insertions(+), 3 deletions(-) + +diff --git a/cmd/containerd/server/server.go b/cmd/containerd/server/server.go +index 9f38cb3..c9e3698 100644 +--- a/cmd/containerd/server/server.go ++++ b/cmd/containerd/server/server.go +@@ -81,10 +81,16 @@ func CreateTopLevelDirectories(config *srvconfig.Config) error { + return errors.New("root and state must be different paths") + } + +- if err := sys.MkdirAllWithACL(config.Root, 0o711); err != nil { ++ if err := sys.MkdirAllWithACL(config.Root, 0o700); err != nil { ++ return err ++ } ++ // chmod is needed for upgrading from an older release that created the dir with 0o711 ++ if err := os.Chmod(config.Root, 0o700); err != nil { + return err + } + ++ // For supporting userns-remapped containers, the state dir cannot be just mkdired with 0o700. ++ // Each of plugins creates a dedicated directory beneath the state dir with appropriate permission bits. + if err := sys.MkdirAllWithACL(config.State, 0o711); err != nil { + return err + } +@@ -99,7 +105,11 @@ func CreateTopLevelDirectories(config *srvconfig.Config) error { + } + + if config.TempDir != "" { +- if err := sys.MkdirAllWithACL(config.TempDir, 0o711); err != nil { ++ if err := sys.MkdirAllWithACL(config.TempDir, 0o700); err != nil { ++ return err ++ } ++ // chmod is needed for upgrading from an older release that created the dir with 0o711 ++ if err := os.Chmod(config.Root, 0o700); err != nil { + return err + } + if runtime.GOOS == "windows" { +diff --git a/core/runtime/v2/task_manager.go b/core/runtime/v2/task_manager.go +index f396ced..024763a 100644 +--- a/core/runtime/v2/task_manager.go ++++ b/core/runtime/v2/task_manager.go +@@ -74,6 +74,8 @@ func init() { + shimManager := shimManagerI.(*ShimManager) + root, state := ic.Properties[plugins.PropertyRootDir], ic.Properties[plugins.PropertyStateDir] + for _, d := range []string{root, state} { ++ // root: the parent of this directory is created as 0o700, not 0o711. ++ // state: the parent of this directory is created as 0o711 too, so as to support userns-remapped containers. + if err := os.MkdirAll(d, 0711); err != nil { + return nil, err + } +diff --git a/plugins/cri/runtime/plugin.go b/plugins/cri/runtime/plugin.go +index adc64d9..07f64a1 100644 +--- a/plugins/cri/runtime/plugin.go ++++ b/plugins/cri/runtime/plugin.go +@@ -91,6 +91,13 @@ func initCRIRuntime(ic *plugin.InitContext) (interface{}, error) { + rootDir := filepath.Join(containerdRootDir, "io.containerd.grpc.v1.cri") + containerdStateDir := filepath.Dir(ic.Properties[plugins.PropertyStateDir]) + stateDir := filepath.Join(containerdStateDir, "io.containerd.grpc.v1.cri") ++ if err := os.MkdirAll(stateDir, 0o700); err != nil { ++ return nil, err ++ } ++ // chmod is needed for upgrading from an older release that created the dir with 0o755 ++ if err := os.Chmod(stateDir, 0o700); err != nil { ++ return nil, err ++ } + c := criconfig.Config{ + RuntimeConfig: *pluginConfig, + ContainerdRootDir: containerdRootDir, +diff --git a/plugins/sandbox/controller.go b/plugins/sandbox/controller.go +index aec9cc3..165f2e8 100644 +--- a/plugins/sandbox/controller.go ++++ b/plugins/sandbox/controller.go +@@ -68,7 +68,11 @@ func init() { + state := ic.Properties[plugins.PropertyStateDir] + root := ic.Properties[plugins.PropertyRootDir] + for _, d := range []string{root, state} { +- if err := os.MkdirAll(d, 0711); err != nil { ++ if err := os.MkdirAll(d, 0700); err != nil { ++ return nil, err ++ } ++ // chmod is needed for upgrading from an older release that created the dir with 0o711 ++ if err := os.Chmod(d, 0o700); err != nil { + return nil, err + } + } +-- +2.45.4 + diff --git a/SPECS/containerd2/CVE-2025-47911.patch b/SPECS/containerd2/CVE-2025-47911.patch new file mode 100644 index 0000000000..2df8cafa55 --- /dev/null +++ b/SPECS/containerd2/CVE-2025-47911.patch @@ -0,0 +1,100 @@ +From 532532d877df8bbee095441886578acaf619132c Mon Sep 17 00:00:00 2001 +From: Roland Shoemaker +Date: Mon, 29 Sep 2025 16:33:18 -0700 +Subject: [PATCH] html: impose open element stack size limit + +The HTML specification contains a number of algorithms which are +quadratic in complexity by design. Instead of adding complicated +workarounds to prevent these cases from becoming extremely expensive in +pathological cases, we impose a limit of 512 to the size of the stack of +open elements. It is extremely unlikely that non-adversarial HTML +documents will ever hit this limit (but if we see cases of this, we may +want to make the limit configurable via a ParseOption). + +Thanks to Guido Vranken and Jakub Ciolek for both independently +reporting this issue. + +Fixes CVE-2025-47911 +Fixes golang/go#75682 + +Change-Id: I890517b189af4ffbf427d25d3fde7ad7ec3509ad +Reviewed-on: https://go-review.googlesource.com/c/net/+/709876 +Reviewed-by: Damien Neil +LUCI-TryBot-Result: Go LUCI +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/golang/net/commit/59706cdaa8f95502fdec64b67b4c61d6ca58727d.patch +--- + vendor/golang.org/x/net/html/escape.go | 2 +- + vendor/golang.org/x/net/html/parse.go | 21 +++++++++++++++++---- + 2 files changed, 18 insertions(+), 5 deletions(-) + +diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go +index 04c6bec..12f2273 100644 +--- a/vendor/golang.org/x/net/html/escape.go ++++ b/vendor/golang.org/x/net/html/escape.go +@@ -299,7 +299,7 @@ func escape(w writer, s string) error { + case '\r': + esc = " " + default: +- panic("unrecognized escape character") ++ panic("html: unrecognized escape character") + } + s = s[i+1:] + if _, err := w.WriteString(esc); err != nil { +diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go +index 979ef17..4d12a1c 100644 +--- a/vendor/golang.org/x/net/html/parse.go ++++ b/vendor/golang.org/x/net/html/parse.go +@@ -231,7 +231,14 @@ func (p *parser) addChild(n *Node) { + } + + if n.Type == ElementNode { +- p.oe = append(p.oe, n) ++ p.insertOpenElement(n) ++ } ++} ++ ++func (p *parser) insertOpenElement(n *Node) { ++ p.oe = append(p.oe, n) ++ if len(p.oe) > 512 { ++ panic("html: open stack of elements exceeds 512 nodes") + } + } + +@@ -810,7 +817,7 @@ func afterHeadIM(p *parser) bool { + p.im = inFramesetIM + return true + case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title: +- p.oe = append(p.oe, p.head) ++ p.insertOpenElement(p.head) + defer p.oe.remove(p.head) + return inHeadIM(p) + case a.Head: +@@ -2320,9 +2327,13 @@ func (p *parser) parseCurrentToken() { + } + } + +-func (p *parser) parse() error { ++func (p *parser) parse() (err error) { ++ defer func() { ++ if panicErr := recover(); panicErr != nil { ++ err = fmt.Errorf("%s", panicErr) ++ } ++ }() + // Iterate until EOF. Any other error will cause an early return. +- var err error + for err != io.EOF { + // CDATA sections are allowed only in foreign content. + n := p.oe.top() +@@ -2351,6 +2362,8 @@ func (p *parser) parse() error { + // s. Conversely, explicit s in r's data can be silently dropped, + // with no corresponding node in the resulting tree. + // ++// Parse will reject HTML that is nested deeper than 512 elements. ++// + // The input is assumed to be UTF-8 encoded. + func Parse(r io.Reader) (*Node, error) { + return ParseWithOptions(r) +-- +2.45.4 + diff --git a/SPECS/containerd2/CVE-2025-58190.patch b/SPECS/containerd2/CVE-2025-58190.patch new file mode 100644 index 0000000000..89b2b84a02 --- /dev/null +++ b/SPECS/containerd2/CVE-2025-58190.patch @@ -0,0 +1,126 @@ +From 582919df8cf0643cd434da7421238628ad5b4cb6 Mon Sep 17 00:00:00 2001 +From: Roland Shoemaker +Date: Mon, 29 Sep 2025 19:38:24 -0700 +Subject: [PATCH] html: align in row insertion mode with spec + +Update inRowIM to match the HTML specification. This fixes an issue +where a specific HTML document could cause the parser to enter an +infinite loop when trying to parse a and implied next to +each other. + +Fixes CVE-2025-58190 +Fixes golang/go#70179 + +Change-Id: Idcb133c87c7d475cc8c7eb1f1550ea21d8bdddea +Reviewed-on: https://go-review.googlesource.com/c/net/+/709875 +LUCI-TryBot-Result: Go LUCI +Reviewed-by: Damien Neil +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/golang/net/commit/6ec8895aa5f6594da7356da7d341b98133629009.patch +--- + vendor/golang.org/x/net/html/parse.go | 36 ++++++++++++++++++--------- + 1 file changed, 24 insertions(+), 12 deletions(-) + +diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go +index 5b8374b..979ef17 100644 +--- a/vendor/golang.org/x/net/html/parse.go ++++ b/vendor/golang.org/x/net/html/parse.go +@@ -136,7 +136,7 @@ func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int { + return -1 + } + default: +- panic("unreachable") ++ panic(fmt.Sprintf("html: internal error: indexOfElementInScope unknown scope: %d", s)) + } + } + switch s { +@@ -179,7 +179,7 @@ func (p *parser) clearStackToContext(s scope) { + return + } + default: +- panic("unreachable") ++ panic(fmt.Sprintf("html: internal error: clearStackToContext unknown scope: %d", s)) + } + } + } +@@ -1674,7 +1674,7 @@ func inTableBodyIM(p *parser) bool { + return inTableIM(p) + } + +-// Section 12.2.6.4.14. ++// Section 13.2.6.4.14. + func inRowIM(p *parser) bool { + switch p.tok.Type { + case StartTagToken: +@@ -1686,7 +1686,9 @@ func inRowIM(p *parser) bool { + p.im = inCellIM + return true + case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead, a.Tr: +- if p.popUntil(tableScope, a.Tr) { ++ if p.elementInScope(tableScope, a.Tr) { ++ p.clearStackToContext(tableRowScope) ++ p.oe.pop() + p.im = inTableBodyIM + return false + } +@@ -1696,22 +1698,28 @@ func inRowIM(p *parser) bool { + case EndTagToken: + switch p.tok.DataAtom { + case a.Tr: +- if p.popUntil(tableScope, a.Tr) { ++ if p.elementInScope(tableScope, a.Tr) { ++ p.clearStackToContext(tableRowScope) ++ p.oe.pop() + p.im = inTableBodyIM + return true + } + // Ignore the token. + return true + case a.Table: +- if p.popUntil(tableScope, a.Tr) { ++ if p.elementInScope(tableScope, a.Tr) { ++ p.clearStackToContext(tableRowScope) ++ p.oe.pop() + p.im = inTableBodyIM + return false + } + // Ignore the token. + return true + case a.Tbody, a.Tfoot, a.Thead: +- if p.elementInScope(tableScope, p.tok.DataAtom) { +- p.parseImpliedToken(EndTagToken, a.Tr, a.Tr.String()) ++ if p.elementInScope(tableScope, p.tok.DataAtom) && p.elementInScope(tableScope, a.Tr) { ++ p.clearStackToContext(tableRowScope) ++ p.oe.pop() ++ p.im = inTableBodyIM + return false + } + // Ignore the token. +@@ -2218,16 +2226,20 @@ func parseForeignContent(p *parser) bool { + p.acknowledgeSelfClosingTag() + } + case EndTagToken: ++ if strings.EqualFold(p.oe[len(p.oe)-1].Data, p.tok.Data) { ++ p.oe = p.oe[:len(p.oe)-1] ++ return true ++ } + for i := len(p.oe) - 1; i >= 0; i-- { +- if p.oe[i].Namespace == "" { +- return p.im(p) +- } + if strings.EqualFold(p.oe[i].Data, p.tok.Data) { + p.oe = p.oe[:i] ++ return true ++ } ++ if i > 0 && p.oe[i-1].Namespace == "" { + break + } + } +- return true ++ return p.im(p) + default: + // Ignore the token. + } +-- +2.45.4 + diff --git a/SPECS/containerd2/CVE-2025-64329.patch b/SPECS/containerd2/CVE-2025-64329.patch new file mode 100644 index 0000000000..b742c82c32 --- /dev/null +++ b/SPECS/containerd2/CVE-2025-64329.patch @@ -0,0 +1,73 @@ +From b9beeef78a6fd90ece5801780c45f550caf71b3d Mon Sep 17 00:00:00 2001 +From: wheat2018 <1151937289@qq.com> +Date: Tue, 13 Aug 2024 15:56:31 +0800 +Subject: [PATCH] fix goroutine leak of container Attach + +The monitor goroutine (runs (*ContainerIO).Attach.func1) of Attach will +never finish if it attaches to a container without any stdout or stderr +output. Wait for http context cancel and break the pipe actively to +address the issue. + +Signed-off-by: wheat2018 <1151937289@qq.com> +Signed-off-by: Akihiro Suda +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/containerd/containerd/commit/083b53cd6f19b5de7717b0ce92c11bdf95e612df.patch +--- + internal/cri/io/container_io.go | 14 +++++++++++--- + internal/cri/server/container_attach.go | 2 +- + 2 files changed, 12 insertions(+), 4 deletions(-) + +diff --git a/internal/cri/io/container_io.go b/internal/cri/io/container_io.go +index 9fc5545..194634e 100644 +--- a/internal/cri/io/container_io.go ++++ b/internal/cri/io/container_io.go +@@ -17,6 +17,7 @@ + package io + + import ( ++ "context" + "errors" + "fmt" + "io" +@@ -160,7 +161,7 @@ func (c *ContainerIO) Pipe() { + + // Attach attaches container stdio. + // TODO(random-liu): Use pools.Copy in docker to reduce memory usage? +-func (c *ContainerIO) Attach(opts AttachOptions) { ++func (c *ContainerIO) Attach(ctx context.Context, opts AttachOptions) { + var wg sync.WaitGroup + key := util.GenerateID() + stdinKey := streamKey(c.id, "attach-"+key, Stdin) +@@ -201,8 +202,15 @@ func (c *ContainerIO) Attach(opts AttachOptions) { + } + + attachStream := func(key string, close <-chan struct{}) { +- <-close +- log.L.Infof("Attach stream %q closed", key) ++ select { ++ case <-close: ++ log.L.Infof("Attach stream %q closed", key) ++ case <-ctx.Done(): ++ log.L.Infof("Attach client of %q cancelled", key) ++ // Avoid writeGroup heap up ++ c.stdoutGroup.Remove(key) ++ c.stderrGroup.Remove(key) ++ } + // Make sure stdin gets closed. + if stdinStreamRC != nil { + stdinStreamRC.Close() +diff --git a/internal/cri/server/container_attach.go b/internal/cri/server/container_attach.go +index 0147859..f4c3322 100644 +--- a/internal/cri/server/container_attach.go ++++ b/internal/cri/server/container_attach.go +@@ -82,6 +82,6 @@ func (c *criService) attachContainer(ctx context.Context, id string, stdin io.Re + }, + } + // TODO(random-liu): Figure out whether we need to support historical output. +- cntr.IO.Attach(opts) ++ cntr.IO.Attach(ctx, opts) + return nil + } +-- +2.45.4 + diff --git a/SPECS/containerd2/containerd2.spec b/SPECS/containerd2/containerd2.spec index 6fe25c1a33..c67bff5732 100644 --- a/SPECS/containerd2/containerd2.spec +++ b/SPECS/containerd2/containerd2.spec @@ -5,7 +5,7 @@ Summary: Industry-standard container runtime Name: %{upstream_name}2 Version: 2.0.0 -Release: 14%{?dist} +Release: 18%{?dist} License: ASL 2.0 Group: Tools/Container URL: https://www.containerd.io @@ -23,6 +23,11 @@ Patch3: CVE-2025-22872.patch Patch4: CVE-2025-47291.patch Patch5: multi-snapshotters-support.patch Patch6: tardev-support.patch +Patch7: CVE-2024-25621.patch +Patch8: CVE-2025-64329.patch +Patch9: fix-credential-leak-in-cri-errors.patch +Patch10:CVE-2025-47911.patch +Patch11:CVE-2025-58190.patch %{?systemd_requires} BuildRequires: golang < 1.25 @@ -132,6 +137,13 @@ fi %{_bindir}/containerd-stress %changelog +* Thu Mar 12 2026 Lee Chee Yang - 2.0.0-18 +- merge from Azure Linux 3.0.20260304-3.0 +- Patch for CVE-2025-64329 +- Patch for CVE-2024-25621 +- Backport fix for credential leak in CRI error logs +- Patch for CVE-2025-58190, CVE-2025-47911 + * Fri Oct 3 2025 Lee Chee Yang - 2.0.0-14 - merge from Azure Linux 3.0.20250910-3.0 - Set BR for golang to < 1.25 diff --git a/SPECS/containerd2/fix-credential-leak-in-cri-errors.patch b/SPECS/containerd2/fix-credential-leak-in-cri-errors.patch new file mode 100644 index 0000000000..909c179c25 --- /dev/null +++ b/SPECS/containerd2/fix-credential-leak-in-cri-errors.patch @@ -0,0 +1,401 @@ +From a34e45d0fa2a7ddefff1a0871c9bf9e3c62bda17 Mon Sep 17 00:00:00 2001 +From: Andrey Noskov +Date: Thu, 6 Nov 2025 13:34:38 +0100 +Subject: [PATCH 1/2] fix: redact all query parameters in CRI error logs + +Signed-off-by: Andrey Noskov +--- + .../cri/instrument/instrumented_service.go | 8 ++ + internal/cri/util/sanitize.go | 93 +++++++++++++ + internal/cri/util/sanitize_test.go | 128 ++++++++++++++++++ + 3 files changed, 229 insertions(+) + create mode 100644 internal/cri/util/sanitize.go + create mode 100644 internal/cri/util/sanitize_test.go + +diff --git a/internal/cri/instrument/instrumented_service.go b/internal/cri/instrument/instrumented_service.go +index c2f5c8de99..f06315a6bd 100644 +--- a/internal/cri/instrument/instrumented_service.go ++++ b/internal/cri/instrument/instrumented_service.go +@@ -351,6 +351,8 @@ func (in *instrumentedService) PullImage(ctx context.Context, r *runtime.PullIma + log.G(ctx).Infof("PullImage %q", r.GetImage().GetImage()) + defer func() { + if err != nil { ++ // Sanitize error to remove sensitive information ++ err = ctrdutil.SanitizeError(err) + log.G(ctx).WithError(err).Errorf("PullImage %q failed", r.GetImage().GetImage()) + } else { + log.G(ctx).Infof("PullImage %q returns image reference %q", +@@ -369,6 +371,8 @@ func (in *instrumentedService) ListImages(ctx context.Context, r *runtime.ListIm + log.G(ctx).Tracef("ListImages with filter %+v", r.GetFilter()) + defer func() { + if err != nil { ++ // Sanitize error to remove sensitive information ++ err = ctrdutil.SanitizeError(err) + log.G(ctx).WithError(err).Errorf("ListImages with filter %+v failed", r.GetFilter()) + } else { + log.G(ctx).Tracef("ListImages with filter %+v returns image list %+v", +@@ -386,6 +390,8 @@ func (in *instrumentedService) ImageStatus(ctx context.Context, r *runtime.Image + log.G(ctx).Tracef("ImageStatus for %q", r.GetImage().GetImage()) + defer func() { + if err != nil { ++ // Sanitize error to remove sensitive information ++ err = ctrdutil.SanitizeError(err) + log.G(ctx).WithError(err).Errorf("ImageStatus for %q failed", r.GetImage().GetImage()) + } else { + log.G(ctx).Tracef("ImageStatus for %q returns image status %+v", +@@ -404,6 +410,8 @@ func (in *instrumentedService) RemoveImage(ctx context.Context, r *runtime.Remov + log.G(ctx).Infof("RemoveImage %q", r.GetImage().GetImage()) + defer func() { + if err != nil { ++ // Sanitize error to remove sensitive information ++ err = ctrdutil.SanitizeError(err) + log.G(ctx).WithError(err).Errorf("RemoveImage %q failed", r.GetImage().GetImage()) + } else { + log.G(ctx).Infof("RemoveImage %q returns successfully", r.GetImage().GetImage()) +diff --git a/internal/cri/util/sanitize.go b/internal/cri/util/sanitize.go +new file mode 100644 +index 0000000000..d50a15ebf6 +--- /dev/null ++++ b/internal/cri/util/sanitize.go +@@ -0,0 +1,93 @@ ++/* ++ Copyright The containerd Authors. ++ ++ Licensed under the Apache License, Version 2.0 (the "License"); ++ you may not use this file except in compliance with the License. ++ You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++ Unless required by applicable law or agreed to in writing, software ++ distributed under the License is distributed on an "AS IS" BASIS, ++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ See the License for the specific language governing permissions and ++ limitations under the License. ++*/ ++ ++package util ++ ++import ( ++ "errors" ++ "net/url" ++ "strings" ++) ++ ++// SanitizeError sanitizes an error by redacting sensitive information in URLs. ++// If the error contains a *url.Error, it parses and sanitizes the URL. ++// Otherwise, it returns the error unchanged. ++func SanitizeError(err error) error { ++ if err == nil { ++ return nil ++ } ++ ++ // Check if the error is or contains a *url.Error ++ var urlErr *url.Error ++ if errors.As(err, &urlErr) { ++ // Parse and sanitize the URL ++ sanitizedURL := sanitizeURL(urlErr.URL) ++ if sanitizedURL != urlErr.URL { ++ // Wrap with sanitized url.Error ++ return &sanitizedError{ ++ original: err, ++ sanitizedURL: sanitizedURL, ++ urlError: urlErr, ++ } ++ } ++ return err ++ } ++ ++ // No sanitization needed for non-URL errors ++ return err ++} ++ ++// sanitizeURL properly parses a URL and redacts all query parameters. ++func sanitizeURL(rawURL string) string { ++ parsed, err := url.Parse(rawURL) ++ if err != nil { ++ // If URL parsing fails, return original (malformed URLs shouldn't leak tokens) ++ return rawURL ++ } ++ ++ // Check if URL has query parameters ++ query := parsed.Query() ++ if len(query) == 0 { ++ return rawURL ++ } ++ ++ // Redact all query parameters ++ for param := range query { ++ query.Set(param, "[REDACTED]") ++ } ++ ++ // Reconstruct URL with sanitized query ++ parsed.RawQuery = query.Encode() ++ return parsed.String() ++} ++ ++// sanitizedError wraps an error containing a *url.Error with a sanitized URL. ++type sanitizedError struct { ++ original error ++ sanitizedURL string ++ urlError *url.Error ++} ++ ++// Error returns the error message with the sanitized URL. ++func (e *sanitizedError) Error() string { ++ // Replace all occurrences of the original URL with the sanitized version ++ return strings.ReplaceAll(e.original.Error(), e.urlError.URL, e.sanitizedURL) ++} ++ ++// Unwrap returns the original error for error chain traversal. ++func (e *sanitizedError) Unwrap() error { ++ return e.original ++} +diff --git a/internal/cri/util/sanitize_test.go b/internal/cri/util/sanitize_test.go +new file mode 100644 +index 0000000000..03e4fb2694 +--- /dev/null ++++ b/internal/cri/util/sanitize_test.go +@@ -0,0 +1,128 @@ ++/* ++ Copyright The containerd Authors. ++ ++ Licensed under the Apache License, Version 2.0 (the "License"); ++ you may not use this file except in compliance with the License. ++ You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++ Unless required by applicable law or agreed to in writing, software ++ distributed under the License is distributed on an "AS IS" BASIS, ++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ See the License for the specific language governing permissions and ++ limitations under the License. ++*/ ++ ++package util ++ ++import ( ++ "errors" ++ "fmt" ++ "net/url" ++ "testing" ++ ++ "github.com/stretchr/testify/assert" ++ "github.com/stretchr/testify/require" ++) ++ ++func TestSanitizeError_SimpleURLError(t *testing.T) { ++ // Create a url.Error with sensitive info ++ originalURL := "https://storage.blob.core.windows.net/container/blob?sig=SECRET&sv=2020" ++ urlErr := &url.Error{ ++ Op: "Get", ++ URL: originalURL, ++ Err: fmt.Errorf("connection timeout"), ++ } ++ ++ // Sanitize ++ sanitized := SanitizeError(urlErr) ++ require.NotNil(t, sanitized) ++ ++ // Check it's a sanitizedError with correct properties ++ sanitizedErr, ok := sanitized.(*sanitizedError) ++ require.True(t, ok, "Should return *sanitizedError type") ++ assert.Equal(t, urlErr, sanitizedErr.original) ++ assert.Equal(t, urlErr, sanitizedErr.urlError) ++ assert.Equal(t, "https://storage.blob.core.windows.net/container/blob?sig=%5BREDACTED%5D&sv=%5BREDACTED%5D", sanitizedErr.sanitizedURL) ++ ++ // Test Error() method - verifies ReplaceAll functionality ++ expected := "Get \"https://storage.blob.core.windows.net/container/blob?sig=%5BREDACTED%5D&sv=%5BREDACTED%5D\": connection timeout" ++ assert.Equal(t, expected, sanitized.Error()) ++} ++ ++func TestSanitizeError_WrappedError(t *testing.T) { ++ originalURL := "https://storage.blob.core.windows.net/blob?sig=SECRET&sv=2020" ++ urlErr := &url.Error{ ++ Op: "Get", ++ URL: originalURL, ++ Err: fmt.Errorf("timeout"), ++ } ++ ++ wrappedErr := fmt.Errorf("image pull failed: %w", urlErr) ++ ++ // Sanitize ++ sanitized := SanitizeError(wrappedErr) ++ ++ // Test Error() method with wrapped error - verifies ReplaceAll works in wrapped context ++ sanitizedMsg := sanitized.Error() ++ assert.NotContains(t, sanitizedMsg, "SECRET", "Secret should be sanitized") ++ assert.Contains(t, sanitizedMsg, "image pull failed", "Wrapper message should be preserved") ++ assert.Contains(t, sanitizedMsg, "%5BREDACTED%5D", "Should contain sanitized marker") ++ ++ // Should still be able to unwrap to url.Error ++ var targetURLErr *url.Error ++ assert.True(t, errors.As(sanitized, &targetURLErr), ++ "Should be able to find *url.Error in sanitized error chain") ++ ++ // Verify url.Error properties are preserved ++ assert.Equal(t, "Get", targetURLErr.Op) ++ assert.Contains(t, targetURLErr.Err.Error(), "timeout") ++} ++ ++func TestSanitizeError_NonURLError(t *testing.T) { ++ // Regular error without url.Error ++ regularErr := fmt.Errorf("some error occurred") ++ ++ sanitized := SanitizeError(regularErr) ++ ++ // Should return the exact same error object ++ assert.Equal(t, regularErr, sanitized, ++ "Non-URL errors should pass through unchanged") ++} ++ ++func TestSanitizeError_NilError(t *testing.T) { ++ sanitized := SanitizeError(nil) ++ assert.Nil(t, sanitized, "nil error should return nil") ++} ++ ++func TestSanitizeError_NoQueryParams(t *testing.T) { ++ // URL without any query parameters ++ urlErr := &url.Error{ ++ Op: "Get", ++ URL: "https://registry.example.com/v2/image/manifests/latest", ++ Err: fmt.Errorf("not found"), ++ } ++ ++ sanitized := SanitizeError(urlErr) ++ ++ // Should return the same error object (no sanitization needed) ++ assert.Equal(t, urlErr, sanitized, ++ "Errors without query params should pass through unchanged") ++} ++ ++func TestSanitizedError_Unwrap(t *testing.T) { ++ originalURL := "https://storage.blob.core.windows.net/blob?sig=SECRET" ++ urlErr := &url.Error{ ++ Op: "Get", ++ URL: originalURL, ++ Err: fmt.Errorf("timeout"), ++ } ++ ++ sanitized := SanitizeError(urlErr) ++ ++ // Should be able to unwrap ++ unwrapped := errors.Unwrap(sanitized) ++ assert.NotNil(t, unwrapped, "Should be able to unwrap sanitized error") ++ assert.Equal(t, urlErr, unwrapped, "Unwrapped should be the original error") ++} +-- +2.45.4 + + +From 50e383e3907d04aeaec85853edfaa9ab34be1006 Mon Sep 17 00:00:00 2001 +From: Aadhar Agarwal +Date: Tue, 20 Jan 2026 22:16:30 +0000 +Subject: [PATCH 2/2] fix: sanitize error before gRPC return to prevent + credential leak in pod events + +PR #12491 fixed credential leaks in containerd logs but the gRPC error +returned to kubelet still contained sensitive information. This was +visible in Kubernetes pod events via `kubectl describe pod`. + +The issue was that SanitizeError was called inside the defer block, +but errgrpc.ToGRPC(err) was evaluated before the defer ran, so the +gRPC message contained the original unsanitized error. + +Move SanitizeError before the return statement so both the logged +error and the gRPC error are sanitized. + +Ref: #5453 +Signed-off-by: Aadhar Agarwal +--- + .../cri/instrument/instrumented_service.go | 24 ++++++++++++------- + 1 file changed, 16 insertions(+), 8 deletions(-) + +diff --git a/internal/cri/instrument/instrumented_service.go b/internal/cri/instrument/instrumented_service.go +index f06315a6bd..4379f95997 100644 +--- a/internal/cri/instrument/instrumented_service.go ++++ b/internal/cri/instrument/instrumented_service.go +@@ -351,8 +351,6 @@ func (in *instrumentedService) PullImage(ctx context.Context, r *runtime.PullIma + log.G(ctx).Infof("PullImage %q", r.GetImage().GetImage()) + defer func() { + if err != nil { +- // Sanitize error to remove sensitive information +- err = ctrdutil.SanitizeError(err) + log.G(ctx).WithError(err).Errorf("PullImage %q failed", r.GetImage().GetImage()) + } else { + log.G(ctx).Infof("PullImage %q returns image reference %q", +@@ -361,6 +359,10 @@ func (in *instrumentedService) PullImage(ctx context.Context, r *runtime.PullIma + span.RecordError(err) + }() + res, err = in.c.PullImage(ctrdutil.WithNamespace(ctx), r) ++ // Sanitize error to remove sensitive information from both logs and returned gRPC error ++ if err != nil { ++ err = ctrdutil.SanitizeError(err) ++ } + return res, errgrpc.ToGRPC(err) + } + +@@ -371,8 +373,6 @@ func (in *instrumentedService) ListImages(ctx context.Context, r *runtime.ListIm + log.G(ctx).Tracef("ListImages with filter %+v", r.GetFilter()) + defer func() { + if err != nil { +- // Sanitize error to remove sensitive information +- err = ctrdutil.SanitizeError(err) + log.G(ctx).WithError(err).Errorf("ListImages with filter %+v failed", r.GetFilter()) + } else { + log.G(ctx).Tracef("ListImages with filter %+v returns image list %+v", +@@ -380,6 +380,10 @@ func (in *instrumentedService) ListImages(ctx context.Context, r *runtime.ListIm + } + }() + res, err = in.c.ListImages(ctrdutil.WithNamespace(ctx), r) ++ // Sanitize error to remove sensitive information from both logs and returned gRPC error ++ if err != nil { ++ err = ctrdutil.SanitizeError(err) ++ } + return res, errgrpc.ToGRPC(err) + } + +@@ -390,8 +394,6 @@ func (in *instrumentedService) ImageStatus(ctx context.Context, r *runtime.Image + log.G(ctx).Tracef("ImageStatus for %q", r.GetImage().GetImage()) + defer func() { + if err != nil { +- // Sanitize error to remove sensitive information +- err = ctrdutil.SanitizeError(err) + log.G(ctx).WithError(err).Errorf("ImageStatus for %q failed", r.GetImage().GetImage()) + } else { + log.G(ctx).Tracef("ImageStatus for %q returns image status %+v", +@@ -399,6 +401,10 @@ func (in *instrumentedService) ImageStatus(ctx context.Context, r *runtime.Image + } + }() + res, err = in.c.ImageStatus(ctrdutil.WithNamespace(ctx), r) ++ // Sanitize error to remove sensitive information from both logs and returned gRPC error ++ if err != nil { ++ err = ctrdutil.SanitizeError(err) ++ } + return res, errgrpc.ToGRPC(err) + } + +@@ -410,8 +416,6 @@ func (in *instrumentedService) RemoveImage(ctx context.Context, r *runtime.Remov + log.G(ctx).Infof("RemoveImage %q", r.GetImage().GetImage()) + defer func() { + if err != nil { +- // Sanitize error to remove sensitive information +- err = ctrdutil.SanitizeError(err) + log.G(ctx).WithError(err).Errorf("RemoveImage %q failed", r.GetImage().GetImage()) + } else { + log.G(ctx).Infof("RemoveImage %q returns successfully", r.GetImage().GetImage()) +@@ -419,6 +423,10 @@ func (in *instrumentedService) RemoveImage(ctx context.Context, r *runtime.Remov + span.RecordError(err) + }() + res, err := in.c.RemoveImage(ctrdutil.WithNamespace(ctx), r) ++ // Sanitize error to remove sensitive information from both logs and returned gRPC error ++ if err != nil { ++ err = ctrdutil.SanitizeError(err) ++ } + return res, errgrpc.ToGRPC(err) + } + +-- +2.45.4 + diff --git a/SPECS/containerized-data-importer/CVE-2022-2879.patch b/SPECS/containerized-data-importer/CVE-2022-2879.patch deleted file mode 100644 index c24bd58e3a..0000000000 --- a/SPECS/containerized-data-importer/CVE-2022-2879.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 042465900fcbb246c602c856ccd924ddf093947e Mon Sep 17 00:00:00 2001 -From: Muhammad Falak R Wani -Date: Tue, 9 Jul 2024 19:27:30 +0530 -Subject: [PATCH] archive/tar: limit size of headers - -Set a 1MiB limit on special file blocks (PAX headers, GNU long names, -GNU link names), to avoid reading arbitrarily large amounts of data -into memory. - -Thanks to Adam Korczynski (ADA Logics) and OSS-Fuzz for reporting -this issue. - -Fixes CVE-2022-2879 -Updates #54853 -Fixes #55925 - -Signed-off-by: Muhammad Falak R Wani -Signed-off-by: Thien Trung Vuong ---- - .../vbatts/tar-split/archive/tar/format.go | 4 ++++ - .../vbatts/tar-split/archive/tar/reader.go | 14 ++++++++++++-- - .../vbatts/tar-split/archive/tar/writer.go | 3 +++ - 3 files changed, 19 insertions(+), 2 deletions(-) - -diff --git a/vendor/github.com/vbatts/tar-split/archive/tar/format.go b/vendor/github.com/vbatts/tar-split/archive/tar/format.go -index 1f89d0c..6097798 100644 ---- a/vendor/github.com/vbatts/tar-split/archive/tar/format.go -+++ b/vendor/github.com/vbatts/tar-split/archive/tar/format.go -@@ -143,6 +143,10 @@ const ( - blockSize = 512 // Size of each block in a tar stream - nameSize = 100 // Max length of the name field in USTAR format - prefixSize = 155 // Max length of the prefix field in USTAR format -+ -+ // Max length of a special file (PAX header, GNU long name or link). -+ // This matches the limit used by libarchive. -+ maxSpecialFileSize = 1 << 20 - ) - - // blockPadding computes the number of bytes needed to pad offset up to the -diff --git a/vendor/github.com/vbatts/tar-split/archive/tar/reader.go b/vendor/github.com/vbatts/tar-split/archive/tar/reader.go -index af006fc..2baa0d5 100644 ---- a/vendor/github.com/vbatts/tar-split/archive/tar/reader.go -+++ b/vendor/github.com/vbatts/tar-split/archive/tar/reader.go -@@ -139,7 +139,7 @@ func (tr *Reader) next() (*Header, error) { - continue // This is a meta header affecting the next header - case TypeGNULongName, TypeGNULongLink: - format.mayOnlyBe(FormatGNU) -- realname, err := ioutil.ReadAll(tr) -+ realname, err := readSpecialFile(tr) - if err != nil { - return nil, err - } -@@ -333,7 +333,7 @@ func mergePAX(hdr *Header, paxHdrs map[string]string) (err error) { - // parsePAX parses PAX headers. - // If an extended header (type 'x') is invalid, ErrHeader is returned - func parsePAX(r io.Reader) (map[string]string, error) { -- buf, err := ioutil.ReadAll(r) -+ buf, err := readSpecialFile(r) - if err != nil { - return nil, err - } -@@ -884,6 +884,16 @@ func tryReadFull(r io.Reader, b []byte) (n int, err error) { - return n, err - } - -+// readSpecialFile is like io.ReadAll except it returns -+// ErrFieldTooLong if more than maxSpecialFileSize is read. -+func readSpecialFile(r io.Reader) ([]byte, error) { -+ buf, err := io.ReadAll(io.LimitReader(r, maxSpecialFileSize+1)) -+ if len(buf) > maxSpecialFileSize { -+ return nil, ErrFieldTooLong -+ } -+ return buf, err -+} -+ - // discard skips n bytes in r, reporting an error if unable to do so. - func discard(tr *Reader, n int64) error { - var seekSkipped, copySkipped int64 -diff --git a/vendor/github.com/vbatts/tar-split/archive/tar/writer.go b/vendor/github.com/vbatts/tar-split/archive/tar/writer.go -index e80498d..893eac0 100644 ---- a/vendor/github.com/vbatts/tar-split/archive/tar/writer.go -+++ b/vendor/github.com/vbatts/tar-split/archive/tar/writer.go -@@ -199,6 +199,9 @@ func (tw *Writer) writePAXHeader(hdr *Header, paxHdrs map[string]string) error { - flag = TypeXHeader - } - data := buf.String() -+ if len(data) > maxSpecialFileSize { -+ return ErrFieldTooLong -+ } - if err := tw.writeRawFile(name, data, flag, FormatPAX); err != nil || isGlobal { - return err // Global headers return here - } --- -2.40.1 - diff --git a/SPECS/containerized-data-importer/CVE-2023-39325.patch b/SPECS/containerized-data-importer/CVE-2023-39325.patch deleted file mode 100644 index e0085e416d..0000000000 --- a/SPECS/containerized-data-importer/CVE-2023-39325.patch +++ /dev/null @@ -1,117 +0,0 @@ -diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go -index 8cb14f3..6000140 100644 ---- a/vendor/golang.org/x/net/http2/server.go -+++ b/vendor/golang.org/x/net/http2/server.go -@@ -581,9 +581,11 @@ type serverConn struct { - advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client - curClientStreams uint32 // number of open streams initiated by the client - curPushedStreams uint32 // number of open streams initiated by server push -+ curHandlers uint32 // number of running handler goroutines - maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests - maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes - streams map[uint32]*stream -+ unstartedHandlers []unstartedHandler - initialStreamSendWindowSize int32 - maxFrameSize int32 - peerMaxHeaderListSize uint32 // zero means unknown (default) -@@ -981,6 +983,8 @@ func (sc *serverConn) serve() { - return - case gracefulShutdownMsg: - sc.startGracefulShutdownInternal() -+ case handlerDoneMsg: -+ sc.handlerDone() - default: - panic("unknown timer") - } -@@ -1028,6 +1032,7 @@ var ( - idleTimerMsg = new(serverMessage) - shutdownTimerMsg = new(serverMessage) - gracefulShutdownMsg = new(serverMessage) -+ handlerDoneMsg = new(serverMessage) - ) - - func (sc *serverConn) onSettingsTimer() { sc.sendServeMsg(settingsTimerMsg) } -@@ -2022,8 +2027,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { - } - } - -- go sc.runHandler(rw, req, handler) -- return nil -+ return sc.scheduleHandler(id, rw, req, handler) - } - - func (sc *serverConn) upgradeRequest(req *http.Request) { -@@ -2043,6 +2047,10 @@ func (sc *serverConn) upgradeRequest(req *http.Request) { - sc.conn.SetReadDeadline(time.Time{}) - } - -+ // This is the first request on the connection, -+ // so start the handler directly rather than going -+ // through scheduleHandler. -+ sc.curHandlers++ - go sc.runHandler(rw, req, sc.handler.ServeHTTP) - } - -@@ -2283,8 +2291,62 @@ func (sc *serverConn) newResponseWriter(st *stream, req *http.Request) *response - return &responseWriter{rws: rws} - } - -+type unstartedHandler struct { -+ streamID uint32 -+ rw *responseWriter -+ req *http.Request -+ handler func(http.ResponseWriter, *http.Request) -+} -+ -+// scheduleHandler starts a handler goroutine, -+// or schedules one to start as soon as an existing handler finishes. -+func (sc *serverConn) scheduleHandler(streamID uint32, rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) error { -+ sc.serveG.check() -+ maxHandlers := sc.advMaxStreams -+ if sc.curHandlers < maxHandlers { -+ sc.curHandlers++ -+ go sc.runHandler(rw, req, handler) -+ return nil -+ } -+ if len(sc.unstartedHandlers) > int(4*sc.advMaxStreams) { -+ return sc.countError("too_many_early_resets", ConnectionError(ErrCodeEnhanceYourCalm)) -+ } -+ sc.unstartedHandlers = append(sc.unstartedHandlers, unstartedHandler{ -+ streamID: streamID, -+ rw: rw, -+ req: req, -+ handler: handler, -+ }) -+ return nil -+} -+ -+func (sc *serverConn) handlerDone() { -+ sc.serveG.check() -+ sc.curHandlers-- -+ i := 0 -+ maxHandlers := sc.advMaxStreams -+ for ; i < len(sc.unstartedHandlers); i++ { -+ u := sc.unstartedHandlers[i] -+ if sc.streams[u.streamID] == nil { -+ // This stream was reset before its goroutine had a chance to start. -+ continue -+ } -+ if sc.curHandlers >= maxHandlers { -+ break -+ } -+ sc.curHandlers++ -+ go sc.runHandler(u.rw, u.req, u.handler) -+ sc.unstartedHandlers[i] = unstartedHandler{} // don't retain references -+ } -+ sc.unstartedHandlers = sc.unstartedHandlers[i:] -+ if len(sc.unstartedHandlers) == 0 { -+ sc.unstartedHandlers = nil -+ } -+} -+ - // Run on its own goroutine. - func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) { -+ defer sc.sendServeMsg(handlerDoneMsg) - didPanic := true - defer func() { - rw.rws.stream.cancelCtx() diff --git a/SPECS/containerized-data-importer/CVE-2023-3978.patch b/SPECS/containerized-data-importer/CVE-2023-3978.patch deleted file mode 100644 index 6a3c1192b1..0000000000 --- a/SPECS/containerized-data-importer/CVE-2023-3978.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 5abbff46d6a70d0e31b41ce98cddaa08cc911e3f Mon Sep 17 00:00:00 2001 -From: Sudipta Pandit -Date: Wed, 5 Feb 2025 20:58:22 +0530 -Subject: [PATCH] Backport fix for CVE-2023-3978 - -Reference: https://go-review.googlesource.com/c/net/+/514896 ---- - vendor/golang.org/x/net/html/render.go | 28 ++++++++++++++++++++++---- - 1 file changed, 24 insertions(+), 4 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/render.go b/vendor/golang.org/x/net/html/render.go -index 497e132..1da09c8 100644 ---- a/vendor/golang.org/x/net/html/render.go -+++ b/vendor/golang.org/x/net/html/render.go -@@ -194,9 +194,8 @@ func render1(w writer, n *Node) error { - } - } - -- // Render any child nodes. -- switch n.Data { -- case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "xmp": -+ // Render any child nodes -+ if childTextNodesAreLiteral(n) { - for c := n.FirstChild; c != nil; c = c.NextSibling { - if c.Type == TextNode { - if _, err := w.WriteString(c.Data); err != nil { -@@ -213,7 +212,7 @@ func render1(w writer, n *Node) error { - // last element in the file, with no closing tag. - return plaintextAbort - } -- default: -+ } else { - for c := n.FirstChild; c != nil; c = c.NextSibling { - if err := render1(w, c); err != nil { - return err -@@ -231,6 +230,27 @@ func render1(w writer, n *Node) error { - return w.WriteByte('>') - } - -+func childTextNodesAreLiteral(n *Node) bool { -+ // Per WHATWG HTML 13.3, if the parent of the current node is a style, -+ // script, xmp, iframe, noembed, noframes, or plaintext element, and the -+ // current node is a text node, append the value of the node's data -+ // literally. The specification is not explicit about it, but we only -+ // enforce this if we are in the HTML namespace (i.e. when the namespace is -+ // ""). -+ // NOTE: we also always include noscript elements, although the -+ // specification states that they should only be rendered as such if -+ // scripting is enabled for the node (which is not something we track). -+ if n.Namespace != "" { -+ return false -+ } -+ switch n.Data { -+ case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "xmp": -+ return true -+ default: -+ return false -+ } -+} -+ - // writeQuoted writes s to w surrounded by quotes. Normally it will use double - // quotes, but if s contains a double quote, it will use single quotes. - // It is used for writing the identifiers in a doctype declaration. --- -2.34.1 - diff --git a/SPECS/containerized-data-importer/CVE-2023-44487.patch b/SPECS/containerized-data-importer/CVE-2023-44487.patch deleted file mode 100644 index ee2a818f28..0000000000 --- a/SPECS/containerized-data-importer/CVE-2023-44487.patch +++ /dev/null @@ -1,258 +0,0 @@ -diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_server.go b/vendor/google.golang.org/grpc/internal/transport/http2_server.go -index 3dd1564..9d9a3fd 100644 ---- a/vendor/google.golang.org/grpc/internal/transport/http2_server.go -+++ b/vendor/google.golang.org/grpc/internal/transport/http2_server.go -@@ -165,15 +165,10 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, - ID: http2.SettingMaxFrameSize, - Val: http2MaxFrameLen, - }} -- // TODO(zhaoq): Have a better way to signal "no limit" because 0 is -- // permitted in the HTTP2 spec. -- maxStreams := config.MaxStreams -- if maxStreams == 0 { -- maxStreams = math.MaxUint32 -- } else { -+ if config.MaxStreams != math.MaxUint32 { - isettings = append(isettings, http2.Setting{ - ID: http2.SettingMaxConcurrentStreams, -- Val: maxStreams, -+ Val: config.MaxStreams, - }) - } - dynamicWindow := true -@@ -252,7 +247,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, - framer: framer, - readerDone: make(chan struct{}), - writerDone: make(chan struct{}), -- maxStreams: maxStreams, -+ maxStreams: config.MaxStreams, - inTapHandle: config.InTapHandle, - fc: &trInFlow{limit: uint32(icwz)}, - state: reachable, -diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go -index f4dde72..98839ad 100644 ---- a/vendor/google.golang.org/grpc/server.go -+++ b/vendor/google.golang.org/grpc/server.go -@@ -43,7 +43,6 @@ import ( - "google.golang.org/grpc/internal" - "google.golang.org/grpc/internal/binarylog" - "google.golang.org/grpc/internal/channelz" -- "google.golang.org/grpc/internal/grpcrand" - "google.golang.org/grpc/internal/grpcsync" - "google.golang.org/grpc/internal/transport" - "google.golang.org/grpc/keepalive" -@@ -74,10 +73,10 @@ func init() { - srv.drainServerTransports(addr) - } - internal.AddGlobalServerOptions = func(opt ...ServerOption) { -- extraServerOptions = append(extraServerOptions, opt...) -+ globalServerOptions = append(globalServerOptions, opt...) - } - internal.ClearGlobalServerOptions = func() { -- extraServerOptions = nil -+ globalServerOptions = nil - } - internal.BinaryLogger = binaryLogger - internal.JoinServerOptions = newJoinServerOption -@@ -115,12 +114,6 @@ type serviceInfo struct { - mdata interface{} - } - --type serverWorkerData struct { -- st transport.ServerTransport -- wg *sync.WaitGroup -- stream *transport.Stream --} -- - // Server is a gRPC server to serve RPC requests. - type Server struct { - opts serverOptions -@@ -145,7 +138,7 @@ type Server struct { - channelzID *channelz.Identifier - czData *channelzData - -- serverWorkerChannels []chan *serverWorkerData -+ serverWorkerChannel chan func() - } - - type serverOptions struct { -@@ -177,13 +170,14 @@ type serverOptions struct { - } - - var defaultServerOptions = serverOptions{ -+ maxConcurrentStreams: math.MaxUint32, - maxReceiveMessageSize: defaultServerMaxReceiveMessageSize, - maxSendMessageSize: defaultServerMaxSendMessageSize, - connectionTimeout: 120 * time.Second, - writeBufferSize: defaultWriteBufSize, - readBufferSize: defaultReadBufSize, - } --var extraServerOptions []ServerOption -+var globalServerOptions []ServerOption - - // A ServerOption sets options such as credentials, codec and keepalive parameters, etc. - type ServerOption interface { -@@ -387,6 +381,9 @@ func MaxSendMsgSize(m int) ServerOption { - // MaxConcurrentStreams returns a ServerOption that will apply a limit on the number - // of concurrent streams to each ServerTransport. - func MaxConcurrentStreams(n uint32) ServerOption { -+ if n == 0 { -+ n = math.MaxUint32 -+ } - return newFuncServerOption(func(o *serverOptions) { - o.maxConcurrentStreams = n - }) -@@ -565,42 +562,35 @@ const serverWorkerResetThreshold = 1 << 16 - // re-allocations (see the runtime.morestack problem [1]). - // - // [1] https://github.com/golang/go/issues/18138 --func (s *Server) serverWorker(ch chan *serverWorkerData) { -- // To make sure all server workers don't reset at the same time, choose a -- // random number of iterations before resetting. -- threshold := serverWorkerResetThreshold + grpcrand.Intn(serverWorkerResetThreshold) -- for completed := 0; completed < threshold; completed++ { -- data, ok := <-ch -+func (s *Server) serverWorker() { -+ for completed := 0; completed < serverWorkerResetThreshold; completed++ { -+ f, ok := <-s.serverWorkerChannel - if !ok { - return - } -- s.handleStream(data.st, data.stream, s.traceInfo(data.st, data.stream)) -- data.wg.Done() -+ f() - } -- go s.serverWorker(ch) -+ go s.serverWorker() - } - - // initServerWorkers creates worker goroutines and channels to process incoming - // connections to reduce the time spent overall on runtime.morestack. - func (s *Server) initServerWorkers() { -- s.serverWorkerChannels = make([]chan *serverWorkerData, s.opts.numServerWorkers) -+ s.serverWorkerChannel = make(chan func()) - for i := uint32(0); i < s.opts.numServerWorkers; i++ { -- s.serverWorkerChannels[i] = make(chan *serverWorkerData) -- go s.serverWorker(s.serverWorkerChannels[i]) -+ go s.serverWorker() - } - } - - func (s *Server) stopServerWorkers() { -- for i := uint32(0); i < s.opts.numServerWorkers; i++ { -- close(s.serverWorkerChannels[i]) -- } -+ close(s.serverWorkerChannel) - } - - // NewServer creates a gRPC server which has no service registered and has not - // started to accept requests yet. - func NewServer(opt ...ServerOption) *Server { - opts := defaultServerOptions -- for _, o := range extraServerOptions { -+ for _, o := range globalServerOptions { - o.apply(&opts) - } - for _, o := range opt { -@@ -945,25 +935,26 @@ func (s *Server) serveStreams(st transport.ServerTransport) { - defer st.Close() - var wg sync.WaitGroup - -- var roundRobinCounter uint32 -+ streamQuota := newHandlerQuota(s.opts.maxConcurrentStreams) - st.HandleStreams(func(stream *transport.Stream) { - wg.Add(1) -+ -+ streamQuota.acquire() -+ f := func() { -+ defer streamQuota.release() -+ defer wg.Done() -+ s.handleStream(st, stream, s.traceInfo(st, stream)) -+ } -+ - if s.opts.numServerWorkers > 0 { -- data := &serverWorkerData{st: st, wg: &wg, stream: stream} - select { -- case s.serverWorkerChannels[atomic.AddUint32(&roundRobinCounter, 1)%s.opts.numServerWorkers] <- data: -+ case s.serverWorkerChannel <- f: -+ return - default: - // If all stream workers are busy, fallback to the default code path. -- go func() { -- s.handleStream(st, stream, s.traceInfo(st, stream)) -- wg.Done() -- }() - } - } else { -- go func() { -- defer wg.Done() -- s.handleStream(st, stream, s.traceInfo(st, stream)) -- }() -+ go f() - } - }, func(ctx context.Context, method string) context.Context { - if !EnableTracing { -@@ -1978,3 +1969,34 @@ type channelzServer struct { - func (c *channelzServer) ChannelzMetric() *channelz.ServerInternalMetric { - return c.s.channelzMetric() - } -+ -+// atomicSemaphore implements a blocking, counting semaphore. acquire should be -+// called synchronously; release may be called asynchronously. -+type atomicSemaphore struct { -+ n atomic.Int64 -+ wait chan struct{} -+} -+ -+func (q *atomicSemaphore) acquire() { -+ if q.n.Add(-1) < 0 { -+ // We ran out of quota. Block until a release happens. -+ <-q.wait -+ } -+} -+ -+func (q *atomicSemaphore) release() { -+ // N.B. the "<= 0" check below should allow for this to work with multiple -+ // concurrent calls to acquire, but also note that with synchronous calls to -+ // acquire, as our system does, n will never be less than -1. There are -+ // fairness issues (queuing) to consider if this was to be generalized. -+ if q.n.Add(1) <= 0 { -+ // An acquire was waiting on us. Unblock it. -+ q.wait <- struct{}{} -+ } -+} -+ -+func newHandlerQuota(n uint32) *atomicSemaphore { -+ a := &atomicSemaphore{wait: make(chan struct{}, 1)} -+ a.n.Store(int64(n)) -+ return a -+} -\ No newline at end of file -diff --git a/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go b/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go -index d738725..3674914 100644 ---- a/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go -+++ b/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go -@@ -126,14 +126,17 @@ type rudimentaryErrorBackoff struct { - // OnError will block if it is called more often than the embedded period time. - // This will prevent overly tight hot error loops. - func (r *rudimentaryErrorBackoff) OnError(error) { -+ now := time.Now() // start the timer before acquiring the lock - r.lastErrorTimeLock.Lock() -- defer r.lastErrorTimeLock.Unlock() -- d := time.Since(r.lastErrorTime) -- if d < r.minPeriod { -- // If the time moves backwards for any reason, do nothing -- time.Sleep(r.minPeriod - d) -- } -+ d := now.Sub(r.lastErrorTime) - r.lastErrorTime = time.Now() -+ r.lastErrorTimeLock.Unlock() -+ -+ // Do not sleep with the lock held because that causes all callers of HandleError to block. -+ // We only want the current goroutine to block. -+ // A negative or zero duration causes time.Sleep to return immediately. -+ // If the time moves backwards for any reason, do nothing. -+ time.Sleep(r.minPeriod - d) - } - - // GetCaller returns the caller of the function that calls it. diff --git a/SPECS/containerized-data-importer/CVE-2023-45288.patch b/SPECS/containerized-data-importer/CVE-2023-45288.patch deleted file mode 100644 index 80eaa40216..0000000000 --- a/SPECS/containerized-data-importer/CVE-2023-45288.patch +++ /dev/null @@ -1,83 +0,0 @@ -Author: Damien Neil -AuthorDate: 2024-01-10 13:41:39 -0800 -Commit: Gopher Robot -CommitDate: 2024-04-03 17:06:00 +0000 - -[internal-branch.go1.21-vendor] http2: close connections when receiving too many headers - -Maintaining HPACK state requires that we parse and process -all HEADERS and CONTINUATION frames on a connection. -When a request's headers exceed MaxHeaderBytes, we don't -allocate memory to store the excess headers but we do -parse them. This permits an attacker to cause an HTTP/2 -endpoint to read arbitrary amounts of data, all associated -with a request which is going to be rejected. - -Set a limit on the amount of excess header frames we -will process before closing a connection. - -Thanks to Bartek Nowotarski for reporting this issue. - -Fixes CVE-2023-45288 -For golang/go#65051 - -Change-Id: I15df097268df13bb5a9e9d3a5c04a8a141d850f6 -Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2130527 -Reviewed-by: Roland Shoemaker -Reviewed-by: Tatiana Bradley -Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2197243 -Run-TryBot: Damien Neil -Reviewed-by: Dmitri Shuralyov -Reviewed-on: https://go-review.googlesource.com/c/net/+/576057 -LUCI-TryBot-Result: Go LUCI -Auto-Submit: Dmitri Shuralyov - -diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go -index c1f6b90..175c154 100644 ---- a/vendor/golang.org/x/net/http2/frame.go -+++ b/vendor/golang.org/x/net/http2/frame.go -@@ -1565,6 +1565,7 @@ - if size > remainSize { - hdec.SetEmitEnabled(false) - mh.Truncated = true -+ remainSize = 0 - return - } - remainSize -= size -@@ -1577,6 +1578,36 @@ - var hc headersOrContinuation = hf - for { - frag := hc.HeaderBlockFragment() -+ -+ // Avoid parsing large amounts of headers that we will then discard. -+ // If the sender exceeds the max header list size by too much, -+ // skip parsing the fragment and close the connection. -+ // -+ // "Too much" is either any CONTINUATION frame after we've already -+ // exceeded the max header list size (in which case remainSize is 0), -+ // or a frame whose encoded size is more than twice the remaining -+ // header list bytes we're willing to accept. -+ if int64(len(frag)) > int64(2*remainSize) { -+ if VerboseLogs { -+ log.Printf("http2: header list too large") -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the struture of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ -+ // Also close the connection after any CONTINUATION frame following an -+ // invalid header, since we stop tracking the size of the headers after -+ // an invalid one. -+ if invalid != nil { -+ if VerboseLogs { -+ log.Printf("http2: invalid header: %v", invalid) -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the struture of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ - if _, err := hdec.Write(frag); err != nil { - return nil, ConnectionError(ErrCodeCompression) - } diff --git a/SPECS/containerized-data-importer/CVE-2024-24786.patch b/SPECS/containerized-data-importer/CVE-2024-24786.patch deleted file mode 100644 index 6c80204f5b..0000000000 --- a/SPECS/containerized-data-importer/CVE-2024-24786.patch +++ /dev/null @@ -1,152 +0,0 @@ -From 1576982839ab9771784526720ed0a2f4a2aa2280 Mon Sep 17 00:00:00 2001 -From: bala -Date: Mon, 25 Nov 2024 16:47:53 +0000 -Subject: [PATCH] Vendor patch applied - ---- - .../protobuf/encoding/protojson/decode.go | 12 ++++ - .../encoding/protojson/well_known_types.go | 59 +++++++------------ - .../protobuf/internal/encoding/json/decode.go | 2 +- - 3 files changed, 33 insertions(+), 40 deletions(-) - -diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/decode.go b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go -index 5f28148..67fe4e7 100644 ---- a/vendor/google.golang.org/protobuf/encoding/protojson/decode.go -+++ b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go -@@ -11,6 +11,7 @@ import ( - "strconv" - "strings" - -+ "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/encoding/json" - "google.golang.org/protobuf/internal/encoding/messageset" - "google.golang.org/protobuf/internal/errors" -@@ -47,6 +48,10 @@ type UnmarshalOptions struct { - protoregistry.MessageTypeResolver - protoregistry.ExtensionTypeResolver - } -+ -+ // RecursionLimit limits how deeply messages may be nested. -+ // If zero, a default limit is applied. -+ RecursionLimit int - } - - // Unmarshal reads the given []byte and populates the given proto.Message -@@ -67,6 +72,9 @@ func (o UnmarshalOptions) unmarshal(b []byte, m proto.Message) error { - if o.Resolver == nil { - o.Resolver = protoregistry.GlobalTypes - } -+ if o.RecursionLimit == 0 { -+ o.RecursionLimit = protowire.DefaultRecursionLimit -+ } - - dec := decoder{json.NewDecoder(b), o} - if err := dec.unmarshalMessage(m.ProtoReflect(), false); err != nil { -@@ -114,6 +122,10 @@ func (d decoder) syntaxError(pos int, f string, x ...interface{}) error { - - // unmarshalMessage unmarshals a message into the given protoreflect.Message. - func (d decoder) unmarshalMessage(m protoreflect.Message, skipTypeURL bool) error { -+ d.opts.RecursionLimit-- -+ if d.opts.RecursionLimit < 0 { -+ return errors.New("exceeded max recursion depth") -+ } - if unmarshal := wellKnownTypeUnmarshaler(m.Descriptor().FullName()); unmarshal != nil { - return unmarshal(d, m) - } -diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go -index 6c37d41..4b177c8 100644 ---- a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go -+++ b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go -@@ -176,7 +176,7 @@ func (d decoder) unmarshalAny(m protoreflect.Message) error { - // Use another decoder to parse the unread bytes for @type field. This - // avoids advancing a read from current decoder because the current JSON - // object may contain the fields of the embedded type. -- dec := decoder{d.Clone(), UnmarshalOptions{}} -+ dec := decoder{d.Clone(), UnmarshalOptions{RecursionLimit: d.opts.RecursionLimit}} - tok, err := findTypeURL(dec) - switch err { - case errEmptyObject: -@@ -308,48 +308,29 @@ Loop: - // array) in order to advance the read to the next JSON value. It relies on - // the decoder returning an error if the types are not in valid sequence. - func (d decoder) skipJSONValue() error { -- tok, err := d.Read() -- if err != nil { -- return err -- } -- // Only need to continue reading for objects and arrays. -- switch tok.Kind() { -- case json.ObjectOpen: -- for { -- tok, err := d.Read() -- if err != nil { -- return err -- } -- switch tok.Kind() { -- case json.ObjectClose: -- return nil -- case json.Name: -- // Skip object field value. -- if err := d.skipJSONValue(); err != nil { -- return err -- } -- } -+ var open int -+ for { -+ tok, err := d.Read() -+ if err != nil { -+ return err - } -- -- case json.ArrayOpen: -- for { -- tok, err := d.Peek() -- if err != nil { -- return err -- } -- switch tok.Kind() { -- case json.ArrayClose: -- d.Read() -- return nil -- default: -- // Skip array item. -- if err := d.skipJSONValue(); err != nil { -- return err -- } -+ switch tok.Kind() { -+ case json.ObjectClose, json.ArrayClose: -+ open-- -+ case json.ObjectOpen, json.ArrayOpen: -+ open++ -+ if open > d.opts.RecursionLimit { -+ return errors.New("exceeded max recursion depth") - } -+ case json.EOF: -+ // This can only happen if there's a bug in Decoder.Read. -+ // Avoid an infinite loop if this does happen. -+ return errors.New("unexpected EOF") -+ } -+ if open == 0 { -+ return nil - } - } -- return nil - } - - // unmarshalAnyValue unmarshals the given custom-type message from the JSON -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go b/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go -index d043a6e..d2b3ac0 100644 ---- a/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go -+++ b/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go -@@ -121,7 +121,7 @@ func (d *Decoder) Read() (Token, error) { - - case ObjectClose: - if len(d.openStack) == 0 || -- d.lastToken.kind == comma || -+ d.lastToken.kind&(Name|comma) != 0 || - d.openStack[len(d.openStack)-1] != ObjectOpen { - return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) - } --- -2.39.4 - diff --git a/SPECS/containerized-data-importer/CVE-2024-28180.patch b/SPECS/containerized-data-importer/CVE-2024-28180.patch deleted file mode 100644 index 45d7246373..0000000000 --- a/SPECS/containerized-data-importer/CVE-2024-28180.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 886860405f81160c23e8e9e8c80694f094f0e104 Mon Sep 17 00:00:00 2001 -From: Kanishk Bansal -Date: Wed, 29 Jan 2025 14:11:18 +0000 -Subject: [PATCH] Address CVE-2024-28180 - ---- - vendor/gopkg.in/square/go-jose.v2/crypter.go | 6 ++++++ - vendor/gopkg.in/square/go-jose.v2/encoding.go | 20 +++++++++++++++---- - 2 files changed, 22 insertions(+), 4 deletions(-) - -diff --git a/vendor/gopkg.in/square/go-jose.v2/crypter.go b/vendor/gopkg.in/square/go-jose.v2/crypter.go -index d24cabf..a628386 100644 ---- a/vendor/gopkg.in/square/go-jose.v2/crypter.go -+++ b/vendor/gopkg.in/square/go-jose.v2/crypter.go -@@ -405,6 +405,9 @@ func (ctx *genericEncrypter) Options() EncrypterOptions { - // Decrypt and validate the object and return the plaintext. Note that this - // function does not support multi-recipient, if you desire multi-recipient - // decryption use DecryptMulti instead. -+// -+// Automatically decompresses plaintext, but returns an error if the decompressed -+// data would be >250kB or >10x the size of the compressed data, whichever is larger. - func (obj JSONWebEncryption) Decrypt(decryptionKey interface{}) ([]byte, error) { - headers := obj.mergedHeaders(nil) - -@@ -469,6 +472,9 @@ func (obj JSONWebEncryption) Decrypt(decryptionKey interface{}) ([]byte, error) - // with support for multiple recipients. It returns the index of the recipient - // for which the decryption was successful, the merged headers for that recipient, - // and the plaintext. -+// -+// Automatically decompresses plaintext, but returns an error if the decompressed -+// data would be >250kB or >3x the size of the compressed data, whichever is larger. - func (obj JSONWebEncryption) DecryptMulti(decryptionKey interface{}) (int, Header, []byte, error) { - globalHeaders := obj.mergedHeaders(nil) - -diff --git a/vendor/gopkg.in/square/go-jose.v2/encoding.go b/vendor/gopkg.in/square/go-jose.v2/encoding.go -index 70f7385..2b92116 100644 ---- a/vendor/gopkg.in/square/go-jose.v2/encoding.go -+++ b/vendor/gopkg.in/square/go-jose.v2/encoding.go -@@ -21,6 +21,7 @@ import ( - "compress/flate" - "encoding/base64" - "encoding/binary" -+ "fmt" - "io" - "math/big" - "strings" -@@ -85,7 +86,7 @@ func decompress(algorithm CompressionAlgorithm, input []byte) ([]byte, error) { - } - } - --// Compress with DEFLATE -+// deflate compresses the input. - func deflate(input []byte) ([]byte, error) { - output := new(bytes.Buffer) - -@@ -97,15 +98,26 @@ func deflate(input []byte) ([]byte, error) { - return output.Bytes(), err - } - --// Decompress with DEFLATE -+// inflate decompresses the input. -+// -+// Errors if the decompressed data would be >250kB or >10x the size of the -+// compressed data, whichever is larger. - func inflate(input []byte) ([]byte, error) { - output := new(bytes.Buffer) - reader := flate.NewReader(bytes.NewBuffer(input)) - -- _, err := io.Copy(output, reader) -- if err != nil { -+ maxCompressedSize := 10 * int64(len(input)) -+ if maxCompressedSize < 250000 { -+ maxCompressedSize = 250000 -+ } -+ limit := maxCompressedSize + 1 -+ n, err := io.CopyN(output, reader, limit) -+ if err != nil && err != io.EOF { - return nil, err - } -+ if n == limit { -+ return nil, fmt.Errorf("uncompressed data would be too large (>%d bytes)", maxCompressedSize) -+ } - - err = reader.Close() - return output.Bytes(), err --- -2.43.0 - diff --git a/SPECS/containerized-data-importer/CVE-2024-3727.patch b/SPECS/containerized-data-importer/CVE-2024-3727.patch deleted file mode 100644 index 92f882851e..0000000000 --- a/SPECS/containerized-data-importer/CVE-2024-3727.patch +++ /dev/null @@ -1,165 +0,0 @@ -From ea14d57b98cc37decad0c39ccbafb27994274b47 Mon Sep 17 00:00:00 2001 -From: Brian Fjeldstad -Date: Thu, 6 Jun 2024 21:13:36 +0000 -Subject: [PATCH] apply CVE-2024-3727 fix to v5.19.1 - ---- - vendor/github.com/containers/image/v5/docker/docker_client.go | 3 +++ - vendor/github.com/containers/image/v5/docker/docker_image.go | 8 ++++++-- - vendor/github.com/containers/image/v5/docker/docker_image_dest.go | 15 ++++++++++++--- - vendor/github.com/containers/image/v5/docker/docker_image_src.go | 19 +++++++++++++++++-- - vendor/github.com/containers/image/v5/docker/lookaside.go | 7 +++++-- - 5 files changed, 43 insertions(+), 9 deletions(-) - -diff --git a/vendor/github.com/containers/image/v5/docker/docker_client.go b/vendor/github.com/containers/image/v5/docker/docker_client.go -index 833323b4..99bde923 100644 ---- a/vendor/github.com/containers/image/v5/docker/docker_client.go -+++ b/vendor/github.com/containers/image/v5/docker/docker_client.go -@@ -796,6 +796,9 @@ func (c *dockerClient) detectProperties(ctx context.Context) error { - // getExtensionsSignatures returns signatures from the X-Registry-Supports-Signatures API extension, - // using the original data structures. - func (c *dockerClient) getExtensionsSignatures(ctx context.Context, ref dockerReference, manifestDigest digest.Digest) (*extensionSignatureList, error) { -+ if err := manifestDigest.Validate(); err != nil { // Make sure manifestDigest.String() does not contain any unexpected characters -+ return nil, err -+ } - path := fmt.Sprintf(extensionsSignaturePath, reference.Path(ref.ref), manifestDigest) - res, err := c.makeRequest(ctx, http.MethodGet, path, nil, nil, v2Auth, nil) - if err != nil { -diff --git a/vendor/github.com/containers/image/v5/docker/docker_image.go b/vendor/github.com/containers/image/v5/docker/docker_image.go -index c84bb37d..0076d229 100644 ---- a/vendor/github.com/containers/image/v5/docker/docker_image.go -+++ b/vendor/github.com/containers/image/v5/docker/docker_image.go -@@ -83,8 +83,12 @@ func GetRepositoryTags(ctx context.Context, sys *types.SystemContext, ref types. - if err = json.NewDecoder(res.Body).Decode(&tagsHolder); err != nil { - return nil, err - } -- tags = append(tags, tagsHolder.Tags...) -- -+ for _, tag := range tagsHolder.Tags { -+ if _, err := reference.WithTag(dr.ref, tag); err != nil { // Ensure the tag does not contain unexpected values -+ return nil, fmt.Errorf("registry returned invalid tag %q: %w", tag, err) -+ } -+ tags = append(tags, tag) -+ } - link := res.Header.Get("Link") - if link == "" { - break -diff --git a/vendor/github.com/containers/image/v5/docker/docker_image_dest.go b/vendor/github.com/containers/image/v5/docker/docker_image_dest.go -index e7af8f93..1096c56f 100644 ---- a/vendor/github.com/containers/image/v5/docker/docker_image_dest.go -+++ b/vendor/github.com/containers/image/v5/docker/docker_image_dest.go -@@ -226,6 +226,9 @@ func (d *dockerImageDestination) PutBlob(ctx context.Context, stream io.Reader, - // If the destination does not contain the blob, or it is unknown, blobExists ordinarily returns (false, -1, nil); - // it returns a non-nil error only on an unexpected failure. - func (d *dockerImageDestination) blobExists(ctx context.Context, repo reference.Named, digest digest.Digest, extraScope *authScope) (bool, int64, error) { -+ if err := digest.Validate(); err != nil { // Make sure digest.String() does not contain any unexpected characters -+ return false, -1, err -+ } - checkPath := fmt.Sprintf(blobsPath, reference.Path(repo), digest.String()) - logrus.Debugf("Checking %s", checkPath) - res, err := d.c.makeRequest(ctx, http.MethodHead, checkPath, nil, nil, v2Auth, extraScope) -@@ -558,8 +561,11 @@ func (d *dockerImageDestination) putSignaturesToLookaside(signatures [][]byte, m - - // NOTE: Keep this in sync with docs/signature-protocols.md! - for i, signature := range signatures { -- url := signatureStorageURL(d.c.signatureBase, manifestDigest, i) -- err := d.putOneSignature(url, signature) -+ url, err := signatureStorageURL(d.c.signatureBase, manifestDigest, i) -+ if err != nil { -+ return err -+ } -+ err = d.putOneSignature(url, signature) - if err != nil { - return err - } -@@ -570,7 +576,10 @@ func (d *dockerImageDestination) putSignaturesToLookaside(signatures [][]byte, m - // is enough for dockerImageSource to stop looking for other signatures, so that - // is sufficient. - for i := len(signatures); ; i++ { -- url := signatureStorageURL(d.c.signatureBase, manifestDigest, i) -+ url, err := signatureStorageURL(d.c.signatureBase, manifestDigest, i) -+ if err != nil { -+ return err -+ } - missing, err := d.c.deleteOneSignature(url) - if err != nil { - return err -diff --git a/vendor/github.com/containers/image/v5/docker/docker_image_src.go b/vendor/github.com/containers/image/v5/docker/docker_image_src.go -index 314e9b39..43ca0c4f 100644 ---- a/vendor/github.com/containers/image/v5/docker/docker_image_src.go -+++ b/vendor/github.com/containers/image/v5/docker/docker_image_src.go -@@ -178,6 +178,9 @@ func simplifyContentType(contentType string) string { - // this never happens if the primary manifest is not a manifest list (e.g. if the source never returns manifest lists). - func (s *dockerImageSource) GetManifest(ctx context.Context, instanceDigest *digest.Digest) ([]byte, string, error) { - if instanceDigest != nil { -+ if err := instanceDigest.Validate(); err != nil { // Make sure instanceDigest.String() does not contain any unexpected characters -+ return nil, "", err -+ } - return s.fetchManifest(ctx, instanceDigest.String()) - } - err := s.ensureManifestIsLoaded(ctx) -@@ -373,6 +376,9 @@ func (s *dockerImageSource) GetBlobAt(ctx context.Context, info types.BlobInfo, - return nil, nil, fmt.Errorf("external URLs not supported with GetBlobAt") - } - -+ if err := info.Digest.Validate(); err != nil { // Make sure info.Digest.String() does not contain any unexpected characters -+ return nil, nil, err -+ } - path := fmt.Sprintf(blobsPath, reference.Path(s.physicalRef.ref), info.Digest.String()) - logrus.Debugf("Downloading %s", path) - res, err := s.c.makeRequest(ctx, http.MethodGet, path, headers, nil, v2Auth, nil) -@@ -425,6 +431,9 @@ func (s *dockerImageSource) GetBlob(ctx context.Context, info types.BlobInfo, ca - } - } - -+ if err := info.Digest.Validate(); err != nil { // Make sure info.Digest.String() does not contain any unexpected characters -+ return nil, 0, err -+ } - path := fmt.Sprintf(blobsPath, reference.Path(s.physicalRef.ref), info.Digest.String()) - logrus.Debugf("Downloading %s", path) - res, err := s.c.makeRequest(ctx, http.MethodGet, path, nil, nil, v2Auth, nil) -@@ -486,7 +495,10 @@ func (s *dockerImageSource) getSignaturesFromLookaside(ctx context.Context, inst - // NOTE: Keep this in sync with docs/signature-protocols.md! - signatures := [][]byte{} - for i := 0; ; i++ { -- url := signatureStorageURL(s.c.signatureBase, manifestDigest, i) -+ url, err := signatureStorageURL(s.c.signatureBase, manifestDigest, i) -+ if err != nil { -+ return nil, err -+ } - signature, missing, err := s.getOneSignature(ctx, url) - if err != nil { - return nil, err -@@ -627,7 +639,10 @@ func deleteImage(ctx context.Context, sys *types.SystemContext, ref dockerRefere - } - - for i := 0; ; i++ { -- url := signatureStorageURL(c.signatureBase, manifestDigest, i) -+ url, err := signatureStorageURL(c.signatureBase, manifestDigest, i) -+ if err != nil { -+ return err -+ } - missing, err := c.deleteOneSignature(url) - if err != nil { - return err -diff --git a/vendor/github.com/containers/image/v5/docker/lookaside.go b/vendor/github.com/containers/image/v5/docker/lookaside.go -index 515e5932..2e400c09 100644 ---- a/vendor/github.com/containers/image/v5/docker/lookaside.go -+++ b/vendor/github.com/containers/image/v5/docker/lookaside.go -@@ -229,8 +229,11 @@ func (ns registryNamespace) signatureTopLevel(write bool) string { - // signatureStorageURL returns an URL usable for accessing signature index in base with known manifestDigest. - // base is not nil from the caller - // NOTE: Keep this in sync with docs/signature-protocols.md! --func signatureStorageURL(base signatureStorageBase, manifestDigest digest.Digest, index int) *url.URL { -+func signatureStorageURL(base signatureStorageBase, manifestDigest digest.Digest, index int) (*url.URL, error) { -+ if err := manifestDigest.Validate(); err != nil { // digest.Digest.Hex() panics on failure, and could possibly result in a path with ../, so validate explicitly. -+ return nil, err -+ } - url := *base - url.Path = fmt.Sprintf("%s@%s=%s/signature-%d", url.Path, manifestDigest.Algorithm(), manifestDigest.Hex(), index+1) -- return &url -+ return &url, nil - } --- -2.34.1 - diff --git a/SPECS/containerized-data-importer/CVE-2024-45338.patch b/SPECS/containerized-data-importer/CVE-2024-45338.patch deleted file mode 100644 index b1a7b33304..0000000000 --- a/SPECS/containerized-data-importer/CVE-2024-45338.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 0c0cb82a7671b2aa12c5136ab9368245e3803985 Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Thu, 2 Jan 2025 10:22:13 +0000 -Subject: [PATCH] Fix CVE CVE-2024-45338 in containerized-data-importer - ---- - .../vendor/golang.org/x/net/html/doctype.go | 2 +- - .../vendor/golang.org/x/net/html/foreign.go | 3 +-- - .../vendor/golang.org/x/net/html/parse.go | 4 ++-- - 3 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go -index c484e5a..bca3ae9 100644 ---- a/vendor/golang.org/x/net/html/doctype.go -+++ b/vendor/golang.org/x/net/html/doctype.go -@@ -87,7 +87,7 @@ func parseDoctype(s string) (n *Node, quirks bool) { - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && -- strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { -+ strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") { - quirks = true - } - } -diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go -index 9da9e9d..e8515d8 100644 ---- a/vendor/golang.org/x/net/html/foreign.go -+++ b/vendor/golang.org/x/net/html/foreign.go -@@ -40,8 +40,7 @@ func htmlIntegrationPoint(n *Node) bool { - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { -- val := strings.ToLower(a.Val) -- if val == "text/html" || val == "application/xhtml+xml" { -+ if strings.EqualFold(a.Val, "text/html") || strings.EqualFold(a.Val, "application/xhtml+xml") { - return true - } - } -diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go -index 46a89ed..5b8374b 100644 ---- a/vendor/golang.org/x/net/html/parse.go -+++ b/vendor/golang.org/x/net/html/parse.go -@@ -1031,7 +1031,7 @@ func inBodyIM(p *parser) bool { - if p.tok.DataAtom == a.Input { - for _, t := range p.tok.Attr { - if t.Key == "type" { -- if strings.ToLower(t.Val) == "hidden" { -+ if strings.EqualFold(t.Val, "hidden") { - // Skip setting framesetOK = false - return true - } -@@ -1459,7 +1459,7 @@ func inTableIM(p *parser) bool { - return inHeadIM(p) - case a.Input: - for _, t := range p.tok.Attr { -- if t.Key == "type" && strings.ToLower(t.Val) == "hidden" { -+ if t.Key == "type" && strings.EqualFold(t.Val, "hidden") { - p.addElement() - p.oe.pop() - return true --- -2.39.4 - diff --git a/SPECS/containerized-data-importer/CVE-2025-22868.patch b/SPECS/containerized-data-importer/CVE-2025-22868.patch deleted file mode 100644 index c4f136f3ca..0000000000 --- a/SPECS/containerized-data-importer/CVE-2025-22868.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 681b4d8edca1bcfea5bce685d77ea7b82ed3e7b3 Mon Sep 17 00:00:00 2001 -From: Neal Patel -Date: Thu, 30 Jan 2025 14:10:09 -0500 -Subject: [PATCH] jws: split token into fixed number of parts - -Thanks to 'jub0bs' for reporting this issue. - -Fixes #71490 -Fixes CVE-2025-22868 - -Change-Id: I2552731f46d4907f29aafe7863c558387b6bd6e2 -Reviewed-on: https://go-review.googlesource.com/c/oauth2/+/652155 -Auto-Submit: Gopher Robot -Reviewed-by: Damien Neil -Reviewed-by: Roland Shoemaker -LUCI-TryBot-Result: Go LUCI ---- - vendor/golang.org/x/oauth2/jws/jws.go | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/oauth2/jws/jws.go b/vendor/golang.org/x/oauth2/jws/jws.go -index 95015648b..6f03a49d3 100644 ---- a/vendor/golang.org/x/oauth2/jws/jws.go -+++ b/vendor/golang.org/x/oauth2/jws/jws.go -@@ -165,11 +165,11 @@ func Encode(header *Header, c *ClaimSet, key *rsa.PrivateKey) (string, error) { - // Verify tests whether the provided JWT token's signature was produced by the private key - // associated with the supplied public key. - func Verify(token string, key *rsa.PublicKey) error { -- parts := strings.Split(token, ".") -- if len(parts) != 3 { -+ if strings.Count(token, ".") != 2 { - return errors.New("jws: invalid token received, token must have 3 parts") - } - -+ parts := strings.SplitN(token, ".", 3) - signedContent := parts[0] + "." + parts[1] - signatureString, err := base64.RawURLEncoding.DecodeString(parts[2]) - if err != nil { diff --git a/SPECS/containerized-data-importer/CVE-2025-22872.patch b/SPECS/containerized-data-importer/CVE-2025-22872.patch deleted file mode 100644 index c86baa1694..0000000000 --- a/SPECS/containerized-data-importer/CVE-2025-22872.patch +++ /dev/null @@ -1,42 +0,0 @@ -From c87c77a12e5554d376945bd488e56d4fc5b9e5ac Mon Sep 17 00:00:00 2001 -From: archana25-ms -Date: Tue, 22 Apr 2025 06:32:35 +0000 -Subject: [PATCH] Address CVE-2025-22872 -Upstream Patch Reference: https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9 - ---- - vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index 3c57880..6598c1f 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType { - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } -- // Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken --- -2.45.3 - diff --git a/SPECS/containerized-data-importer/CVE-2025-27144.patch b/SPECS/containerized-data-importer/CVE-2025-27144.patch deleted file mode 100644 index 6015ed48ca..0000000000 --- a/SPECS/containerized-data-importer/CVE-2025-27144.patch +++ /dev/null @@ -1,50 +0,0 @@ -From fa324fa38481f9d2da9109cb5983326f62ff7507 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Fri, 28 Feb 2025 07:45:53 +0000 -Subject: [PATCH] CVE-2025-27144 -Upstream Ref: https://github.com/go-jose/go-jose/commit/c9ed84d8f0cfadcfad817150158caca6fcbc518b - ---- - vendor/gopkg.in/square/go-jose.v2/jwe.go | 5 +++-- - vendor/gopkg.in/square/go-jose.v2/jws.go | 5 +++-- - 2 files changed, 6 insertions(+), 4 deletions(-) - -diff --git a/vendor/gopkg.in/square/go-jose.v2/jwe.go b/vendor/gopkg.in/square/go-jose.v2/jwe.go -index b5a6dcd..cd1de9e 100644 ---- a/vendor/gopkg.in/square/go-jose.v2/jwe.go -+++ b/vendor/gopkg.in/square/go-jose.v2/jwe.go -@@ -201,10 +201,11 @@ func (parsed *rawJSONWebEncryption) sanitized() (*JSONWebEncryption, error) { - - // parseEncryptedCompact parses a message in compact format. - func parseEncryptedCompact(input string) (*JSONWebEncryption, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 5 { -+ // Five parts is four separators -+ if strings.Count(input, ".") != 4 { - return nil, fmt.Errorf("square/go-jose: compact JWE format must have five parts") - } -+ parts := strings.SplitN(input, ".", 5) - - rawProtected, err := base64.RawURLEncoding.DecodeString(parts[0]) - if err != nil { -diff --git a/vendor/gopkg.in/square/go-jose.v2/jws.go b/vendor/gopkg.in/square/go-jose.v2/jws.go -index 7e261f9..a8d55fb 100644 ---- a/vendor/gopkg.in/square/go-jose.v2/jws.go -+++ b/vendor/gopkg.in/square/go-jose.v2/jws.go -@@ -275,10 +275,11 @@ func (parsed *rawJSONWebSignature) sanitized() (*JSONWebSignature, error) { - - // parseSignedCompact parses a message in compact format. - func parseSignedCompact(input string, payload []byte) (*JSONWebSignature, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 3 { -+ // Three parts is two separators -+ if strings.Count(input, ".") != 2 { - return nil, fmt.Errorf("square/go-jose: compact JWS format must have three parts") - } -+ parts := strings.SplitN(input, ".", 3) - - if parts[1] != "" && payload != nil { - return nil, fmt.Errorf("square/go-jose: payload is not detached") --- -2.45.2 - diff --git a/SPECS/containerized-data-importer/containerized-data-importer.signatures.json b/SPECS/containerized-data-importer/containerized-data-importer.signatures.json deleted file mode 100644 index d5ded8e703..0000000000 --- a/SPECS/containerized-data-importer/containerized-data-importer.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "containerized-data-importer-1.57.0.tar.gz": "71191e9e98df6d73490ae2bb74fa069bd2967a439f9a76d6bba1822fccc134ce" - } -} diff --git a/SPECS/containerized-data-importer/containerized-data-importer.spec b/SPECS/containerized-data-importer/containerized-data-importer.spec deleted file mode 100644 index 397a471710..0000000000 --- a/SPECS/containerized-data-importer/containerized-data-importer.spec +++ /dev/null @@ -1,581 +0,0 @@ -# -# spec file for package containerized-data-importer -# -# Copyright (c) 2022 SUSE LLC -# -# All modifications and additions to the file contributed by third parties -# remain the property of their copyright owners, unless otherwise agreed -# upon. The license for this file, and modifications and additions to the -# file, is the same license as for the pristine package itself (unless the -# license for the pristine package is not an Open Source License, in which -# case the license is the MIT License). An "Open Source License" is a -# license that conforms to the Open Source Definition (Version 1.9) -# published by the Open Source Initiative. - -# Please submit bugfixes or comments via https://bugs.opensuse.org/ -# - -Summary: Container native virtualization -Name: containerized-data-importer -Version: 1.57.0 -Release: 16%{?dist} -License: ASL 2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: System/Packages -URL: https://github.com/kubevirt/containerized-data-importer -Source0: https://github.com/kubevirt/containerized-data-importer/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -Patch0: CVE-2024-3727.patch -Patch1: CVE-2022-2879.patch -Patch2: CVE-2024-24786.patch -Patch3: CVE-2024-45338.patch -Patch4: CVE-2023-39325.patch -Patch5: CVE-2023-44487.patch -Patch6: CVE-2024-28180.patch -Patch7: CVE-2023-45288.patch -Patch8: CVE-2023-3978.patch -Patch9: CVE-2025-27144.patch -Patch10: CVE-2025-22868.patch -Patch11: CVE-2025-22872.patch -BuildRequires: golang < 1.25 -BuildRequires: golang-packaging -BuildRequires: libnbd-devel -BuildRequires: pkgconfig -BuildRequires: rsync -BuildRequires: sed -Provides: cdi = %{version}-%{release} -ExclusiveArch: x86_64 aarch64 - -%description -Containerized-Data-Importer (CDI) is a persistent storage management add-on for Kubernetes - -%package api -Summary: CDI API server -Group: System/Packages -Provides: cdi-apiserver = %{version}-%{release} - -%description api -The containerized-data-importer-api package provides the kubernetes API extension for CDI - -%package cloner -Summary: Cloner for host assisted cloning -Group: System/Packages - -%description cloner -Source and Target cloner image for host assisted cloning - -%package controller -Summary: Controller for the data fetching service -Group: System/Packages - -%description controller -Controller for the data fetching service for VM container images - -%package importer -Summary: Data fetching service -Group: System/Packages -Requires: nbdkit - -%description importer -Data fetching service for VM container imagess - -%package operator -Summary: Operator for the data fetching service -Group: System/Packages - -%description operator -Operator for the data fetching service for VM container images - -%package uploadproxy -Summary: Upload proxy for the data fetching service -Group: System/Packages - -%description uploadproxy -Upload proxy for the data fetching service for VM container images - -%package uploadserver -Summary: Upload server for the data fetching service -Group: System/Packages - -%description uploadserver -Upload server for the data fetching service for VM container images - -%package manifests -Summary: YAML manifests used to install CDI -Group: System/Packages - -%description manifests -This contains the built YAML manifests used to install CDI into a -kubernetes installation with kubectl apply. - -%prep -# Unpack the sources respecting the GOPATH directory structure expected by the -# go imports resolver. I.e. if DIR is in GOPATH then DIR/src/foo/bar can be -# imported as "foo/bar". The same 'visibility' rules apply to the local copies -# of external dependencies placed in 'vendor' directory when imported from the -# 'parent' package. -# -# Note: having bar symlink'ed to DIR/src/foo/bar does not seem to work. Looks -# like symlinks in go path are not resolved correctly. Hence the sources need -# to be 'physically' placed into the proper location. -%setup -q -n go/src/kubevirt.io/%{name} -c -T -tar --strip-components=1 -xf %{SOURCE0} -%autopatch -p1 - -%build - -export GOPATH=%{_builddir}/go -export GOFLAGS="-mod=vendor" -export CDI_SOURCE_DATE_EPOCH="$(date -r LICENSE +%s)" -export CDI_GIT_COMMIT='v%{version}' -export CDI_GIT_VERSION='v%{version}' -export CDI_GIT_TREE_STATE="clean" - -GOFLAGS="-buildmode=pie ${GOFLAGS}" ./hack/build/build-go.sh build \ - cmd/cdi-apiserver \ - cmd/cdi-cloner \ - cmd/cdi-controller \ - cmd/cdi-importer \ - cmd/cdi-uploadproxy \ - cmd/cdi-uploadserver \ - cmd/cdi-operator \ - tools/cdi-image-size-detection \ - tools/cdi-source-update-poller \ - tools/csv-generator \ - %{nil} - -# Disable cgo to build static binaries, so they can run on scratch images -CGO_ENABLED=0 ./hack/build/build-go.sh build \ - tools/cdi-containerimage-server \ - %{nil} - -./hack/build/build-manifests.sh - -%install -mkdir -p %{buildroot}%{_bindir} - -install -p -m 0755 _out/cmd/cdi-apiserver/cdi-apiserver %{buildroot}%{_bindir}/cdi-apiserver - -install -p -m 0755 cmd/cdi-cloner/cloner_startup.sh %{buildroot}%{_bindir}/ -install -p -m 0755 _out/cmd/cdi-cloner/cdi-cloner %{buildroot}%{_bindir}/ - -install -p -m 0755 _out/cmd/cdi-controller/cdi-controller %{buildroot}%{_bindir}/cdi-controller - -install -p -m 0755 _out/cmd/cdi-importer/cdi-importer %{buildroot}%{_bindir}/cdi-importer - -install -p -m 0755 _out/cmd/cdi-operator/cdi-operator %{buildroot}%{_bindir}/cdi-operator - -install -p -m 0755 _out/cmd/cdi-uploadproxy/cdi-uploadproxy %{buildroot}%{_bindir}/cdi-uploadproxy - -install -p -m 0755 _out/cmd/cdi-uploadserver/cdi-uploadserver %{buildroot}%{_bindir}/cdi-uploadserver - -install -p -m 0755 _out/tools/cdi-containerimage-server/cdi-containerimage-server %{buildroot}%{_bindir}/cdi-containerimage-server - -install -p -m 0755 _out/tools/cdi-image-size-detection/cdi-image-size-detection %{buildroot}%{_bindir}/cdi-image-size-detection - -install -p -m 0755 _out/tools/cdi-source-update-poller/cdi-source-update-poller %{buildroot}%{_bindir}/cdi-source-update-poller - -install -p -m 0755 _out/tools/csv-generator/csv-generator %{buildroot}%{_bindir}/csv-generator - -# Install release manifests -mkdir -p %{buildroot}%{_datadir}/cdi/manifests/release -install -m 0644 _out/manifests/release/cdi-operator.yaml %{buildroot}%{_datadir}/cdi/manifests/release/ -install -m 0644 _out/manifests/release/cdi-cr.yaml %{buildroot}%{_datadir}/cdi/manifests/release/ - -%files api -%license LICENSE -%doc README.md -%{_bindir}/cdi-apiserver - -%files cloner -%license LICENSE -%doc README.md -%{_bindir}/cloner_startup.sh -%{_bindir}/cdi-cloner - -%files controller -%license LICENSE -%doc README.md -%{_bindir}/cdi-controller - -%files importer -%license LICENSE -%doc README.md -%{_bindir}/cdi-importer -%{_bindir}/cdi-containerimage-server -%{_bindir}/cdi-image-size-detection -%{_bindir}/cdi-source-update-poller - -%files operator -%license LICENSE -%doc README.md -%{_bindir}/cdi-operator -%{_bindir}/csv-generator - -%files uploadproxy -%license LICENSE -%doc README.md -%{_bindir}/cdi-uploadproxy - -%files uploadserver -%license LICENSE -%doc README.md -%{_bindir}/cdi-uploadserver - -%files manifests -%license LICENSE -%doc README.md -%dir %{_datadir}/cdi -%dir %{_datadir}/cdi/manifests -%dir %{_datadir}/cdi/manifests/release -%{_datadir}/cdi/manifests - -%changelog -* Fri Oct 3 2025 Lee Chee Yang - 1.57.0-16 -- merge from Azure Linux 3.0.20250910-3.0 -- Set BR for golang to < 1.25 - -* Fri May 30 2025 Ranjan Dutta - 1.57.0-15 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22872 - -* Fri Mar 21 2025 Anuj Mittal - 1.57.0-14 -- Bump Release to rebuild - -* Mon Mar 03 2025 Kanishk Bansal - 1.57.0-13 -- Fix CVE-2025-27144, CVE-2025-22868 - -* Sun Feb 23 2025 Sudipta Pandit - 1.57.0-12 -- Fix CVE-2023-3978 with a backported patch - -* Fri Feb 14 2025 Kanishk Bansal - 1.57.0-11 -- Address CVE-2023-45288 - -* Mon Feb 03 2025 Sharath Srikanth Chellappa - 1.57.0-10 -- Rename cdi binaries to be inline with upstream. - -* Wed Jan 29 2025 Kanishk Bansal - 1.57.0-9 -- Fix CVE-2024-28180 with an upstream patch - -* Fri Jan 24 2025 Henry Li - 1.57.0-8 -- Add patch for CVE-2023-39325 and CVE-2023-44487 - -* Tue Dec 31 2024 Rohit Rawat - 1.57.0-7 -- Add patch for CVE-2024-45338 - -* Mon Nov 25 2024 Bala - 1.57.0-6 -- Fix CVE-2024-24786 - -* Fri Sep 06 2024 Aditya Dubey - 1.57.0-5 -- Statically building binaries - -* Fri Jul 19 2024 Aditya Dubey - 1.57.0-4 -- Building cdi tool binaries within package build - -* Wed Jul 10 2024 Thien Trung Vuong - 1.57.0-3 -- Address CVE-2022-2879 by patching vendored github.com/vbatss/tar-split - -* Thu Jun 06 2024 Brian Fjeldstad - 1.57.0-2 -- Address CVE-2024-3727 by patching vendored github.com/containers/image - -* Fri Oct 27 2023 CBL-Mariner Servicing Account - 1.57.0-1 -- Auto-upgrade to 1.57.0 - Azure Linux 3.0 - package upgrades - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 1.55.0-16 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 1.55.0-15 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.55.0-14 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 1.55.0-13 -- Bump release to rebuild with go 1.19.11 - -* Tue Jun 27 2023 Vince Perri - 1.55.0-12 -- Add nbkdit as a dependency for the importer - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 1.55.0-11 -- Bump release to rebuild with go 1.19.10 - -* Fri May 26 2023 Aditya Dubey - 1.55.0-0 -- Update to verion 1.55.0 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.51.0-10 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 1.51.0-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 1.51.0-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 1.51.0-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 1.51.0-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 1.51.0-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 1.51.0-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Ameya Usgaonkar - 1.51.0-3 -- Shorthand nomenclature for containerized-data-importer (cdi) -- Provide api as apiserver - -* Mon Aug 22 2022 Olivia Crain - 1.51.0-2 -- Bump release to rebuild against Go 1.18.5 - -* Wed Aug 3 2022 Ameya Usgaonkar - 1.51.0-1 -- Initial changes to build for Mariner -- License verified -- Initial CBL-Mariner import from openSUSE Tumbleweed (license: same as "License" tag) - -* Fri Jul 15 2022 Vasily Ulyanov -- Update to version 1.51.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.51.0 - -* Tue Jun 21 2022 Vasily Ulyanov -- Update to version 1.50.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.50.0 - -* Tue May 31 2022 Caleb Crane -- Update to version 1.49.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.49.0 - -* Mon Apr 25 2022 Caleb Crane -- Update to version 1.48.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.48.0 - -* Mon Apr 11 2022 Vasily Ulyanov -- Update to version 1.47.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.47.0 - -* Fri Apr 1 2022 Vasily Ulyanov -- Update to version 1.46.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.46.0 - -* Thu Mar 10 2022 Vasily Ulyanov -- Update to version 1.45.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.45.0 - -* Fri Feb 4 2022 Vasily Ulyanov -- Pack only cdi-{cr,operator}.yaml into the manifests RPM - -* Tue Feb 1 2022 Vasily Ulyanov -- Update to version 1.44.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.44.0 - -* Thu Jan 13 2022 Guillaume GARDET -- Enable build on aarch64 - -* Mon Jan 10 2022 Vasily Ulyanov -- Update to version 1.43.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.43.0 - -* Sun Dec 19 2021 Vasily Ulyanov -- Update to version 1.42.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.42.0 - -* Fri Nov 26 2021 Vasily Ulyanov -- Detect SLE15 SP4 build environment - -* Fri Nov 12 2021 Vasily Ulyanov -- Update to version 1.41.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.41.0 - -* Mon Oct 11 2021 Vasily Ulyanov -- Update to version 1.40.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.40.0 - -* Tue Aug 10 2021 Vasily Ulyanov -- Update to version 1.37.1 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.37.1 - -* Mon Jul 12 2021 Vasily Ulyanov -- Update to version 1.36.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.36.0 - -* Wed Jun 30 2021 Vasily Ulyanov -- Generate meta info for containers during rpm build - -* Mon Jun 14 2021 Vasily Ulyanov -- Use registry.suse.com as the default fallback for sle -- Rename macro registry_path to kubevirt_registry_path -- Update to version 1.35.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.35.0 - -* Fri Jun 4 2021 Fabian Vogt -- Add REGISTRY variable - -* Thu May 20 2021 Vasily Ulyanov -- Update to version 1.34.0 - Release notes https://github.com/kubevirt/containerized-data-importer/releases/tag/v1.34.0 - -* Thu May 20 2021 Vasily Ulyanov -- Disable changelog generation via tar_scm service (too verbose) - -* Thu Apr 29 2021 Vasily Ulyanov -- Include release number into docker tag -- Add cdi_containers_meta build service - -* Thu Apr 29 2021 Vasily Ulyanov -- Set default reg_path='registry.opensuse.org/kubevirt' -- Add _constraints file with disk requirements -- Drop CDI_VERSION env var since its not used during the build - -* Wed Apr 21 2021 Vasily Ulyanov -- Preparation for submission to SLE15 SP2 - jsc#SLE-11089 jsc#ECO-3633 - -* Thu Apr 15 2021 Vasily Ulyanov -- Drop csv-generator - -* Wed Apr 7 2021 Vasily Ulyanov -- Update registry path - -* Fri Mar 5 2021 Vasily Ulyanov -- Fix import of vendor dependencies - * Arrange the directory layout in buildroot - * Drop manifest-build-fix.patch - * Switch to Go 1.14 (used for upstream builds) - -* Fri Feb 26 2021 James Fehlig -- Add a manifests package containing YAML manifests used to - install CDI - manifest-build-fix.patch - -* Wed Feb 24 2021 jfehlig@suse.com -- Update to version 1.30.0: - * Release to quay.io instead of docker (#1635) - * Preallocation test did not run all scenarios (#1625) - * Add diagnostic to flake test (#1626) - * VDDK: avoid crash when specified disk isn't in VM. (#1639) - * rename importController to uploadController in the upload-controller.go file (#1632) - * Simplify shouldReconcile function arguments. (#1602) - * Increase polling interval for upload annotation test (#1630) - * Remove note about VDDK 7 restriction. (#1631) - * Remove OLM integration code not removed in #982 (#1624) - * Fix typos in doc/datavolumes.md (#1621) - * Support cloning from Filesystem to Block and vice-versa (#1597) - * Add error to DV when VDDK configmap is missing. (#1627) - * Add focus for destructive tests. (#1614) - * Wait for clone to succeed before checking MD5. (#1601) - * doc: update url in doc/datavolumes.md. (#1609) - * Enable tests for featuregates (#1600) - * Make string we are checking for less specific to allow it pass for other platforms. (#1580) - * Validate image fits in filesystem in a lot more cases. take filesystem overhead into account when resizing. (#1466) - * Try to use the CDIConfig proxy URL if it is set, if not use port-forward (#1598) - * Update kubevirtci (#1579) - * Replaced file copying code with an existing utility function. (#1585) - * Global preallocation setting is not taken into account correctly. (#1565) - * Retry finding the pods for looking up the annotations. (#1583) - * Make DeletePodByName always wait for the pod to stop existing. (#1584) - * When cleaning up NFS disks, recursively delete their contents. (#1576) - * Typedef for preallocation status (#1568) - * Add Data Volume annotations documentation (#1582) - * core: Preallocate blank block volumes (#1559) - * Skip test 2555 if running on openshift (#1572) - -* Tue Jan 26 2021 jfehlig@suse.com -- Update to version 1.29.0: - * Document smartclone disable feature in markdown (#1571) - * update cdi config docs (#1556) - * Run bazelisk run //plugins/cmd/uploader:uploader -- -workspace /home/prow/go/src/github.com/kubevirt/project-infra/../containerized-data-importer/WORKSPACE -dry-run=false (#1569) - * Reduce the noise from the filesystem overhead functionality (#1558) - * VDDK: work with block devices better (BZ 1913756). (#1564) - * Add a DV/PVC annotation "storage.bind.immediate.requested" (#1560) - * Use nbdkit for direct stream for the http importer (#1508) - * Text-only changes missed in removing the Process phase (#1446) (#1562) - * Compare logs while ignoring differences in spaces. (#1557) - * update api for cert configuration (#1542) - * core: Preallocate blank image disks as well (#1555) - * Preallocation check all paths (#1535) - * Remove temporary approver status. - * Change verbosity for preallocation messages, avoid possible infinite loop (#1551) - * Add test ids to strict reconciliation tests (#1546) - * VDDK: more reliable transfers of full disks. (#1547) - * Stop Using Deprecated Packages (#1548) - * Run bazelisk run //plugins/cmd/uploader:uploader -- -workspace /home/prow/go/src/github.com/kubevirt/project-infra/../containerized-data-importer/WORKSPACE -dry-run=false (#1543) - * Preallocation support (#1498) - * VDDK: incremental copy with changed block tracking (#1517) - * Run bazelisk run //plugins/cmd/uploader:uploader -- -workspace /home/prow/go/src/github.com/kubevirt/project-infra/../containerized-data-importer/WORKSPACE -dry-run=false (#1536) - * Add maya-r to approver list. - * Simplify file host, now a new image only has to be added to bazel. (#1534) - * Update fedora 33 (#1486) - * Allow passing default multus network annotation to transfer pods (#1532) - * Try updating the node taint in a loop (#1510) - * Add an API for disabling smart-cloning. (#1461) - * Read-only clone source pods (#1524) - * Clone source program calls tar instead of getting piped input. This ensures we trap tar errors. (#1521) - * Add strict reconciliation tests (#1505) - * Allow specifying of the CONTAINER_DISK_IMAGE with a default of the current value. (#1515) - * Designate CDI as CDIConfig authority (#1516) - * Update builder to fedora 33 (#1511) - * In the operator test there is a critical addons test that removes and (#1513) - * Create a Datavolume if a coliding PVC with same name exists but is marked to delete (#1477) - * Fix make target cluster-sync-cdi, add cluster-clean-cdi & cluster-clean-test-infra (#1503) - * increase code coverage by moving utility functions from api packages (#1479) - * Pass specific PVC annotations to the transfer pods (#1480) - * Move configure_storage to test setup. (#1484) - * Make sure the DV is the main resource and single source of truth for WaitForFirstConsumer. (#1499) - * Controller support for Multistage Imports (#1450) - * Pull less from dockerhub when running testsuite (#1478) - * apiserver should serve up openapi spec (#1485) - * VDDK: Add more debug logging around nbdkit. (#1465) - * k8s-reporter: Add Endpoints logging (#1481) - * Add CDIConfig to CDI (#1475) - * Run bazelisk run //plugins/cmd/uploader:uploader -- -workspace /home/prow/go/src/github.com/fgimenez/project-infra/../../kubevirt/containerized-data-importer/WORKSPACE -dry-run=false - * Wait for stray pods to terminate, destroy/re-create at AfterEach. (#1459) - * Remove the "Process" data processor phase, simplify state machine. (#1446) - * Scratch import bug (#1424) - * Dump service resources after failed tests (#1463) - * VDDK: replace qemu-img with libnbd (#1448) - * update kubevirtci (#1457) - * Update WORKSPACE packages to non-404 ones, and add a second mirror. (#1444) - * Don't wait for NS to deleted in test before starting next test (#1439) - -* Tue Oct 27 2020 James Fehlig -- spec: Fix binary names for several CDI components - -* Mon Oct 26 2020 jfehlig@suse.com -- Update to version 1.25.0: - * Update builder image to add libnbd (#1452) - * Add make targets cluster-sync-cdi & cluster-sync-test-infra (#1451) - * Add library function to determine if a PVC is waiting for first consu… (#1442) - * Add test_ids for the tests (#1441) - * Retry upload in case upload pod wasn't 100%% ready when attempting upload (#1440) - * add finalizer to target PVC before creating clone source pod (#1429) - * Make CDI infra deployments as critical addons. (#1361) - * Fix cloning checking fsGroup test in case of use with OCS. (#1435) - * Fix types.go vs code schema verification to actually fail if they are different. (#1428) - * Add files used in OpenShift CI. (#1416) - * Retry upload in case upload pod wasn't 100%% ready when attempting upload (#1437) - * Check for expected changes after CDI upgrade (#1417) - * Files in tar archives can have paths relative to ./ (#1432) - * Attempt to schedula clone sourc/target pods on same node (#1426) - * Touch ups for filesystem overhead test cases (#1427) - * Fix imports for images with no info about MediaType. (#1413) - * Fix size mismatch between source and target in smart clone tests. Ceph no longer (#1421) - * use snappy compression for cloning instead of gzip (#1419) - * Update to k8s.io/klog/v2, used by kubernetes 1.19 (#1409) - -* Fri Oct 23 2020 jfehlig@suse.com -- Update to version 1.24.0: - * add system:authorized to groups checked for clone auth (#1415) - * Fixing CDIStatus generate-verify issues (#1412) - * Reserve overhead when validating that a Filesystem has enough space (#1319) - * Test behavior after client-side upload failure. (#1404) - * Removed hard coded registry:5000 for vddk datasource test. (#1402) - * Add library function to determine if a PVC has been populated fully. (#1400) - * Remove dependency update when building the OR CI build image (#1386) - * Add test_id for the test cases (#1398) - * Fix incorrect region parsing from aws s3 endpoint (#1395) - * Add functional test for cloning if source NS has enought quota and (#1387) - -* Fri Oct 23 2020 James Fehlig -- Initial attempt at packaging CDI diff --git a/SPECS/docker-cli/CVE-2024-24786.patch b/SPECS/docker-cli/CVE-2024-24786.patch deleted file mode 100644 index 6c80204f5b..0000000000 --- a/SPECS/docker-cli/CVE-2024-24786.patch +++ /dev/null @@ -1,152 +0,0 @@ -From 1576982839ab9771784526720ed0a2f4a2aa2280 Mon Sep 17 00:00:00 2001 -From: bala -Date: Mon, 25 Nov 2024 16:47:53 +0000 -Subject: [PATCH] Vendor patch applied - ---- - .../protobuf/encoding/protojson/decode.go | 12 ++++ - .../encoding/protojson/well_known_types.go | 59 +++++++------------ - .../protobuf/internal/encoding/json/decode.go | 2 +- - 3 files changed, 33 insertions(+), 40 deletions(-) - -diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/decode.go b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go -index 5f28148..67fe4e7 100644 ---- a/vendor/google.golang.org/protobuf/encoding/protojson/decode.go -+++ b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go -@@ -11,6 +11,7 @@ import ( - "strconv" - "strings" - -+ "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/encoding/json" - "google.golang.org/protobuf/internal/encoding/messageset" - "google.golang.org/protobuf/internal/errors" -@@ -47,6 +48,10 @@ type UnmarshalOptions struct { - protoregistry.MessageTypeResolver - protoregistry.ExtensionTypeResolver - } -+ -+ // RecursionLimit limits how deeply messages may be nested. -+ // If zero, a default limit is applied. -+ RecursionLimit int - } - - // Unmarshal reads the given []byte and populates the given proto.Message -@@ -67,6 +72,9 @@ func (o UnmarshalOptions) unmarshal(b []byte, m proto.Message) error { - if o.Resolver == nil { - o.Resolver = protoregistry.GlobalTypes - } -+ if o.RecursionLimit == 0 { -+ o.RecursionLimit = protowire.DefaultRecursionLimit -+ } - - dec := decoder{json.NewDecoder(b), o} - if err := dec.unmarshalMessage(m.ProtoReflect(), false); err != nil { -@@ -114,6 +122,10 @@ func (d decoder) syntaxError(pos int, f string, x ...interface{}) error { - - // unmarshalMessage unmarshals a message into the given protoreflect.Message. - func (d decoder) unmarshalMessage(m protoreflect.Message, skipTypeURL bool) error { -+ d.opts.RecursionLimit-- -+ if d.opts.RecursionLimit < 0 { -+ return errors.New("exceeded max recursion depth") -+ } - if unmarshal := wellKnownTypeUnmarshaler(m.Descriptor().FullName()); unmarshal != nil { - return unmarshal(d, m) - } -diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go -index 6c37d41..4b177c8 100644 ---- a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go -+++ b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go -@@ -176,7 +176,7 @@ func (d decoder) unmarshalAny(m protoreflect.Message) error { - // Use another decoder to parse the unread bytes for @type field. This - // avoids advancing a read from current decoder because the current JSON - // object may contain the fields of the embedded type. -- dec := decoder{d.Clone(), UnmarshalOptions{}} -+ dec := decoder{d.Clone(), UnmarshalOptions{RecursionLimit: d.opts.RecursionLimit}} - tok, err := findTypeURL(dec) - switch err { - case errEmptyObject: -@@ -308,48 +308,29 @@ Loop: - // array) in order to advance the read to the next JSON value. It relies on - // the decoder returning an error if the types are not in valid sequence. - func (d decoder) skipJSONValue() error { -- tok, err := d.Read() -- if err != nil { -- return err -- } -- // Only need to continue reading for objects and arrays. -- switch tok.Kind() { -- case json.ObjectOpen: -- for { -- tok, err := d.Read() -- if err != nil { -- return err -- } -- switch tok.Kind() { -- case json.ObjectClose: -- return nil -- case json.Name: -- // Skip object field value. -- if err := d.skipJSONValue(); err != nil { -- return err -- } -- } -+ var open int -+ for { -+ tok, err := d.Read() -+ if err != nil { -+ return err - } -- -- case json.ArrayOpen: -- for { -- tok, err := d.Peek() -- if err != nil { -- return err -- } -- switch tok.Kind() { -- case json.ArrayClose: -- d.Read() -- return nil -- default: -- // Skip array item. -- if err := d.skipJSONValue(); err != nil { -- return err -- } -+ switch tok.Kind() { -+ case json.ObjectClose, json.ArrayClose: -+ open-- -+ case json.ObjectOpen, json.ArrayOpen: -+ open++ -+ if open > d.opts.RecursionLimit { -+ return errors.New("exceeded max recursion depth") - } -+ case json.EOF: -+ // This can only happen if there's a bug in Decoder.Read. -+ // Avoid an infinite loop if this does happen. -+ return errors.New("unexpected EOF") -+ } -+ if open == 0 { -+ return nil - } - } -- return nil - } - - // unmarshalAnyValue unmarshals the given custom-type message from the JSON -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go b/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go -index d043a6e..d2b3ac0 100644 ---- a/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go -+++ b/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go -@@ -121,7 +121,7 @@ func (d *Decoder) Read() (Token, error) { - - case ObjectClose: - if len(d.openStack) == 0 || -- d.lastToken.kind == comma || -+ d.lastToken.kind&(Name|comma) != 0 || - d.openStack[len(d.openStack)-1] != ObjectOpen { - return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) - } --- -2.39.4 - diff --git a/SPECS/docker-cli/disable_manpage_vendor.patch b/SPECS/docker-cli/disable_manpage_vendor.patch deleted file mode 100644 index b0c1a888aa..0000000000 --- a/SPECS/docker-cli/disable_manpage_vendor.patch +++ /dev/null @@ -1,17 +0,0 @@ -Prevent the manpage build from attemption to vendor golang modules. -These dependencies have already been included in Source1 - -diff -Naur a/scripts/docs/generate-man.sh b/scripts/docs/generate-man.sh ---- a/scripts/docs/generate-man.sh 2023-10-26 00:06:42.000000000 -0700 -+++ b/scripts/docs/generate-man.sh 2024-01-18 15:11:13.529735864 -0800 -@@ -21,10 +21,8 @@ - ./scripts/vendor init - # install go-md2man and copy man/tools.go in root folder - # to be able to fetch the required dependencies -- go mod edit -modfile=vendor.mod -require=github.com/cpuguy83/go-md2man/v2@${MD2MAN_VERSION} - cp man/tools.go . - # update vendor -- ./scripts/vendor update - # build gen-manpages - go build -mod=vendor -modfile=vendor.mod -tags manpages -o /tmp/gen-manpages ./man/generate.go - # build go-md2man diff --git a/SPECS/docker-cli/docker-cli.signatures.json b/SPECS/docker-cli/docker-cli.signatures.json deleted file mode 100644 index 3567cc31eb..0000000000 --- a/SPECS/docker-cli/docker-cli.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "docker-cli-25.0.7.tar.gz": "95b57af62273f9c069141b78360f0e39c5662447d63de2a6a257d59750b8d5ac", - "docker-cli-25.0.7-govendor-v1.tar.gz": "41a6f00be23ee3d6a3f32c59b1cb9f2472ced402b9c994a6291cb371a13ad755" - } -} diff --git a/SPECS/docker-cli/docker-cli.spec b/SPECS/docker-cli/docker-cli.spec deleted file mode 100644 index beecfb814f..0000000000 --- a/SPECS/docker-cli/docker-cli.spec +++ /dev/null @@ -1,189 +0,0 @@ -%define commit_hash 4debf411d1e6efbd9ce65e4250718e9c529a6525 -%define OUR_GOPATH %{_topdir}/.gopath -Summary: The open-source application container engine client. -Name: docker-cli -Version: 25.0.7 -Release: 2%{?dist} -License: ASL 2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Tools/Container -URL: https://github.com/docker/cli -Source0: https://github.com/docker/cli/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -Source1: %{name}-%{version}-govendor-v1.tar.gz -Patch0: disable_manpage_vendor.patch -Patch1: CVE-2024-24786.patch -BuildRequires: git -BuildRequires: go-md2man -BuildRequires: golang -BuildRequires: make -Requires: /bin/sh -Requires: tar -Requires: xz -# This package replaces the old name of moby-cli -Provides: moby-cli = %{version}-%{release} -Obsoletes: moby-cli < %{version}-%{release} - -%description -%{summary} - -%prep -%autosetup -p1 -n cli-%{version} -%setup -q -n cli-%{version} -T -D -a 1 - -mkdir -p %{OUR_GOPATH}/src/github.com/docker -ln -sfT %{_builddir}/cli-%{version} %{OUR_GOPATH}/src/github.com/docker/cli - -%build -export GOPATH=%{OUR_GOPATH} -export GOCACHE=%{OUR_GOPATH}/.cache -export GOPROXY=off -export DISABLE_WARN_OUTSIDE_CONTAINER=1 -export GO111MODULE=off -export GOGC=off -export CGO_ENABLED=1 - -make \ - LDFLAGS='' \ - VERSION=%{version} \ - GITCOMMIT=%{commit_hash} \ - dynbinary - -# Generating man pages. -mkdir -p ./github.com/docker -ln -sfT %{_builddir}/cli-%{version} ./github.com/docker/cli -make manpages - -%install -mkdir -p %{buildroot}/%{_bindir} -install -p -m 755 build/docker %{buildroot}%{_bindir}/docker - -install -dp %{buildroot}%{_mandir}/man{1,5,8} -install -p -m 644 man/man1/*.1 %{buildroot}%{_mandir}/man1 -install -p -m 644 man/man5/*.5 %{buildroot}%{_mandir}/man5 -install -p -m 644 man/man8/*.8 %{buildroot}%{_mandir}/man8 - -install -d %{buildroot}%{_datadir}/bash-completion/completions -install -d %{buildroot}%{_datadir}/zsh/vendor-completions -install -d %{buildroot}%{_datadir}/fish/vendor_completions.d -install -p -m 644 contrib/completion/bash/docker %{buildroot}%{_datadir}/bash-completion/completions/docker -install -p -m 644 contrib/completion/zsh/_docker %{buildroot}%{_datadir}/zsh/vendor-completions/_docker -install -p -m 644 contrib/completion/fish/docker.fish %{buildroot}%{_datadir}/fish/vendor_completions.d/docker.fish - -%files -%license NOTICE LICENSE -%{_bindir}/docker -%{_mandir}/man1/* -%{_mandir}/man5/* -%{_mandir}/man8/* -%{_datadir}/bash-completion/completions/docker -%{_datadir}/zsh/vendor-completions/_docker -%{_datadir}/fish/vendor_completions.d/docker.fish - -%changelog -* Fri Mar 21 2025 Anuj Mittal - 25.0.7-2 -- Bump Release to rebuild - -* Sat Feb 15 2025 CBL-Mariner Servicing Account - 25.0.7-1 -- Auto-upgrade to 25.0.7 - to fix CVE-2023-45288 [High] -- Remove patch for CVE-2024-36623 - -* Tue Dec 10 2024 Sudipta Pandit - 25.0.3-3 -- Fix CVE-2024-36623 with patch - -* Mon Nov 25 2024 Bala - 25.0.3-2 -- Fix CVE-2024-24786 - -* Thu Feb 22 2024 Henry Beberman - 25.0.3-1 -- Rename package to docker-cli -- Bump version to 25.0.3 -- Add vendor tarball for new deps in make manpages - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 20.10.25-3 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 20.10.25-2 -- Bump release to rebuild with updated version of Go. - -* Thu Aug 17 2023 Muhammad Falak - 20.10.25-1 -- Bump version to 20.10.25 - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 20.10.24-4 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 20.10.24-3 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 20.10.24-2 -- Bump release to rebuild with go 1.19.10 - -* Fri Apr 21 2023 CBL-Mariner Servicing Account - 20.10.24-1 -- Auto-upgrade to 20.10.24 - none - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 20.10.12-10 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 20.10.12-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 20.10.12-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 20.10.12-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 20.10.12-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 20.10.12-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 20.10.12-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 20.10.12-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 20.10.12-2 -- Bump release to rebuild with golang 1.18.3 - -* Thu Feb 3 2022 Nicolas Guibourge - 20.10.12-1 -- Update to version 20.10.12 -- Use code from upstream instead of Azure fork. - -* Tue Jun 08 2021 Henry Beberman 19.03.15+azure-2 -- Increment release to force republishing using golang 1.15.13. - -* Thu Apr 15 2021 Andrew Phelps 19.03.15+azure-1 -- Update to version 19.03.15+azure -- Rename 'md2man' to 'go-md2man' in md2man-all.sh - -* Thu Dec 10 2020 Andrew Phelps 19.03.11+azure-2 -- Increment release to force republishing using golang 1.15. - -* Thu Jun 11 2020 Andrew Phelps 19.03.11+azure-1 -- Update to version 19.03.11+azure - -* Wed May 20 2020 Joe Schmitt 3.0.12~rc.1+azure-5 -- Remove reliance on existing GOPATH environment variable. - -* Sat May 09 2020 Nick Samson 3.0.12~rc.1+azure-4 -- Added %%license line automatically - -* Tue May 05 2020 Eric Li 3.0.12~rc.1+azure-3 -- Add #Source0:, update URL:, and license verified - -* Fri May 01 2020 Emre Girgin 3.0.12~rc.1+azure-2 -- Renaming go to golang - -* Fri Apr 03 2020 Mohan Datla 3.0.12~rc.1+azure-1 -- Initial CBL-Mariner import from Azure. - -* Mon Jan 27 2020 Brian Goffs -- Use dynamic linking and issue build commands from rpm spec - -* Tue Aug 7 2018 Robledo Pontes -- Adding to moby build tools. - -* Mon Mar 12 2018 Xing Wu -- First draft diff --git a/SPECS/docker-cli/generate_source_tarball.sh b/SPECS/docker-cli/generate_source_tarball.sh deleted file mode 100755 index edc162f251..0000000000 --- a/SPECS/docker-cli/generate_source_tarball.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/bin/bash -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -# Quit on failure -set -e - -PKG_VERSION="" -SRC_TARBALL="" -VENDOR_VERSION="1" -OUT_FOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# parameters: -# -# --srcTarball : src tarball file -# this file contains the 'initial' source code of the component -# and should be replaced with the new/modified src code -# --outFolder : folder where to copy the new tarball(s) -# --pkgVersion : package version -# --vendorVersion : vendor version -# -PARAMS="" -while (( "$#" )); do - case "$1" in - --srcTarball) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - SRC_TARBALL=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --outFolder) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - OUT_FOLDER=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --pkgVersion) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - PKG_VERSION=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --vendorVersion) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - VENDOR_VERSION=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - -*|--*=) # unsupported flags - echo "Error: Unsupported flag $1" >&2 - exit 1 - ;; - *) # preserve positional arguments - PARAMS="$PARAMS $1" - shift - ;; - esac -done - -echo "--srcTarball -> $SRC_TARBALL" -echo "--outFolder -> $OUT_FOLDER" -echo "--pkgVersion -> $PKG_VERSION" -echo "--vendorVersion -> $VENDOR_VERSION" - -if [ -z "$PKG_VERSION" ]; then - echo "--pkgVersion parameter cannot be empty" - exit 1 -fi - -echo "-- create temp folder" -tmpdir=$(mktemp -d) -function cleanup { - echo "+++ cleanup -> remove $tmpdir" - rm -rf $tmpdir -} -trap cleanup EXIT - -TARBALL_FOLDER="$tmpdir/tarballFolder" -mkdir -p $TARBALL_FOLDER -cp $SRC_TARBALL $tmpdir - -pushd $tmpdir > /dev/null - -PKG_NAME="docker-cli" -NAME_VER="$PKG_NAME-$PKG_VERSION" -VENDOR_TARBALL="$OUT_FOLDER/$NAME_VER-govendor-v$VENDOR_VERSION.tar.gz" - -echo "Unpacking source tarball..." -tar -xf $SRC_TARBALL - -echo "Vendor go modules..." -cd cli-"$PKG_VERSION" -cp man/tools.go . -./scripts/vendor init -go mod edit -modfile=vendor.mod -require=github.com/cpuguy83/go-md2man/v2@v2.0.3 -#go mod tidy -modfile=vendor.mod -#go mod vendor -modfile=vendor.mod -./scripts/vendor update - -echo "" -echo "=========================" -echo "Tar vendored tarball" -tar --sort=name \ - --mtime="2021-04-26 00:00Z" \ - --owner=0 --group=0 --numeric-owner \ - --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ - -czf "$VENDOR_TARBALL" vendor.mod vendor.sum vendor - -popd > /dev/null -echo "$PKG_NAME vendored modules are available at $VENDOR_TARBALL" diff --git a/SPECS/docker-compose/CVE-2024-10846.patch b/SPECS/docker-compose/CVE-2024-10846.patch deleted file mode 100644 index bf7868e735..0000000000 --- a/SPECS/docker-compose/CVE-2024-10846.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 217663fd8fd2b7b789c9f877bbd9781d887a6b07 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Mon, 3 Mar 2025 04:54:06 +0000 -Subject: [PATCH] CVE-2024-10846 -Upstream Reference: https://github.com/compose-spec/compose-go/pull/703 ---- - .../compose-go/v2/loader/reset.go | 28 ++++++++++++++++--- - 1 file changed, 24 insertions(+), 4 deletions(-) - -diff --git a/vendor/github.com/compose-spec/compose-go/v2/loader/reset.go b/vendor/github.com/compose-spec/compose-go/v2/loader/reset.go -index 2b7f04c..213d0e8 100644 ---- a/vendor/github.com/compose-spec/compose-go/v2/loader/reset.go -+++ b/vendor/github.com/compose-spec/compose-go/v2/loader/reset.go -@@ -26,13 +26,15 @@ import ( - ) - - type ResetProcessor struct { -- target interface{} -- paths []tree.Path -+ target interface{} -+ paths []tree.Path -+ visitedNodes map[*yaml.Node]string - } - - // UnmarshalYAML implement yaml.Unmarshaler - func (p *ResetProcessor) UnmarshalYAML(value *yaml.Node) error { - resolved, err := p.resolveReset(value, tree.NewPath()) -+ p.visitedNodes = nil - if err != nil { - return err - } -@@ -41,10 +43,28 @@ func (p *ResetProcessor) UnmarshalYAML(value *yaml.Node) error { - - // resolveReset detects `!reset` tag being set on yaml nodes and record position in the yaml tree - func (p *ResetProcessor) resolveReset(node *yaml.Node, path tree.Path) (*yaml.Node, error) { -+ pathStr := path.String() - // If the path contains "<<", removing the "<<" element and merging the path -- if strings.Contains(path.String(), ".<<") { -- path = tree.NewPath(strings.Replace(path.String(), ".<<", "", 1)) -+ if strings.Contains(pathStr, ".<<") { -+ path = tree.NewPath(strings.Replace(pathStr, ".<<", "", 1)) - } -+ -+ // Check for cycle -+ if p.visitedNodes == nil { -+ p.visitedNodes = make(map[*yaml.Node]string) -+ } -+ -+ // Check for cycle by seeing if the node has already been visited at this path -+ if previousPath, found := p.visitedNodes[node]; found { -+ // If the current node has been visited, we have a cycle if the previous path is a prefix -+ if strings.HasPrefix(pathStr, previousPath) { -+ return nil, fmt.Errorf("cycle detected at path: %s", pathStr) -+ } -+ } -+ -+ // Mark the current node as visited -+ p.visitedNodes[node] = pathStr -+ - // If the node is an alias, We need to process the alias field in order to consider the !override and !reset tags - if node.Kind == yaml.AliasNode { - return p.resolveReset(node.Alias, path) --- -2.45.2 - diff --git a/SPECS/docker-compose/CVE-2024-45337.patch b/SPECS/docker-compose/CVE-2024-45337.patch deleted file mode 100644 index 868ef502b5..0000000000 --- a/SPECS/docker-compose/CVE-2024-45337.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 66fd5d19c5ea8c7f4f7ff69bcc93a7c8231ce4cf Mon Sep 17 00:00:00 2001 -From: Roland Shoemaker -Date: Tue, 3 Dec 2024 09:03:03 -0800 -Subject: [PATCH] ssh: make the public key cache a 1-entry FIFO cache - -Users of the the ssh package seem to extremely commonly misuse the -PublicKeyCallback API, assuming that the key passed in the last call -before a connection is established is the key used for authentication. -Some users then make authorization decisions based on this key. This -property is not documented, and may not be correct, due to the caching -behavior of the package, resulting in users making incorrect -authorization decisions about the connection. - -This change makes the cache a one entry FIFO cache, making the assumed -property, that the last call to PublicKeyCallback represents the key -actually used for authentication, actually hold. - -Thanks to Damien Tournoud, Patrick Dawkins, Vince Parker, and -Jules Duvivier from the Platform.sh / Upsun engineering team -for reporting this issue. - -Fixes golang/go#70779 -Fixes CVE-2024-45337 - -Change-Id: Ife7c7b4045d8b6bcd7e3a417bdfae370c709797f -Reviewed-on: https://go-review.googlesource.com/c/crypto/+/635315 -Reviewed-by: Roland Shoemaker -Auto-Submit: Gopher Robot -Reviewed-by: Damien Neil -Reviewed-by: Nicola Murino -LUCI-TryBot-Result: Go LUCI -Signed-off-by: Muhammad Falak R Wani ---- - vendor/golang.org/x/crypto/ssh/server.go | 15 +++++++++++---- - 1 file changed, 11 insertions(+), 4 deletions(-) - -diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go -index c2dfe32..39dcc09 100644 ---- a/vendor/golang.org/x/crypto/ssh/server.go -+++ b/vendor/golang.org/x/crypto/ssh/server.go -@@ -149,7 +149,7 @@ func (s *ServerConfig) AddHostKey(key Signer) { - } - - // cachedPubKey contains the results of querying whether a public key is --// acceptable for a user. -+// acceptable for a user. This is a FIFO cache. - type cachedPubKey struct { - user string - pubKeyData []byte -@@ -157,7 +157,13 @@ type cachedPubKey struct { - perms *Permissions - } - --const maxCachedPubKeys = 16 -+// maxCachedPubKeys is the number of cache entries we store. -+// -+// Due to consistent misuse of the PublicKeyCallback API, we have reduced this -+// to 1, such that the only key in the cache is the most recently seen one. This -+// forces the behavior that the last call to PublicKeyCallback will always be -+// with the key that is used for authentication. -+const maxCachedPubKeys = 1 - - // pubKeyCache caches tests for public keys. Since SSH clients - // will query whether a public key is acceptable before attempting to -@@ -179,9 +185,10 @@ func (c *pubKeyCache) get(user string, pubKeyData []byte) (cachedPubKey, bool) { - - // add adds the given tuple to the cache. - func (c *pubKeyCache) add(candidate cachedPubKey) { -- if len(c.keys) < maxCachedPubKeys { -- c.keys = append(c.keys, candidate) -+ if len(c.keys) >= maxCachedPubKeys { -+ c.keys = c.keys[1:] - } -+ c.keys = append(c.keys, candidate) - } - - // ServerConn is an authenticated SSH connection, as seen from the --- -2.34.1 - diff --git a/SPECS/docker-compose/CVE-2024-45338.patch b/SPECS/docker-compose/CVE-2024-45338.patch deleted file mode 100644 index fd085545da..0000000000 --- a/SPECS/docker-compose/CVE-2024-45338.patch +++ /dev/null @@ -1,63 +0,0 @@ -From c21b7e1c46951fdca284e42ec86d34342183fc94 Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Thu, 2 Jan 2025 10:22:13 +0000 -Subject: [PATCH] Fix CVE CVE-2024-45338 in docker-compose - ---- - vendor/golang.org/x/net/html/doctype.go | 2 +- - vendor/golang.org/x/net/html/foreign.go | 3 +-- - vendor/golang.org/x/net/html/parse.go | 4 ++-- - 3 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go -index c484e5a..bca3ae9 100644 ---- a/vendor/golang.org/x/net/html/doctype.go -+++ b/vendor/golang.org/x/net/html/doctype.go -@@ -87,7 +87,7 @@ func parseDoctype(s string) (n *Node, quirks bool) { - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && -- strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { -+ strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") { - quirks = true - } - } -diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go -index 9da9e9d..e8515d8 100644 ---- a/vendor/golang.org/x/net/html/foreign.go -+++ b/vendor/golang.org/x/net/html/foreign.go -@@ -40,8 +40,7 @@ func htmlIntegrationPoint(n *Node) bool { - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { -- val := strings.ToLower(a.Val) -- if val == "text/html" || val == "application/xhtml+xml" { -+ if strings.EqualFold(a.Val, "text/html") || strings.EqualFold(a.Val, "application/xhtml+xml") { - return true - } - } -diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go -index 46a89ed..5b8374b 100644 ---- a/vendor/golang.org/x/net/html/parse.go -+++ b/vendor/golang.org/x/net/html/parse.go -@@ -1031,7 +1031,7 @@ func inBodyIM(p *parser) bool { - if p.tok.DataAtom == a.Input { - for _, t := range p.tok.Attr { - if t.Key == "type" { -- if strings.ToLower(t.Val) == "hidden" { -+ if strings.EqualFold(t.Val, "hidden") { - // Skip setting framesetOK = false - return true - } -@@ -1459,7 +1459,7 @@ func inTableIM(p *parser) bool { - return inHeadIM(p) - case a.Input: - for _, t := range p.tok.Attr { -- if t.Key == "type" && strings.ToLower(t.Val) == "hidden" { -+ if t.Key == "type" && strings.EqualFold(t.Val, "hidden") { - p.addElement() - p.oe.pop() - return true --- -2.39.4 - diff --git a/SPECS/docker-compose/CVE-2025-22869.patch b/SPECS/docker-compose/CVE-2025-22869.patch deleted file mode 100644 index c0415fddb0..0000000000 --- a/SPECS/docker-compose/CVE-2025-22869.patch +++ /dev/null @@ -1,140 +0,0 @@ -From 041b89a18f81265899e42e6801f830c101a96120 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Sun, 2 Mar 2025 13:46:00 +0000 -Subject: [PATCH] CVE-2025-22869 - -Upstream Reference : https://github.com/golang/crypto/commit/7292932d45d55c7199324ab0027cc86e8198aa22 - -ssh: limit the size of the internal packet queue while waiting for KEX - -In the SSH protocol, clients and servers execute the key exchange to -generate one-time session keys used for encryption and authentication. -The key exchange is performed initially after the connection is -established and then periodically after a configurable amount of data. -While a key exchange is in progress, we add the received packets to an -internal queue until we receive SSH_MSG_KEXINIT from the other side. -This can result in high memory usage if the other party is slow to -respond to the SSH_MSG_KEXINIT packet, or memory exhaustion if a -malicious client never responds to an SSH_MSG_KEXINIT packet during a -large file transfer. -We now limit the internal queue to 64 packets: this means 2MB with the -typical 32KB packet size. -When the internal queue is full we block further writes until the -pending key exchange is completed or there is a read or write error. - -Thanks to Yuichi Watanabe for reporting this issue. - -Change-Id: I1ce2214cc16e08b838d4bc346c74c72addafaeec -Reviewed-on: https://go-review.googlesource.com/c/crypto/+/652135 -Reviewed-by: Neal Patel -Auto-Submit: Gopher Robot -Reviewed-by: Roland Shoemaker -LUCI-TryBot-Result: Go LUCI - ---- - vendor/golang.org/x/crypto/ssh/handshake.go | 47 ++++++++++++++++----- - 1 file changed, 37 insertions(+), 10 deletions(-) - -diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go -index 70a7369..e14eb6c 100644 ---- a/vendor/golang.org/x/crypto/ssh/handshake.go -+++ b/vendor/golang.org/x/crypto/ssh/handshake.go -@@ -24,6 +24,11 @@ const debugHandshake = false - // quickly. - const chanSize = 16 - -+// maxPendingPackets sets the maximum number of packets to queue while waiting -+// for KEX to complete. This limits the total pending data to maxPendingPackets -+// * maxPacket bytes, which is ~16.8MB. -+const maxPendingPackets = 64 -+ - // keyingTransport is a packet based transport that supports key - // changes. It need not be thread-safe. It should pass through - // msgNewKeys in both directions. -@@ -58,11 +63,19 @@ type handshakeTransport struct { - incoming chan []byte - readError error - -- mu sync.Mutex -- writeError error -- sentInitPacket []byte -- sentInitMsg *kexInitMsg -- pendingPackets [][]byte // Used when a key exchange is in progress. -+ mu sync.Mutex -+ // Condition for the above mutex. It is used to notify a completed key -+ // exchange or a write failure. Writes can wait for this condition while a -+ // key exchange is in progress. -+ writeCond *sync.Cond -+ writeError error -+ sentInitPacket []byte -+ sentInitMsg *kexInitMsg -+ // Used to queue writes when a key exchange is in progress. The length is -+ // limited by pendingPacketsSize. Once full, writes will block until the key -+ // exchange is completed or an error occurs. If not empty, it is emptied -+ // all at once when the key exchange is completed in kexLoop. -+ pendingPackets [][]byte - writePacketsLeft uint32 - writeBytesLeft int64 - -@@ -114,6 +127,7 @@ func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, - - config: config, - } -+ t.writeCond = sync.NewCond(&t.mu) - t.resetReadThresholds() - t.resetWriteThresholds() - -@@ -236,6 +250,7 @@ func (t *handshakeTransport) recordWriteError(err error) { - defer t.mu.Unlock() - if t.writeError == nil && err != nil { - t.writeError = err -+ t.writeCond.Broadcast() - } - } - -@@ -339,6 +354,8 @@ write: - } - } - t.pendingPackets = t.pendingPackets[:0] -+ // Unblock writePacket if waiting for KEX. -+ t.writeCond.Broadcast() - t.mu.Unlock() - } - -@@ -526,11 +543,20 @@ func (t *handshakeTransport) writePacket(p []byte) error { - } - - if t.sentInitMsg != nil { -- // Copy the packet so the writer can reuse the buffer. -- cp := make([]byte, len(p)) -- copy(cp, p) -- t.pendingPackets = append(t.pendingPackets, cp) -- return nil -+ if len(t.pendingPackets) < maxPendingPackets { -+ // Copy the packet so the writer can reuse the buffer. -+ cp := make([]byte, len(p)) -+ copy(cp, p) -+ t.pendingPackets = append(t.pendingPackets, cp) -+ return nil -+ } -+ for t.sentInitMsg != nil { -+ // Block and wait for KEX to complete or an error. -+ t.writeCond.Wait() -+ if t.writeError != nil { -+ return t.writeError -+ } -+ } - } - - if t.writeBytesLeft > 0 { -@@ -547,6 +573,7 @@ func (t *handshakeTransport) writePacket(p []byte) error { - - if err := t.pushPacket(p); err != nil { - t.writeError = err -+ t.writeCond.Broadcast() - } - - return nil --- -2.45.2 - diff --git a/SPECS/docker-compose/CVE-2025-22872.patch b/SPECS/docker-compose/CVE-2025-22872.patch deleted file mode 100644 index a9203f2a9a..0000000000 --- a/SPECS/docker-compose/CVE-2025-22872.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 01035da6c5be2080f75765d9ebbb462614d7e81a Mon Sep 17 00:00:00 2001 -From: jykanase -Date: Tue, 22 Apr 2025 08:15:38 +0000 -Subject: [PATCH] CVE-2025-22872 - -Upstream patch reference: https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9 ---- - vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index 3c57880..6598c1f 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType { - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } -- // Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken --- -2.45.2 - diff --git a/SPECS/docker-compose/docker-compose.signatures.json b/SPECS/docker-compose/docker-compose.signatures.json deleted file mode 100644 index 556ee15405..0000000000 --- a/SPECS/docker-compose/docker-compose.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "docker-compose-2.27.0.tar.gz": "29b2232d1609dff03db74188a7944c85ba8b612f47a7e39938a43db8fb7d7067", - "docker-compose-2.27.0-govendor-v1.tar.gz": "c134fd4acc74f4f5f8b6cbfa7044ebcd12f558db193f92577323c284fca70a04" - } -} diff --git a/SPECS/docker-compose/docker-compose.spec b/SPECS/docker-compose/docker-compose.spec deleted file mode 100644 index c6c0e53490..0000000000 --- a/SPECS/docker-compose/docker-compose.spec +++ /dev/null @@ -1,95 +0,0 @@ -Summary: Define and run multi-container applications with Docker -Name: docker-compose -Version: 2.27.0 -Release: 6%{?dist} -License: ASL 2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Tools/Container -URL: https://github.com/docker/compose -Source0: https://github.com/docker/compose/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -# Leverage the `generate_source_tarball.sh` to create the vendor sources -# NOTE: govendor-v1 format is for inplace CVE updates so that we do not have to overwrite in the blob-store. -# After fixing any possible CVE for the vendored source, we must bump v1 -> v2 -Source1: %{name}-%{version}-govendor-v1.tar.gz -Patch0: CVE-2024-45337.patch -Patch1: CVE-2024-45338.patch -Patch2: CVE-2025-22869.patch -Patch3: CVE-2024-10846.patch -Patch4: CVE-2025-22872.patch -BuildRequires: golang -Requires: docker-cli -Obsoletes: moby-compose < %{version}-%{release} -Provides: moby-compose = %{version}-%{release} - - -%description -Compose is a tool for defining and running multi-container Docker applications. -With Compose, you use a YAML file to configure your application’s services. -Then, with a single command, you create and start all the services from your -configuration. - -%prep -%autosetup -p1 -n compose-%{version} -a 1 - -%build -go build \ - -mod=vendor \ - -trimpath \ - -tags e2e \ - -ldflags "-w -X github.com/docker/compose/v2/internal.Version=%{version}" \ - -o ./bin/build/docker-compose ./cmd - -%install -mkdir -p "%{buildroot}/%{_libexecdir}/docker/cli-plugins" -install -D -m0755 bin/build/docker-compose %{buildroot}/%{_libexecdir}/docker/cli-plugins - -%files -%license LICENSE -%{_libexecdir}/docker/cli-plugins/docker-compose - -%changelog -* Fri May 30 2025 Ranjan Dutta - 2.27.0-6 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22872 - -* Fri Mar 21 2025 Anuj Mittal - 2.27.0-5 -- Bump Release to rebuild - -* Mon Mar 03 2025 Kanishk Bansal - 2.27.0-4 -- Fix CVE-2025-22869, CVE-2024-10846 with an upstream patch - -* Tue Dec 31 2024 Rohit Rawat - 2.27.0-3 -- Add patch for CVE-2024-45338 - -* Wed Jan 08 2025 Muhammad Falak - 2.27.0-2 -- Patch CVE-2024-45337 - -* Thu May 02 2024 CBL-Mariner Servicing Account - 2.27.0-1 -- Auto-upgrade to 2.27.0 - address CVE-2024-23653 - -* Wed Mar 20 2024 Henry Beberman - 2.24.6-2 -- Correct license to ASL 2.0 - -* Mon Feb 26 2024 Henry Beberman - 2.24.6-1 -- Rename spec from moby-compose to docker-compose -- Bump version to 2.24.6 - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 2.17.2-6 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 2.17.2-5 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 2.17.2-4 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 2.17.2-3 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 2.17.2-2 -- Bump release to rebuild with go 1.19.10 - -* Tue Mar 14 2023 Muhammad Falak R Wani - 2.17.2-1 -- Original version for CBL-Mariner -- License Verified diff --git a/SPECS/docker-compose/generate_source_tarball.sh b/SPECS/docker-compose/generate_source_tarball.sh deleted file mode 100755 index 12e68805bb..0000000000 --- a/SPECS/docker-compose/generate_source_tarball.sh +++ /dev/null @@ -1,117 +0,0 @@ -#!/bin/bash -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -# Quit on failure -set -e - -PKG_VERSION="" -SRC_TARBALL="" -VENDOR_VERSION="1" -OUT_FOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# parameters: -# -# --srcTarball : src tarball file -# this file contains the 'initial' source code of the component -# and should be replaced with the new/modified src code -# --outFolder : folder where to copy the new tarball(s) -# --pkgVersion : package version -# --vendorVersion : vendor version -# -PARAMS="" -while (( "$#" )); do - case "$1" in - --srcTarball) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - SRC_TARBALL=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --outFolder) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - OUT_FOLDER=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --pkgVersion) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - PKG_VERSION=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --vendorVersion) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - VENDOR_VERSION=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - -*|--*=) # unsupported flags - echo "Error: Unsupported flag $1" >&2 - exit 1 - ;; - *) # preserve positional arguments - PARAMS="$PARAMS $1" - shift - ;; - esac -done - -echo "--srcTarball -> $SRC_TARBALL" -echo "--outFolder -> $OUT_FOLDER" -echo "--pkgVersion -> $PKG_VERSION" -echo "--vendorVersion -> $VENDOR_VERSION" - -if [ -z "$PKG_VERSION" ]; then - echo "--pkgVersion parameter cannot be empty" - exit 1 -fi - -echo "-- create temp folder" -tmpdir=$(mktemp -d) -function cleanup { - echo "+++ cleanup -> remove $tmpdir" - rm -rf $tmpdir -} -trap cleanup EXIT - -TARBALL_FOLDER="$tmpdir/tarballFolder" -mkdir -p $TARBALL_FOLDER -cp $SRC_TARBALL $tmpdir - -pushd $tmpdir > /dev/null - -PKG_NAME="docker-compose" -NAME_VER="$PKG_NAME-$PKG_VERSION" -VENDOR_TARBALL="$OUT_FOLDER/$NAME_VER-govendor-v$VENDOR_VERSION.tar.gz" - -echo "Unpacking source tarball..." -tar -xf $SRC_TARBALL - -echo "Vendor go modules..." -cd compose-"$PKG_VERSION" -go mod vendor - -echo "" -echo "=========================" -echo "Tar vendored tarball" -tar --sort=name \ - --mtime="2021-04-26 00:00Z" \ - --owner=0 --group=0 --numeric-owner \ - --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ - -czf "$VENDOR_TARBALL" vendor - -popd > /dev/null -echo "$PKG_NAME vendored modules are available at $VENDOR_TARBALL" diff --git a/SPECS/dracut/0006-dracut.sh-validate-instmods-calls.patch b/SPECS/dracut/0006-dracut.sh-validate-instmods-calls.patch deleted file mode 100644 index 5f2273a143..0000000000 --- a/SPECS/dracut/0006-dracut.sh-validate-instmods-calls.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 6eca9468a981bd5188a04ff0dd4638e828b0bb65 Mon Sep 17 00:00:00 2001 -From: Shreenidhi Shedi -Date: Wed, 1 Mar 2023 01:29:02 +0530 -Subject: [PATCH] dracut.sh: validate instmods calls - -Signed-off-by: Shreenidhi Shedi ---- - dracut.sh | 15 ++++++++++++--- - modules.d/01fips/module-setup.sh | 8 +++++--- - 2 files changed, 17 insertions(+), 6 deletions(-) - -diff --git a/dracut.sh b/dracut.sh -index cc6d6f28..ff541e79 100755 ---- a/dracut.sh -+++ b/dracut.sh -@@ -1970,11 +1970,17 @@ if [[ $no_kernel != yes ]]; then - - if [[ -n ${add_drivers// /} ]]; then - # shellcheck disable=SC2086 -- hostonly='' instmods -c $add_drivers -+ if ! hostonly='' instmods -c $add_drivers; then -+ dfatal "instmods failed for add_drivers: $add_drivers" -+ exit 1 -+ fi - fi - if [[ $force_drivers ]]; then - # shellcheck disable=SC2086 -- hostonly='' instmods -c $force_drivers -+ if ! hostonly='' instmods -c $force_drivers; then -+ dfatal "instmods failed for force_drivers: $force_drivers" -+ exit 1 -+ fi - rm -f "$initdir"/etc/cmdline.d/20-force_driver.conf - for mod in $force_drivers; do - echo "rd.driver.pre=$mod" >> "$initdir"/etc/cmdline.d/20-force_drivers.conf -@@ -1982,7 +1988,10 @@ if [[ $no_kernel != yes ]]; then - fi - if [[ $filesystems ]]; then - # shellcheck disable=SC2086 -- hostonly='' instmods -c $filesystems -+ if ! hostonly='' instmods -c $filesystems; then -+ dfatal "instmods failed for filesystems: $filesystems" -+ exit 1 -+ fi - fi - - dinfo "*** Installing kernel module dependencies ***" -diff --git a/modules.d/01fips/module-setup.sh b/modules.d/01fips/module-setup.sh -index 83fcd564..3e3a7c88 100755 ---- a/modules.d/01fips/module-setup.sh -+++ b/modules.d/01fips/module-setup.sh -@@ -40,10 +40,12 @@ installkernel() { - fi - - for _mod in $_fipsmodules; do -- if hostonly='' instmods -c -s "$_mod"; then -- echo "$_mod" >> "${initdir}/etc/fipsmodules" -- echo "blacklist $_mod" >> "${initdir}/etc/fips.conf" -+ if ! hostonly='' instmods -c -s "$_mod"; then -+ dfatal "ERROR: instmods -c -s $_mod failed" -+ return 1 - fi -+ echo "$_mod" >> "${initdir}/etc/fipsmodules" -+ echo "blacklist $_mod" >> "${initdir}/etc/fips.conf" - done - - # with hostonly_default_device fs module for /boot is not installed by default --- -2.34.1 - diff --git a/SPECS/dracut/dracut.spec b/SPECS/dracut/dracut.spec index 264c8c2bc2..bbda1c133b 100644 --- a/SPECS/dracut/dracut.spec +++ b/SPECS/dracut/dracut.spec @@ -4,7 +4,7 @@ Summary: dracut to create initramfs Name: dracut Version: 102 -Release: 15%{?dist} +Release: 16%{?dist} # The entire source code is GPLv2+ # except install/* which is LGPLv2+ License: GPLv2+ AND LGPLv2+ @@ -50,7 +50,6 @@ Patch: allow-liveos-overlay-no-user-confirmation-prompt.patch # azl-liveos-artifacts-download.sh) - which are included as separate sources in # this package. Patch: add-livenet-download-service.patch -Patch: 0006-dracut.sh-validate-instmods-calls.patch Patch: 0011-Remove-reference-to-kernel-module-zlib-in-fips-module.patch Patch: 0012-fix-dracut-functions-avoid-awk-in-get_maj_min.patch Patch: 0013-revert-fix-crypt-unlock-encrypted-devices-by-default.patch @@ -345,6 +344,10 @@ ln -srv %{buildroot}%{_bindir}/%{name} %{buildroot}%{_sbindir}/%{name} %dir %{_sharedstatedir}/%{name}/overlay %changelog +* Mon Mar 16 2026 Lee Chee Yang - 102-16 +- merge from Azure Linux 3.0.20260304-3.0 +- Remove old dracut-validate-instmods-calls patch to support both 6.6 and 6.12 versions. + * Fri May 30 2025 Lishan Liu - 102-15 - Update tmpfs mount command in tmpfsroot-mount.sh diff --git a/SPECS/edk2/0001-BaseTools-do-not-build-BrotliCompress-RH-only.patch b/SPECS/edk2/0001-BaseTools-do-not-build-BrotliCompress-RH-only.patch deleted file mode 100644 index 604eec6b08..0000000000 --- a/SPECS/edk2/0001-BaseTools-do-not-build-BrotliCompress-RH-only.patch +++ /dev/null @@ -1,43 +0,0 @@ -From b1df949609eb0bf0df4e5958e8665433d856174d Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Thu, 4 Jun 2020 13:34:12 +0200 -Subject: [PATCH 01/17] BaseTools: do not build BrotliCompress (RH only) - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- no change - -Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> -RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: - -- New patch. - -BrotliCompress is not used for building ArmVirtPkg or OvmfPkg platforms. -It depends on one of the upstream Brotli git submodules that we removed -earlier in this rebase series. (See patch "remove upstream edk2's Brotli -submodules (RH only"). - -Do not attempt to build BrotliCompress. - -Signed-off-by: Laszlo Ersek -(cherry picked from commit db8ccca337e2c5722c1d408d2541cf653d3371a2) ---- - BaseTools/Source/C/GNUmakefile | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/BaseTools/Source/C/GNUmakefile b/BaseTools/Source/C/GNUmakefile -index 5275f657efe8..39d719975309 100644 ---- a/BaseTools/Source/C/GNUmakefile -+++ b/BaseTools/Source/C/GNUmakefile -@@ -51,7 +51,6 @@ all: makerootdir subdirs - LIBRARIES = Common - VFRAUTOGEN = VfrCompile/VfrLexer.h - APPLICATIONS = \ -- BrotliCompress \ - VfrCompile \ - EfiRom \ - GenFfs \ --- -2.45.0 - diff --git a/SPECS/edk2/0002-MdeModulePkg-remove-package-private-Brotli-include-p.patch b/SPECS/edk2/0002-MdeModulePkg-remove-package-private-Brotli-include-p.patch deleted file mode 100644 index 61b5608862..0000000000 --- a/SPECS/edk2/0002-MdeModulePkg-remove-package-private-Brotli-include-p.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 9de592b920018344719eecd2eb1975c694e765d5 Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Thu, 4 Jun 2020 13:39:08 +0200 -Subject: [PATCH 02/17] MdeModulePkg: remove package-private Brotli include - path (RH only) - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- no change - -Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> -RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: - -- New patch. - -Originating from upstream commit 58802e02c41b -("MdeModulePkg/BrotliCustomDecompressLib: Make brotli a submodule", -2020-04-16), "MdeModulePkg/MdeModulePkg.dec" contains a package-internal -include path into a Brotli submodule. - -The edk2 build system requires such include paths to resolve successfully, -regardless of the firmware platform being built. Because -BrotliCustomDecompressLib is not consumed by any OvmfPkg or ArmVirtPkg -platforms, and we've removed the submodule earlier in this patch set, -remove the include path too. - -Signed-off-by: Laszlo Ersek -(cherry picked from commit e05e0de713c4a2b8adb6ff9809611f222bfe50ed) ---- - MdeModulePkg/MdeModulePkg.dec | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec -index f7339f0aec96..badb93238ff1 100644 ---- a/MdeModulePkg/MdeModulePkg.dec -+++ b/MdeModulePkg/MdeModulePkg.dec -@@ -26,9 +26,6 @@ [Includes] - Include - Test/Mock/Include - --[Includes.Common.Private] -- Library/BrotliCustomDecompressLib/brotli/c/include -- - [LibraryClasses] - ## @libraryclass Defines a set of methods to reset whole system. - ResetSystemLib|Include/Library/ResetSystemLib.h --- -2.45.0 - diff --git a/SPECS/edk2/0003-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch b/SPECS/edk2/0003-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch deleted file mode 100644 index d6731ac59e..0000000000 --- a/SPECS/edk2/0003-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch +++ /dev/null @@ -1,180 +0,0 @@ -From 83b44bcbad5cb3e8df5505ea0cdc6d5d319b3612 Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Tue, 25 Feb 2014 22:40:01 +0100 -Subject: [PATCH 03/17] MdeModulePkg: TerminalDxe: set xterm resolution on mode - change (RH only) - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- Resolve harmless conflict in "MdeModulePkg/MdeModulePkg.dec", - originating from new upstream commits - - 45bc28172fbf ("MdeModulePkg.dec: Change PCDs for status code.", - 2020-06-18), - - 0785c619a58a ("MdeModulePkg/Bus/Pci/PciBusDxe: Support PCIe Resizable - BAR Capability", 2021-01-04), - - ef23012e5439 ("MdeModulePkg: Change default value of - PcdPcieResizableBarSupport to FALSE", 2021-01-14). - -Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> -RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: - -- Resolve trivial conflict in "MdeModulePkg/MdeModulePkg.dec", arising - from upstream commit 166830d8f7ca ("MdeModulePkg/dec: add - PcdTcgPfpMeasurementRevision PCD", 2020-01-06). - -Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> -RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: - -- Conflict in "MdeModulePkg/MdeModulePkg.dec" due to upstream commits - - 1103ba946aee ("MdeModulePkg: Add Capsule On Disk related definition.", - 2019-06-26), - - 1c7b3eb84631 ("MdeModulePkg/DxeIpl: Introduce PCD - PcdUse5LevelPageTable", 2019-08-09), - with easy manual resolution. - -Notes about the RHEL-8.0/20180508-ee3198e672e2 -> -RHEL-8.1/20190308-89910a39dcfd rebase: - -- no change - -Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> -RHEL-8.0/20180508-ee3198e672e2 rebase: - -- reorder the rebase changelog in the commit message so that it reads like - a blog: place more recent entries near the top -- no changes to the patch body - -Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: - -- no change - -Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: - -- Refresh downstream-only commit 2909e025db68 against "MdeModulePkg.dec" - context change from upstream commits e043f7895b83 ("MdeModulePkg: Add - PCD PcdPteMemoryEncryptionAddressOrMask", 2017-02-27) and 76081dfcc5b2 - ("MdeModulePkg: Add PROMPT&HELP string of pcd to UNI file", 2017-03-03). - -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: - -- refresh commit 519b9751573e against various context changes - -The - - CSI Ps ; Ps ; Ps t - -escape sequence serves for window manipulation. We can use the - - CSI 8 ; ; t - -sequence to adapt eg. the xterm window size to the selected console mode. - -Reference: -Contributed-under: TianoCore Contribution Agreement 1.0 -Signed-off-by: Laszlo Ersek -(cherry picked from commit 2909e025db6878723b49644a8a0cf160d07e6444) -(cherry picked from commit b9c5c901f25e48d68eef6e78a4abca00e153f574) -(cherry picked from commit b7f6115b745de8cbc5214b6ede33c9a8558beb90) -(cherry picked from commit 67415982afdc77922aa37496c981adeb4351acdb) -(cherry picked from commit cfccb98d13e955beb0b93b4a75a973f30c273ffc) -(cherry picked from commit a11602f5e2ef930be5b693ddfd0c789a1bd4c60c) -(cherry picked from commit bc2266f20de5db1636e09a07e4a72c8dbf505f5a) ---- - MdeModulePkg/MdeModulePkg.dec | 4 +++ - .../Console/TerminalDxe/TerminalDxe.inf | 2 ++ - .../Console/TerminalDxe/TerminalConOut.c | 29 +++++++++++++++++++ - 3 files changed, 35 insertions(+) - -diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec -index badb93238ff1..5ee6db534d41 100644 ---- a/MdeModulePkg/MdeModulePkg.dec -+++ b/MdeModulePkg/MdeModulePkg.dec -@@ -2222,6 +2222,10 @@ [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] - # @Prompt The value is use for Usb Network rate limiting supported. - gEfiMdeModulePkgTokenSpaceGuid.PcdUsbNetworkRateLimitingFactor|100|UINT32|0x10000028 - -+ ## Controls whether TerminalDxe outputs an XTerm resize sequence on terminal -+ # mode change. -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE|BOOLEAN|0x00010080 -+ - [PcdsPatchableInModule] - ## Specify memory size with page number for PEI code when - # Loading Module at Fixed Address feature is enabled. -diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf -index b2a8aeba8510..eff625346539 100644 ---- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf -+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf -@@ -55,6 +55,7 @@ [LibraryClasses] - DebugLib - PcdLib - BaseLib -+ PrintLib - - [Guids] - ## SOMETIMES_PRODUCES ## Variable:L"ConInDev" -@@ -87,6 +88,7 @@ [Protocols] - [Pcd] - gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType ## SOMETIMES_CONSUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable ## CONSUMES -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm ## CONSUMES - - # [Event] - # # Relative timer event set by UnicodeToEfiKey(), used to be one 2 seconds input timeout. -diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c -index 7809869e7d49..496849458db4 100644 ---- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c -+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c -@@ -7,6 +7,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ - -+#include -+ - #include "Terminal.h" - - // -@@ -80,6 +82,15 @@ CHAR16 mSetCursorPositionString[] = { ESC, '[', '0', '0', ';', '0', '0', 'H', 0 - CHAR16 mCursorForwardString[] = { ESC, '[', '0', '0', 'C', 0 }; - CHAR16 mCursorBackwardString[] = { ESC, '[', '0', '0', 'D', 0 }; - -+// -+// Note that this is an ASCII format string, taking two INT32 arguments: -+// rows, columns. -+// -+// A %d (INT32) format specification can expand to at most 11 characters. -+// -+CHAR8 mResizeTextAreaFormatString[] = "\x1B[8;%d;%dt"; -+#define RESIZE_SEQ_SIZE (sizeof mResizeTextAreaFormatString + 2 * (11 - 2)) -+ - // - // Body of the ConOut functions - // -@@ -498,6 +509,24 @@ TerminalConOutSetMode ( - return EFI_DEVICE_ERROR; - } - -+ if (PcdGetBool (PcdResizeXterm)) { -+ CHAR16 ResizeSequence[RESIZE_SEQ_SIZE]; -+ -+ UnicodeSPrintAsciiFormat ( -+ ResizeSequence, -+ sizeof ResizeSequence, -+ mResizeTextAreaFormatString, -+ (INT32)TerminalDevice->TerminalConsoleModeData[ModeNumber].Rows, -+ (INT32)TerminalDevice->TerminalConsoleModeData[ModeNumber].Columns -+ ); -+ TerminalDevice->OutputEscChar = TRUE; -+ Status = This->OutputString (This, ResizeSequence); -+ TerminalDevice->OutputEscChar = FALSE; -+ if (EFI_ERROR (Status)) { -+ return EFI_DEVICE_ERROR; -+ } -+ } -+ - This->Mode->Mode = (INT32)ModeNumber; - - Status = This->ClearScreen (This); --- -2.45.0 - diff --git a/SPECS/edk2/0004-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch b/SPECS/edk2/0004-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch deleted file mode 100644 index a079e958ad..0000000000 --- a/SPECS/edk2/0004-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch +++ /dev/null @@ -1,219 +0,0 @@ -From 895195c00cc87545d751a6b063cdf7e19d2d8fe8 Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Wed, 14 Oct 2015 15:59:06 +0200 -Subject: [PATCH 04/17] OvmfPkg: take PcdResizeXterm from the QEMU command line - (RH only) - -edk2-stable202205 rebase - -- re-add UPDATE_BOOLEAN_PCD_FROM_FW_CFG -- add microvm, cloudhw and inteltdx - -edk2-stable202108 rebase - -- resolve conflict in OvmfPkg/PlatformPei/PlatformPei.inf - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- Extend the DSC change to the new OvmfPkg/AmdSev platform, which has been - introduced upstream in commit 30d277ed7a82 ("OvmfPkg/Amdsev: Base commit - to build encrypted boot specific OVMF", 2020-12-14), for TianoCore#3077. - - We've always patched all those DSC/FDF files in OvmfPkg down-stream that - made sense at least in theory on QEMU. (For example, we've always - patched "OvmfPkgIa32.dsc" and "OvmfPkgIa32.fdf", even though we never - build or ship the pure IA32 firmware platform.) Follow suit with - "AmdSevX64.dsc". - -Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> -RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: - -- Resolve contextual conflict in the DSC files, from upstream commit - b0ed7ebdebd1 ("OvmfPkg: set fixed FlashNvStorage base addresses with -D - SMM_REQUIRE", 2020-03-12). - -Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> -RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: - -- no change - -Notes about the RHEL-8.0/20180508-ee3198e672e2 -> -RHEL-8.1/20190308-89910a39dcfd rebase: - -- no change - -Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> -RHEL-8.0/20180508-ee3198e672e2 rebase: - -- reorder the rebase changelog in the commit message so that it reads like - a blog: place more recent entries near the top -- no changes to the patch body - -Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: - -- no change - -Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: - -- refresh downstream-only commit 8abc2a6ddad2 against context differences - in the DSC files from upstream commit 5e167d7e784c - ("OvmfPkg/PlatformPei: don't allocate reserved mem varstore if - SMM_REQUIRE", 2017-03-12). - -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: - -- no changes - -Contributed-under: TianoCore Contribution Agreement 1.0 -Signed-off-by: Laszlo Ersek -(cherry picked from commit 6fa0c4d67c0bb8bde2ddd6db41c19eb0c40b2721) -(cherry picked from commit 8abc2a6ddad25af7e88dc0cf57d55dfb75fbf92d) -(cherry picked from commit b311932d3841c017a0f0fec553edcac365cc2038) -(cherry picked from commit 61914fb81cf624c9028d015533b400b2794e52d3) -(cherry picked from commit 2ebf3cc2ae99275d63bb6efd3c22dec76251a853) -(cherry picked from commit f9b73437b9b231773c1a20e0c516168817a930a2) -(cherry picked from commit 2cc462ee963d0be119bc97bfc9c70d292a40516f) -(cherry picked from commit 51e0de961029af84b5bdbfddcc9762b1819d500f) ---- - OvmfPkg/AmdSev/AmdSevX64.dsc | 1 + - OvmfPkg/CloudHv/CloudHvX64.dsc | 1 + - OvmfPkg/IntelTdx/IntelTdxX64.dsc | 1 + - OvmfPkg/Microvm/MicrovmX64.dsc | 1 + - OvmfPkg/OvmfPkgIa32.dsc | 1 + - OvmfPkg/OvmfPkgIa32X64.dsc | 1 + - OvmfPkg/OvmfPkgX64.dsc | 1 + - OvmfPkg/PlatformPei/PlatformPei.inf | 1 + - OvmfPkg/PlatformPei/Platform.c | 13 +++++++++++++ - 9 files changed, 21 insertions(+) - -diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc -index 8eb6f4f24fa8..05076ff7f079 100644 ---- a/OvmfPkg/AmdSev/AmdSevX64.dsc -+++ b/OvmfPkg/AmdSev/AmdSevX64.dsc -@@ -484,6 +484,7 @@ [PcdsFixedAtBuild] - [PcdsDynamicDefault] - gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0 - -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|0 -diff --git a/OvmfPkg/CloudHv/CloudHvX64.dsc b/OvmfPkg/CloudHv/CloudHvX64.dsc -index 4996885301fa..243c6c6e49d8 100644 ---- a/OvmfPkg/CloudHv/CloudHvX64.dsc -+++ b/OvmfPkg/CloudHv/CloudHvX64.dsc -@@ -581,6 +581,7 @@ [PcdsDynamicDefault] - # ($(SMM_REQUIRE) == FALSE) - gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0 - -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE - !if $(SMM_REQUIRE) == FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0 -diff --git a/OvmfPkg/IntelTdx/IntelTdxX64.dsc b/OvmfPkg/IntelTdx/IntelTdxX64.dsc -index 0931ce061a1a..f55f821a42cc 100644 ---- a/OvmfPkg/IntelTdx/IntelTdxX64.dsc -+++ b/OvmfPkg/IntelTdx/IntelTdxX64.dsc -@@ -477,6 +477,7 @@ [PcdsDynamicDefault] - # ($(SMM_REQUIRE) == FALSE) - gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0 - -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|0 -diff --git a/OvmfPkg/Microvm/MicrovmX64.dsc b/OvmfPkg/Microvm/MicrovmX64.dsc -index 69de4dd3f148..2025cd88a791 100644 ---- a/OvmfPkg/Microvm/MicrovmX64.dsc -+++ b/OvmfPkg/Microvm/MicrovmX64.dsc -@@ -591,6 +591,7 @@ [PcdsDynamicDefault] - # ($(SMM_REQUIRE) == FALSE) - gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0 - -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|0 -diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc -index 1be021be7140..4aa47ac79ba2 100644 ---- a/OvmfPkg/OvmfPkgIa32.dsc -+++ b/OvmfPkg/OvmfPkgIa32.dsc -@@ -600,6 +600,7 @@ [PcdsDynamicDefault] - # ($(SMM_REQUIRE) == FALSE) - gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0 - -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE - !if $(SMM_REQUIRE) == FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0 -diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc -index d27a4c7278c2..16f415821001 100644 ---- a/OvmfPkg/OvmfPkgIa32X64.dsc -+++ b/OvmfPkg/OvmfPkgIa32X64.dsc -@@ -612,6 +612,7 @@ [PcdsDynamicDefault] - # ($(SMM_REQUIRE) == FALSE) - gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0 - -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE - !if $(SMM_REQUIRE) == FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0 -diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc -index 8f5cd23b2ec0..0b8cb74ce099 100644 ---- a/OvmfPkg/OvmfPkgX64.dsc -+++ b/OvmfPkg/OvmfPkgX64.dsc -@@ -630,6 +630,7 @@ [PcdsDynamicDefault] - # ($(SMM_REQUIRE) == FALSE) - gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0 - -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE - !if $(SMM_REQUIRE) == FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0 -diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf b/OvmfPkg/PlatformPei/PlatformPei.inf -index e036018eab39..7103e109b88e 100644 ---- a/OvmfPkg/PlatformPei/PlatformPei.inf -+++ b/OvmfPkg/PlatformPei/PlatformPei.inf -@@ -103,6 +103,7 @@ [Pcd] - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize - gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm - gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode - gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable - gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack -diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c -index df35726ff650..278135a66368 100644 ---- a/OvmfPkg/PlatformPei/Platform.c -+++ b/OvmfPkg/PlatformPei/Platform.c -@@ -41,6 +41,18 @@ - - #include "Platform.h" - -+#define UPDATE_BOOLEAN_PCD_FROM_FW_CFG(TokenName) \ -+ do { \ -+ BOOLEAN Setting; \ -+ RETURN_STATUS PcdStatus; \ -+ \ -+ if (!RETURN_ERROR (QemuFwCfgParseBool ( \ -+ "opt/ovmf/" #TokenName, &Setting))) { \ -+ PcdStatus = PcdSetBoolS (TokenName, Setting); \ -+ ASSERT_RETURN_ERROR (PcdStatus); \ -+ } \ -+ } while (0) -+ - EFI_PEI_PPI_DESCRIPTOR mPpiBootMode[] = { - { - EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, -@@ -355,6 +367,7 @@ InitializePlatform ( - MemTypeInfoInitialization (PlatformInfoHob); - MemMapInitialization (PlatformInfoHob); - NoexecDxeInitialization (PlatformInfoHob); -+ UPDATE_BOOLEAN_PCD_FROM_FW_CFG (PcdResizeXterm); - } - - InstallClearCacheCallback (); --- -2.45.0 - diff --git a/SPECS/edk2/0005-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch b/SPECS/edk2/0005-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch deleted file mode 100644 index 4a47d8b51b..0000000000 --- a/SPECS/edk2/0005-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch +++ /dev/null @@ -1,204 +0,0 @@ -From 97f1f3f002f2f16fd03d43c66937b408cc954feb Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Sun, 26 Jul 2015 08:02:50 +0000 -Subject: [PATCH 05/17] ArmVirtPkg: take PcdResizeXterm from the QEMU command - line (RH only) - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- no change - -Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> -RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: - -- Resolve leading context divergence in "ArmVirtPkg/ArmVirtQemu.dsc", - arising from upstream commits: - - - 82662a3b5f56 ("ArmVirtPkg/PlatformPeiLib: discover the TPM base - address from the DT", 2020-03-04) - - - ddd34a818315 ("ArmVirtPkg/ArmVirtQemu: enable TPM2 support in the PEI - phase", 2020-03-04) - - - cdc3fa54184a ("ArmVirtPkg: control PXEv4 / PXEv6 boot support from the - QEMU command line", 2020-04-28) - -- Rework the downstream patch quite a bit, paralleling the upstream work - done for in commit - range 64ab457d1f21..cdc3fa54184a: - - - Refresh copyright year in TerminalPcdProducerLib.{inf,c}. Also replace - open-coded BSDL with "SPDX-License-Identifier: BSD-2-Clause-Patent". - - - Simplify LIBRARY_CLASS: this lib instance is meant to be consumed only - via NULL class resolution (basically: as a plugin), so use NULL for - LIBRARY_CLASS, not "TerminalPcdProducerLib|DXE_DRIVER". - - - Sort the [Packages] section alphabetically in the INF file. - - - Replace the open-coded GetNamedFwCfgBoolean() function with a call to - QemuFwCfgParseBool(), from QemuFwCfgSimpleParserLib. - - - Add the SOMETIMES_PRODUCES usage comment in the [Pcd] section of the - INF file. - -Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> -RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: - -- no change - -Notes about the RHEL-8.0/20180508-ee3198e672e2 -> -RHEL-8.1/20190308-89910a39dcfd rebase: - -- no change - -Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> -RHEL-8.0/20180508-ee3198e672e2 rebase: - -- reorder the rebase changelog in the commit message so that it reads like - a blog: place more recent entries near the top -- no changes to the patch body - -Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: - -- no change - -Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: - -- Refresh downstream-only commit d4564d39dfdb against context changes in - "ArmVirtPkg/ArmVirtQemu.dsc" from upstream commit 7e5f1b673870 - ("ArmVirtPkg/PlatformHasAcpiDtDxe: allow guest level ACPI disable - override", 2017-03-29). - -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: - -- Adapt commit 6b97969096a3 to the fact that upstream has deprecated such - setter functions for dynamic PCDs that don't return a status code (such - as PcdSetBool()). Employ PcdSetBoolS(), and assert that it succeeds -- - there's really no circumstance in this case when it could fail. - -Contributed-under: TianoCore Contribution Agreement 1.0 -Signed-off-by: Laszlo Ersek -(cherry picked from commit d4564d39dfdbf74e762af43314005a2c026cb262) -(cherry picked from commit c9081ebe3bcd28e5cce4bf58bd8d4fca12f9af7c) -(cherry picked from commit 8e92730c8e1cdb642b3b3e680e643ff774a90c65) -(cherry picked from commit 9448b6b46267d8d807fac0c648e693171bb34806) -(cherry picked from commit 232fcf06f6b3048b7c2ebd6931f23186b3852f04) -(cherry picked from commit 8338545260fbb423f796d5196faaaf8ff6e1ed99) -(cherry picked from commit a5f7a57bf390f1f340ff1d1f1884a73716817ef1) ---- - ArmVirtPkg/ArmVirtQemu.dsc | 7 +++- - .../TerminalPcdProducerLib.inf | 33 ++++++++++++++++++ - .../TerminalPcdProducerLib.c | 34 +++++++++++++++++++ - 3 files changed, 73 insertions(+), 1 deletion(-) - create mode 100644 ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.inf - create mode 100644 ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.c - -diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc -index 7e2ff33ad172..9cb9831edde6 100644 ---- a/ArmVirtPkg/ArmVirtQemu.dsc -+++ b/ArmVirtPkg/ArmVirtQemu.dsc -@@ -307,6 +307,8 @@ [PcdsPatchableInModule] - gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress|0x0 - !endif - -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE -+ - [PcdsDynamicHii] - gUefiOvmfPkgTokenSpaceGuid.PcdForceNoAcpi|L"ForceNoAcpi"|gOvmfVariableGuid|0x0|FALSE|NV,BS - -@@ -416,7 +418,10 @@ [Components.common] - MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf - MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf - MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf -- MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf -+ MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf { -+ -+ NULL|ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.inf -+ } - MdeModulePkg/Universal/SerialDxe/SerialDxe.inf - - MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf -diff --git a/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.inf b/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.inf -new file mode 100644 -index 000000000000..a51dbd1670a8 ---- /dev/null -+++ b/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.inf -@@ -0,0 +1,33 @@ -+## @file -+# Plugin library for setting up dynamic PCDs for TerminalDxe, from fw_cfg -+# -+# Copyright (C) 2015-2020, Red Hat, Inc. -+# Copyright (c) 2014, Linaro Ltd. All rights reserved.
-+# -+# SPDX-License-Identifier: BSD-2-Clause-Patent -+## -+ -+[Defines] -+ INF_VERSION = 0x00010005 -+ BASE_NAME = TerminalPcdProducerLib -+ FILE_GUID = 4a0c5ed7-8c42-4c01-8f4c-7bf258316a96 -+ MODULE_TYPE = BASE -+ VERSION_STRING = 1.0 -+ LIBRARY_CLASS = NULL -+ CONSTRUCTOR = TerminalPcdProducerLibConstructor -+ -+[Sources] -+ TerminalPcdProducerLib.c -+ -+[Packages] -+ MdeModulePkg/MdeModulePkg.dec -+ MdePkg/MdePkg.dec -+ OvmfPkg/OvmfPkg.dec -+ -+[LibraryClasses] -+ DebugLib -+ PcdLib -+ QemuFwCfgSimpleParserLib -+ -+[Pcd] -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm ## SOMETIMES_PRODUCES -diff --git a/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.c b/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.c -new file mode 100644 -index 000000000000..bfd3a6a535f9 ---- /dev/null -+++ b/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.c -@@ -0,0 +1,34 @@ -+/** @file -+* Plugin library for setting up dynamic PCDs for TerminalDxe, from fw_cfg -+* -+* Copyright (C) 2015-2020, Red Hat, Inc. -+* Copyright (c) 2014, Linaro Ltd. All rights reserved.
-+* -+* SPDX-License-Identifier: BSD-2-Clause-Patent -+**/ -+ -+#include -+#include -+#include -+ -+#define UPDATE_BOOLEAN_PCD_FROM_FW_CFG(TokenName) \ -+ do { \ -+ BOOLEAN Setting; \ -+ RETURN_STATUS PcdStatus; \ -+ \ -+ if (!RETURN_ERROR (QemuFwCfgParseBool ( \ -+ "opt/org.tianocore.edk2.aavmf/" #TokenName, &Setting))) { \ -+ PcdStatus = PcdSetBoolS (TokenName, Setting); \ -+ ASSERT_RETURN_ERROR (PcdStatus); \ -+ } \ -+ } while (0) -+ -+RETURN_STATUS -+EFIAPI -+TerminalPcdProducerLibConstructor ( -+ VOID -+ ) -+{ -+ UPDATE_BOOLEAN_PCD_FROM_FW_CFG (PcdResizeXterm); -+ return RETURN_SUCCESS; -+} --- -2.45.0 - diff --git a/SPECS/edk2/0006-OvmfPkg-enable-DEBUG_VERBOSE-RHEL-only.patch b/SPECS/edk2/0006-OvmfPkg-enable-DEBUG_VERBOSE-RHEL-only.patch deleted file mode 100644 index 3d2e51529c..0000000000 --- a/SPECS/edk2/0006-OvmfPkg-enable-DEBUG_VERBOSE-RHEL-only.patch +++ /dev/null @@ -1,121 +0,0 @@ -From edd740e3e07de081fca6d87c045c5db7b6a5dcc7 Mon Sep 17 00:00:00 2001 -From: Paolo Bonzini -Date: Tue, 21 Nov 2017 00:57:45 +0100 -Subject: [PATCH 06/17] OvmfPkg: enable DEBUG_VERBOSE (RHEL only) - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- Extend the DSC change to the new OvmfPkg/AmdSev platform, which has been - introduced upstream in commit 30d277ed7a82 ("OvmfPkg/Amdsev: Base commit - to build encrypted boot specific OVMF", 2020-12-14), for TianoCore#3077. - -- Remove obsolete commit message tags related to downstream patch - management: Message-id, Patchwork-id, O-Subject, Acked-by, From - (RHBZ#1846481). - -Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> -RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: - -- context difference from upstream commit 46bb81200742 ("OvmfPkg: Make - SOURCE_DEBUG_ENABLE actually need to be set to TRUE", 2019-10-22) - resolved automatically - -Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> -RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: - -- no change - -Notes about the RHEL-8.0/20180508-ee3198e672e2 -> -RHEL-8.1/20190308-89910a39dcfd rebase: - -- no change - -Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> -RHEL-8.0/20180508-ee3198e672e2 rebase: - -- reorder the rebase changelog in the commit message so that it reads like - a blog: place more recent entries near the top -- no changes to the patch body - -Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: - -- no changes - -Bugzilla: 1488247 - -Set the DEBUG_VERBOSE bit (0x00400000) in the log mask. We want detailed -debug messages, and code in OvmfPkg logs many messages on the -DEBUG_VERBOSE level. - -Signed-off-by: Laszlo Ersek -Signed-off-by: Paolo Bonzini -(this patch was previously applied as commit 78d3ed73172b5738e32d2b0bc03f7984b9584117) -(cherry picked from commit 7aeeaabc9871f657e65d2b99d81011b4964a1ce9) -(cherry picked from commit a0617a6be1a80966099ddceb010f89202a79ee76) -(cherry picked from commit 759bd3f591e2db699bdef4c7ea4e97c908e7f027) -(cherry picked from commit 7e6d5dc4078c64be6d55d8fc3317c59a91507a50) -(cherry picked from commit 3cb92f9ba18ac79911bd5258ff4f949cc617ae89) -(cherry picked from commit 5ecc18badaabe774d9d0806b027ab63a30c6a2d7) ---- - OvmfPkg/AmdSev/AmdSevX64.dsc | 2 +- - OvmfPkg/OvmfPkgIa32.dsc | 2 +- - OvmfPkg/OvmfPkgIa32X64.dsc | 2 +- - OvmfPkg/OvmfPkgX64.dsc | 2 +- - 4 files changed, 4 insertions(+), 4 deletions(-) - -diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc -index 05076ff7f079..9bf06a17f3d2 100644 ---- a/OvmfPkg/AmdSev/AmdSevX64.dsc -+++ b/OvmfPkg/AmdSev/AmdSevX64.dsc -@@ -429,7 +429,7 @@ [PcdsFixedAtBuild] - # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may - # // significantly impact boot performance - # DEBUG_ERROR 0x80000000 // Error -- gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8040004F - - !if $(SOURCE_DEBUG_ENABLE) == TRUE - gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 -diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc -index 4aa47ac79ba2..63a1c0f393b5 100644 ---- a/OvmfPkg/OvmfPkgIa32.dsc -+++ b/OvmfPkg/OvmfPkgIa32.dsc -@@ -536,7 +536,7 @@ [PcdsFixedAtBuild] - # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may - # // significantly impact boot performance - # DEBUG_ERROR 0x80000000 // Error -- gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8040004F - - !if $(SOURCE_DEBUG_ENABLE) == TRUE - gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 -diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc -index 16f415821001..73f69272a75e 100644 ---- a/OvmfPkg/OvmfPkgIa32X64.dsc -+++ b/OvmfPkg/OvmfPkgIa32X64.dsc -@@ -543,7 +543,7 @@ [PcdsFixedAtBuild] - # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may - # // significantly impact boot performance - # DEBUG_ERROR 0x80000000 // Error -- gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8040004F - - !if $(SOURCE_DEBUG_ENABLE) == TRUE - gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 -diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc -index 0b8cb74ce099..1d1f2651b9b3 100644 ---- a/OvmfPkg/OvmfPkgX64.dsc -+++ b/OvmfPkg/OvmfPkgX64.dsc -@@ -562,7 +562,7 @@ [PcdsFixedAtBuild] - # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may - # // significantly impact boot performance - # DEBUG_ERROR 0x80000000 // Error -- gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8040004F - - !if $(SOURCE_DEBUG_ENABLE) == TRUE - gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 --- -2.45.0 - diff --git a/SPECS/edk2/0007-OvmfPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuVide.patch b/SPECS/edk2/0007-OvmfPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuVide.patch deleted file mode 100644 index 4457836ff7..0000000000 --- a/SPECS/edk2/0007-OvmfPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuVide.patch +++ /dev/null @@ -1,170 +0,0 @@ -From 1db7854d3e618d42b429aefd7ac397478e5a1ef9 Mon Sep 17 00:00:00 2001 -From: Paolo Bonzini -Date: Tue, 21 Nov 2017 00:57:46 +0100 -Subject: [PATCH 07/17] OvmfPkg: silence DEBUG_VERBOSE (0x00400000) in - QemuVideoDxe/QemuRamfbDxe (RH) - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- Extend the DSC change to the new OvmfPkg/AmdSev platform, which has been - introduced upstream in commit 30d277ed7a82 ("OvmfPkg/Amdsev: Base commit - to build encrypted boot specific OVMF", 2020-12-14), for TianoCore#3077. - -- Remove obsolete commit message tags related to downstream patch - management: Message-id, Patchwork-id, O-Subject, Acked-by, From - (RHBZ#1846481). - -Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> -RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: - -- no change - -Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> -RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: - -- Due to upstream commit 4b04d9d73604 ("OvmfPkg: Don't build in - QemuVideoDxe when we have CSM", 2019-06-26), the contexts of - "QemuVideoDxe.inf" / "QemuRamfbDxe.inf" have changed in the DSC files. - Resolve the conflict manually. - -Notes about the RHEL-8.0/20180508-ee3198e672e2 -> -RHEL-8.1/20190308-89910a39dcfd rebase: - -- Upstream commit 1d25ff51af5c ("OvmfPkg: add QemuRamfbDxe", 2018-06-14) - introduced another GOP driver that consumes FrameBufferBltLib, and - thereby produces a large number of (mostly useless) debug messages at - the DEBUG_VERBOSE level. Extend the patch to suppress those messages in - both QemuVideoDxe and QemuRamfbDxe; update the subject accordingly. - QemuRamfbDxe itself doesn't log anything at the VERBOSE level (see also - the original commit message at the bottom of this downstream patch). - -Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> -RHEL-8.0/20180508-ee3198e672e2 rebase: - -- reorder the rebase changelog in the commit message so that it reads like - a blog: place more recent entries near the top -- no changes to the patch body - -Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: - -- no changes - -Bugzilla: 1488247 - -In commit 5b2291f9567a ("OvmfPkg: QemuVideoDxe uses -MdeModulePkg/FrameBufferLib"), QemuVideoDxe was rebased to -FrameBufferBltLib. - -The FrameBufferBltLib instance added in commit b1ca386074bd -("MdeModulePkg: Add FrameBufferBltLib library instance") logs many -messages on the VERBOSE level; for example, a normal boot with OVMF can -produce 500+ "VideoFill" messages, dependent on the progress bar, when the -VERBOSE bit is set in PcdDebugPrintErrorLevel. - -QemuVideoDxe itself doesn't log anything at the VERBOSE level, so we lose -none of its messages this way. - -Signed-off-by: Laszlo Ersek -Signed-off-by: Paolo Bonzini -(this patch was previously applied as commit 9b0d031dee7e823f6717bab73e422fbc6f0a6c52) -(cherry picked from commit 9122d5f2e8d8d289064d1e1700cb61964d9931f3) -(cherry picked from commit 7eb3be1d4ccafc26c11fe5afb95cc12b250ce6f0) -(cherry picked from commit bd650684712fb840dbcda5d6eaee065bd9e91fa1) -(cherry picked from commit b06b87f8ffd4fed4ef7eacb13689a9b6d111f850) -(cherry picked from commit c8c3f893e7c3710afe45c46839e97954871536e4) -(cherry picked from commit 1355849ad97c1e4a5c430597a377165a5cc118f7) ---- - OvmfPkg/AmdSev/AmdSevX64.dsc | 10 ++++++++-- - OvmfPkg/OvmfPkgIa32.dsc | 10 ++++++++-- - OvmfPkg/OvmfPkgIa32X64.dsc | 10 ++++++++-- - OvmfPkg/OvmfPkgX64.dsc | 10 ++++++++-- - 4 files changed, 32 insertions(+), 8 deletions(-) - -diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc -index 9bf06a17f3d2..f87c1eb00186 100644 ---- a/OvmfPkg/AmdSev/AmdSevX64.dsc -+++ b/OvmfPkg/AmdSev/AmdSevX64.dsc -@@ -691,8 +691,14 @@ [Components] - MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf - -- OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf -- OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf -+ OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } -+ OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } - OvmfPkg/VirtioGpuDxe/VirtioGpu.inf - - # -diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc -index 63a1c0f393b5..d7184a248df2 100644 ---- a/OvmfPkg/OvmfPkgIa32.dsc -+++ b/OvmfPkg/OvmfPkgIa32.dsc -@@ -829,8 +829,14 @@ [Components] - MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf - -- OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf -- OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf -+ OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } -+ OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } - OvmfPkg/VirtioGpuDxe/VirtioGpu.inf - OvmfPkg/VirtHstiDxe/VirtHstiDxe.inf - -diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc -index 73f69272a75e..47e580fede51 100644 ---- a/OvmfPkg/OvmfPkgIa32X64.dsc -+++ b/OvmfPkg/OvmfPkgIa32X64.dsc -@@ -843,8 +843,14 @@ [Components.X64] - MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf - -- OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf -- OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf -+ OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } -+ OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } - OvmfPkg/VirtioGpuDxe/VirtioGpu.inf - OvmfPkg/VirtHstiDxe/VirtHstiDxe.inf - -diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc -index 1d1f2651b9b3..d68b61e2e6b9 100644 ---- a/OvmfPkg/OvmfPkgX64.dsc -+++ b/OvmfPkg/OvmfPkgX64.dsc -@@ -911,8 +911,14 @@ [Components] - MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf - -- OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf -- OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf -+ OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } -+ OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } - OvmfPkg/VirtioGpuDxe/VirtioGpu.inf - OvmfPkg/VirtHstiDxe/VirtHstiDxe.inf - --- -2.45.0 - diff --git a/SPECS/edk2/0008-ArmVirtPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuR.patch b/SPECS/edk2/0008-ArmVirtPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuR.patch deleted file mode 100644 index 8958dfb930..0000000000 --- a/SPECS/edk2/0008-ArmVirtPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuR.patch +++ /dev/null @@ -1,97 +0,0 @@ -From 7011ddb80145b9e47ebabb0f2f2f33e74dd2f83a Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Wed, 27 Jan 2016 03:05:18 +0100 -Subject: [PATCH 08/17] ArmVirtPkg: silence DEBUG_VERBOSE (0x00400000) in - QemuRamfbDxe (RH only) - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- no change - -Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> -RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: - -- no change - -Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> -RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: - -- The previous version of this patch (downstream commit 76b4ac28e975) - caused a regression (RHBZ#1714446), which was fixed up in downstream - commit 5a216abaa737 ("ArmVirtPkg: silence DEBUG_VERBOSE masking - ~0x00400000 in QemuRamfbDxe (RH only)", 2019-08-05). - - Squash the fixup into the original patch. Fuse the commit messages. - (Acked-by tags are not preserved, lest we confuse ourselves while - reviewing this rebase.) - -Notes about the RHEL-8.0/20180508-ee3198e672e2 -> -RHEL-8.1/20190308-89910a39dcfd rebase: - -- new patch, due to upstream commit c64688f36a8b ("ArmVirtPkg: add - QemuRamfbDxe", 2018-06-14) - -QemuRamfbDxe uses FrameBufferLib. The FrameBufferBltLib instance added in -commit b1ca386074bd ("MdeModulePkg: Add FrameBufferBltLib library -instance") logs many messages on the VERBOSE level; for example, a normal -boot with ArmVirtQemu[Kernel] can produce 500+ "VideoFill" messages, -dependent on the progress bar, when the VERBOSE bit is set in -PcdDebugPrintErrorLevel. - -Clear the VERBOSE bit without touching other bits -- those other bits -differ between the "silent" and "verbose" builds, so we can't set them as -constants. - -QemuRamfbDxe itself doesn't log anything at the VERBOSE level, so we lose -none of its messages, with the VERBOSE bit clear. - -Signed-off-by: Laszlo Ersek -(cherry picked from commit 76b4ac28e975bd63c25db903a1d42c47b38cc756) -Reported-by: Andrew Jones -Suggested-by: Laszlo Ersek -Signed-off-by: Philippe Mathieu-Daude -(cherry picked from commit 5a216abaa737195327235e37563b18a6bf2a74dc) -Signed-off-by: Laszlo Ersek -(cherry picked from commit e5b8152bced2364a1ded0926dbba4d65e23e3f84) -(cherry picked from commit e7f57f154439c1c18ea5030b01f8d7bc492698b2) ---- - ArmVirtPkg/ArmVirtQemu.dsc | 5 ++++- - ArmVirtPkg/ArmVirtQemuKernel.dsc | 5 ++++- - 2 files changed, 8 insertions(+), 2 deletions(-) - -diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc -index 9cb9831edde6..e4c8adf6e494 100644 ---- a/ArmVirtPkg/ArmVirtQemu.dsc -+++ b/ArmVirtPkg/ArmVirtQemu.dsc -@@ -545,7 +545,10 @@ [Components.common] - # - # Video support - # -- OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf -+ OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|($(DEBUG_PRINT_ERROR_LEVEL)) & 0xFFBFFFFF -+ } - OvmfPkg/VirtioGpuDxe/VirtioGpu.inf - OvmfPkg/PlatformDxe/Platform.inf - -diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc -index efe2df97bdf7..a12bb0809e23 100644 ---- a/ArmVirtPkg/ArmVirtQemuKernel.dsc -+++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc -@@ -447,7 +447,10 @@ [Components.common] - # - # Video support - # -- OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf -+ OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|($(DEBUG_PRINT_ERROR_LEVEL)) & 0xFFBFFFFF -+ } - OvmfPkg/VirtioGpuDxe/VirtioGpu.inf - OvmfPkg/PlatformDxe/Platform.inf - --- -2.45.0 - diff --git a/SPECS/edk2/0009-OvmfPkg-QemuRamfbDxe-Do-not-report-DXE-failure-on-Aa.patch b/SPECS/edk2/0009-OvmfPkg-QemuRamfbDxe-Do-not-report-DXE-failure-on-Aa.patch deleted file mode 100644 index a68655cc9d..0000000000 --- a/SPECS/edk2/0009-OvmfPkg-QemuRamfbDxe-Do-not-report-DXE-failure-on-Aa.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 643f3d555a97c9187e0e817083da145c2a564d3e Mon Sep 17 00:00:00 2001 -From: Philippe Mathieu-Daude -Date: Thu, 1 Aug 2019 20:43:48 +0200 -Subject: [PATCH 09/17] OvmfPkg: QemuRamfbDxe: Do not report DXE failure on - Aarch64 silent builds (RH only) - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- no change - -Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> -RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: - -- no change - -Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> -RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: - -- We have to carry this downstream-only patch -- committed originally as - aaaedc1e2cfd -- indefinitely. - -- To avoid confusion, remove the tags from the commit message that had - been added by the downstream maintainer scripts, such as: Message-id, - Patchwork-id, O-Subject, Acked-by. These remain available on the - original downstream commit. The Bugzilla line is preserved, as it - doesn't relate to a specific posting, but to the problem. - -Bugzilla: 1714446 - -To suppress an error message on the silent build when ramfb is -not configured, change QemuRamfbDxe to return EFI_SUCCESS even -when it fails. -Some memory is wasted (driver stays resident without -any good use), but it is mostly harmless, as the memory -is released by the OS after ExitBootServices(). - -Suggested-by: Laszlo Ersek -Signed-off-by: Philippe Mathieu-Daude -(cherry picked from commit aaaedc1e2cfd55ef003fb1b5a37c73a196b26dc7) -Signed-off-by: Laszlo Ersek -(cherry picked from commit aa2b66b18a62d652bdbefae7b5732297294306ca) -(cherry picked from commit deb3451034326b75fd760aba47a5171493ff055e) ---- - OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf | 1 + - OvmfPkg/QemuRamfbDxe/QemuRamfb.c | 15 +++++++++++++++ - 2 files changed, 16 insertions(+) - -diff --git a/OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf b/OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf -index e3890b8c202f..6ffee5acb24c 100644 ---- a/OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf -+++ b/OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf -@@ -29,6 +29,7 @@ [LibraryClasses] - BaseLib - BaseMemoryLib - DebugLib -+ DebugPrintErrorLevelLib - DevicePathLib - FrameBufferBltLib - MemoryAllocationLib -diff --git a/OvmfPkg/QemuRamfbDxe/QemuRamfb.c b/OvmfPkg/QemuRamfbDxe/QemuRamfb.c -index 5a1044f0dc7b..3a687901b0d2 100644 ---- a/OvmfPkg/QemuRamfbDxe/QemuRamfb.c -+++ b/OvmfPkg/QemuRamfbDxe/QemuRamfb.c -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -259,6 +260,20 @@ InitializeQemuRamfb ( - - Status = QemuFwCfgFindFile ("etc/ramfb", &mRamfbFwCfgItem, &FwCfgSize); - if (EFI_ERROR (Status)) { -+ #if defined (MDE_CPU_AARCH64) -+ // -+ // RHBZ#1714446 -+ // If no ramfb device was configured, this platform DXE driver should -+ // returns EFI_NOT_FOUND, so the DXE Core can unload it. However, even -+ // using a silent build, an error message is issued to the guest console. -+ // Since this confuse users, return success and stay resident. The wasted -+ // guest RAM still gets freed later after ExitBootServices(). -+ // -+ if (GetDebugPrintErrorLevel () == DEBUG_ERROR) { -+ return EFI_SUCCESS; -+ } -+ -+ #endif - return EFI_NOT_FOUND; - } - --- -2.45.0 - diff --git a/SPECS/edk2/0010-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch b/SPECS/edk2/0010-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch deleted file mode 100644 index 9a141ed176..0000000000 --- a/SPECS/edk2/0010-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch +++ /dev/null @@ -1,131 +0,0 @@ -From c59eeb543e26a6fe53afb72632571953b02ee45e Mon Sep 17 00:00:00 2001 -From: Paolo Bonzini -Date: Tue, 21 Nov 2017 00:57:47 +0100 -Subject: [PATCH 10/17] OvmfPkg: silence EFI_D_VERBOSE (0x00400000) in - NvmExpressDxe (RH only) - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- Extend the DSC change to the new OvmfPkg/AmdSev platform, which has been - introduced upstream in commit 30d277ed7a82 ("OvmfPkg/Amdsev: Base commit - to build encrypted boot specific OVMF", 2020-12-14), for TianoCore#3077. - -- Remove obsolete commit message tags related to downstream patch - management: Message-id, Patchwork-id, O-Subject, Acked-by, From - (RHBZ#1846481). - -Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> -RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: - -- no change - -Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> -RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: - -- no change - -Notes about the RHEL-8.0/20180508-ee3198e672e2 -> -RHEL-8.1/20190308-89910a39dcfd rebase: - -- no change - -Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> -RHEL-8.0/20180508-ee3198e672e2 rebase: - -- reorder the rebase changelog in the commit message so that it reads like - a blog: place more recent entries near the top -- no changes to the patch body - -Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: - -- no changes - -Bugzilla: 1488247 - -NvmExpressDxe logs all BlockIo read & write calls on the EFI_D_VERBOSE -level. - -Signed-off-by: Laszlo Ersek -Signed-off-by: Paolo Bonzini -(this patch was previously applied as commit 5f432837b9c60c2929b13dda1a1b488d5c3a6d2f) -(cherry picked from commit 33e00146eb878588ad1395d7b1ae38f401729da4) -(cherry picked from commit bd10cabcfcb1bc9a32b05062f4ee3792e27bc2d8) -(cherry picked from commit 5a27af700f49e00608f232f618dedd7bf5e9b3e6) -(cherry picked from commit 58bba429b9ec7b78109940ef945d0dc93f3cd958) -(cherry picked from commit b8d0ebded8c2cf5b266c807519e2d8ccfd66fee6) -(cherry picked from commit ed89844b47f46cfe911f1bf2bda40e537a908502) ---- - OvmfPkg/AmdSev/AmdSevX64.dsc | 5 ++++- - OvmfPkg/OvmfPkgIa32.dsc | 5 ++++- - OvmfPkg/OvmfPkgIa32X64.dsc | 5 ++++- - OvmfPkg/OvmfPkgX64.dsc | 5 ++++- - 4 files changed, 16 insertions(+), 4 deletions(-) - -diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc -index f87c1eb00186..96a63c50b451 100644 ---- a/OvmfPkg/AmdSev/AmdSevX64.dsc -+++ b/OvmfPkg/AmdSev/AmdSevX64.dsc -@@ -686,7 +686,10 @@ [Components] - MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf - MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf - MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf -- MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf -+ MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } - MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf - MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf -diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc -index d7184a248df2..9371b3a5e917 100644 ---- a/OvmfPkg/OvmfPkgIa32.dsc -+++ b/OvmfPkg/OvmfPkgIa32.dsc -@@ -824,7 +824,10 @@ [Components] - MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf - MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf - MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf -- MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf -+ MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } - MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf - MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf -diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc -index 47e580fede51..483bcc69966d 100644 ---- a/OvmfPkg/OvmfPkgIa32X64.dsc -+++ b/OvmfPkg/OvmfPkgIa32X64.dsc -@@ -838,7 +838,10 @@ [Components.X64] - MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf - MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf - MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf -- MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf -+ MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } - MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf - MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf -diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc -index d68b61e2e6b9..9e243c5c086b 100644 ---- a/OvmfPkg/OvmfPkgX64.dsc -+++ b/OvmfPkg/OvmfPkgX64.dsc -@@ -906,7 +906,10 @@ [Components] - MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf - MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf - MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf -- MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf -+ MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } - MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf - MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf --- -2.45.0 - diff --git a/SPECS/edk2/0011-OvmfPkg-QemuKernelLoaderFsDxe-suppress-error-on-no-k.patch b/SPECS/edk2/0011-OvmfPkg-QemuKernelLoaderFsDxe-suppress-error-on-no-k.patch deleted file mode 100644 index 67cb8e326f..0000000000 --- a/SPECS/edk2/0011-OvmfPkg-QemuKernelLoaderFsDxe-suppress-error-on-no-k.patch +++ /dev/null @@ -1,84 +0,0 @@ -From e76c01fd6eeb467e427f5e76f3c45ed098de4d3d Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Wed, 24 Jun 2020 11:31:36 +0200 -Subject: [PATCH 11/17] OvmfPkg/QemuKernelLoaderFsDxe: suppress error on no - "-kernel" in silent aa64 build (RH) - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- Remove obsolete commit message tags related to downstream patch - management: Message-id, Patchwork-id, O-Subject, Acked-by, From, - RH-Acked-by, RH-Author (RHBZ#1846481). - -Bugzilla: 1844682 - -If the "-kernel" QEMU option is not used, then QemuKernelLoaderFsDxe -should return EFI_NOT_FOUND, so that the DXE Core can unload it. However, -the associated error message, logged by the DXE Core to the serial -console, is not desired in the silent edk2-aarch64 build, given that the -absence of "-kernel" is nothing out of the ordinary. Therefore, return -success and stay resident. The wasted guest RAM still gets freed after -ExitBootServices(). - -(Inspired by RHEL-8.1.0 commit aaaedc1e2cfd.) - -Signed-off-by: Laszlo Ersek -Signed-off-by: Miroslav Rezanina -(cherry picked from commit 9adcdf493ebbd11efb74e2905ab5f6c8996e096d) ---- - .../QemuKernelLoaderFsDxe.inf | 1 + - .../QemuKernelLoaderFsDxe.c | 18 ++++++++++++++++++ - 2 files changed, 19 insertions(+) - -diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf -index 7b35adb8e034..e0331c6e2cbc 100644 ---- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf -+++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf -@@ -28,6 +28,7 @@ [LibraryClasses] - BaseLib - BaseMemoryLib - DebugLib -+ DebugPrintErrorLevelLib - DevicePathLib - MemoryAllocationLib - QemuFwCfgLib -diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c -index 3c12085f6c1e..e473c0b57345 100644 ---- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c -+++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c -@@ -19,6 +19,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -1081,6 +1082,23 @@ QemuKernelLoaderFsDxeEntrypoint ( - - if (KernelBlob->Data == NULL) { - Status = EFI_NOT_FOUND; -+ #if defined (MDE_CPU_AARCH64) -+ // -+ // RHBZ#1844682 -+ // -+ // If the "-kernel" QEMU option is not being used, this platform DXE driver -+ // should return EFI_NOT_FOUND, so that the DXE Core can unload it. -+ // However, the associated error message, logged by the DXE Core to the -+ // serial console, is not desired in the silent edk2-aarch64 build, given -+ // that the absence of "-kernel" is nothing out of the ordinary. Therefore, -+ // return success and stay resident. The wasted guest RAM still gets freed -+ // after ExitBootServices(). -+ // -+ if (GetDebugPrintErrorLevel () == DEBUG_ERROR) { -+ Status = EFI_SUCCESS; -+ } -+ -+ #endif - goto FreeBlobs; - } - --- -2.45.0 - diff --git a/SPECS/edk2/0012-SecurityPkg-Tcg2Dxe-suppress-error-on-no-swtpm-in-si.patch b/SPECS/edk2/0012-SecurityPkg-Tcg2Dxe-suppress-error-on-no-swtpm-in-si.patch deleted file mode 100644 index d7115f2e4d..0000000000 --- a/SPECS/edk2/0012-SecurityPkg-Tcg2Dxe-suppress-error-on-no-swtpm-in-si.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 7cb925d8dad6be9e9b749c7331fe0b0da8fd5e1c Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Wed, 24 Jun 2020 11:40:09 +0200 -Subject: [PATCH 12/17] SecurityPkg/Tcg2Dxe: suppress error on no swtpm in - silent aa64 build (RH) - -Notes about the RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] -> -RHEL-8.5/20210520-e1999b264f1f [edk2-stable202105] rebase: - -- Remove obsolete commit message tags related to downstream patch - management: Message-id, Patchwork-id, O-Subject, Acked-by, From, - RH-Acked-by, RH-Author (RHBZ#1846481). - -Bugzilla: 1844682 - -If swtpm / vTPM2 is not being used, Tcg2Dxe should return EFI_UNSUPPORTED, -so that the DXE Core can unload it. However, the associated error message, -logged by the DXE Core to the serial console, is not desired in the silent -edk2-aarch64 build, given that the absence of swtpm / vTPM2 is nothing out -of the ordinary. Therefore, return success and stay resident. The wasted -guest RAM still gets freed after ExitBootServices(). - -(Inspired by RHEL-8.1.0 commit aaaedc1e2cfd.) - -Signed-off-by: Laszlo Ersek -Signed-off-by: Miroslav Rezanina -(cherry picked from commit cbce29f7749477e271f9764fed82de94724af5df) ---- - SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf | 1 + - SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c | 17 +++++++++++++++++ - 2 files changed, 18 insertions(+) - -diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf -index a645474bf3cd..57795bd8d512 100644 ---- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf -+++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf -@@ -55,6 +55,7 @@ [LibraryClasses] - UefiRuntimeServicesTableLib - BaseMemoryLib - DebugLib -+ DebugPrintErrorLevelLib - Tpm2CommandLib - PrintLib - UefiLib -diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c -index b55b6c12d2c5..4028cd0e1be3 100644 ---- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c -+++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c -@@ -29,6 +29,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent - #include - - #include -+#include - #include - #include - #include -@@ -2743,6 +2744,22 @@ DriverEntry ( - CompareGuid (PcdGetPtr (PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceTpm12Guid)) - { - DEBUG ((DEBUG_INFO, "No TPM2 instance required!\n")); -+#if defined (MDE_CPU_AARCH64) -+ // -+ // RHBZ#1844682 -+ // -+ // If swtpm / vTPM2 is not being used, this driver should return -+ // EFI_UNSUPPORTED, so that the DXE Core can unload it. However, the -+ // associated error message, logged by the DXE Core to the serial console, -+ // is not desired in the silent edk2-aarch64 build, given that the absence -+ // of swtpm / vTPM2 is nothing out of the ordinary. Therefore, return -+ // success and stay resident. The wasted guest RAM still gets freed after -+ // ExitBootServices(). -+ // -+ if (GetDebugPrintErrorLevel () == DEBUG_ERROR) { -+ return EFI_SUCCESS; -+ } -+#endif - return EFI_UNSUPPORTED; - } - --- -2.45.0 - diff --git a/SPECS/edk2/0013-UefiCpuPkg-MpInitLib-fix-apic-mode-for-cpu-hotplug.patch b/SPECS/edk2/0013-UefiCpuPkg-MpInitLib-fix-apic-mode-for-cpu-hotplug.patch deleted file mode 100644 index 3b2286d711..0000000000 --- a/SPECS/edk2/0013-UefiCpuPkg-MpInitLib-fix-apic-mode-for-cpu-hotplug.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 54244041230217e763509c5bc4d8197e81e7f695 Mon Sep 17 00:00:00 2001 -From: Gerd Hoffmann -Date: Tue, 28 Feb 2023 15:47:00 +0100 -Subject: [PATCH 13/17] UefiCpuPkg/MpInitLib: fix apic mode for cpu hotplug - -In case the number of CPUs can in increase beyond 255 -due to CPU hotplug choose x2apic mode. - -Signed-off-by: Gerd Hoffmann ---- - UefiCpuPkg/Library/MpInitLib/MpLib.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c -index d7244565029d..c478878bb0a0 100644 ---- a/UefiCpuPkg/Library/MpInitLib/MpLib.c -+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c -@@ -534,7 +534,9 @@ CollectProcessorCount ( - // - // Enable x2APIC mode if - // 1. Number of CPU is greater than 255; or -- // 2. There are any logical processors reporting an Initial APIC ID of 255 or greater. -+ // 2. The platform exposed the exact *boot* CPU count to us in advance, and -+ // more than 255 logical processors are possible later, with hotplug; or -+ // 3. There are any logical processors reporting an Initial APIC ID of 255 or greater. - // - X2Apic = FALSE; - if (CpuMpData->CpuCount > 255) { -@@ -542,6 +544,10 @@ CollectProcessorCount ( - // If there are more than 255 processor found, force to enable X2APIC - // - X2Apic = TRUE; -+ } else if ((PcdGet32 (PcdCpuBootLogicalProcessorNumber) > 0) && -+ (PcdGet32 (PcdCpuMaxLogicalProcessorNumber) > 255)) -+ { -+ X2Apic = TRUE; - } else { - CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob; - for (Index = 0; Index < CpuMpData->CpuCount; Index++) { --- -2.45.0 - diff --git a/SPECS/edk2/0014-CryptoPkg-CrtLib-add-stat.h.patch b/SPECS/edk2/0014-CryptoPkg-CrtLib-add-stat.h.patch deleted file mode 100644 index e6cad96ba0..0000000000 --- a/SPECS/edk2/0014-CryptoPkg-CrtLib-add-stat.h.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 15df0f549bdf5842c7aef669687dd1d8c11421cf Mon Sep 17 00:00:00 2001 -From: Gerd Hoffmann -Date: Mon, 28 Aug 2023 13:11:02 +0200 -Subject: [PATCH 14/17] CryptoPkg/CrtLib: add stat.h - -needed by rhel downstream openssl patches ---- - CryptoPkg/Library/Include/sys/stat.h | 9 +++++++++ - 1 file changed, 9 insertions(+) - create mode 100644 CryptoPkg/Library/Include/sys/stat.h - -diff --git a/CryptoPkg/Library/Include/sys/stat.h b/CryptoPkg/Library/Include/sys/stat.h -new file mode 100644 -index 000000000000..22247bb2db80 ---- /dev/null -+++ b/CryptoPkg/Library/Include/sys/stat.h -@@ -0,0 +1,9 @@ -+/** @file -+ Include file to support building the third-party cryptographic library. -+ -+Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.
-+SPDX-License-Identifier: BSD-2-Clause-Patent -+ -+**/ -+ -+#include --- -2.45.0 - diff --git a/SPECS/edk2/0015-CryptoPkg-CrtLib-add-access-open-read-write-close-sy.patch b/SPECS/edk2/0015-CryptoPkg-CrtLib-add-access-open-read-write-close-sy.patch deleted file mode 100644 index 4193beee17..0000000000 --- a/SPECS/edk2/0015-CryptoPkg-CrtLib-add-access-open-read-write-close-sy.patch +++ /dev/null @@ -1,138 +0,0 @@ -From 919352ae9d35d222ec2073f03590b6914567daaf Mon Sep 17 00:00:00 2001 -From: Gerd Hoffmann -Date: Mon, 28 Aug 2023 13:27:09 +0200 -Subject: [PATCH 15/17] CryptoPkg/CrtLib: add access/open/read/write/close - syscalls - -needed by rhel downstream openssl patches ---- - CryptoPkg/Library/Include/CrtLibSupport.h | 41 +++++++++++++++++ - .../Library/BaseCryptLib/SysCall/CrtWrapper.c | 46 +++++++++++++++++++ - 2 files changed, 87 insertions(+) - -diff --git a/CryptoPkg/Library/Include/CrtLibSupport.h b/CryptoPkg/Library/Include/CrtLibSupport.h -index f36fe08f0c61..7d98496af80b 100644 ---- a/CryptoPkg/Library/Include/CrtLibSupport.h -+++ b/CryptoPkg/Library/Include/CrtLibSupport.h -@@ -78,6 +78,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent - // - // Definitions for global constants used by CRT library routines - // -+#define EINTR 4 - #define EINVAL 22 /* Invalid argument */ - #define EAFNOSUPPORT 47 /* Address family not supported by protocol family */ - #define INT_MAX 0x7FFFFFFF /* Maximum (signed) int value */ -@@ -102,6 +103,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent - #define NS_INADDRSZ 4 /*%< IPv4 T_A */ - #define NS_IN6ADDRSZ 16 /*%< IPv6 T_AAAA */ - -+#define O_RDONLY 00000000 -+#define O_WRONLY 00000001 -+#define O_RDWR 00000002 -+ -+#define R_OK 4 -+#define W_OK 2 -+#define X_OK 1 -+#define F_OK 0 -+ - // - // Basic types mapping - // -@@ -324,6 +334,37 @@ fprintf ( - ... - ); - -+int -+access( -+ const char*, -+ int -+ ); -+ -+int -+open ( -+ const char *, -+ int -+ ); -+ -+ssize_t -+read ( -+ int, -+ void*, -+ size_t -+ ); -+ -+ssize_t -+write ( -+ int, -+ const void*, -+ size_t -+ ); -+ -+int -+close ( -+ int -+ ); -+ - time_t - time ( - time_t * -diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c b/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c -index 37cdecc9bd1d..dfdb63553667 100644 ---- a/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c -+++ b/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c -@@ -550,6 +550,52 @@ fread ( - return 0; - } - -+int -+access( -+ const char*, -+ int -+ ) -+{ -+ return -1; -+} -+ -+int -+open ( -+ const char *, -+ int -+ ) -+{ -+ return -1; -+} -+ -+ssize_t -+read ( -+ int, -+ void*, -+ size_t -+ ) -+{ -+ return -1; -+} -+ -+ssize_t -+write ( -+ int, -+ const void*, -+ size_t -+ ) -+{ -+ return -1; -+} -+ -+int -+close ( -+ int -+ ) -+{ -+ return -1; -+} -+ - uid_t - getuid ( - void --- -2.45.0 - diff --git a/SPECS/edk2/0016-OvmfPkg-set-PcdVariableStoreSize-PcdMaxVolatileVaria.patch b/SPECS/edk2/0016-OvmfPkg-set-PcdVariableStoreSize-PcdMaxVolatileVaria.patch deleted file mode 100644 index b7b404d780..0000000000 --- a/SPECS/edk2/0016-OvmfPkg-set-PcdVariableStoreSize-PcdMaxVolatileVaria.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 1fb97b6dfd4538216a118b5f303048c6c2686553 Mon Sep 17 00:00:00 2001 -From: Gerd Hoffmann -Date: Mon, 25 Sep 2023 09:48:46 +0200 -Subject: [PATCH 16/17] OvmfPkg: set PcdVariableStoreSize + - PcdMaxVolatileVariableSize unconditionally - -Signed-off-by: Gerd Hoffmann ---- - OvmfPkg/OvmfPkgIa32.dsc | 10 ---------- - OvmfPkg/OvmfPkgIa32X64.dsc | 10 ---------- - OvmfPkg/OvmfPkgX64.dsc | 10 ---------- - 3 files changed, 30 deletions(-) - -diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc -index 9371b3a5e917..2d8669c759d7 100644 ---- a/OvmfPkg/OvmfPkgIa32.dsc -+++ b/OvmfPkg/OvmfPkgIa32.dsc -@@ -492,23 +492,13 @@ [PcdsFixedAtBuild] - !if ($(FD_SIZE_IN_KB) == 1024) || ($(FD_SIZE_IN_KB) == 2048) - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x2000 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x2800 --!if $(NETWORK_TLS_ENABLE) == FALSE -- # match PcdFlashNvStorageVariableSize purely for convenience -- gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0xe000 --!endif - !endif - !if $(FD_SIZE_IN_KB) == 4096 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x8400 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x8400 --!if $(NETWORK_TLS_ENABLE) == FALSE -- # match PcdFlashNvStorageVariableSize purely for convenience -- gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x40000 - !endif --!endif --!if $(NETWORK_TLS_ENABLE) == TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x80000 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVolatileVariableSize|0x40000 --!endif - - gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0 - gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|FALSE -diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc -index 483bcc69966d..0ee075a23d7b 100644 ---- a/OvmfPkg/OvmfPkgIa32X64.dsc -+++ b/OvmfPkg/OvmfPkgIa32X64.dsc -@@ -499,23 +499,13 @@ [PcdsFixedAtBuild] - !if ($(FD_SIZE_IN_KB) == 1024) || ($(FD_SIZE_IN_KB) == 2048) - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x2000 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x2800 --!if $(NETWORK_TLS_ENABLE) == FALSE -- # match PcdFlashNvStorageVariableSize purely for convenience -- gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0xe000 --!endif - !endif - !if $(FD_SIZE_IN_KB) == 4096 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x8400 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x8400 --!if $(NETWORK_TLS_ENABLE) == FALSE -- # match PcdFlashNvStorageVariableSize purely for convenience -- gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x40000 - !endif --!endif --!if $(NETWORK_TLS_ENABLE) == TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x80000 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVolatileVariableSize|0x40000 --!endif - - gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0 - gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|FALSE -diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc -index 9e243c5c086b..9bd223a880d5 100644 ---- a/OvmfPkg/OvmfPkgX64.dsc -+++ b/OvmfPkg/OvmfPkgX64.dsc -@@ -518,23 +518,13 @@ [PcdsFixedAtBuild] - !if ($(FD_SIZE_IN_KB) == 1024) || ($(FD_SIZE_IN_KB) == 2048) - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x2000 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x2800 --!if $(NETWORK_TLS_ENABLE) == FALSE -- # match PcdFlashNvStorageVariableSize purely for convenience -- gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0xe000 --!endif - !endif - !if $(FD_SIZE_IN_KB) == 4096 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x8400 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x8400 --!if $(NETWORK_TLS_ENABLE) == FALSE -- # match PcdFlashNvStorageVariableSize purely for convenience -- gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x40000 - !endif --!endif --!if $(NETWORK_TLS_ENABLE) == TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x80000 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVolatileVariableSize|0x40000 --!endif - - gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0 - gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|FALSE --- -2.45.0 - diff --git a/SPECS/edk2/0017-silence-.-has-a-LOAD-segment-with-RWX-permissions-wa.patch b/SPECS/edk2/0017-silence-.-has-a-LOAD-segment-with-RWX-permissions-wa.patch deleted file mode 100644 index 43bb319c9b..0000000000 --- a/SPECS/edk2/0017-silence-.-has-a-LOAD-segment-with-RWX-permissions-wa.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 7abc0fa61b35a7ac6335175451c429f04671e02e Mon Sep 17 00:00:00 2001 -From: Gerd Hoffmann -Date: Mon, 27 Nov 2023 11:04:08 +0100 -Subject: [PATCH 17/17] silence '... has a LOAD segment with RWX permissions' - warning - ---- - BaseTools/Conf/tools_def.template | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template -index c34ecfd557c5..53ac3baa6be3 100755 ---- a/BaseTools/Conf/tools_def.template -+++ b/BaseTools/Conf/tools_def.template -@@ -747,7 +747,7 @@ DEFINE GCC_AARCH64_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -mlittle-endian -fno- - DEFINE GCC_AARCH64_CC_XIPFLAGS = -mstrict-align -mgeneral-regs-only - DEFINE GCC_RISCV64_CC_XIPFLAGS = -mstrict-align -mgeneral-regs-only - DEFINE GCC_DLINK_FLAGS_COMMON = -nostdlib --pie --DEFINE GCC_DLINK2_FLAGS_COMMON = -Wl,--script=$(EDK_TOOLS_PATH)/Scripts/GccBase.lds -+DEFINE GCC_DLINK2_FLAGS_COMMON = -Wl,--script=$(EDK_TOOLS_PATH)/Scripts/GccBase.lds -Wl,--no-warn-rwx-segments - DEFINE GCC_IA32_X64_DLINK_COMMON = DEF(GCC_DLINK_FLAGS_COMMON) --gc-sections - DEFINE GCC_ARM_AARCH64_DLINK_COMMON= -Wl,--emit-relocs -nostdlib -Wl,--gc-sections -u $(IMAGE_ENTRY_POINT) -Wl,-e,$(IMAGE_ENTRY_POINT),-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map - DEFINE GCC_LOONGARCH64_DLINK_COMMON= -Wl,--emit-relocs -nostdlib -Wl,--gc-sections -u $(IMAGE_ENTRY_POINT) -Wl,-e,$(IMAGE_ENTRY_POINT),-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map --- -2.45.0 - diff --git a/SPECS/edk2/0018-NetworkPkg-TcpDxe-Fixed-system-stuck-on-PXE-boot-flo.patch b/SPECS/edk2/0018-NetworkPkg-TcpDxe-Fixed-system-stuck-on-PXE-boot-flo.patch deleted file mode 100644 index 49c9b2c0ef..0000000000 --- a/SPECS/edk2/0018-NetworkPkg-TcpDxe-Fixed-system-stuck-on-PXE-boot-flo.patch +++ /dev/null @@ -1,57 +0,0 @@ -From be52b5be73ab0a5e0cd37272a6f8f768a3395ffc Mon Sep 17 00:00:00 2001 -From: Sam -Date: Wed, 29 May 2024 07:46:03 +0800 -Subject: [PATCH 18/18] NetworkPkg TcpDxe: Fixed system stuck on PXE boot flow - in iPXE environment -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This bug fix is based on the following commit "NetworkPkg TcpDxe: SECURITY PATCH" -REF: 1904a64 - -Issue Description: -An "Invalid handle" error was detected during runtime when attempting to destroy a child instance of the hashing protocol. The problematic code segment was: - -NetworkPkg\TcpDxe\TcpDriver.c -Status = Hash2ServiceBinding->DestroyChild(Hash2ServiceBinding, ​&mHash2ServiceHandle); - -Root Cause Analysis: -The root cause of the error was the passing of an incorrect parameter type, a pointer to an EFI_HANDLE instead of an EFI_HANDLE itself, to the DestroyChild function. This mismatch resulted in the function receiving an invalid handle. - -Implemented Solution: -To resolve this issue, the function call was corrected to pass mHash2ServiceHandle directly: - -NetworkPkg\TcpDxe\TcpDriver.c -Status = Hash2ServiceBinding->DestroyChild(Hash2ServiceBinding, mHash2ServiceHandle); - -This modification ensures the correct handle type is used, effectively rectifying the "Invalid handle" error. - -Verification: -Testing has been conducted, confirming the efficacy of the fix. Additionally, the BIOS can boot into the OS in an iPXE environment. - -Cc: Doug Flick [MSFT] - -Signed-off-by: Sam Tsai [Wiwynn] -Reviewed-by: Saloni Kasbekar -(cherry picked from commit ced13b93afea87a8a1fe6ddbb67240a84cb2e3d3) ---- - NetworkPkg/TcpDxe/TcpDriver.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/NetworkPkg/TcpDxe/TcpDriver.c b/NetworkPkg/TcpDxe/TcpDriver.c -index 40bba4080c87..c6e7c0df540a 100644 ---- a/NetworkPkg/TcpDxe/TcpDriver.c -+++ b/NetworkPkg/TcpDxe/TcpDriver.c -@@ -509,7 +509,7 @@ TcpDestroyService ( - // - // Destroy the instance of the hashing protocol for this controller. - // -- Status = Hash2ServiceBinding->DestroyChild (Hash2ServiceBinding, &mHash2ServiceHandle); -+ Status = Hash2ServiceBinding->DestroyChild (Hash2ServiceBinding, mHash2ServiceHandle); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } --- -2.45.1 - diff --git a/SPECS/edk2/0019-NetworkPkg-DxeNetLib-adjust-PseudoRandom-error-loggi.patch b/SPECS/edk2/0019-NetworkPkg-DxeNetLib-adjust-PseudoRandom-error-loggi.patch deleted file mode 100644 index 9bc704c1c6..0000000000 --- a/SPECS/edk2/0019-NetworkPkg-DxeNetLib-adjust-PseudoRandom-error-loggi.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 820bf9f58bd8bd88a45f8355ffea8e8ac4890328 Mon Sep 17 00:00:00 2001 -From: Gerd Hoffmann -Date: Wed, 19 Jun 2024 09:07:56 +0200 -Subject: [PATCH 19/19] NetworkPkg/DxeNetLib: adjust PseudoRandom error logging - -There is a list of allowed rng algorithms, if /one/ of them is not -supported this is not a problem, only /all/ of them failing is an -error condition. - -Downgrade the message for a single unsupported algorithm from ERROR to -VERBOSE. Add an error message in case we finish the loop without -finding a supported algorithm. - -Signed-off-by: Gerd Hoffmann -(cherry picked from commit 6862b9d538d96363635677198899e1669e591259) ---- - NetworkPkg/Library/DxeNetLib/DxeNetLib.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c -index 01c13c08d203..4dfbe91a5554 100644 ---- a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c -+++ b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c -@@ -951,7 +951,7 @@ PseudoRandom ( - // - // Secure Algorithm was not supported on this platform - // -- DEBUG ((DEBUG_ERROR, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); -+ DEBUG ((DEBUG_VERBOSE, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); - - // - // Try the next secure algorithm -@@ -971,6 +971,7 @@ PseudoRandom ( - // If we get here, we failed to generate random data using any secure algorithm - // Platform owner should ensure that at least one secure algorithm is supported - // -+ DEBUG ((DEBUG_ERROR, "Failed to generate random data, no supported secure algorithm found\n")); - ASSERT_EFI_ERROR (Status); - return Status; - } --- -2.45.2 - diff --git a/SPECS/edk2/30-edk2-ovmf-4m-qcow2-x64-sb-enrolled.json b/SPECS/edk2/30-edk2-ovmf-4m-qcow2-x64-sb-enrolled.json deleted file mode 100644 index e709223313..0000000000 --- a/SPECS/edk2/30-edk2-ovmf-4m-qcow2-x64-sb-enrolled.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "OVMF with SB+SMM, SB enabled, MS certs enrolled", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/ovmf/OVMF_CODE_4M.secboot.qcow2", - "format": "qcow2" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf/OVMF_VARS_4M.secboot.qcow2", - "format": "qcow2" - } - }, - "targets": [ - { - "architecture": "x86_64", - "machines": [ - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "enrolled-keys", - "requires-smm", - "secure-boot", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/30-edk2-ovmf-ia32-sb-enrolled.json b/SPECS/edk2/30-edk2-ovmf-ia32-sb-enrolled.json deleted file mode 100644 index 33f970d0a6..0000000000 --- a/SPECS/edk2/30-edk2-ovmf-ia32-sb-enrolled.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "OVMF for i386, with SB+SMM, SB enabled, MS certs enrolled", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_CODE.secboot.fd", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_VARS.secboot.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "i386", - "machines": [ - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "enrolled-keys", - "requires-smm", - "secure-boot", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/31-edk2-ovmf-2m-raw-x64-sb-enrolled.json b/SPECS/edk2/31-edk2-ovmf-2m-raw-x64-sb-enrolled.json deleted file mode 100644 index 2ed45362c4..0000000000 --- a/SPECS/edk2/31-edk2-ovmf-2m-raw-x64-sb-enrolled.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "OVMF with SB+SMM, SB enabled, MS certs enrolled", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf/OVMF_VARS.secboot.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "x86_64", - "machines": [ - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "enrolled-keys", - "requires-smm", - "secure-boot", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/40-edk2-ovmf-4m-qcow2-x64-sb.json b/SPECS/edk2/40-edk2-ovmf-4m-qcow2-x64-sb.json deleted file mode 100644 index 655dd42ef1..0000000000 --- a/SPECS/edk2/40-edk2-ovmf-4m-qcow2-x64-sb.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "description": "OVMF with SB+SMM, empty varstore", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/ovmf/OVMF_CODE_4M.secboot.qcow2", - "format": "qcow2" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf/OVMF_VARS_4M.qcow2", - "format": "qcow2" - } - }, - "targets": [ - { - "architecture": "x86_64", - "machines": [ - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "requires-smm", - "secure-boot", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/40-edk2-ovmf-ia32-sb.json b/SPECS/edk2/40-edk2-ovmf-ia32-sb.json deleted file mode 100644 index 1e80e588ac..0000000000 --- a/SPECS/edk2/40-edk2-ovmf-ia32-sb.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "description": "OVMF for i386, with SB+SMM, empty varstore", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_CODE.secboot.fd", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_VARS.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "i386", - "machines": [ - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "requires-smm", - "secure-boot", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/41-edk2-ovmf-2m-raw-x64-sb.json b/SPECS/edk2/41-edk2-ovmf-2m-raw-x64-sb.json deleted file mode 100644 index 06b3ece89a..0000000000 --- a/SPECS/edk2/41-edk2-ovmf-2m-raw-x64-sb.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "description": "OVMF with SB+SMM, empty varstore", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf/OVMF_VARS.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "x86_64", - "machines": [ - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "requires-smm", - "secure-boot", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/50-edk2-aarch64-qcow2.json b/SPECS/edk2/50-edk2-aarch64-qcow2.json deleted file mode 100644 index 79f64a11a3..0000000000 --- a/SPECS/edk2/50-edk2-aarch64-qcow2.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "description": "UEFI firmware for ARM64 virtual machines", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.qcow2", - "format": "qcow2" - }, - "nvram-template": { - "filename": "/usr/share/edk2/aarch64/vars-template-pflash.qcow2", - "format": "qcow2" - } - }, - "targets": [ - { - "architecture": "aarch64", - "machines": [ - "virt-*" - ] - } - ], - "features": [ - - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/50-edk2-arm-verbose.json b/SPECS/edk2/50-edk2-arm-verbose.json deleted file mode 100644 index 52f9c2ce00..0000000000 --- a/SPECS/edk2/50-edk2-arm-verbose.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "description": "UEFI firmware for arm, verbose logs", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/arm/QEMU_EFI-pflash.raw", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/arm/vars-template-pflash.raw", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "arm", - "machines": [ - "virt-*" - ] - } - ], - "features": [ - "verbose-static" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/50-edk2-loongarch64.json b/SPECS/edk2/50-edk2-loongarch64.json deleted file mode 100644 index c5a7ec5f7b..0000000000 --- a/SPECS/edk2/50-edk2-loongarch64.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode": "split", - "executable": { - "filename": "/usr/share/edk2/loongarch64/QEMU_EFI.fd", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/loongarch64/QEMU_VARS.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "loongarch64", - "machines": [ - "virt", - "virt-*" - ] - } - ], - "features": [ - ] -} diff --git a/SPECS/edk2/50-edk2-ovmf-4m-qcow2-x64-nosb.json b/SPECS/edk2/50-edk2-ovmf-4m-qcow2-x64-nosb.json deleted file mode 100644 index d64735f477..0000000000 --- a/SPECS/edk2/50-edk2-ovmf-4m-qcow2-x64-nosb.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "OVMF without SB+SMM, empty varstore", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/ovmf/OVMF_CODE_4M.qcow2", - "format": "qcow2" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf/OVMF_VARS_4M.qcow2", - "format": "qcow2" - } - }, - "targets": [ - { - "architecture": "x86_64", - "machines": [ - "pc-i440fx-*", - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "amd-sev", - "amd-sev-es", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/50-edk2-ovmf-ia32-nosb.json b/SPECS/edk2/50-edk2-ovmf-ia32-nosb.json deleted file mode 100644 index 544f824ced..0000000000 --- a/SPECS/edk2/50-edk2-ovmf-ia32-nosb.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "description": "OVMF for i386, without SB+SMM, empty varstore", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_CODE.fd", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_VARS.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "i386", - "machines": [ - "pc-i440fx-*", - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/50-edk2-ovmf-x64-microvm.json b/SPECS/edk2/50-edk2-ovmf-x64-microvm.json deleted file mode 100644 index 3d5b393949..0000000000 --- a/SPECS/edk2/50-edk2-ovmf-x64-microvm.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "description": "OVMF for microvm", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "memory", - "filename": "/usr/share/edk2/ovmf/MICROVM.fd" - }, - "targets": [ - { - "architecture": "x86_64", - "machines": [ - "microvm" - ] - } - ], - "features": [ - ], - "tags": [ - ] -} diff --git a/SPECS/edk2/50-edk2-riscv-qcow2.json b/SPECS/edk2/50-edk2-riscv-qcow2.json deleted file mode 100644 index eb1930da49..0000000000 --- a/SPECS/edk2/50-edk2-riscv-qcow2.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "description": "UEFI firmware for RISC-V virtual machines", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/riscv/RISCV_VIRT_CODE.qcow2", - "format": "qcow2" - }, - "nvram-template": { - "filename": "/usr/share/edk2/riscv/RISCV_VIRT_VARS.qcow2", - "format": "qcow2" - } - }, - "targets": [ - { - "architecture": "riscv64", - "machines": [ - "virt", - "virt-*" - ] - } - ], - "features": [ - - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/51-edk2-aarch64-raw.json b/SPECS/edk2/51-edk2-aarch64-raw.json deleted file mode 100644 index cabbd396ea..0000000000 --- a/SPECS/edk2/51-edk2-aarch64-raw.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "description": "UEFI firmware for ARM64 virtual machines", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/aarch64/vars-template-pflash.raw", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "aarch64", - "machines": [ - "virt-*" - ] - } - ], - "features": [ - - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/51-edk2-ovmf-2m-raw-x64-nosb.json b/SPECS/edk2/51-edk2-ovmf-2m-raw-x64-nosb.json deleted file mode 100644 index 050853e2b8..0000000000 --- a/SPECS/edk2/51-edk2-ovmf-2m-raw-x64-nosb.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "OVMF without SB+SMM, empty varstore", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/ovmf/OVMF_CODE.fd", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf/OVMF_VARS.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "x86_64", - "machines": [ - "pc-i440fx-*", - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "amd-sev", - "amd-sev-es", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/52-edk2-aarch64-verbose-qcow2.json b/SPECS/edk2/52-edk2-aarch64-verbose-qcow2.json deleted file mode 100644 index 4173102967..0000000000 --- a/SPECS/edk2/52-edk2-aarch64-verbose-qcow2.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "description": "UEFI firmware for ARM64 virtual machines, verbose logs", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/aarch64/QEMU_EFI-pflash.qcow2", - "format": "qcow2" - }, - "nvram-template": { - "filename": "/usr/share/edk2/aarch64/vars-template-pflash.qcow2", - "format": "qcow2" - } - }, - "targets": [ - { - "architecture": "aarch64", - "machines": [ - "virt-*" - ] - } - ], - "features": [ - "verbose-static" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/53-edk2-aarch64-verbose-raw.json b/SPECS/edk2/53-edk2-aarch64-verbose-raw.json deleted file mode 100644 index ec69d19858..0000000000 --- a/SPECS/edk2/53-edk2-aarch64-verbose-raw.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "description": "UEFI firmware for ARM64 virtual machines, verbose logs", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode" : "split", - "executable": { - "filename": "/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/aarch64/vars-template-pflash.raw", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "aarch64", - "machines": [ - "virt-*" - ] - } - ], - "features": [ - "verbose-static" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/60-edk2-ovmf-x64-amdsev.json b/SPECS/edk2/60-edk2-ovmf-x64-amdsev.json deleted file mode 100644 index 9a561bc7eb..0000000000 --- a/SPECS/edk2/60-edk2-ovmf-x64-amdsev.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "description": "OVMF with SEV-ES support", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "mode": "stateless", - "executable": { - "filename": "/usr/share/edk2/ovmf/OVMF.amdsev.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "x86_64", - "machines": [ - "pc-q35-*" - ] - } - ], - "features": [ - "amd-sev", - "amd-sev-es", - "amd-sev-snp", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/60-edk2-ovmf-x64-inteltdx.json b/SPECS/edk2/60-edk2-ovmf-x64-inteltdx.json deleted file mode 100644 index 445eb70e03..0000000000 --- a/SPECS/edk2/60-edk2-ovmf-x64-inteltdx.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "description": "OVMF with TDX support", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "memory", - "filename": "/usr/share/edk2/ovmf/OVMF.inteltdx.secboot.fd" - }, - "targets": [ - { - "architecture": "x86_64", - "machines": [ - "pc-q35-*" - ] - } - ], - "features": [ - "enrolled-keys", - "intel-tdx", - "secure-boot", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/SPECS/edk2/CVE-2022-3996.patch b/SPECS/edk2/CVE-2022-3996.patch deleted file mode 100644 index 46339f9195..0000000000 --- a/SPECS/edk2/CVE-2022-3996.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 7725e7bfe6f2ce8146b6552b44e0d226be7638e7 Mon Sep 17 00:00:00 2001 -From: Pauli -Date: Fri, 11 Nov 2022 09:40:19 +1100 -Subject: [PATCH] x509: fix double locking problem - -This reverts commit 9aa4be691f5c73eb3c68606d824c104550c053f7 and removed the -redundant flag setting. - -Fixes #19643 - -Fixes LOW CVE-2022-3996 - -Reviewed-by: Dmitry Belyavskiy -Reviewed-by: Tomas Mraz -(Merged from https://github.com/openssl/openssl/pull/19652) - -(cherry picked from commit 4d0340a6d2f327700a059f0b8f954d6160f8eef5) ---- - CryptoPkg/Library/OpensslLib/openssl/crypto/x509/pcy_map.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/CryptoPkg/Library/OpensslLib/openssl/crypto/x509/pcy_map.c b/CryptoPkg/Library/OpensslLib/openssl/crypto/x509/pcy_map.c -index 05406c6493fce..60dfd1e3203b0 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/crypto/x509/pcy_map.c -+++ b/CryptoPkg/Library/OpensslLib/openssl/crypto/x509/pcy_map.c -@@ -73,10 +73,6 @@ int ossl_policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps) - - ret = 1; - bad_mapping: -- if (ret == -1 && CRYPTO_THREAD_write_lock(x->lock)) { -- x->ex_flags |= EXFLAG_INVALID_POLICY; -- CRYPTO_THREAD_unlock(x->lock); -- } - sk_POLICY_MAPPING_pop_free(maps, POLICY_MAPPING_free); - return ret; - diff --git a/SPECS/edk2/CVE-2024-13176.patch b/SPECS/edk2/CVE-2024-13176.patch deleted file mode 100644 index 2c218aa4ef..0000000000 --- a/SPECS/edk2/CVE-2024-13176.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 07272b05b04836a762b4baa874958af51d513844 Mon Sep 17 00:00:00 2001 -From: Tomas Mraz -Date: Wed, 15 Jan 2025 18:27:02 +0100 -Subject: [PATCH] Fix timing side-channel in ECDSA signature computation - -There is a timing signal of around 300 nanoseconds when the top word of -the inverted ECDSA nonce value is zero. This can happen with significant -probability only for some of the supported elliptic curves. In particular -the NIST P-521 curve is affected. To be able to measure this leak, the -attacker process must either be located in the same physical computer or -must have a very fast network connection with low latency. - -Attacks on ECDSA nonce are also known as Minerva attack. - -Fixes CVE-2024-13176 - -Reviewed-by: Tim Hudson -Reviewed-by: Neil Horman -Reviewed-by: Paul Dale -(Merged from https://github.com/openssl/openssl/pull/26429) - -(cherry picked from commit 63c40a66c5dc287485705d06122d3a6e74a6a203) ---- - CryptoPkg/Library/OpensslLib/openssl/crypto/bn/bn_exp.c | 21 +++++++++++++++------ - CryptoPkg/Library/OpensslLib/openssl/crypto/ec/ec_lib.c | 7 ++++--- - include/CryptoPkg/Library/OpensslLib/openssl/crypto/bn.h | 3 +++ - 3 files changed, 22 insertions(+), 9 deletions(-) - -diff --git a/CryptoPkg/Library/OpensslLib/openssl/crypto/bn/bn_exp.c b/CryptoPkg/Library/OpensslLib/openssl/crypto/bn/bn_exp.c -index 598a592ca1397..d84c7de18a6b6 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/crypto/bn/bn_exp.c -+++ b/CryptoPkg/Library/OpensslLib/openssl/crypto/bn/bn_exp.c -@@ -606,7 +606,7 @@ static int MOD_EXP_CTIME_COPY_FROM_PREBUF(BIGNUM *b, int top, - * out by Colin Percival, - * http://www.daemonology.net/hyperthreading-considered-harmful/) - */ --int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, -+int bn_mod_exp_mont_fixed_top(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx, - BN_MONT_CTX *in_mont) - { -@@ -623,10 +623,6 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, - unsigned int t4 = 0; - #endif - -- bn_check_top(a); -- bn_check_top(p); -- bn_check_top(m); -- - if (!BN_is_odd(m)) { - ERR_raise(ERR_LIB_BN, BN_R_CALLED_WITH_EVEN_MODULUS); - return 0; -@@ -1146,7 +1142,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, - goto err; - } else - #endif -- if (!BN_from_montgomery(rr, &tmp, mont, ctx)) -+ if (!bn_from_mont_fixed_top(rr, &tmp, mont, ctx)) - goto err; - ret = 1; - err: -@@ -1160,6 +1156,19 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, - return ret; - } - -+int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, -+ const BIGNUM *m, BN_CTX *ctx, -+ BN_MONT_CTX *in_mont) -+{ -+ bn_check_top(a); -+ bn_check_top(p); -+ bn_check_top(m); -+ if (!bn_mod_exp_mont_fixed_top(rr, a, p, m, ctx, in_mont)) -+ return 0; -+ bn_correct_top(rr); -+ return 1; -+} -+ - int BN_mod_exp_mont_word(BIGNUM *rr, BN_ULONG a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont) - { -diff --git a/CryptoPkg/Library/OpensslLib/openssl/crypto/ec/ec_lib.c b/CryptoPkg/Library/OpensslLib/openssl/crypto/ec/ec_lib.c -index b1696d93bd6dd..1f0bf1ec795fa 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/crypto/ec/ec_lib.c -+++ b/CryptoPkg/Library/OpensslLib/openssl/crypto/ec/ec_lib.c -@@ -20,6 +20,7 @@ - #include - #include - #include "crypto/ec.h" -+#include "crypto/bn.h" - #include "internal/nelem.h" - #include "ec_local.h" - -@@ -1262,10 +1263,10 @@ static int ec_field_inverse_mod_ord(const EC_GROUP *group, BIGNUM *r, - if (!BN_sub(e, group->order, e)) - goto err; - /*- -- * Exponent e is public. -- * No need for scatter-gather or BN_FLG_CONSTTIME. -+ * Although the exponent is public we want the result to be -+ * fixed top. - */ -- if (!BN_mod_exp_mont(r, x, e, group->order, ctx, group->mont_data)) -+ if (!bn_mod_exp_mont_fixed_top(r, x, e, group->order, ctx, group->mont_data)) - goto err; - - ret = 1; -diff --git a/CryptoPkg/Library/OpensslLib/openssl/include/crypto/bn.h b/include/CryptoPkg/Library/OpensslLib/openssl/crypto/bn.h -index c5f328156d3a9..59a629b9f6288 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/include/crypto/bn.h -+++ b/CryptoPkg/Library/OpensslLib/openssl/include/crypto/bn.h -@@ -73,6 +73,9 @@ int bn_set_words(BIGNUM *a, const BN_ULONG *words, int num_words); - */ - int bn_mul_mont_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, - BN_MONT_CTX *mont, BN_CTX *ctx); -+int bn_mod_exp_mont_fixed_top(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, -+ const BIGNUM *m, BN_CTX *ctx, -+ BN_MONT_CTX *in_mont); - int bn_to_mont_fixed_top(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, - BN_CTX *ctx); - int bn_from_mont_fixed_top(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, diff --git a/SPECS/edk2/CVE-2024-2511.patch b/SPECS/edk2/CVE-2024-2511.patch deleted file mode 100644 index c7f036c39d..0000000000 --- a/SPECS/edk2/CVE-2024-2511.patch +++ /dev/null @@ -1,95 +0,0 @@ -From dfa811c4173d0b520de4cfb0e7794781ad41289a Mon Sep 17 00:00:00 2001 -From: Archana Choudhary -Date: Tue, 29 Apr 2025 09:04:40 +0000 -Subject: [PATCH] Patch for CVE-2024-2511 - -Ported from https://github.com/openssl/openssl/commit/b52867a9f618bb955bed2a3ce3db4d4f97ed8e5d ---- - .../Library/OpensslLib/openssl/ssl/ssl_lib.c | 5 ++-- - .../Library/OpensslLib/openssl/ssl/ssl_sess.c | 28 +++++++++++++++---- - .../openssl/ssl/statem/statem_srvr.c | 5 ++-- - 3 files changed, 27 insertions(+), 11 deletions(-) - -diff --git a/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_lib.c b/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_lib.c -index 99ce450..158b550 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_lib.c -+++ b/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_lib.c -@@ -3717,9 +3717,10 @@ void ssl_update_cache(SSL *s, int mode) - - /* - * If the session_id_length is 0, we are not supposed to cache it, and it -- * would be rather hard to do anyway :-) -+ * would be rather hard to do anyway :-). Also if the session has already -+ * been marked as not_resumable we should not cache it for later reuse. - */ -- if (s->session->session_id_length == 0) -+ if (s->session->session_id_length == 0 || s->session->not_resumable) - return; - - /* -diff --git a/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_sess.c b/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_sess.c -index 68b57a5..c1c7837 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_sess.c -+++ b/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_sess.c -@@ -152,16 +152,11 @@ SSL_SESSION *SSL_SESSION_new(void) - return ss; - } - --SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src) --{ -- return ssl_session_dup(src, 1); --} -- - /* - * Create a new SSL_SESSION and duplicate the contents of |src| into it. If - * ticket == 0 then no ticket information is duplicated, otherwise it is. - */ --SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket) -+static SSL_SESSION *ssl_session_dup_intern(const SSL_SESSION *src, int ticket) - { - SSL_SESSION *dest; - -@@ -281,6 +276,27 @@ SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket) - return NULL; - } - -+SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src) -+{ -+ return ssl_session_dup_intern(src, 1); -+} -+ -+/* -+ * Used internally when duplicating a session which might be already shared. -+ * We will have resumed the original session. Subsequently we might have marked -+ * it as non-resumable (e.g. in another thread) - but this copy should be ok to -+ * resume from. -+ */ -+SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket) -+{ -+ SSL_SESSION *sess = ssl_session_dup_intern(src, ticket); -+ -+ if (sess != NULL) -+ sess->not_resumable = 0; -+ -+ return sess; -+} -+ - const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, unsigned int *len) - { - if (len) -diff --git a/CryptoPkg/Library/OpensslLib/openssl/ssl/statem/statem_srvr.c b/CryptoPkg/Library/OpensslLib/openssl/ssl/statem/statem_srvr.c -index a9e67f9..6c942e6 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/ssl/statem/statem_srvr.c -+++ b/CryptoPkg/Library/OpensslLib/openssl/ssl/statem/statem_srvr.c -@@ -2338,9 +2338,8 @@ int tls_construct_server_hello(SSL *s, WPACKET *pkt) - * so the following won't overwrite an ID that we're supposed - * to send back. - */ -- if (s->session->not_resumable || -- (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER) -- && !s->hit)) -+ if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER) -+ && !s->hit) - s->session->session_id_length = 0; - - if (usetls13) { diff --git a/SPECS/edk2/CVE-2024-38796.patch b/SPECS/edk2/CVE-2024-38796.patch deleted file mode 100644 index 59aa80a6b6..0000000000 --- a/SPECS/edk2/CVE-2024-38796.patch +++ /dev/null @@ -1,26 +0,0 @@ -From a6d8206a22d70dc5e6d7ac8aae8e69b80ace7e61 Mon Sep 17 00:00:00 2001 -From: jykanase -Date: Wed, 2 Apr 2025 05:23:55 +0000 -Subject: [PATCH] CVE-2024-38796 - -Upstream patch reference: https://github.com/tianocore/edk2/commit/c95233b8525ca6828921affd1496146cff262e65 ---- - MdePkg/Library/BasePeCoffLib/BasePeCoff.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c -index 86ff2e7..128090d 100644 ---- a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c -+++ b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c -@@ -1054,7 +1054,7 @@ PeCoffLoaderRelocateImage ( - RelocDir = &Hdr.Te->DataDirectory[0]; - } - -- if ((RelocDir != NULL) && (RelocDir->Size > 0)) { -+ if ((RelocDir != NULL) && (RelocDir->Size > 0) && (RelocDir->Size - 1 < MAX_UINT32 - RelocDir->VirtualAddress)) { - RelocBase = (EFI_IMAGE_BASE_RELOCATION *)PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress, TeStrippedOffset); - RelocBaseEnd = (EFI_IMAGE_BASE_RELOCATION *)PeCoffLoaderImageAddress ( - ImageContext, --- -2.45.2 - diff --git a/SPECS/edk2/CVE-2024-4603.patch b/SPECS/edk2/CVE-2024-4603.patch deleted file mode 100644 index 7c3ee34ade..0000000000 --- a/SPECS/edk2/CVE-2024-4603.patch +++ /dev/null @@ -1,125 +0,0 @@ -From d2bbe37ccf8857197a4b6c36fc0381ab58bb8b09 Mon Sep 17 00:00:00 2001 -From: Archana Choudhary -Date: Tue, 29 Apr 2025 09:12:17 +0000 -Subject: [PATCH] Fix for CVE-2024-4603 - -Ported from https://github.com/openssl/openssl/commit/3559e868e58005d15c6013a0c1fd832e51c73397 ---- - .../Library/OpensslLib/openssl/CHANGES.md | 17 +++++++ - .../OpensslLib/openssl/crypto/dsa/dsa_check.c | 45 +++++++++++++++++-- - 2 files changed, 58 insertions(+), 4 deletions(-) - -diff --git a/CryptoPkg/Library/OpensslLib/openssl/CHANGES.md b/CryptoPkg/Library/OpensslLib/openssl/CHANGES.md -index 84933a8..34a2e7f 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/CHANGES.md -+++ b/CryptoPkg/Library/OpensslLib/openssl/CHANGES.md -@@ -30,6 +30,23 @@ breaking changes, and mappings for the large list of deprecated functions. - - ### Changes between 3.0.6 and 3.0.7 [1 Nov 2022] - -+ * Fixed an issue where checking excessively long DSA keys or parameters may -+ be very slow. -+ -+ Applications that use the functions EVP_PKEY_param_check() or -+ EVP_PKEY_public_check() to check a DSA public key or DSA parameters may -+ experience long delays. Where the key or parameters that are being checked -+ have been obtained from an untrusted source this may lead to a Denial of -+ Service. -+ -+ To resolve this issue DSA keys larger than OPENSSL_DSA_MAX_MODULUS_BITS -+ will now fail the check immediately with a DSA_R_MODULUS_TOO_LARGE error -+ reason. -+ -+ ([CVE-2024-4603]) -+ -+ *Tomáš Mráz* -+ - * Fixed two buffer overflows in punycode decoding functions. - - A buffer overrun can be triggered in X.509 certificate verification, -diff --git a/CryptoPkg/Library/OpensslLib/openssl/crypto/dsa/dsa_check.c b/CryptoPkg/Library/OpensslLib/openssl/crypto/dsa/dsa_check.c -index 7ee914a..a66fe05 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/crypto/dsa/dsa_check.c -+++ b/CryptoPkg/Library/OpensslLib/openssl/crypto/dsa/dsa_check.c -@@ -19,8 +19,34 @@ - #include "dsa_local.h" - #include "crypto/dsa.h" - -+static int dsa_precheck_params(const DSA *dsa, int *ret) -+{ -+ if (dsa->params.p == NULL || dsa->params.q == NULL) { -+ ERR_raise(ERR_LIB_DSA, DSA_R_BAD_FFC_PARAMETERS); -+ *ret = FFC_CHECK_INVALID_PQ; -+ return 0; -+ } -+ -+ if (BN_num_bits(dsa->params.p) > OPENSSL_DSA_MAX_MODULUS_BITS) { -+ ERR_raise(ERR_LIB_DSA, DSA_R_MODULUS_TOO_LARGE); -+ *ret = FFC_CHECK_INVALID_PQ; -+ return 0; -+ } -+ -+ if (BN_num_bits(dsa->params.q) >= BN_num_bits(dsa->params.p)) { -+ ERR_raise(ERR_LIB_DSA, DSA_R_BAD_Q_VALUE); -+ *ret = FFC_CHECK_INVALID_PQ; -+ return 0; -+ } -+ -+ return 1; -+} -+ - int ossl_dsa_check_params(const DSA *dsa, int checktype, int *ret) - { -+ if (!dsa_precheck_params(dsa, ret)) -+ return 0; -+ - if (checktype == OSSL_KEYMGMT_VALIDATE_QUICK_CHECK) - return ossl_ffc_params_simple_validate(dsa->libctx, &dsa->params, - FFC_PARAM_TYPE_DSA, ret); -@@ -39,6 +65,9 @@ int ossl_dsa_check_params(const DSA *dsa, int checktype, int *ret) - */ - int ossl_dsa_check_pub_key(const DSA *dsa, const BIGNUM *pub_key, int *ret) - { -+ if (!dsa_precheck_params(dsa, ret)) -+ return 0; -+ - return ossl_ffc_validate_public_key(&dsa->params, pub_key, ret); - } - -@@ -49,6 +78,10 @@ int ossl_dsa_check_pub_key(const DSA *dsa, const BIGNUM *pub_key, int *ret) - */ - int ossl_dsa_check_pub_key_partial(const DSA *dsa, const BIGNUM *pub_key, int *ret) - { -+ -+ if (!dsa_precheck_params(dsa, ret)) -+ return 0; -+ - return ossl_ffc_validate_public_key_partial(&dsa->params, pub_key, ret); - } - -@@ -56,8 +89,10 @@ int ossl_dsa_check_priv_key(const DSA *dsa, const BIGNUM *priv_key, int *ret) - { - *ret = 0; - -- return (dsa->params.q != NULL -- && ossl_ffc_validate_private_key(dsa->params.q, priv_key, ret)); -+ if (!dsa_precheck_params(dsa, ret)) -+ return 0; -+ -+ return ossl_ffc_validate_private_key(dsa->params.q, priv_key, ret); - } - - /* -@@ -70,8 +105,10 @@ int ossl_dsa_check_pairwise(const DSA *dsa) - BN_CTX *ctx = NULL; - BIGNUM *pub_key = NULL; - -- if (dsa->params.p == NULL -- || dsa->params.g == NULL -+ if (!dsa_precheck_params(dsa, &ret)) -+ return 0; -+ -+ if (dsa->params.g == NULL - || dsa->priv_key == NULL - || dsa->pub_key == NULL) - return 0; diff --git a/SPECS/edk2/CVE-2024-4741.patch b/SPECS/edk2/CVE-2024-4741.patch deleted file mode 100644 index 133442d130..0000000000 --- a/SPECS/edk2/CVE-2024-4741.patch +++ /dev/null @@ -1,69 +0,0 @@ -From b3f0eb0a295f58f16ba43ba99dad70d4ee5c437d Mon Sep 17 00:00:00 2001 -From: Watson Ladd -Date: Wed, 24 Apr 2024 11:26:56 +0100 -Subject: [PATCH] Only free the read buffers if we're not using them - -If we're part way through processing a record, or the application has -not released all the records then we should not free our buffer because -they are still needed. - -CVE-2024-4741 - -Reviewed-by: Tomas Mraz -Reviewed-by: Neil Horman -Reviewed-by: Matt Caswell -(Merged from https://github.com/openCryptoPkg/Library/OpensslLib/openssl/ssl/openCryptoPkg/Library/OpensslLib/openssl/ssl/pull/24395) - -(cherry picked from commit 704f725b96aa373ee45ecfb23f6abfe8be8d9177) ---- - CryptoPkg/Library/OpensslLib/openssl/ssl/record/rec_layer_s3.c | 9 +++++++++ - CryptoPkg/Library/OpensslLib/openssl/ssl/record/record.h | 1 + - CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_lib.c | 3 +++ - 3 files changed, 13 insertions(+) - -diff --git a/CryptoPkg/Library/OpensslLib/openssl/ssl/record/rec_layer_s3.c b/CryptoPkg/Library/OpensslLib/openssl/ssl/record/rec_layer_s3.c -index 4bcffcc41e364..1569997bea2d3 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/ssl/record/rec_layer_s3.c -+++ b/CryptoPkg/Library/OpensslLib/openssl/ssl/record/rec_layer_s3.c -@@ -81,6 +81,15 @@ int RECORD_LAYER_read_pending(const RECORD_LAYER *rl) - return SSL3_BUFFER_get_left(&rl->rbuf) != 0; - } - -+int RECORD_LAYER_data_present(const RECORD_LAYER *rl) -+{ -+ if (rl->rstate == SSL_ST_READ_BODY) -+ return 1; -+ if (RECORD_LAYER_processed_read_pending(rl)) -+ return 1; -+ return 0; -+} -+ - /* Checks if we have decrypted unread record data pending */ - int RECORD_LAYER_processed_read_pending(const RECORD_LAYER *rl) - { -diff --git a/CryptoPkg/Library/OpensslLib/openssl/ssl/record/record.h b/CryptoPkg/Library/OpensslLib/openssl/ssl/record/record.h -index 234656bf93942..b60f71c8cb23b 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/ssl/record/record.h -+++ b/CryptoPkg/Library/OpensslLib/openssl/ssl/record/record.h -@@ -205,6 +205,7 @@ void RECORD_LAYER_release(RECORD_LAYER *rl); - int RECORD_LAYER_read_pending(const RECORD_LAYER *rl); - int RECORD_LAYER_processed_read_pending(const RECORD_LAYER *rl); - int RECORD_LAYER_write_pending(const RECORD_LAYER *rl); -+int RECORD_LAYER_data_present(const RECORD_LAYER *rl); - void RECORD_LAYER_reset_read_sequence(RECORD_LAYER *rl); - void RECORD_LAYER_reset_write_sequence(RECORD_LAYER *rl); - int RECORD_LAYER_is_sslv2_record(RECORD_LAYER *rl); -diff --git a/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_lib.c b/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_lib.c -index eed649c6fdee9..d14c55ae557bc 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_lib.c -+++ b/CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_lib.c -@@ -5492,6 +5492,9 @@ int SSL_free_buffers(SSL *ssl) - if (RECORD_LAYER_read_pending(rl) || RECORD_LAYER_write_pending(rl)) - return 0; - -+ if (RECORD_LAYER_data_present(rl)) -+ return 0; -+ - RECORD_LAYER_release(rl); - return 1; - } diff --git a/SPECS/edk2/CVE-2024-6119.patch b/SPECS/edk2/CVE-2024-6119.patch deleted file mode 100644 index e821f23434..0000000000 --- a/SPECS/edk2/CVE-2024-6119.patch +++ /dev/null @@ -1,266 +0,0 @@ -From 05f360d9e849a1b277db628f1f13083a7f8dd04f Mon Sep 17 00:00:00 2001 -From: Viktor Dukhovni -Date: Wed, 19 Jun 2024 21:04:11 +1000 -Subject: [PATCH] Avoid type errors in EAI-related name check logic. - -The incorrectly typed data is read only, used in a compare operation, so -neither remote code execution, nor memory content disclosure were possible. -However, applications performing certificate name checks were vulnerable to -denial of service. - -The GENERAL_TYPE data type is a union, and we must take care to access the -correct member, based on `gen->type`, not all the member fields have the same -structure, and a segfault is possible if the wrong member field is read. - -The code in question was lightly refactored with the intent to make it more -obviously correct. - -Fixes CVE-2024-6119 - -Reviewed-by: Richard Levitte -Reviewed-by: Tomas Mraz -(cherry picked from commit 0890cd13d40fbc98f655f3974f466769caa83680) ---- - CryptoPkg/Library/OpensslLib/openssl/crypto/x509/v3_utl.c | 78 +++++++++++++------ - CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data.t | 12 ++- - CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data/kdc-cert.pem | 21 +++++ - .../25-test_eai_data/kdc-root-cert.pem | 16 ++++ - CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data/kdc.sh | 41 ++++++++++ - 5 files changed, 142 insertions(+), 26 deletions(-) - create mode 100644 test/recipes/25-test_eai_data/kdc-cert.pem - create mode 100644 test/recipes/25-test_eai_data/kdc-root-cert.pem - create mode 100755 test/recipes/25-test_eai_data/kdc.sh - -diff --git a/CryptoPkg/Library/OpensslLib/openssl/crypto/x509/v3_utl.c b/CryptoPkg/Library/OpensslLib/openssl/crypto/x509/v3_utl.c -index 1a18174995196..a09414c972fa8 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/crypto/x509/v3_utl.c -+++ b/CryptoPkg/Library/OpensslLib/openssl/crypto/x509/v3_utl.c -@@ -916,36 +916,64 @@ static int do_x509_check(X509 *x, const char *chk, size_t chklen, - ASN1_STRING *cstr; - - gen = sk_GENERAL_NAME_value(gens, i); -- if ((gen->type == GEN_OTHERNAME) && (check_type == GEN_EMAIL)) { -- if (OBJ_obj2nid(gen->d.otherName->type_id) == -- NID_id_on_SmtpUTF8Mailbox) { -- san_present = 1; -- -- /* -- * If it is not a UTF8String then that is unexpected and we -- * treat it as no match -- */ -- if (gen->d.otherName->value->type == V_ASN1_UTF8STRING) { -- cstr = gen->d.otherName->value->value.utf8string; -- -- /* Positive on success, negative on error! */ -- if ((rv = do_check_string(cstr, 0, equal, flags, -- chk, chklen, peername)) != 0) -- break; -- } -- } else -+ switch (gen->type) { -+ default: -+ continue; -+ case GEN_OTHERNAME: -+ switch (OBJ_obj2nid(gen->d.otherName->type_id)) { -+ default: - continue; -- } else { -- if ((gen->type != check_type) && (gen->type != GEN_OTHERNAME)) -+ case NID_id_on_SmtpUTF8Mailbox: -+ /*- -+ * https://datatracker.ietf.org/doc/html/rfc8398#section-3 -+ * -+ * Due to name constraint compatibility reasons described -+ * in Section 6, SmtpUTF8Mailbox subjectAltName MUST NOT -+ * be used unless the local-part of the email address -+ * contains non-ASCII characters. When the local-part is -+ * ASCII, rfc822Name subjectAltName MUST be used instead -+ * of SmtpUTF8Mailbox. This is compatible with legacy -+ * software that supports only rfc822Name (and not -+ * SmtpUTF8Mailbox). [...] -+ * -+ * SmtpUTF8Mailbox is encoded as UTF8String. -+ * -+ * If it is not a UTF8String then that is unexpected, and -+ * we ignore the invalid SAN (neither set san_present nor -+ * consider it a candidate for equality). This does mean -+ * that the subject CN may be considered, as would be the -+ * case when the malformed SmtpUtf8Mailbox SAN is instead -+ * simply absent. -+ * -+ * When CN-ID matching is not desirable, applications can -+ * choose to turn it off, doing so is at this time a best -+ * practice. -+ */ -+ if (check_type != GEN_EMAIL -+ || gen->d.otherName->value->type != V_ASN1_UTF8STRING) -+ continue; -+ alt_type = 0; -+ cstr = gen->d.otherName->value->value.utf8string; -+ break; -+ } -+ break; -+ case GEN_EMAIL: -+ if (check_type != GEN_EMAIL) - continue; -- } -- san_present = 1; -- if (check_type == GEN_EMAIL) - cstr = gen->d.rfc822Name; -- else if (check_type == GEN_DNS) -+ break; -+ case GEN_DNS: -+ if (check_type != GEN_DNS) -+ continue; - cstr = gen->d.dNSName; -- else -+ break; -+ case GEN_IPADD: -+ if (check_type != GEN_IPADD) -+ continue; - cstr = gen->d.iPAddress; -+ break; -+ } -+ san_present = 1; - /* Positive on success, negative on error! */ - if ((rv = do_check_string(cstr, alt_type, equal, flags, - chk, chklen, peername)) != 0) -diff --git a/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data.t b/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data.t -index 522982ddfb802..e18735d89aadf 100644 ---- a/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data.t -+++ b/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data.t -@@ -21,16 +21,18 @@ setup("test_eai_data"); - #./util/wrap.pl apps/openssl verify -nameopt utf8 -no_check_time -CAfile test/recipes/25-test_eai_data/utf8_chain.pem test/recipes/25-test_eai_data/ascii_leaf.pem - #./util/wrap.pl apps/openssl verify -nameopt utf8 -no_check_time -CAfile test/recipes/25-test_eai_data/ascii_chain.pem test/recipes/25-test_eai_data/utf8_leaf.pem - --plan tests => 12; -+plan tests => 16; - - require_ok(srctop_file('test','recipes','tconversion.pl')); - my $folder = "test/recipes/25-test_eai_data"; - - my $ascii_pem = srctop_file($folder, "ascii_leaf.pem"); - my $utf8_pem = srctop_file($folder, "utf8_leaf.pem"); -+my $kdc_pem = srctop_file($folder, "kdc-cert.pem"); - - my $ascii_chain_pem = srctop_file($folder, "ascii_chain.pem"); - my $utf8_chain_pem = srctop_file($folder, "utf8_chain.pem"); -+my $kdc_chain_pem = srctop_file($folder, "kdc-root-cert.pem"); - - my $out; - my $outcnt = 0; -@@ -56,10 +58,18 @@ SKIP: { - - ok(run(app(["openssl", "verify", "-nameopt", "utf8", "-no_check_time", "-CAfile", $ascii_chain_pem, $ascii_pem]))); - ok(run(app(["openssl", "verify", "-nameopt", "utf8", "-no_check_time", "-CAfile", $utf8_chain_pem, $utf8_pem]))); -+ok(run(app(["openssl", "verify", "-nameopt", "utf8", "-no_check_time", "-CAfile", $kdc_chain_pem, $kdc_pem]))); - - ok(!run(app(["openssl", "verify", "-nameopt", "utf8", "-no_check_time", "-CAfile", $ascii_chain_pem, $utf8_pem]))); - ok(!run(app(["openssl", "verify", "-nameopt", "utf8", "-no_check_time", "-CAfile", $utf8_chain_pem, $ascii_pem]))); - -+# Check an otherName does not get misparsed as an DNS name, (should trigger ASAN errors if violated). -+ok(run(app(["openssl", "verify", "-nameopt", "utf8", "-no_check_time", "-verify_hostname", 'mx1.example.com', "-CAfile", $kdc_chain_pem, $kdc_pem]))); -+# Check an otherName does not get misparsed as an email address, (should trigger ASAN errors if violated). -+ok(run(app(["openssl", "verify", "-nameopt", "utf8", "-no_check_time", "-verify_email", 'joe@example.com', "-CAfile", $kdc_chain_pem, $kdc_pem]))); -+# We expect SmtpUTF8Mailbox to be a UTF8 String, not an IA5String. -+ok(!run(app(["openssl", "verify", "-nameopt", "utf8", "-no_check_time", "-verify_email", 'moe@example.com', "-CAfile", $kdc_chain_pem, $kdc_pem]))); -+ - #Check that we get the expected failure return code - with({ exit_checker => sub { return shift == 2; } }, - sub { -diff --git a/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data/kdc-cert.pem b/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data/kdc-cert.pem -new file mode 100644 -index 0000000000000..e8a2c6f55d459 ---- /dev/null -+++ b/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data/kdc-cert.pem -@@ -0,0 +1,21 @@ -+-----BEGIN CERTIFICATE----- -+MIIDbDCCAlSgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290 -+MCAXDTI0MDYyMDA2MTQxNVoYDzIxMjQwNjIwMDYxNDE1WjAXMRUwEwYDVQQDDAxU -+RVNULkVYQU1QTEUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6wfP+ -+6go79dkpo/dGLMlPZ7Gw/Q6gUYrCWZWUEgEeRVHCrqOlgUEyA+PcWas/XDPUxXry -+BQlJHLvlqamAQn8gs4QPBARFYWKNiTVGyaRkgNA1N5gqyZdrP9UE+ZJmdqxRAAe8 -+vvpGZWSgevPhLUiSCFYDiD0Rtji2Hm3rGUrReQFBQDEw2pNGwz9zIaxUs08kQZcx -+Yzyiplz5Oau+R/6sAgUwDlrD9xOlUxx/tA/MSDIfkK8qioU11uUZtO5VjkNQy/bT -+7zQMmXxWgm2MIgOs1u4YN7YGOtgqHE9v9iPHHfgrkbQDtVDGQsa8AQEhkUDSCtW9 -+3VFAKx6dGNXYzFwfAgMBAAGjgcgwgcUwHQYDVR0OBBYEFFR5tZycW19DmtbL4Zqj -+te1c2vZLMAkGA1UdIwQCMAAwCQYDVR0TBAIwADCBjQYDVR0RBIGFMIGCoD8GBisG -+AQUCAqA1MDOgDhsMVEVTVC5FWEFNUExFoSEwH6ADAgEBoRgwFhsGa3JidGd0GwxU -+RVNULkVYQU1QTEWgHQYIKwYBBQUHCAmgERYPbW9lQGV4YW1wbGUuY29tgQ9qb2VA -+ZXhhbXBsZS5jb22CD214MS5leGFtcGxlLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEA -+T0xzVtVpRtaOzIhgzw7XQUdzWD5UEGSJJ1cBCOmKUWwDLTAouCYLFB4TbEE7MMUb -+iuMy60bjmVtvfJIXorGUgSadRe5RWJ5DamJWvPA0Q9x7blnEcXqEF+9Td+ypevgU -+UYHFmg83OYwxOsFXZ5cRuXMk3WCsDHQIBi6D1L6oDDZ2pfArs5mqm3thQKVlqyl1 -+El3XRYEdqAz/5eCOFNfwxF0ALxjxVr/Z50StUZU8I7Zfev6+kHhyrR7dqzYJImv9 -+0fTCOBEMjIETDsrA70OxAMu4V16nrWZdJdvzblS2qrt97Omkj+2kiPAJFB76RpwI -+oDQ9fKfUOAmUFth2/R/eGA== -+-----END CERTIFICATE----- -diff --git a/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data/kdc-root-cert.pem b/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data/kdc-root-cert.pem -new file mode 100644 -index 0000000000000..a74c96bf31469 ---- /dev/null -+++ b/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data/kdc-root-cert.pem -@@ -0,0 +1,16 @@ -+-----BEGIN CERTIFICATE----- -+MIICnDCCAYQCCQCBswYcrlZSHjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARS -+b290MCAXDTI0MDYyMDA2MTQxNVoYDzIxMjQwNjIwMDYxNDE1WjAPMQ0wCwYDVQQD -+DARSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqRj8S4kBbIUj -+61kZfi6nE35Q38U140+qt4uAiwAhKumfVHlBM0zQ98WFt5zMHIBQwIb3yjc2zj+0 -+qzUnQfwm1r/RfcMmBPEti9Ge+aEMSsds2gMXziOFM8wd2aAFPy7UVE0XpEWofsRK -+MGi61MKVdPSbGIxBwY9VW38/7D/wf1HtJe7y0xpuecR7GB2XAs+qST59NjuF+7wS -+dLM8Hb3TATgeYbXXWsRJgwz+SPzExg5WmLnU+7y4brZ32dHtdSmkRVSgSlaIf7Xj -+3Tc6Zi7I+W/JYk7hy1zUexVdWCak4PHcoWrXe0gNNN/t8VfLfMExt5z/HIylXnU7 -+pGUyqZlTGQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAHpLF1UCRy7b6Hk0rLokxI -+lgwiH9BU9mktigAGASvkbllpt+YbUbWnuYAvpHBGiP1qZtfX2r96UrSJaGO9BEzT -+Gp9ThnSjoj4Srul0+s/NArU22irFLmDzbalgevAmm9gMGkdqkiIm/mXbwrPj0ncl -+KGicevXryVpvaP62eZ8cc3C4p97frMmXxRX8sTdQpD/gRI7prdEILRSKveqT+AEW -+7rFGM5AOevb4U8ddop8A3D/kX0wcCAIBF6jCNk3uEJ57jVcagL04kPnVfdRiedTS -+vfq1DRNcD29d1H/9u0fHdSn1/+8Ep3X+afQ3C6//5NvOEaXcIGO4QSwkprQydfv8 -+-----END CERTIFICATE----- -diff --git a/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data/kdc.sh b/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data/kdc.sh -new file mode 100755 -index 0000000000000..7a8dbc719fb71 ---- /dev/null -+++ b/CryptoPkg/Library/OpensslLib/openssl/test/recipes/25-test_eai_data/kdc.sh -@@ -0,0 +1,41 @@ -+#! /usr/bin/env bash -+ -+# Create a root CA, signing a leaf cert with a KDC principal otherName SAN, and -+# also a non-UTF8 smtpUtf8Mailbox SAN followed by an rfc822Name SAN and a DNS -+# name SAN. In the vulnerable EAI code, the KDC principal `otherName` should -+# trigger ASAN errors in DNS name checks, while the non-UTF8 `smtpUtf8Mailbox` -+# should likewise lead to ASAN issues with email name checks. -+ -+rm -f root-key.pem root-cert.pem -+openssl req -nodes -new -newkey rsa:2048 -keyout kdc-root-key.pem \ -+ -x509 -subj /CN=Root -days 36524 -out kdc-root-cert.pem -+ -+exts=$( -+ printf "%s\n%s\n%s\n%s = " \ -+ "subjectKeyIdentifier = hash" \ -+ "authorityKeyIdentifier = keyid" \ -+ "basicConstraints = CA:false" \ -+ "subjectAltName" -+ printf "%s, " "otherName:1.3.6.1.5.2.2;SEQUENCE:kdc_princ_name" -+ printf "%s, " "otherName:1.3.6.1.5.5.7.8.9;IA5:moe@example.com" -+ printf "%s, " "email:joe@example.com" -+ printf "%s\n" "DNS:mx1.example.com" -+ printf "[kdc_princ_name]\n" -+ printf "realm = EXP:0, GeneralString:TEST.EXAMPLE\n" -+ printf "principal_name = EXP:1, SEQUENCE:kdc_principal_seq\n" -+ printf "[kdc_principal_seq]\n" -+ printf "name_type = EXP:0, INTEGER:1\n" -+ printf "name_string = EXP:1, SEQUENCE:kdc_principal_components\n" -+ printf "[kdc_principal_components]\n" -+ printf "princ1 = GeneralString:krbtgt\n" -+ printf "princ2 = GeneralString:TEST.EXAMPLE\n" -+ ) -+ -+printf "%s\n" "$exts" -+ -+openssl req -nodes -new -newkey rsa:2048 -keyout kdc-key.pem \ -+ -subj "/CN=TEST.EXAMPLE" | -+ openssl x509 -req -out kdc-cert.pem \ -+ -CA "kdc-root-cert.pem" -CAkey "kdc-root-key.pem" \ -+ -set_serial 2 -days 36524 \ -+ -extfile <(printf "%s\n" "$exts") diff --git a/SPECS/edk2/CVE-2025-3770.patch b/SPECS/edk2/CVE-2025-3770.patch deleted file mode 100644 index 3577990bc2..0000000000 --- a/SPECS/edk2/CVE-2025-3770.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 9e882b45ee5648f415540cea3c2c0f7e274b5e86 Mon Sep 17 00:00:00 2001 -From: John Mathews -Date: Fri, 30 May 2025 11:06:49 -0700 -Subject: [PATCH] UefiCpuPkg/PiSmmCpuDxeSmm: Safe handling of IDT register on - SMM entry - -Mitigates CVE-2025-3770 - -Do not assume that IDT.limit is loaded with a zero value upon SMM entry. -Delay enabling Machine Check Exceptions in SMM until after the SMM IDT -has been reloaded. - -Signed-off-by: John Mathews -Signed-off-by: rpm-build -Upstream-reference: https://github.com/tianocore/edk2/commit/d2d8d38ee08c5e602fb092f940dfecc1f5a4eb38.patch ---- - UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm -index 644366b..6e1cd45 100644 ---- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm -+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm -@@ -113,7 +113,7 @@ ProtFlatMode: - mov eax, strict dword 0 ; source operand will be patched - ASM_PFX(gPatchSmiCr3): - mov cr3, rax -- mov eax, 0x668 ; as cr4.PGE is not set here, refresh cr3 -+ mov eax, 0x628 ; as cr4.PGE is not set here, refresh cr3 - - mov cl, strict byte 0 ; source operand will be patched - ASM_PFX(gPatch5LevelPagingNeeded): -@@ -204,6 +204,10 @@ SmiHandlerIdtrAbsAddr: - mov ax, [rbx + DSC_SS] - mov ss, eax - -+ mov rax, cr4 ; enable MCE -+ bts rax, 6 -+ mov cr4, rax -+ - mov rbx, [rsp + 0x8] ; rbx <- CpuIndex - - ; enable CET if supported --- -2.45.4 - diff --git a/SPECS/edk2/DBXUpdate-20220812.ia32.bin b/SPECS/edk2/DBXUpdate-20220812.ia32.bin deleted file mode 100644 index fbdb270960..0000000000 Binary files a/SPECS/edk2/DBXUpdate-20220812.ia32.bin and /dev/null differ diff --git a/SPECS/edk2/DBXUpdate-20220812.x64.bin b/SPECS/edk2/DBXUpdate-20220812.x64.bin deleted file mode 100644 index ab95a63894..0000000000 Binary files a/SPECS/edk2/DBXUpdate-20220812.x64.bin and /dev/null differ diff --git a/SPECS/edk2/DBXUpdate-20230314.ia32.bin b/SPECS/edk2/DBXUpdate-20230314.ia32.bin deleted file mode 100644 index 0d4b335608..0000000000 Binary files a/SPECS/edk2/DBXUpdate-20230314.ia32.bin and /dev/null differ diff --git a/SPECS/edk2/DBXUpdate-20230314.x64.bin b/SPECS/edk2/DBXUpdate-20230314.x64.bin deleted file mode 100644 index e211fbcf72..0000000000 Binary files a/SPECS/edk2/DBXUpdate-20230314.x64.bin and /dev/null differ diff --git a/SPECS/edk2/DBXUpdate-20230509.ia32.bin b/SPECS/edk2/DBXUpdate-20230509.ia32.bin deleted file mode 100644 index 6dbb7028d6..0000000000 Binary files a/SPECS/edk2/DBXUpdate-20230509.ia32.bin and /dev/null differ diff --git a/SPECS/edk2/DBXUpdate-20230509.x64.bin b/SPECS/edk2/DBXUpdate-20230509.x64.bin deleted file mode 100644 index e2f6b0259a..0000000000 Binary files a/SPECS/edk2/DBXUpdate-20230509.x64.bin and /dev/null differ diff --git a/SPECS/edk2/README.experimental b/SPECS/edk2/README.experimental deleted file mode 100644 index 0859237582..0000000000 --- a/SPECS/edk2/README.experimental +++ /dev/null @@ -1,36 +0,0 @@ - -experimental edk2 builds ------------------------- - -OVMF.stateless.fd -OVMF.stateless.secboot.fd -OVMF.stateless.secboot.pcr - - Stateless (== no persistent uefi variables) ovmf build. Has secure - boot support, the 'secboot' variant has secure boot enabled. Does - not require SMM support. - -OVMF_CODE.4m.secboot.strictnx.fd - - OVMF build with strict NX configuration (using r-x for code, rw- for - data). Known to not work with some grub and linux kernel versions - because they use the wrong memory type for allocations and run into - NX faults. Useful for bootloader development and CI. - -QEMU_EFI.strictnx.fd -QEMU_EFI-strictnx-pflash.raw - - ArmVirt build with strict NX configuration (see above for details). - -QEMU_EFI.secboot.testonly.fd -QEMU_EFI-secboot-testonly-pflash.raw -vars-template-secboot-testonly-pflash.raw - - ArmVirt build with secure boot support. - - Exposes the secure boot APIs, so they can be used for development / - testing / CI. - - The EFI variable store is NOT protected, therefore the build is NOT - suitable for production use. - diff --git a/SPECS/edk2/edk2-build.fedora b/SPECS/edk2/edk2-build.fedora deleted file mode 100644 index 0a91fd8461..0000000000 --- a/SPECS/edk2/edk2-build.fedora +++ /dev/null @@ -1,311 +0,0 @@ - -[opts.ovmf.common] -NETWORK_HTTP_BOOT_ENABLE = TRUE -NETWORK_IP6_ENABLE = TRUE -NETWORK_TLS_ENABLE = TRUE -NETWORK_ISCSI_ENABLE = TRUE -NETWORK_ALLOW_HTTP_CONNECTIONS = TRUE -TPM2_ENABLE = TRUE -TPM2_CONFIG_ENABLE = TRUE -TPM1_ENABLE = FALSE -CAVIUM_ERRATUM_27456 = TRUE - -[opts.ovmf.4m] -FD_SIZE_4MB = TRUE - -[opts.ovmf.2m] -FD_SIZE_2MB = TRUE -NETWORK_ISCSI_ENABLE = FALSE -NETWORK_TLS_ENABLE = FALSE - -[opts.ovmf.sb.smm] -SECURE_BOOT_ENABLE = TRUE -SMM_REQUIRE = TRUE -BUILD_SHELL = FALSE - -# requires edk2 2022-11 or newer -[opts.ovmf.sb.stateless] -SECURE_BOOT_ENABLE = TRUE -SMM_REQUIRE = FALSE -BUILD_SHELL = FALSE - -[opts.armvirt.verbose] -DEBUG_PRINT_ERROR_LEVEL = 0x8040004F - -[opts.armvirt.silent] -DEBUG_PRINT_ERROR_LEVEL = 0x80000000 - -[opts.armvirt.sb.testonly] -SECURE_BOOT_ENABLE = TRUE -BUILD_SHELL = FALSE - -[opts.armvirt.kernel] -TPM2_ENABLE = FALSE -TPM2_CONFIG_ENABLE = FALSE - - -[pcds.nx.strict] -PcdDxeNxMemoryProtectionPolicy = 0xC000000000007FD5 -PcdImageProtectionPolicy = 0x03 -PcdSetNxForStack = TRUE -# Default is FALSE, so there no need to actually set it. -#PcdUninstallMemAttrProtocol = FALSE - -[pcds.nx.broken.shim.grub] -# grub.efi uses EfiLoaderData for code -PcdDxeNxMemoryProtectionPolicy = 0xC000000000007FD1 -# shim.efi has broken MemAttr code -PcdUninstallMemAttrProtocol = TRUE - - -##################################################################### -# stateful ovmf builds (with vars in flash) - -[build.ovmf.2m.default] -desc = ovmf build (64-bit, 2MB) -conf = OvmfPkg/OvmfPkgX64.dsc -arch = X64 -opts = ovmf.common - ovmf.2m -plat = OvmfX64 -dest = Fedora/ovmf -cpy1 = FV/OVMF_CODE.fd -cpy2 = FV/OVMF_VARS.fd -cpy3 = X64/Shell.efi - -[build.ovmf.4m.default] -desc = ovmf build (64-bit, 4MB) -conf = OvmfPkg/OvmfPkgX64.dsc -arch = X64 -opts = ovmf.common - ovmf.4m -plat = OvmfX64 -dest = Fedora/ovmf -cpy1 = FV/OVMF_CODE.fd OVMF_CODE_4M.fd -cpy2 = FV/OVMF_VARS.fd OVMF_VARS_4M.fd - -[build.ovmf.2m.sb.smm] -desc = ovmf build (64-bit, 2MB, q35 only, needs smm, secure boot) -conf = OvmfPkg/OvmfPkgX64.dsc -arch = X64 -opts = ovmf.common - ovmf.2m - ovmf.sb.smm -plat = OvmfX64 -dest = Fedora/ovmf -cpy1 = FV/OVMF_CODE.fd OVMF_CODE.secboot.fd -cpy2 = X64/EnrollDefaultKeys.efi - -[build.ovmf.4m.sb.smm] -desc = ovmf build (64-bit, 4MB, q35 only, needs smm, secure boot) -conf = OvmfPkg/OvmfPkgX64.dsc -arch = X64 -opts = ovmf.common - ovmf.4m - ovmf.sb.smm -plat = OvmfX64 -dest = Fedora/ovmf -cpy1 = FV/OVMF_CODE.fd OVMF_CODE_4M.secboot.fd - - -##################################################################### -# stateless ovmf builds (firmware in rom or r/o flash) - -[build.ovmf.microvm] -desc = ovmf build for qemu microvm (2MB) -conf = OvmfPkg/Microvm/MicrovmX64.dsc -arch = X64 -opts = ovmf.common - ovmf.2m -plat = MicrovmX64 -dest = Fedora/ovmf -cpy1 = FV/MICROVM.fd - -[build.ovmf.xen] -desc = ovmf build for Xen -conf = OvmfPkg/OvmfXen.dsc -arch = X64 -opts = ovmf.common - ovmf.2m -plat = OvmfXen -dest = Fedora/xen -cpy1 = FV/OVMF.fd - -[build.ovmf.amdsev] -desc = ovmf build for AmdSev (2MB) -conf = OvmfPkg/AmdSev/AmdSevX64.dsc -arch = X64 -opts = ovmf.common - ovmf.2m -plat = AmdSev -dest = Fedora/ovmf -cpy1 = FV/OVMF.fd OVMF.amdsev.fd - -[build.ovmf.inteltdx] -desc = ovmf build for IntelTdx (2MB) -conf = OvmfPkg/IntelTdx/IntelTdxX64.dsc -arch = X64 -opts = ovmf.common - ovmf.2m - ovmf.sb.stateless -plat = IntelTdx -dest = Fedora/ovmf -cpy1 = FV/OVMF.fd OVMF.inteltdx.fd - - -##################################################################### -# armvirt builds - -[build.armvirt.aa64.verbose] -desc = ArmVirt build for qemu, 64-bit (arm v8), verbose -conf = ArmVirtPkg/ArmVirtQemu.dsc -arch = AARCH64 -opts = ovmf.common - armvirt.verbose -pcds = nx.broken.shim.grub -plat = ArmVirtQemu-AARCH64 -dest = Fedora/aarch64 -cpy1 = FV/QEMU_EFI.fd -cpy2 = FV/QEMU_VARS.fd -cpy3 = FV/QEMU_EFI.fd QEMU_EFI-pflash.raw -cpy4 = FV/QEMU_VARS.fd vars-template-pflash.raw -pad3 = QEMU_EFI-pflash.raw 64m -pad4 = vars-template-pflash.raw 64m - -[build.armvirt.aa64.silent] -desc = ArmVirt build for qemu, 64-bit (arm v8), silent -conf = ArmVirtPkg/ArmVirtQemu.dsc -arch = AARCH64 -opts = ovmf.common - armvirt.silent -pcds = nx.broken.shim.grub -plat = ArmVirtQemu-AARCH64 -dest = Fedora/aarch64 -cpy1 = FV/QEMU_EFI.fd QEMU_EFI.silent.fd -cpy2 = FV/QEMU_EFI.fd QEMU_EFI-silent-pflash.raw -pad2 = QEMU_EFI-silent-pflash.raw 64m - -[build.armvirt.aa64.kernel] -desc = ArmVirt build for qemu, 64-bit (arm v8) -conf = ArmVirtPkg/ArmVirtQemuKernel.dsc -arch = AARCH64 -opts = ovmf.common - armvirt.silent - armvirt.kernel -pcds = nx.broken.shim.grub -plat = ArmVirtQemuKernel-AARCH64 -dest = Fedora/aarch64 -cpy1 = FV/QEMU_EFI.fd QEMU_EFI.kernel.fd - - -##################################################################### -# riscv - -[build.riscv.qemu] -conf = OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc -arch = RISCV64 -plat = RiscVVirtQemu -dest = Fedora/riscv -cpy1 = FV/RISCV_VIRT_CODE.fd -cpy2 = FV/RISCV_VIRT_CODE.fd RISCV_VIRT_CODE.raw -cpy3 = FV/RISCV_VIRT_VARS.fd -cpy4 = FV/RISCV_VIRT_VARS.fd RISCV_VIRT_VARS.raw -pad1 = RISCV_VIRT_CODE.raw 32m -pad2 = RISCV_VIRT_VARS.raw 32m - - -##################################################################### -# 32-bit builds - -[build.ovmf.ia32.default] -desc = ovmf build (32-bit, 2MB) -conf = OvmfPkg/OvmfPkgIa32.dsc -arch = IA32 -opts = ovmf.common - ovmf.2m -plat = OvmfIa32 -dest = Fedora/ovmf-ia32 -cpy1 = FV/OVMF_CODE.fd -cpy2 = FV/OVMF_VARS.fd -cpy3 = IA32/Shell.efi - -[build.ovmf.ia32.sb.smm] -desc = ovmf build (32-bit, 2MB, q35 only, needs smm, secure boot) -conf = OvmfPkg/OvmfPkgIa32.dsc -arch = IA32 -opts = ovmf.common - ovmf.2m - ovmf.sb.smm -plat = OvmfIa32 -dest = Fedora/ovmf-ia32 -cpy1 = FV/OVMF_CODE.fd OVMF_CODE.secboot.fd -cpy2 = IA32/EnrollDefaultKeys.efi - -[build.armvirt.arm] -desc = ArmVirt build for qemu, 32-bit (arm v7) -conf = ArmVirtPkg/ArmVirtQemu.dsc -arch = ARM -opts = ovmf.common -pcds = nx.broken.shim.grub -plat = ArmVirtQemu-ARM -dest = Fedora/arm -cpy1 = FV/QEMU_EFI.fd -cpy2 = FV/QEMU_VARS.fd -cpy3 = FV/QEMU_EFI.fd QEMU_EFI-pflash.raw -cpy4 = FV/QEMU_VARS.fd vars-template-pflash.raw -pad3 = QEMU_EFI-pflash.raw 64m -pad4 = vars-template-pflash.raw 64m - - -##################################################################### -# experimental builds - -[build.ovmf.sb.stateless] -desc = ovmf build (64-bit, stateless secure boot) -conf = OvmfPkg/OvmfPkgX64.dsc -arch = X64 -opts = ovmf.common - ovmf.4m - ovmf.sb.stateless -plat = OvmfX64 -dest = Fedora/experimental -cpy1 = FV/OVMF.fd OVMF.stateless.fd - -[build.ovmf.strict.nx] -desc = ovmf build (64-bit, 4MB, q35 only, needs smm, secure boot, strict nx) -conf = OvmfPkg/OvmfPkgX64.dsc -arch = X64 -opts = ovmf.common - ovmf.4m - ovmf.sb.smm -pcds = nx.strict -plat = OvmfX64 -dest = Fedora/experimental -cpy1 = FV/OVMF_CODE.fd OVMF_CODE_4M.secboot.strictnx.fd - -[build.armvirt.aa64.strict.nx] -desc = ArmVirt build for qemu, 64-bit (arm v8), verbose -conf = ArmVirtPkg/ArmVirtQemu.dsc -arch = AARCH64 -opts = ovmf.common - armvirt.verbose -pcds = nx.strict -plat = ArmVirtQemu-AARCH64 -dest = Fedora/experimental -cpy1 = FV/QEMU_EFI.fd QEMU_EFI.strictnx.fd -cpy3 = FV/QEMU_EFI.fd QEMU_EFI-strictnx-pflash.raw -pad3 = QEMU_EFI-strictnx-pflash.raw 64m - -[build.armvirt.aa64.secboot.testonly] -desc = ArmVirt build for qemu, 64-bit (arm v8), secure boot -conf = ArmVirtPkg/ArmVirtQemu.dsc -arch = AARCH64 -opts = ovmf.common - armvirt.verbose - armvirt.sb.testonly -pcds = nx.strict -plat = ArmVirtQemu-AARCH64 -dest = Fedora/experimental -cpy1 = FV/QEMU_EFI.fd QEMU_EFI.secboot.testonly.fd -cpy3 = FV/QEMU_EFI.fd QEMU_EFI-secboot-testonly-pflash.raw -pad3 = QEMU_EFI-secboot-testonly-pflash.raw 64m diff --git a/SPECS/edk2/edk2-build.fedora.platforms b/SPECS/edk2/edk2-build.fedora.platforms deleted file mode 100644 index e9aad91b02..0000000000 --- a/SPECS/edk2/edk2-build.fedora.platforms +++ /dev/null @@ -1,51 +0,0 @@ - -##################################################################### -# ext4 driver - -[build.ext4.x64] -desc = ext4 driver -conf = Features/Ext4Pkg/Ext4Pkg.dsc -arch = X64 -plat = Ext4Pkg -dest = Fedora/drivers -cpy1 = X64/Ext4Dxe.efi ext4x64.efi - -[build.ext4.aa64] -desc = ext4 driver -conf = Features/Ext4Pkg/Ext4Pkg.dsc -arch = AARCH64 -plat = Ext4Pkg -dest = Fedora/drivers -cpy1 = AARCH64/Ext4Dxe.efi ext4aa64.efi - -[build.ext4.riscv64] -desc = ext4 driver -conf = Features/Ext4Pkg/Ext4Pkg.dsc -arch = RISCV64 -plat = Ext4Pkg -dest = Fedora/drivers -cpy1 = RISCV64/Ext4Dxe.efi ext4riscv64.efi - - -##################################################################### -# arm standalone mm - -[build.standalone.mm.aa64] -conf = Platform/StandaloneMm/PlatformStandaloneMmPkg/PlatformStandaloneMmRpmb.dsc -arch = AARCH64 -plat = MmStandaloneRpmb -dest = Fedora/aarch64 -cpy1 = FV/BL32_AP_MM.fd - - -##################################################################### -# loongarch builds - -[build.loongarch] -desc = Loongarch build -conf = Platform/Loongson/LoongArchQemuPkg/Loongson.dsc -arch = LOONGARCH64 -plat = LoongArchQemu -dest = Fedora/loongarch64 -cpy1 = FV/QEMU_EFI.fd -cpy2 = FV/QEMU_VARS.fd diff --git a/SPECS/edk2/edk2-build.py b/SPECS/edk2/edk2-build.py deleted file mode 100755 index 5f02ecb854..0000000000 --- a/SPECS/edk2/edk2-build.py +++ /dev/null @@ -1,447 +0,0 @@ -#!/usr/bin/python3 -""" -build helper script for edk2, see -https://gitlab.com/kraxel/edk2-build-config - -""" -import os -import sys -import time -import shutil -import argparse -import subprocess -import configparser - -rebase_prefix = "" -version_override = None -release_date = None - -# pylint: disable=unused-variable -def check_rebase(): - """ detect 'git rebase -x edk2-build.py master' testbuilds """ - global rebase_prefix - global version_override - gitdir = '.git' - - if os.path.isfile(gitdir): - with open(gitdir, 'r', encoding = 'utf-8') as f: - (unused, gitdir) = f.read().split() - - if not os.path.exists(f'{gitdir}/rebase-merge/msgnum'): - return - with open(f'{gitdir}/rebase-merge/msgnum', 'r', encoding = 'utf-8') as f: - msgnum = int(f.read()) - with open(f'{gitdir}/rebase-merge/end', 'r', encoding = 'utf-8') as f: - end = int(f.read()) - with open(f'{gitdir}/rebase-merge/head-name', 'r', encoding = 'utf-8') as f: - head = f.read().strip().split('/') - - rebase_prefix = f'[ {int(msgnum/2)} / {int(end/2)} - {head[-1]} ] ' - if msgnum != end and not version_override: - # fixed version speeds up builds - version_override = "test-build-patch-series" - -def get_coredir(cfg): - if cfg.has_option('global', 'core'): - return os.path.abspath(cfg['global']['core']) - return os.getcwd() - -def get_toolchain(cfg, build): - if cfg.has_option(build, 'tool'): - return cfg[build]['tool'] - if cfg.has_option('global', 'tool'): - return cfg['global']['tool'] - return 'GCC5' - -def get_hostarch(): - mach = os.uname().machine - if mach == 'x86_64': - return 'X64' - if mach == 'aarch64': - return 'AARCH64' - if mach == 'riscv64': - return 'RISCV64' - return 'UNKNOWN' - -def get_version(cfg, silent = False): - coredir = get_coredir(cfg) - if version_override: - version = version_override - if not silent: - print('') - print(f'### version [override]: {version}') - return version - if os.environ.get('RPM_PACKAGE_NAME'): - version = os.environ.get('RPM_PACKAGE_NAME') - version += '-' + os.environ.get('RPM_PACKAGE_VERSION') - version += '-' + os.environ.get('RPM_PACKAGE_RELEASE') - if not silent: - print('') - print(f'### version [rpmbuild]: {version}') - return version - if os.path.exists(coredir + '/.git'): - cmdline = [ 'git', 'describe', '--tags', '--abbrev=8', - '--match=edk2-stable*' ] - result = subprocess.run(cmdline, cwd = coredir, - stdout = subprocess.PIPE, - check = True) - version = result.stdout.decode().strip() - if not silent: - print('') - print(f'### version [git]: {version}') - return version - return None - -def pcd_string(name, value): - return f'{name}=L{value}\\0' - -def pcd_version(cfg, silent = False): - version = get_version(cfg, silent) - if version is None: - return [] - return [ '--pcd', pcd_string('PcdFirmwareVersionString', version) ] - -def pcd_release_date(): - if release_date is None: - return [] - return [ '--pcd', pcd_string('PcdFirmwareReleaseDateString', release_date) ] - -def build_message(line, line2 = None, silent = False): - if os.environ.get('TERM') in [ 'xterm', 'xterm-256color' ]: - # setxterm title - start = '\x1b]2;' - end = '\x07' - print(f'{start}{rebase_prefix}{line}{end}', end = '') - - if silent: - print(f'### {rebase_prefix}{line}', flush = True) - else: - print('') - print('###') - print(f'### {rebase_prefix}{line}') - if line2: - print(f'### {line2}') - print('###', flush = True) - -def build_run(cmdline, name, section, silent = False, nologs = False): - if silent: - logfile = f'{section}.log' - if nologs: - print(f'### building in silent mode [no log] ...', flush = True) - else: - print(f'### building in silent mode [{logfile}] ...', flush = True) - start = time.time() - result = subprocess.run(cmdline, check = False, - stdout = subprocess.PIPE, - stderr = subprocess.STDOUT) - if not nologs: - with open(logfile, 'wb') as f: - f.write(result.stdout) - - if result.returncode: - print('### BUILD FAILURE') - print('### cmdline') - print(cmdline) - print('### output') - print(result.stdout.decode()) - print(f'### exit code: {result.returncode}') - else: - secs = int(time.time() - start) - print(f'### OK ({int(secs/60)}:{secs%60:02d})') - else: - print(cmdline, flush = True) - result = subprocess.run(cmdline, check = False) - if result.returncode: - print(f'ERROR: {cmdline[0]} exited with {result.returncode}' - f' while building {name}') - sys.exit(result.returncode) - -def build_copy(plat, tgt, toolchain, dstdir, copy): - srcdir = f'Build/{plat}/{tgt}_{toolchain}' - names = copy.split() - srcfile = names[0] - if len(names) > 1: - dstfile = names[1] - else: - dstfile = os.path.basename(srcfile) - print(f'# copy: {srcdir} / {srcfile} => {dstdir} / {dstfile}') - - src = srcdir + '/' + srcfile - dst = dstdir + '/' + dstfile - os.makedirs(os.path.dirname(dst), exist_ok = True) - shutil.copy(src, dst) - -def pad_file(dstdir, pad): - args = pad.split() - if len(args) < 2: - raise RuntimeError(f'missing arg for pad ({args})') - name = args[0] - size = args[1] - cmdline = [ - 'truncate', - '--size', size, - dstdir + '/' + name, - ] - print(f'# padding: {dstdir} / {name} => {size}') - subprocess.run(cmdline, check = True) - -# pylint: disable=too-many-branches -def build_one(cfg, build, jobs = None, silent = False, nologs = False): - b = cfg[build] - - cmdline = [ 'build' ] - cmdline += [ '-t', get_toolchain(cfg, build) ] - cmdline += [ '-p', b['conf'] ] - - if (b['conf'].startswith('OvmfPkg/') or - b['conf'].startswith('ArmVirtPkg/')): - cmdline += pcd_version(cfg, silent) - cmdline += pcd_release_date() - - if jobs: - cmdline += [ '-n', jobs ] - for arch in b['arch'].split(): - if arch == 'HOST': - cmdline += [ '-a', get_hostarch() ] - else: - cmdline += [ '-a', arch ] - if 'opts' in b: - for name in b['opts'].split(): - section = 'opts.' + name - for opt in cfg[section]: - cmdline += [ '-D', opt + '=' + cfg[section][opt] ] - if 'pcds' in b: - for name in b['pcds'].split(): - section = 'pcds.' + name - for pcd in cfg[section]: - cmdline += [ '--pcd', pcd + '=' + cfg[section][pcd] ] - if 'tgts' in b: - tgts = b['tgts'].split() - else: - tgts = [ 'DEBUG' ] - for tgt in tgts: - desc = None - if 'desc' in b: - desc = b['desc'] - build_message(f'building: {b["conf"]} ({b["arch"]}, {tgt})', - f'description: {desc}', - silent = silent) - build_run(cmdline + [ '-b', tgt ], - b['conf'], - build + '.' + tgt, - silent, - nologs) - - if 'plat' in b: - # copy files - for cpy in b: - if not cpy.startswith('cpy'): - continue - build_copy(b['plat'], tgt, - get_toolchain(cfg, build), - b['dest'], b[cpy]) - # pad builds - for pad in b: - if not pad.startswith('pad'): - continue - pad_file(b['dest'], b[pad]) - -def build_basetools(silent = False, nologs = False): - build_message('building: BaseTools', silent = silent) - basedir = os.environ['EDK_TOOLS_PATH'] + '/Source/C' - cmdline = [ 'make', '-C', basedir ] - build_run(cmdline, 'BaseTools', 'build.basetools', silent, nologs) - -def binary_exists(name): - for pdir in os.environ['PATH'].split(':'): - if os.path.exists(pdir + '/' + name): - return True - return False - -def prepare_env(cfg, silent = False): - """ mimic Conf/BuildEnv.sh """ - workspace = os.getcwd() - packages = [ workspace, ] - path = os.environ['PATH'].split(':') - dirs = [ - 'BaseTools/Bin/Linux-x86_64', - 'BaseTools/BinWrappers/PosixLike' - ] - - if cfg.has_option('global', 'pkgs'): - for pkgdir in cfg['global']['pkgs'].split(): - packages.append(os.path.abspath(pkgdir)) - coredir = get_coredir(cfg) - if coredir != workspace: - packages.append(coredir) - - # add basetools to path - for pdir in dirs: - p = coredir + '/' + pdir - if not os.path.exists(p): - continue - if p in path: - continue - path.insert(0, p) - - # run edksetup if needed - toolsdef = coredir + '/Conf/tools_def.txt' - if not os.path.exists(toolsdef): - os.makedirs(os.path.dirname(toolsdef), exist_ok = True) - build_message('running BaseTools/BuildEnv', silent = silent) - cmdline = [ 'bash', 'BaseTools/BuildEnv' ] - subprocess.run(cmdline, cwd = coredir, check = True) - - # set variables - os.environ['PATH'] = ':'.join(path) - os.environ['PACKAGES_PATH'] = ':'.join(packages) - os.environ['WORKSPACE'] = workspace - os.environ['EDK_TOOLS_PATH'] = coredir + '/BaseTools' - os.environ['CONF_PATH'] = coredir + '/Conf' - os.environ['PYTHON_COMMAND'] = '/usr/bin/python3' - os.environ['PYTHONHASHSEED'] = '1' - - # for cross builds - if binary_exists('arm-linux-gnueabi-gcc'): - # ubuntu - os.environ['GCC5_ARM_PREFIX'] = 'arm-linux-gnueabi-' - os.environ['GCC_ARM_PREFIX'] = 'arm-linux-gnueabi-' - elif binary_exists('arm-linux-gnu-gcc'): - # fedora - os.environ['GCC5_ARM_PREFIX'] = 'arm-linux-gnu-' - os.environ['GCC_ARM_PREFIX'] = 'arm-linux-gnu-' - if binary_exists('loongarch64-linux-gnu-gcc'): - os.environ['GCC5_LOONGARCH64_PREFIX'] = 'loongarch64-linux-gnu-' - os.environ['GCC_LOONGARCH64_PREFIX'] = 'loongarch64-linux-gnu-' - - hostarch = os.uname().machine - if binary_exists('aarch64-linux-gnu-gcc') and hostarch != 'aarch64': - os.environ['GCC5_AARCH64_PREFIX'] = 'aarch64-linux-gnu-' - os.environ['GCC_AARCH64_PREFIX'] = 'aarch64-linux-gnu-' - if binary_exists('riscv64-linux-gnu-gcc') and hostarch != 'riscv64': - os.environ['GCC5_RISCV64_PREFIX'] = 'riscv64-linux-gnu-' - os.environ['GCC_RISCV64_PREFIX'] = 'riscv64-linux-gnu-' - if binary_exists('x86_64-linux-gnu-gcc') and hostarch != 'x86_64': - os.environ['GCC5_IA32_PREFIX'] = 'x86_64-linux-gnu-' - os.environ['GCC5_X64_PREFIX'] = 'x86_64-linux-gnu-' - os.environ['GCC5_BIN'] = 'x86_64-linux-gnu-' - os.environ['GCC_IA32_PREFIX'] = 'x86_64-linux-gnu-' - os.environ['GCC_X64_PREFIX'] = 'x86_64-linux-gnu-' - os.environ['GCC_BIN'] = 'x86_64-linux-gnu-' - -def build_list(cfg): - for build in cfg.sections(): - if not build.startswith('build.'): - continue - name = build.lstrip('build.') - desc = 'no description' - if 'desc' in cfg[build]: - desc = cfg[build]['desc'] - print(f'# {name:20s} - {desc}') - -def main(): - parser = argparse.ArgumentParser(prog = 'edk2-build', - description = 'edk2 build helper script') - parser.add_argument('-c', '--config', dest = 'configfile', - type = str, default = '.edk2.builds', metavar = 'FILE', - help = 'read configuration from FILE (default: .edk2.builds)') - parser.add_argument('-C', '--directory', dest = 'directory', type = str, - help = 'change to DIR before building', metavar = 'DIR') - parser.add_argument('-j', '--jobs', dest = 'jobs', type = str, - help = 'allow up to JOBS parallel build jobs', - metavar = 'JOBS') - parser.add_argument('-m', '--match', dest = 'match', - type = str, action = 'append', - help = 'only run builds matching INCLUDE (substring)', - metavar = 'INCLUDE') - parser.add_argument('-x', '--exclude', dest = 'exclude', - type = str, action = 'append', - help = 'skip builds matching EXCLUDE (substring)', - metavar = 'EXCLUDE') - parser.add_argument('-l', '--list', dest = 'list', - action = 'store_true', default = False, - help = 'list build configs available') - parser.add_argument('--silent', dest = 'silent', - action = 'store_true', default = False, - help = 'write build output to logfiles, ' - 'write to console only on errors') - parser.add_argument('--no-logs', dest = 'nologs', - action = 'store_true', default = False, - help = 'do not write build log files (with --silent)') - parser.add_argument('--core', dest = 'core', type = str, metavar = 'DIR', - help = 'location of the core edk2 repository ' - '(i.e. where BuildTools are located)') - parser.add_argument('--pkg', '--package', dest = 'pkgs', - type = str, action = 'append', metavar = 'DIR', - help = 'location(s) of additional packages ' - '(can be specified multiple times)') - parser.add_argument('-t', '--toolchain', dest = 'toolchain', - type = str, metavar = 'NAME', - help = 'tool chain to be used to build edk2') - parser.add_argument('--version-override', dest = 'version_override', - type = str, metavar = 'VERSION', - help = 'set firmware build version') - parser.add_argument('--release-date', dest = 'release_date', - type = str, metavar = 'DATE', - help = 'set firmware build release date (in MM/DD/YYYY format)') - options = parser.parse_args() - - if options.directory: - os.chdir(options.directory) - - if not os.path.exists(options.configfile): - print(f'config file "{options.configfile}" not found') - return 1 - - cfg = configparser.ConfigParser() - cfg.optionxform = str - cfg.read(options.configfile) - - if options.list: - build_list(cfg) - return 0 - - if not cfg.has_section('global'): - cfg.add_section('global') - if options.core: - cfg.set('global', 'core', options.core) - if options.pkgs: - cfg.set('global', 'pkgs', ' '.join(options.pkgs)) - if options.toolchain: - cfg.set('global', 'tool', options.toolchain) - - global version_override - global release_date - check_rebase() - if options.version_override: - version_override = options.version_override - if options.release_date: - release_date = options.release_date - - prepare_env(cfg, options.silent) - build_basetools(options.silent, options.nologs) - for build in cfg.sections(): - if not build.startswith('build.'): - continue - if options.match: - matching = False - for item in options.match: - if item in build: - matching = True - if not matching: - print(f'# skipping "{build}" (not matching "{"|".join(options.match)}")') - continue - if options.exclude: - exclude = False - for item in options.exclude: - if item in build: - print(f'# skipping "{build}" (matching "{item}")') - exclude = True - if exclude: - continue - build_one(cfg, build, options.jobs, options.silent, options.nologs) - - return 0 - -if __name__ == '__main__': - sys.exit(main()) diff --git a/SPECS/edk2/edk2-build.rhel-9 b/SPECS/edk2/edk2-build.rhel-9 deleted file mode 100644 index cb172ed8a9..0000000000 --- a/SPECS/edk2/edk2-build.rhel-9 +++ /dev/null @@ -1,127 +0,0 @@ - -[opts.ovmf.common] -NETWORK_HTTP_BOOT_ENABLE = TRUE -NETWORK_IP6_ENABLE = TRUE -NETWORK_TLS_ENABLE = TRUE -NETWORK_ISCSI_ENABLE = TRUE -NETWORK_ALLOW_HTTP_CONNECTIONS = TRUE -TPM2_ENABLE = TRUE -TPM2_CONFIG_ENABLE = TRUE -TPM1_ENABLE = FALSE -CAVIUM_ERRATUM_27456 = TRUE - -[opts.ovmf.4m] -FD_SIZE_4MB = TRUE - -[opts.ovmf.sb.smm] -SECURE_BOOT_ENABLE = TRUE -SMM_REQUIRE = TRUE -BUILD_SHELL = FALSE - -[opts.ovmf.sb.stateless] -SECURE_BOOT_ENABLE = TRUE -SMM_REQUIRE = FALSE -BUILD_SHELL = FALSE - -[opts.armvirt.verbose] -DEBUG_PRINT_ERROR_LEVEL = 0x8040004F - -[opts.armvirt.silent] -DEBUG_PRINT_ERROR_LEVEL = 0x80000000 - - -[pcds.nx.strict] -PcdDxeNxMemoryProtectionPolicy = 0xC000000000007FD5 -PcdUninstallMemAttrProtocol = FALSE - -[pcds.nx.broken.shim.grub] -# grub.efi uses EfiLoaderData for code -PcdDxeNxMemoryProtectionPolicy = 0xC000000000007FD1 -# shim.efi has broken MemAttr code -PcdUninstallMemAttrProtocol = TRUE - - -##################################################################### -# stateful ovmf builds (with vars in flash) - -[build.ovmf.4m.default] -desc = ovmf build (64-bit, 4MB) -conf = OvmfPkg/OvmfPkgX64.dsc -arch = X64 -opts = ovmf.common - ovmf.4m -plat = OvmfX64 -dest = RHEL-9/ovmf -cpy1 = FV/OVMF_CODE.fd OVMF_CODE.fd -cpy2 = FV/OVMF_VARS.fd -cpy3 = X64/Shell.efi - -[build.ovmf.4m.sb.smm] -desc = ovmf build (64-bit, 4MB, q35 only, needs smm, secure boot) -conf = OvmfPkg/OvmfPkgX64.dsc -arch = X64 -opts = ovmf.common - ovmf.4m - ovmf.sb.smm -plat = OvmfX64 -dest = RHEL-9/ovmf -cpy1 = FV/OVMF_CODE.fd OVMF_CODE.secboot.fd -cpy2 = X64/EnrollDefaultKeys.efi - - -##################################################################### -# stateless ovmf builds (firmware in rom or r/o flash) - -[build.ovmf.amdsev] -desc = ovmf build for AmdSev (4MB) -conf = OvmfPkg/AmdSev/AmdSevX64.dsc -arch = X64 -opts = ovmf.common - ovmf.4m -plat = AmdSev -dest = RHEL-9/ovmf -cpy1 = FV/OVMF.fd OVMF.amdsev.fd - -[build.ovmf.inteltdx] -desc = ovmf build for IntelTdx (4MB) -conf = OvmfPkg/IntelTdx/IntelTdxX64.dsc -arch = X64 -opts = ovmf.common - ovmf.4m - ovmf.sb.stateless -plat = IntelTdx -dest = RHEL-9/ovmf -cpy1 = FV/OVMF.fd OVMF.inteltdx.fd - - -##################################################################### -# armvirt builds - -[build.armvirt.aa64.verbose] -desc = ArmVirt build for qemu, 64-bit (arm v8), verbose -conf = ArmVirtPkg/ArmVirtQemu.dsc -arch = AARCH64 -opts = ovmf.common - armvirt.verbose -pcds = nx.broken.shim.grub -plat = ArmVirtQemu-AARCH64 -dest = RHEL-9/aarch64 -cpy1 = FV/QEMU_EFI.fd -cpy2 = FV/QEMU_VARS.fd -cpy3 = FV/QEMU_EFI.fd QEMU_EFI-pflash.raw -cpy4 = FV/QEMU_VARS.fd vars-template-pflash.raw -pad3 = QEMU_EFI-pflash.raw 64m -pad4 = vars-template-pflash.raw 64m - -[build.armvirt.aa64.silent] -desc = ArmVirt build for qemu, 64-bit (arm v8), silent -conf = ArmVirtPkg/ArmVirtQemu.dsc -arch = AARCH64 -opts = ovmf.common - armvirt.silent -pcds = nx.broken.shim.grub -plat = ArmVirtQemu-AARCH64 -dest = RHEL-9/aarch64 -cpy1 = FV/QEMU_EFI.fd QEMU_EFI.silent.fd -cpy2 = FV/QEMU_EFI.fd QEMU_EFI-silent-pflash.raw -pad2 = QEMU_EFI-silent-pflash.raw 64m diff --git a/SPECS/edk2/edk2.signatures.json b/SPECS/edk2/edk2.signatures.json deleted file mode 100644 index 3a5fe9358e..0000000000 --- a/SPECS/edk2/edk2.signatures.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "Signatures": { - "30-edk2-ovmf-4m-qcow2-x64-sb-enrolled.json": "827c542dee2906d261c92c19f390637c1e653165d6a920c45651edd68e7fffd0", - "30-edk2-ovmf-ia32-sb-enrolled.json": "8ce4600fd84968adca9d037df9531d34ce455ad566d4691d256d370acc86120d", - "31-edk2-ovmf-2m-raw-x64-sb-enrolled.json": "e0237cf4909d129324953bd854caf79136065402a30d363f13e594fd0e493bcf", - "40-edk2-ovmf-4m-qcow2-x64-sb.json": "52ad30099a600dc9d03d60557a94e8c5459cd72124445109287ebf6971b879a1", - "40-edk2-ovmf-ia32-sb.json": "de562405d0f9a9400eb58239e10753455216196dface2631858bcf1a3c886ac7", - "41-edk2-ovmf-2m-raw-x64-sb.json": "c9c505b6308af28f29c16b4108f7f295408f975a47c94fb7aef523cb2a999d8e", - "50-edk2-aarch64-qcow2.json": "a62d1c8b3801a33d670863fd4824252f65b93b64af8e5fd8908e6e09d8d5db99", - "50-edk2-arm-verbose.json": "8805fce3e313705b7b43be6f2601776871c35bac0914fa05c34d09c929044253", - "50-edk2-loongarch64.json": "733d208b45c1d15cb96273f9eb405adb91876d64306c6ad791351f6861b85053", - "50-edk2-ovmf-4m-qcow2-x64-nosb.json": "a97c1339a837d106ccb25132a68cdeaf13f2b7cff3d4c7411ce4457e75b68278", - "50-edk2-ovmf-ia32-nosb.json": "b360162bd55df3b1cb4bfa8d0b7c2b46a7c7b492aabf6d0d57c3dbf3d8c7fd10", - "50-edk2-ovmf-x64-microvm.json": "5136200cd26eff9387259b1ca0f352b64298283f990277ac7a1b7a94d87baa27", - "50-edk2-riscv-qcow2.json": "b91747d4c9e46b656105cf0b5e061df6f30f8db452c39bac1ae6e91bc3f90da1", - "51-edk2-aarch64-raw.json": "7523b4dc263748fc8bee26e763aa94463222a8d2e8b738fdbde0d2b263ad562d", - "51-edk2-ovmf-2m-raw-x64-nosb.json": "59aec29aa157bb0f7e5242ff0de9932367d5314d9ce8159b97360b6d44da58f2", - "52-edk2-aarch64-verbose-qcow2.json": "132627485055270421667399465b06e954f85b8e6f14b2efa1d31aac1b83a6cb", - "53-edk2-aarch64-verbose-raw.json": "a03962c06b66b33d55ee8d62273dabe625f1525fd1a7769af2dc07e7889b2163", - "60-edk2-ovmf-x64-amdsev.json": "3ea01de7839cae41880cded64f964ed8d9b44e179527627aca6b24d6f8ead113", - "60-edk2-ovmf-x64-inteltdx.json": "43bb034df6a8c4dfd69b5b7350850a8884873ab09e8d27f18657ecfe0727c65b", - "DBXUpdate-20230509.ia32.bin": "b073eb71894e933e22d935cf45bf8319543819998522785d967f51fd87c85f85", - "DBXUpdate-20230509.x64.bin": "3e56c3d9e5b12edbd9e4006413d87fba099de1eba33d2bea566e742166cb366a", - "README.experimental": "71ce0b179d0e1325723cc444e45f7eeb67cce4cc1b336f3c5f586de16a6a78fd", - "edk2-3e722403cd16.tar.xz": "7ec671f04a183fb0e7f70bba008e8f66e60b44e1709b7bacd293ddb9196f4456", - "edk2-build.fedora": "0c8ed554f434a4b392620cec4e47af5b2ec5288542337216be849b5f7ac93329", - "edk2-build.fedora.platforms": "a4c1c1b34917b451a7f2386bfc053a980e62316b2bbdece1e024d2633d2356c7", - "edk2-build.py": "b4be60833465d372662ac4f1f89f40b9c65d59fb17f7716059f980503069ddb7", - "edk2-build.rhel-9": "477723037cadf03fa15756de563995cc556ccf84d9a4ba059ea37c97c3a0e3e7", - "edk2-platforms-a912d9fcf7d1.tar.xz": "dc2c8a0eb131ccba28f52c83d14617cae049ddd466f98a8cd229215051b9754a", - "hvloader-286f1c642ed624af2c7840fbca7923497891fe68.tar.gz": "4e0a15cfab98a89a0a93f747df876ea3ee5366c3ffbd158c28e296bf52c7dfba", - "hvloader-target.txt": "fcf4f427d3b80e67296be2a1d17ec124d65f673d4f6ea37d238f8d3fc1ddc4b8", - "jansson-2.13.1.tar.bz2": "ee90a0f879d2b7b7159124ff22b937a2a9a8c36d3bb65d1da7dd3f04370a10bd", - "openssl-rhel-db0287935122edceb91dcda8dfb53b4090734e22.tar.xz": "9fcc5b49513d6ae21c7ddc3d1bbb1f8973cfbe76f2392d10106a8cd435e3eb47", - "ovmf-whitepaper-c770f8c.txt": "842518adadaa837914dbb13a6628002fb7f7acca107c6d6f41815b399dc9f8b8", - "softfloat-20180726-gitb64af41.tar.xz": "c7f2172357ca3022621b9464fd92bf2b462256bda3e019bf9a669fa6b5aeea91" - } -} diff --git a/SPECS/edk2/edk2.spec b/SPECS/edk2/edk2.spec deleted file mode 100644 index 2673e02176..0000000000 --- a/SPECS/edk2/edk2.spec +++ /dev/null @@ -1,1269 +0,0 @@ -%bcond_without experimental -%bcond_with arm - -Vendor: Intel Corporation -Distribution: Edge Microvisor Toolkit -## START: Set by rpmautospec -## (rpmautospec version 0.3.5) -## RPMAUTOSPEC: autorelease, autochangelog -%define autorelease(e:s:pb:n) %{?-p:0.}%{lua: - release_number = 31; - base_release_number = tonumber(rpm.expand("%{?-b*}%{!?-b:1}")); - print(release_number + base_release_number - 1); -}%{?-e:.%{-e*}}%{?-s:.%{-s*}}%{!?-n:%{?dist}} -## END: Set by rpmautospec - -# https://fedoraproject.org/wiki/Changes/SetBuildFlagsBuildCheck -# breaks cross-building -%undefine _auto_set_build_flags - -# actual firmware builds support cross-compiling. edk2-tools -# in theory should build everywhere without much trouble, but -# in practice the edk2 build system barfs on archs it doesn't know -# (such as ppc), so lets limit things to the known-good ones. -# -# Can't build aarch64 due to a dependency on "nasm", which doesn't -# officially support the ARM64 architecture. See here: -# https://github.com/netwide-assembler/nasm/pull/3 -ExclusiveArch: x86_64 - -# edk2-stable202402 -%define GITDATE 20240524 -%define GITCOMMIT 3e722403cd16 -%define TOOLCHAIN GCC - -%define PLATFORMS_COMMIT a912d9fcf7d1 - -%define OPENSSL_VER 3.0.7 -%define OPENSSL_COMMIT db0287935122edceb91dcda8dfb53b4090734e22 - -%define DBXDATE 20230509 - -%define HVLOADER_VER 1.0.1 -%define HVLOADER_COMMIT 286f1c642ed624af2c7840fbca7923497891fe68 - -%define build_ovmf 1 -%define build_aarch64 0 -%define build_riscv64 0 - -# Undefine this to get *HUGE* (50MB+) verbose build logs -%define silent --silent - -%global softfloat_version 20180726-gitb64af41 -%define disable_werror 1 - - -Name: edk2 -Version: %{GITDATE}git%{GITCOMMIT} -Release: 10%{?dist} -Summary: UEFI firmware for 64-bit virtual machines -License: Apache-2.0 AND (BSD-2-Clause OR GPL-2.0-or-later) AND BSD-2-Clause-Patent AND BSD-3-Clause AND BSD-4-Clause AND ISC AND MIT AND LicenseRef-Fedora-Public-Domain -URL: https://www.tianocore.org - -# The source tarball is created using following commands: -# COMMIT=bb1bba3d7767 -# git archive --format=tar --prefix=edk2-$COMMIT/ $COMMIT \ -# | xz -9ev >/tmp/edk2-$COMMIT.tar.xz -Source0: https://src.fedoraproject.org/repo/pkgs/edk2/edk2-%{GITCOMMIT}.tar.xz/sha512/58550636ea26810a0184423765db24e43319a0cc5e38dfd5fbd7f09b5f6e1c2d2b9e1e33112a3b721e05c7f088dbfd8a2ddd4a73d833c3019a16101ef1d0342a/edk2-%{GITCOMMIT}.tar.xz -Source1: ovmf-whitepaper-c770f8c.txt -Source2: openssl-rhel-%{OPENSSL_COMMIT}.tar.xz -Source3: softfloat-%{softfloat_version}.tar.xz -Source4: edk2-platforms-%{PLATFORMS_COMMIT}.tar.xz -Source5: jansson-2.13.1.tar.bz2 -Source6: README.experimental -Source7: hvloader-%{HVLOADER_COMMIT}.tar.gz -Source8: hvloader-target.txt - -# json description files -Source10: 50-edk2-aarch64-qcow2.json -Source11: 51-edk2-aarch64-raw.json -Source12: 52-edk2-aarch64-verbose-qcow2.json -Source13: 53-edk2-aarch64-verbose-raw.json - -Source20: 50-edk2-arm-verbose.json - -Source30: 30-edk2-ovmf-ia32-sb-enrolled.json -Source31: 40-edk2-ovmf-ia32-sb.json -Source32: 50-edk2-ovmf-ia32-nosb.json - -Source40: 30-edk2-ovmf-4m-qcow2-x64-sb-enrolled.json -Source41: 31-edk2-ovmf-2m-raw-x64-sb-enrolled.json -Source42: 40-edk2-ovmf-4m-qcow2-x64-sb.json -Source43: 41-edk2-ovmf-2m-raw-x64-sb.json -Source44: 50-edk2-ovmf-x64-microvm.json -Source45: 50-edk2-ovmf-4m-qcow2-x64-nosb.json -Source46: 51-edk2-ovmf-2m-raw-x64-nosb.json -Source47: 60-edk2-ovmf-x64-amdsev.json -Source48: 60-edk2-ovmf-x64-inteltdx.json -Source50: 50-edk2-riscv-qcow2.json - -Source60: 50-edk2-loongarch64.json - -# https://gitlab.com/kraxel/edk2-build-config -Source80: edk2-build.py -Source81: edk2-build.fedora -Source82: edk2-build.fedora.platforms -Source83: edk2-build.rhel-9 - -Source90: DBXUpdate-%{DBXDATE}.x64.bin -Source91: DBXUpdate-%{DBXDATE}.ia32.bin - -Patch0001: 0001-BaseTools-do-not-build-BrotliCompress-RH-only.patch -Patch0002: 0002-MdeModulePkg-remove-package-private-Brotli-include-p.patch -Patch0003: 0003-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch -Patch0004: 0004-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch -Patch0005: 0005-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch -Patch0006: 0006-OvmfPkg-enable-DEBUG_VERBOSE-RHEL-only.patch -Patch0007: 0007-OvmfPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuVide.patch -Patch0008: 0008-ArmVirtPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuR.patch -Patch0009: 0009-OvmfPkg-QemuRamfbDxe-Do-not-report-DXE-failure-on-Aa.patch -Patch0010: 0010-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch -Patch0011: 0011-OvmfPkg-QemuKernelLoaderFsDxe-suppress-error-on-no-k.patch -Patch0012: 0012-SecurityPkg-Tcg2Dxe-suppress-error-on-no-swtpm-in-si.patch -Patch0013: 0013-UefiCpuPkg-MpInitLib-fix-apic-mode-for-cpu-hotplug.patch -Patch0014: 0014-CryptoPkg-CrtLib-add-stat.h.patch -Patch0015: 0015-CryptoPkg-CrtLib-add-access-open-read-write-close-sy.patch -Patch0016: 0016-OvmfPkg-set-PcdVariableStoreSize-PcdMaxVolatileVaria.patch -%if (0%{?fedora} >= 38 || 0%{?rhel} >= 10) && !0%{?emt} -Patch0017: 0017-silence-.-has-a-LOAD-segment-with-RWX-permissions-wa.patch -%endif -Patch0018: 0018-NetworkPkg-TcpDxe-Fixed-system-stuck-on-PXE-boot-flo.patch -Patch0019: 0019-NetworkPkg-DxeNetLib-adjust-PseudoRandom-error-loggi.patch -Patch0020: CVE-2024-38796.patch - -# Patches for the vendored OpenSSL are in the range from 1000 to 1999 (inclusive). -Patch1000: CVE-2022-3996.patch -Patch1001: CVE-2024-6119.patch -Patch1002: CVE-2024-4741.patch -Patch1003: CVE-2024-13176.patch -Patch1004: CVE-2024-2511.patch -Patch1005: CVE-2024-4603.patch -Patch1006: CVE-2025-3770.patch - -# python3-devel and libuuid-devel are required for building tools. -# python3-devel is also needed for varstore template generation and -# verification with "ovmf-vars-generator". -BuildRequires: python3-devel -BuildRequires: libuuid-devel -BuildRequires: iasl -BuildRequires: binutils gcc git gcc-c++ make -BuildRequires: qemu-img - -# openssl configure -BuildRequires: perl(FindBin) -BuildRequires: perl(IPC::Cmd) -BuildRequires: perl(File::Compare) -BuildRequires: perl(File::Copy) -BuildRequires: perl(JSON) -BuildRequires: perl(lib) - -%if %{build_ovmf} -# Only OVMF includes 80x86 assembly files (*.nasm*). -BuildRequires: nasm - -# Only OVMF includes the Secure Boot feature, for which we need to separate out -# the UEFI shell. -BuildRequires: dosfstools -BuildRequires: mtools -BuildRequires: xorriso - -# For mkisofs. -BuildRequires: cdrkit - -# For generating the variable store template with the default certificates -# enrolled. -BuildRequires: python3-virt-firmware >= 24.2 -BuildRequires: python3-pefile - -# endif build_ovmf -%endif - - -%package ovmf -Summary: UEFI firmware for x86_64 virtual machines -BuildArch: noarch -Provides: OVMF = %{version}-%{release} -Obsoletes: OVMF < 20180508-100.gitee3198e672e2.el7 - -# need libvirt version with qcow2 support -Conflicts: libvirt-daemon-driver-qemu < 9.7.0 - -# OVMF includes the Secure Boot and IPv6 features; it has a builtin OpenSSL -# library. -Provides: bundled(openssl) = %{OPENSSL_VER} -License: Apache-2.0 AND (BSD-2-Clause OR GPL-2.0-or-later) AND BSD-2-Clause-Patent AND BSD-4-Clause AND ISC AND LicenseRef-Fedora-Public-Domain - -# URL taken from the Maintainers.txt file. -URL: http://www.tianocore.org/ovmf/ - -%description ovmf -OVMF (Open Virtual Machine Firmware) is a project to enable UEFI support for -Virtual Machines. This package contains a sample 64-bit UEFI firmware for QEMU -and KVM. - - -%package aarch64 -Summary: UEFI firmware for aarch64 virtual machines -BuildArch: noarch -Provides: AAVMF = %{version}-%{release} -Obsoletes: AAVMF < 20180508-100.gitee3198e672e2.el7 - -# need libvirt version with qcow2 support -Conflicts: libvirt-daemon-driver-qemu < 9.7.0 - -# No Secure Boot for AAVMF yet, but we include OpenSSL for the IPv6 stack. -Provides: bundled(openssl) = %{OPENSSL_VER} -License: Apache-2.0 AND (BSD-2-Clause OR GPL-2.0-or-later) AND BSD-2-Clause-Patent AND BSD-4-Clause AND ISC AND LicenseRef-Fedora-Public-Domain - -# URL taken from the Maintainers.txt file. -URL: https://github.com/tianocore/tianocore.github.io/wiki/ArmVirtPkg - -%description aarch64 -AAVMF (ARM Architecture Virtual Machine Firmware) is an EFI Development Kit II -platform that enables UEFI support for QEMU/KVM ARM Virtual Machines. This -package contains a 64-bit build. - - -%package tools -Summary: EFI Development Kit II Tools -License: BSD-2-Clause-Patent AND LicenseRef-Fedora-Public-Domain -URL: https://github.com/tianocore/tianocore.github.io/wiki/BaseTools -%description tools -This package provides tools that are needed to -build EFI executables and ROMs using the GNU tools. - -%package tools-doc -Summary: Documentation for EFI Development Kit II Tools -BuildArch: noarch -License: BSD-2-Clause-Patent -URL: https://github.com/tianocore/tianocore.github.io/wiki/BaseTools -%description tools-doc -This package documents the tools that are needed to -build EFI executables and ROMs using the GNU tools. - -%description -EDK II is a modern, feature-rich, cross-platform firmware development -environment for the UEFI and PI specifications. This package contains sample -64-bit UEFI firmware builds for QEMU and KVM. - - -%package ovmf-ia32 -Summary: Open Virtual Machine Firmware -License: Apache-2.0 AND BSD-2-Clause-Patent AND BSD-4-Clause AND ISC AND LicenseRef-Fedora-Public-Domain -Provides: bundled(openssl) -BuildArch: noarch -%description ovmf-ia32 -EFI Development Kit II -Open Virtual Machine Firmware (ia32) - -%package ovmf-xen -Summary: Open Virtual Machine Firmware, Xen build -License: Apache-2.0 AND BSD-2-Clause-Patent AND BSD-4-Clause AND ISC AND LicenseRef-Fedora-Public-Domain -Provides: bundled(openssl) -BuildArch: noarch -%description ovmf-xen -EFI Development Kit II -Open Virtual Machine Firmware (Xen build) - -%if %{with experimental} -%package experimental -Summary: Open Virtual Machine Firmware, experimental builds -License: Apache-2.0 AND BSD-2-Clause-Patent AND BSD-4-Clause AND ISC AND LicenseRef-Fedora-Public-Domain -Provides: bundled(openssl) -Obsoletes: edk2-ovmf-experimental < 20230825 -BuildArch: noarch -%description experimental -EFI Development Kit II -Open Virtual Machine Firmware (experimental builds) -%endif - -%if %{with arm} -%package arm -Summary: ARM Virtual Machine Firmware -BuildArch: noarch -License: Apache-2.0 AND (BSD-2-Clause OR GPL-2.0-or-later) AND BSD-2-Clause-Patent AND BSD-3-Clause AND BSD-4-Clause AND ISC AND LicenseRef-Fedora-Public-Domain -%description arm -EFI Development Kit II -ARMv7 UEFI Firmware -%endif - -%if %{build_riscv64} -%package riscv64 -Summary: RISC-V Virtual Machine Firmware -BuildArch: noarch -License: Apache-2.0 AND (BSD-2-Clause OR GPL-2.0-or-later) AND BSD-2-Clause-Patent AND LicenseRef-Fedora-Public-Domain - -# need libvirt version with qcow2 support -Conflicts: libvirt-daemon-driver-qemu < 9.7.0 - -%description riscv64 -EFI Development Kit II -RISC-V UEFI Firmware -%endif - -%package ext4 -Summary: Ext4 filesystem driver -License: Apache-2.0 AND BSD-2-Clause-Patent -BuildArch: noarch -%description ext4 -EFI Development Kit II -Ext4 filesystem driver - -%package tools-python -Summary: EFI Development Kit II Tools -Requires: python3 -BuildArch: noarch - -%description tools-python -This package provides tools that are needed to build EFI executables -and ROMs using the GNU tools. You do not need to install this package; -you probably want to install edk2-tools only. - -%package hvloader -Summary: Loader binary for loading type 1 hypervisors under Linux. -Requires: python3 - -%description hvloader -HvLoader.efi is an EFI application for loading an external hypervisor loader. - -HvLoader.efi loads a given hypervisor loader binary (DLL, EFI, etc.), and -calls it's entry point passing HvLoader.efi ImageHandle. This way the -hypervisor loader binary has access to HvLoader.efi's command line options, -and use those as configuration parameters. The first HvLoader.efi command line -option is the path to hypervisor loader binary. - - -%prep -# We needs some special git config options that %%autosetup won't give us. -# We init the git dir ourselves, then tell %%autosetup not to blow it away. -%setup -q -n edk2-%{GITCOMMIT} -git init -q -git config core.whitespace cr-at-eol -git config am.keepcr true -# -T is passed to %%setup to not re-extract the archive -# -D is passed to %%setup to not delete the existing archive dir -%autosetup -T -D -n edk2-%{GITCOMMIT} -S git_am -N -# -M Apply patches up to 999 -%autopatch -M 999 - -# Unpack the vendored OpenSSL tarball. This tarball has a '.git' directory -# which will confuse the git repo we unpack it into, so exclude that. -# Then add it to the git index so that we can use autopatch, which -# uses git am since we set it up that way initially. -# Only apply patches between 1000 and 1999 (inclusive). -tar -C CryptoPkg/Library/OpensslLib -a -f %{SOURCE2} -x --exclude '.git' -git add . -git commit -m 'add vendored openssl' -%autopatch -p1 -m 1000 -M 1999 - -cp -a -- %{SOURCE1} . - -# extract softfloat into place -tar -xf %{SOURCE3} --strip-components=1 --directory ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3/ -tar -xf %{SOURCE4} --strip-components=1 --wildcards "*/Drivers" "*/Features" "*/Platform" "*/Silicon" -mkdir -p RedfishPkg/Library/JsonLib/jansson -tar -xf %{SOURCE5} --strip-components=1 --directory RedfishPkg/Library/JsonLib/jansson - -# include paths pointing to unused submodules -mkdir -p MdePkg/Library/MipiSysTLib/mipisyst/library/include -mkdir -p CryptoPkg/Library/MbedTlsLib/mbedtls/include -mkdir -p CryptoPkg/Library/MbedTlsLib/mbedtls/include/mbedtls -mkdir -p CryptoPkg/Library/MbedTlsLib/mbedtls/library -mkdir -p SecurityPkg/DeviceSecurity/SpdmLib/libspdm/include - -# Done by %setup, but we do not use it for the auxiliary tarballs -chmod -Rf a+rX,u+w,g-w,o-w . - -cp -a -- \ - %{SOURCE6} \ - %{SOURCE10} %{SOURCE11} %{SOURCE12} %{SOURCE13} \ - %{SOURCE20} \ - %{SOURCE30} %{SOURCE31} %{SOURCE32} \ - %{SOURCE40} %{SOURCE41} %{SOURCE42} %{SOURCE43} %{SOURCE44} \ - %{SOURCE45} %{SOURCE46} %{SOURCE47} %{SOURCE48} \ - %{SOURCE50} \ - %{SOURCE60} \ - %{SOURCE80} %{SOURCE81} %{SOURCE82} %{SOURCE83} \ - %{SOURCE90} %{SOURCE91} \ - . - -# extract hvloader source into place -tar -xf %{SOURCE7} --directory MdeModulePkg/Application -sed -i '/MdeModulePkg\/Application\/HelloWorld\/HelloWorld.inf/a \ \ MdeModulePkg\/Application\/HvLoader-%{HVLOADER_VER}/HvLoader.inf' MdeModulePkg/MdeModulePkg.dsc - -%build - -chmod +x ./edk2-build.py - -build_iso() { - dir="$1" - UEFI_SHELL_BINARY=${dir}/Shell.efi - ENROLLER_BINARY=${dir}/EnrollDefaultKeys.efi - UEFI_SHELL_IMAGE=uefi_shell.img - ISO_IMAGE=${dir}/UefiShell.iso - - UEFI_SHELL_BINARY_BNAME=$(basename -- "$UEFI_SHELL_BINARY") - UEFI_SHELL_SIZE=$(stat --format=%s -- "$UEFI_SHELL_BINARY") - ENROLLER_SIZE=$(stat --format=%s -- "$ENROLLER_BINARY") - - # add 1MB then 10% for metadata - UEFI_SHELL_IMAGE_KB=$(( - (UEFI_SHELL_SIZE + ENROLLER_SIZE + 1 * 1024 * 1024) * 11 / 10 / 1024 - )) - - # create non-partitioned FAT image - rm -f -- "$UEFI_SHELL_IMAGE" - mkdosfs -C "$UEFI_SHELL_IMAGE" -n UEFI_SHELL -- "$UEFI_SHELL_IMAGE_KB" - - # copy the shell binary into the FAT image - export MTOOLS_SKIP_CHECK=1 - mmd -i "$UEFI_SHELL_IMAGE" ::efi - mmd -i "$UEFI_SHELL_IMAGE" ::efi/boot - mcopy -i "$UEFI_SHELL_IMAGE" "$UEFI_SHELL_BINARY" ::efi/boot/bootx64.efi - mcopy -i "$UEFI_SHELL_IMAGE" "$ENROLLER_BINARY" :: - mdir -i "$UEFI_SHELL_IMAGE" -/ :: - - # build ISO with FAT image file as El Torito EFI boot image - mkisofs -input-charset ASCII -J -rational-rock \ - -e "$UEFI_SHELL_IMAGE" -no-emul-boot \ - -o "$ISO_IMAGE" "$UEFI_SHELL_IMAGE" -} - -export EXTRA_OPTFLAGS="%{optflags}" -export EXTRA_LDFLAGS="%{__global_ldflags}" -export RELEASE_DATE="$(echo %{GITDATE} | sed -e 's|\(....\)\(..\)\(..\)|\2/\3/\1|')" - -touch OvmfPkg/AmdSev/Grub/grub.efi # dummy -python3 CryptoPkg/Library/OpensslLib/configure.py - -%if %{build_ovmf} -./edk2-build.py --config edk2-build.fedora %{?silent} --release-date "$RELEASE_DATE" -m ovmf -./edk2-build.py --config edk2-build.fedora.platforms %{?silent} -m x64 -virt-fw-vars --input Fedora/ovmf/OVMF_VARS.fd \ - --output Fedora/ovmf/OVMF_VARS.secboot.fd \ - --set-dbx DBXUpdate-%{DBXDATE}.x64.bin \ - --enroll-redhat --secure-boot -virt-fw-vars --input Fedora/ovmf/OVMF_VARS_4M.fd \ - --output Fedora/ovmf/OVMF_VARS_4M.secboot.fd \ - --set-dbx DBXUpdate-%{DBXDATE}.x64.bin \ - --enroll-redhat --secure-boot -virt-fw-vars --input Fedora/ovmf/OVMF.inteltdx.fd \ - --output Fedora/ovmf/OVMF.inteltdx.secboot.fd \ - --set-dbx DBXUpdate-%{DBXDATE}.x64.bin \ - --enroll-redhat --secure-boot -virt-fw-vars --input Fedora/ovmf-ia32/OVMF_VARS.fd \ - --output Fedora/ovmf-ia32/OVMF_VARS.secboot.fd \ - --set-dbx DBXUpdate-%{DBXDATE}.ia32.bin \ - --enroll-redhat --secure-boot -build_iso Fedora/ovmf -build_iso Fedora/ovmf-ia32 -cp DBXUpdate-%{DBXDATE}.x64.bin Fedora/ovmf -cp DBXUpdate-%{DBXDATE}.ia32.bin Fedora/ovmf-ia32 - -for raw in */ovmf/*_4M*.fd; do - qcow2="${raw%.fd}.qcow2" - qemu-img convert -f raw -O qcow2 -o cluster_size=4096 -S 4096 "$raw" "$qcow2" - rm -f "$raw" -done - -# experimental stateless builds -virt-fw-vars --input Fedora/experimental/OVMF.stateless.fd \ - --output Fedora/experimental/OVMF.stateless.secboot.fd \ - --set-dbx DBXUpdate-%{DBXDATE}.x64.bin \ - --enroll-redhat --secure-boot \ - --set-fallback-no-reboot - -for image in \ - Fedora/ovmf/OVMF_CODE.secboot.fd \ - Fedora/ovmf/OVMF_CODE_4M.secboot.qcow2 \ - Fedora/experimental/OVMF.stateless.secboot.fd \ -; do - pcr="${image}" - pcr="${pcr%.fd}" - pcr="${pcr%.qcow2}" - pcr="${pcr}.pcr" - python3 /usr/share/doc/python3-virt-firmware/experimental/measure.py \ - --image "$image" \ - --version "%{name}-%{version}-%{release}" \ - --no-shim \ - --bank sha256 --bank sha384 \ - > "$pcr" -done -%endif - -%if %{build_aarch64} -./edk2-build.py --config edk2-build.fedora %{?silent} --release-date "$RELEASE_DATE" -m armvirt -./edk2-build.py --config edk2-build.fedora.platforms %{?silent} -m aa64 -virt-fw-vars --input Fedora/aarch64/vars-template-pflash.raw \ - --output Fedora/experimental/vars-template-secboot-testonly-pflash.raw \ - --enroll-redhat --secure-boot --distro-keys rhel -for raw in */aarch64/*.raw; do - qcow2="${raw%.raw}.qcow2" - qemu-img convert -f raw -O qcow2 -o cluster_size=4096 -S 4096 "$raw" "$qcow2" -done -%endif - -%if %{build_riscv64} -./edk2-build.py --config edk2-build.fedora %{?silent} --release-date "$RELEASE_DATE" -m riscv -./edk2-build.py --config edk2-build.fedora.platforms %{?silent} -m riscv -for raw in */riscv/*.raw; do - qcow2="${raw%.raw}.qcow2" - qemu-img convert -f raw -O qcow2 -o cluster_size=4096 -S 4096 "$raw" "$qcow2" - rm -f "$raw" -done -%endif - -source ./edksetup.sh -make -C BaseTools -cp %{SOURCE8} Conf/target.txt -build -p MdeModulePkg/MdeModulePkg.dsc -m MdeModulePkg/Application/HvLoader-%{HVLOADER_VER}/HvLoader.inf - -%install - -cp -a OvmfPkg/License.txt License.OvmfPkg.txt -cp -a CryptoPkg/Library/OpensslLib/openssl/LICENSE.txt LICENSE.openssl -mkdir -p %{buildroot}%{_datadir}/qemu/firmware - -# install the tools -mkdir -p %{buildroot}%{_bindir} \ - %{buildroot}%{_datadir}/%{name}/Conf \ - %{buildroot}%{_datadir}/%{name}/Scripts -install BaseTools/Source/C/bin/* \ - %{buildroot}%{_bindir} -install BaseTools/BinWrappers/PosixLike/LzmaF86Compress \ - %{buildroot}%{_bindir} -install BaseTools/BuildEnv \ - %{buildroot}%{_datadir}/%{name} -install BaseTools/Conf/*.template \ - %{buildroot}%{_datadir}/%{name}/Conf -install BaseTools/Scripts/GccBase.lds \ - %{buildroot}%{_datadir}/%{name}/Scripts - -# install firmware images -mkdir -p %{buildroot}%{_datadir}/%{name} -cp -av Fedora/* %{buildroot}%{_datadir}/%{name} -%if !%{with experimental} -rm -rf %{buildroot}%{_datadir}/%{name}/experimental -%endif - -%if %{build_ovmf} -# compat symlinks -mkdir -p %{buildroot}%{_datadir}/OVMF -ln -s ../%{name}/ovmf/OVMF_CODE.fd %{buildroot}%{_datadir}/OVMF/ -ln -s ../%{name}/ovmf/OVMF_CODE.secboot.fd %{buildroot}%{_datadir}/OVMF/ -ln -s ../%{name}/ovmf/OVMF_VARS.fd %{buildroot}%{_datadir}/OVMF/ -ln -s ../%{name}/ovmf/OVMF_VARS.secboot.fd %{buildroot}%{_datadir}/OVMF/ -ln -s ../%{name}/ovmf/UefiShell.iso %{buildroot}%{_datadir}/OVMF/ -ln -s OVMF_CODE.fd %{buildroot}%{_datadir}/%{name}/ovmf/OVMF_CODE.cc.fd - -# json description files -mkdir -p %{buildroot}%{_datadir}/qemu/firmware -install -m 0644 \ - 30-edk2-ovmf-4m-qcow2-x64-sb-enrolled.json \ - 31-edk2-ovmf-2m-raw-x64-sb-enrolled.json \ - 40-edk2-ovmf-4m-qcow2-x64-sb.json \ - 41-edk2-ovmf-2m-raw-x64-sb.json \ - 50-edk2-ovmf-4m-qcow2-x64-nosb.json \ - 51-edk2-ovmf-2m-raw-x64-nosb.json \ - 60-edk2-ovmf-x64-amdsev.json \ - 60-edk2-ovmf-x64-inteltdx.json \ - %{buildroot}%{_datadir}/qemu/firmware -install -m 0644 \ - 50-edk2-ovmf-x64-microvm.json \ - 30-edk2-ovmf-ia32-sb-enrolled.json \ - 40-edk2-ovmf-ia32-sb.json \ - 50-edk2-ovmf-ia32-nosb.json \ - %{buildroot}%{_datadir}/qemu/firmware -# endif build_ovmf -%endif - -%if %{build_aarch64} -# compat symlinks -mkdir -p %{buildroot}%{_datadir}/AAVMF -ln -s ../%{name}/aarch64/QEMU_EFI-pflash.raw \ - %{buildroot}%{_datadir}/AAVMF/AAVMF_CODE.verbose.fd -ln -s ../%{name}/aarch64/QEMU_EFI-silent-pflash.raw \ - %{buildroot}%{_datadir}/AAVMF/AAVMF_CODE.fd -ln -s ../%{name}/aarch64/vars-template-pflash.raw \ - %{buildroot}%{_datadir}/AAVMF/AAVMF_VARS.fd -ln -s ../%{name}/arm/QEMU_EFI-pflash.raw \ - %{buildroot}%{_datadir}/AAVMF/AAVMF32_CODE.fd - -# json description files -install -m 0644 \ - 50-edk2-aarch64-qcow2.json \ - 51-edk2-aarch64-raw.json \ - 52-edk2-aarch64-verbose-qcow2.json \ - 53-edk2-aarch64-verbose-raw.json \ - %{buildroot}%{_datadir}/qemu/firmware -install -m 0644 \ - 50-edk2-arm-verbose.json \ - %{buildroot}%{_datadir}/qemu/firmware -# endif build_aarch64 -%endif - -# edk2-tools-python install -cp -R BaseTools/Source/Python %{buildroot}%{_datadir}/%{name}/Python -for i in build BPDG Ecc GenDepex GenFds GenPatchPcdTable PatchPcdValue TargetTool Trim UPT; do -echo '#!/bin/sh -export PYTHONPATH=%{_datadir}/%{name}/Python -exec python3 '%{_datadir}/%{name}/Python/$i/$i.py' "$@"' > %{buildroot}%{_bindir}/$i - chmod +x %{buildroot}%{_bindir}/$i -done - -%if 0%{?py_byte_compile:1} -# https://docs.fedoraproject.org/en-US/packaging-guidelines/Python_Appendix/#manual-bytecompilation -%py_byte_compile %{python3} %{buildroot}%{_datadir}/edk2/Python -%endif - -mkdir -p %{buildroot}/boot/efi -cp ./Build/MdeModule/RELEASE_GCC5/X64/MdeModulePkg/Application/HvLoader-%{HVLOADER_VER}/HvLoader/OUTPUT/HvLoader.efi %{buildroot}/boot/efi - -%check -for file in %{buildroot}%{_datadir}/%{name}/*/*VARS.secboot.fd; do - test -f "$file" || continue - virt-fw-vars --input $file --print | grep "SecureBootEnable.*ON" || exit 1 -done - -%global common_files \ - %%license License.txt License.OvmfPkg.txt License-History.txt LICENSE.openssl \ - %%dir %%{_datadir}/%%{name}/ \ - %%dir %%{_datadir}/qemu \ - %%dir %%{_datadir}/qemu/firmware - -%if %{build_ovmf} -%files ovmf -%common_files -%doc OvmfPkg/README -%doc ovmf-whitepaper-c770f8c.txt -%dir %{_datadir}/OVMF/ -%{_datadir}/OVMF/OVMF_CODE.fd -%{_datadir}/OVMF/OVMF_CODE.secboot.fd -%{_datadir}/OVMF/OVMF_VARS.fd -%{_datadir}/OVMF/OVMF_VARS.secboot.fd -%{_datadir}/OVMF/UefiShell.iso -%dir %{_datadir}/%{name}/ovmf/ -%{_datadir}/%{name}/ovmf/OVMF_CODE.fd -%{_datadir}/%{name}/ovmf/OVMF_CODE.cc.fd -%{_datadir}/%{name}/ovmf/OVMF_CODE.secboot.fd -%{_datadir}/%{name}/ovmf/OVMF_VARS.fd -%{_datadir}/%{name}/ovmf/OVMF_VARS.secboot.fd -%{_datadir}/%{name}/ovmf/OVMF.amdsev.fd -%{_datadir}/%{name}/ovmf/OVMF.inteltdx.fd -%{_datadir}/%{name}/ovmf/OVMF.inteltdx.secboot.fd -%{_datadir}/%{name}/ovmf/UefiShell.iso -%{_datadir}/%{name}/ovmf/Shell.efi -%{_datadir}/%{name}/ovmf/EnrollDefaultKeys.efi -%{_datadir}/%{name}/ovmf/DBXUpdate*.bin -%{_datadir}/qemu/firmware/30-edk2-ovmf-4m-qcow2-x64-sb-enrolled.json -%{_datadir}/qemu/firmware/31-edk2-ovmf-2m-raw-x64-sb-enrolled.json -%{_datadir}/qemu/firmware/40-edk2-ovmf-4m-qcow2-x64-sb.json -%{_datadir}/qemu/firmware/41-edk2-ovmf-2m-raw-x64-sb.json -%{_datadir}/qemu/firmware/50-edk2-ovmf-4m-qcow2-x64-nosb.json -%{_datadir}/qemu/firmware/51-edk2-ovmf-2m-raw-x64-nosb.json -%{_datadir}/qemu/firmware/60-edk2-ovmf-x64-amdsev.json -%{_datadir}/qemu/firmware/60-edk2-ovmf-x64-inteltdx.json -%{_datadir}/%{name}/ovmf/MICROVM.fd -%{_datadir}/qemu/firmware/50-edk2-ovmf-x64-microvm.json -%{_datadir}/%{name}/ovmf/OVMF_CODE_4M.qcow2 -%{_datadir}/%{name}/ovmf/OVMF_CODE_4M.secboot.qcow2 -%{_datadir}/%{name}/ovmf/OVMF_VARS_4M.qcow2 -%{_datadir}/%{name}/ovmf/OVMF_VARS_4M.secboot.qcow2 -%{_datadir}/%{name}/ovmf/*.pcr -# endif build_ovmf -%endif - -%if %{build_aarch64} -%files aarch64 -%common_files -%dir %{_datadir}/AAVMF/ -%{_datadir}/AAVMF/AAVMF_CODE.verbose.fd -%{_datadir}/AAVMF/AAVMF_CODE.fd -%{_datadir}/AAVMF/AAVMF_VARS.fd -%dir %{_datadir}/%{name}/aarch64/ -%{_datadir}/%{name}/aarch64/QEMU_EFI-pflash.* -%{_datadir}/%{name}/aarch64/QEMU_EFI-silent-pflash.* -%{_datadir}/%{name}/aarch64/vars-template-pflash.* -%{_datadir}/%{name}/aarch64/QEMU_EFI.fd -%{_datadir}/%{name}/aarch64/QEMU_EFI.silent.fd -%{_datadir}/%{name}/aarch64/QEMU_VARS.fd -%{_datadir}/%{name}/aarch64/BL32_AP_MM.fd -%{_datadir}/%{name}/aarch64/QEMU_EFI.kernel.fd -%{_datadir}/qemu/firmware/50-edk2-aarch64-qcow2.json -%{_datadir}/qemu/firmware/51-edk2-aarch64-raw.json -%{_datadir}/qemu/firmware/52-edk2-aarch64-verbose-qcow2.json -%{_datadir}/qemu/firmware/53-edk2-aarch64-verbose-raw.json -# endif build_aarch64 -%endif - -%files tools -%license License.txt -%license License-History.txt -%{_bindir}/DevicePath -%{_bindir}/EfiRom -%{_bindir}/GenCrc32 -%{_bindir}/GenFfs -%{_bindir}/GenFv -%{_bindir}/GenFw -%{_bindir}/GenSec -%{_bindir}/LzmaCompress -%{_bindir}/LzmaF86Compress -%{_bindir}/TianoCompress -%{_bindir}/VfrCompile -%{_bindir}/VolInfo -%dir %{_datadir}/%{name} -%{_datadir}/%{name}/BuildEnv -%{_datadir}/%{name}/Conf -%{_datadir}/%{name}/Scripts - -%files tools-doc -%doc BaseTools/UserManuals/*.rtf - - -%if %{build_ovmf} -%files ovmf-ia32 -%common_files -%dir %{_datadir}/%{name}/ovmf-ia32 -%{_datadir}/%{name}/ovmf-ia32/EnrollDefaultKeys.efi -%{_datadir}/%{name}/ovmf-ia32/OVMF_CODE.fd -%{_datadir}/%{name}/ovmf-ia32/OVMF_CODE.secboot.fd -%{_datadir}/%{name}/ovmf-ia32/OVMF_VARS.fd -%{_datadir}/%{name}/ovmf-ia32/OVMF_VARS.secboot.fd -%{_datadir}/%{name}/ovmf-ia32/Shell.efi -%{_datadir}/%{name}/ovmf-ia32/UefiShell.iso -%{_datadir}/%{name}/ovmf-ia32/DBXUpdate*.bin -%{_datadir}/qemu/firmware/30-edk2-ovmf-ia32-sb-enrolled.json -%{_datadir}/qemu/firmware/40-edk2-ovmf-ia32-sb.json -%{_datadir}/qemu/firmware/50-edk2-ovmf-ia32-nosb.json - -%if %{with experimental} -%files experimental -%common_files -%doc README.experimental -%dir %{_datadir}/%{name}/experimental -%{_datadir}/%{name}/experimental/*.fd -%if %{build_aarch64} -%{_datadir}/%{name}/experimental/*.raw -%endif -%{_datadir}/%{name}/experimental/*.pcr -%endif - -%files ovmf-xen -%common_files -%dir %{_datadir}/%{name}/xen -%{_datadir}/%{name}/xen/*.fd -%endif - -%if %{with arm} -%files arm -%common_files -%dir %{_datadir}/AAVMF/ -%{_datadir}/AAVMF/AAVMF32_CODE.fd -%dir %{_datadir}/%{name}/arm -%{_datadir}/%{name}/arm/QEMU_EFI-pflash.raw -%{_datadir}/%{name}/arm/QEMU_EFI.fd -%{_datadir}/%{name}/arm/QEMU_VARS.fd -%{_datadir}/%{name}/arm/vars-template-pflash.raw -%{_datadir}/qemu/firmware/50-edk2-arm-verbose.json -%endif - -%if %{build_riscv64} -%files riscv64 -%common_files -%{_datadir}/%{name}/riscv/*.fd -%{_datadir}/%{name}/riscv/*.qcow2 -%{_datadir}/qemu/firmware/50-edk2-riscv-qcow2.json -%endif - -%files ext4 -%common_files -%dir %{_datadir}/%{name}/drivers -%{_datadir}/%{name}/drivers/ext4*.efi - - -%files tools-python -%{_bindir}/build -%{_bindir}/BPDG -%{_bindir}/Ecc -%{_bindir}/GenDepex -%{_bindir}/GenFds -%{_bindir}/GenPatchPcdTable -%{_bindir}/PatchPcdValue -%{_bindir}/TargetTool -%{_bindir}/Trim -%{_bindir}/UPT -%dir %{_datadir}/%{name} -%{_datadir}/%{name}/Python - -%files hvloader -%license MdeModulePkg/Application/HvLoader-%{HVLOADER_VER}/LICENSE -/boot/efi/HvLoader.efi - -%changelog -* Fri Oct 3 2025 Lee Chee Yang - 20240524git3e722403cd16-10 -- merge from Azure Linux 3.0.20250910-3.0 -- Patch for CVE-2025-3770 - -* Tue Sep 30 2025 Andy - 20240524git3e722403cd16-9 -- Bump version for release - -* Thu Apr 24 2025 Jyoti Kanase - 20240524git3e722403cd16-8 -- Fix CVE-2024-38796 - -* Wed Apr 23 2025 Archana Choudhary - 20240524git3e722403cd16-7 -- Add patch for CVE-2024-2511, CVE-2024-4603 - -* Mon Apr 14 2025 Tobias Brick - 20240524git3e722403cd16-6 -- Patch CVE-2024-13176. -- Rename patch for CVE-2024-4741 to standard name format. - -* Tue Mar 25 2025 Tobias Brick - 20240524git3e722403cd16-5 -- Patch vendored openssl to only free read buffers if not in use. - -* Wed Sep 25 2024 Cameron Baird - 20240524git3e722403cd16-4 -- Package license for edk2-hvloader - -* Thu Sep 19 2024 Minghe Ren - 20240524git3e722403cd16-3 -- Add patch for CVE-2024-6119 - -* Wed Aug 21 2024 Cameron Baird - 20240524git3e722403cd16-2 -- Introduce edk2-hvloader subpackage - -* Tue Jul 30 2024 Betty Lakes - 20240524git3e722403cd16-1 -- Upgrade to 20240524git3e722403cd16 to fix CVE-2023-45236, CVE-2023-45237 - -* Tue Jul 9 2024 Suresh Thelkar - 20240223gitedc6681206c1-2 -- Patch CVE-2022-3996 in bundled OpenSSL - -* Fri Mar 8 2024 Elaine Zhao - 20240223gitedc6681206c1-1 -- Bump version to edk2-stable202402 - -* Wed Dec 13 2023 Andrew Phelps - 20230301gitf80f052277c8-38 -- Apply patch to vendored source - -* Tue Oct 17 2023 Francisco Huelsz Prince - 20230301gitf80f052277c8-37 -- Patch CVE-2023-0465 and CVE-2023-2650 in bundled OpenSSL. - -* Fri Oct 13 2023 Sindhu Karri - 20230301gitf80f052277c8-36 -- Patch CVE-2023-3817 in bundled OpenSSL - -* Tue Sep 26 2023 Pawel Winogrodzki - 20230301gitf80f052277c8-35 -- Removing 'exit' calls from the '%%check' section. - -* Wed Jun 21 2023 Vince Perri - 20230301gitf80f052277c8-34 -- Add nvram-template mapping to ovmf x64 config. - -* Tue Jun 6 2023 Daniel McIlvaney - 20230301gitf80f052277c8-33 -- Patch CVE-2023-0464 in bundled OpenSSL. - -* Fri May 26 2023 Vince Perri - 20230301gitf80f052277c8-32 -- License verified. -- Disable aarch64 and riscv64 builds. -- Disable ovmf-experimental and arm subpackages due to build error. -- Pass _smp_mflags to edk-build.py commands for parallel builds. -- Disable cross-compilation. -- Add --wildcards to fix tar command. -- Initial CBL-Mariner import from Fedora 39 (license: MIT). - -* Wed May 17 2023 Gerd Hoffmann - 20230301gitf80f052277c8-31 -- drop /ovmf-4m/, move 4M builds to /ovmf/ instead - -* Wed May 17 2023 Gerd Hoffmann - 20230301gitf80f052277c8-30 -- update build script - -* Tue May 16 2023 Gerd Hoffmann - 20230301gitf80f052277c8-29 -- json descriptors: explicitly set mode = split - -* Fri May 12 2023 Gerd Hoffmann - 20230301gitf80f052277c8-28 -- switch DBXDATE to 20230509 - -* Fri May 12 2023 Gerd Hoffmann - 20230301gitf80f052277c8-27 -- add 20230509 dbx update files - -* Fri May 12 2023 Gerd Hoffmann - 20230301gitf80f052277c8-26 -- add json descriptor files for qcow2 images - -* Fri May 12 2023 Gerd Hoffmann - 20230301gitf80f052277c8-25 -- drop ovmf 4m raw images - -* Fri May 12 2023 Gerd Hoffmann - 20230301gitf80f052277c8-24 -- add ovmf 4m qcow2 images - -* Fri May 12 2023 Gerd Hoffmann - 20230301gitf80f052277c8-23 -- require python3-virt-firmware v23.5 - -* Fri May 12 2023 Gerd Hoffmann - 20230301gitf80f052277c8-22 -- update NestedInterruptTplLib patches - -* Fri May 05 2023 Gerd Hoffmann - 20230301gitf80f052277c8-21 -- drop ASSERT from NestedInterruptTplLib (rhbz#2183336). - -* Thu Apr 27 2023 Gerd Hoffmann - 20230301gitf80f052277c8-4 -- fix tpm detection. - -* Thu Apr 13 2023 Gerd Hoffmann - 20230301gitf80f052277c8-2 -- add StandaloneMM and ArmVirtQemuKernel builds. -- add json files for qcow2 images. -- update dbx files to 2023-03. - -* Mon Mar 06 2023 Gerd Hoffmann - 20230301gitf80f052277c8-1 -- update to edk2-stable202302 -- update dbx database to 20220812 -- add riscv64 sub-rpm - -* Fri Feb 17 2023 Gerd Hoffmann - 20221117gitfff6d81270b5-14 -- add sub-package with xen build (resolves: rhbz#2170730) - -* Sat Feb 11 2023 Gerd Hoffmann - 20221117gitfff6d81270b5-13 -- update openssl (CVE-2023-0286, CVE-2023-0215, CVE-2022-4450, CVE-2022-4304). - -* Wed Feb 08 2023 Gerd Hoffmann - 20221117gitfff6d81270b5-12 -- cherry-pick aarch64 bugfixes. -- set firmware build release date. -- add ext4 sub-package. - -* Thu Jan 19 2023 Fedora Release Engineering - 20221117gitfff6d81270b5-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Fri Jan 06 2023 Gerd Hoffmann - 20221117gitfff6d81270b5-10 -- add experimental builds with strict nx checking. - -* Mon Jan 02 2023 Gerd Hoffmann - 20221117gitfff6d81270b5-9 -- revert 'make files sparse again' (resolves: rhbz#2155673). -- pick up compiler + linker flags from rpm - -* Tue Dec 20 2022 Gerd Hoffmann - 20221117gitfff6d81270b5-8 -- make files sparse again - -* Thu Dec 15 2022 Gerd Hoffmann - 20221117gitfff6d81270b5-7 -- backport https://github.com/tianocore/edk2/pull/3770 - -* Mon Dec 12 2022 Gerd Hoffmann - 20221117gitfff6d81270b5-6 -- fix ovmf platform config (revert broken commit). -- show version information in smbios (backport). - -* Mon Dec 05 2022 Gerd Hoffmann - 20221117gitfff6d81270b5-5 -- rename *.json files to be more consistent. -- build script update - -* Fri Dec 02 2022 Gerd Hoffmann - 20221117gitfff6d81270b5-4 -- apply dbx updates - -* Tue Nov 29 2022 Gerd Hoffmann - 20221117gitfff6d81270b5-3 -- fix build script - -* Mon Nov 28 2022 Gerd Hoffmann - 20221117gitfff6d81270b5-2 -- add workaround for broken grub - -* Tue Sep 20 2022 Gerd Hoffmann - 20220826gitba0e0e4c6a17-1 -- update edk2 to 2022-08 stable tag. -- update openssl bundle to rhel-8.7 level. -- add stdvga fix. -- add 4MB firmware builds. - -* Thu Aug 18 2022 Gerd Hoffmann - 20220526git16779ede2d36-5 -- comment out patch #4 (bug 2116534 workaround) -- comment out patch #12 (bug 2114858 workaround) - -* Thu Jul 21 2022 Fedora Release Engineering - 20220526git16779ede2d36-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Fri Jun 10 2022 Gerd Hoffmann - 20220526git16779ede2d36-3 -- swap stack fix patch. - -* Wed Jun 08 2022 Gerd Hoffmann - 20220526git16779ede2d36-2 -- fix PcdResizeXterm patch. -- minor specfile cleanup. -- add 0021-OvmfPkg-Sec-fix-stack-switch.patch -- Resolves rhbz#2093745 - -* Tue May 31 2022 Gerd Hoffmann - 20220526git16779ede2d36-1 -- update to new edk2 stable tag (2022-05), refresh patches. -- add amdsev and inteltdx builds -- drop qosb - -* Tue Apr 19 2022 Gerd Hoffmann - 20220221gitb24306f15daa-4 -- switch to virt-firmware for secure boot key enrollment -- Stop builds on armv7 too (iasl missing). - -* Thu Apr 07 2022 Gerd Hoffmann - 20220221gitb24306f15daa-3 -- Fix TPM build options. -- Stop builds on i686 (iasl missing). -- Resolves rhbz#2072827 - -* Wed Mar 23 2022 Gerd Hoffmann - 20220221gitb24306f15daa-1 -- Update to edk2-stable202202 - -* Thu Jan 20 2022 Fedora Release Engineering - 20211126gitbb1bba3d7767-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Mon Dec 6 2021 Gerd Hoffmann - 20211126gitbb1bba3d7767-1 -- Update to edk2-stable202111 -- Resolves rhbz#1978966 -- Resolves rhbz#2026744 - -* Mon Dec 6 2021 Daniel P. Berrangé - 20210527gite1999b264f1f-5 -- Drop glibc strcmp workaround - -* Mon Nov 29 2021 Daniel P. Berrangé - 20210527gite1999b264f1f-4 -- Drop customized splash screen boot logo -- Temporary workaround for suspected glibc strcmp bug breaking builds in koji - -* Wed Sep 1 2021 Daniel P. Berrangé - 20210527gite1999b264f1f-3 -- Fix qemu packaging conditionals for ELN builds - -* Wed Jul 21 2021 Fedora Release Engineering - 20210527gite1999b264f1f-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Tue Jul 20 2021 Cole Robinson - 20210527gite1999b264f1f-1 -- Update to git snapshot -- Sync with c9s packaging - -* Mon Jun 14 2021 Jiri Kucera - 20200801stable-5 -- Replace genisoimage with xorriso - -* Tue Jan 26 2021 Fedora Release Engineering - 20200801stable-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Thu Dec 03 2020 Cole Robinson - 20200801stable-3 -- Really fix TPM breakage (bz 1897367) - -* Tue Nov 24 2020 Cole Robinson - 20200801stable-2 -- Fix openssl usage, unbreak TPM (bz 1897367) - -* Wed Sep 16 2020 Cole Robinson - 20200801stable-1 -- Update to edk2 stable 202008 - -* Sat Sep 12 2020 Peter Robinson - 20200201stable-6 -- Tweaks for aarch64/ARMv7 builds -- Minor cleanups - -* Tue Aug 04 2020 Cole Robinson - 20200201stable-5 -- Fix build failures on rawhide - -* Sat Aug 01 2020 Fedora Release Engineering - 20200201stable-4 -- Second attempt - Rebuilt for - https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Mon Jul 27 2020 Fedora Release Engineering - 20200201stable-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Mon Jul 13 2020 Tom Stellard - 20200201stable-2 -- Use make macros -- https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro - -* Mon Apr 13 2020 Cole Robinson - 20200201stable-1 -- Update to stable-202002 - -* Tue Jan 28 2020 Fedora Release Engineering - 20190501stable-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Fri Sep 06 2019 Patrick Uiterwijk - 20190501stable-4 -- Updated HTTP_BOOT option to new upstream value - -* Wed Jul 24 2019 Fedora Release Engineering - 20190501stable-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Mon Jul 15 2019 Cole Robinson - 20190501stable-2 -- License is now BSD-2-Clause-Patent -- Re-enable secureboot enrollment -- Use qemu-ovmf-secureboot from git - -* Thu Jul 11 2019 Cole Robinson - 20190501stable-1 -- Update to stable-201905 -- Update to openssl-1.1.1b -- Ship VARS file for ovmf-ia32 (bug 1688596) -- Ship Fedora-variant JSON "firmware descriptor files" -- Resolves rhbz#1728652 - -* Mon Mar 18 2019 Cole Robinson - 20190308stable-1 -- Use YYYYMMDD versioning to fix upgrade path - -* Fri Mar 15 2019 Cole Robinson - 201903stable-1 -- Update to stable-201903 -- Update to openssl-1.1.0j -- Move to python3 deps - -* Thu Jan 31 2019 Fedora Release Engineering - 20180815gitcb5f4f45ce-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Wed Nov 14 2018 Patrick Uiterwijk - 20180815gitcb5f4f45ce-5 -- Add -qosb dependency on python3 - -* Fri Nov 9 2018 Paolo Bonzini - 20180815gitcb5f4f45ce-4 -- Fix network boot via grub (bz 1648476) - -* Wed Sep 12 2018 Paolo Bonzini - 20180815gitcb5f4f45ce-3 -- Explicitly compile the scripts using py_byte_compile - -* Fri Aug 31 2018 Cole Robinson - 20180815gitcb5f4f45ce-2 -- Fix passing through RPM build flags (bz 1540244) - -* Tue Aug 21 2018 Cole Robinson - 20180815gitcb5f4f45ce-1 -- Update to edk2 git cb5f4f45ce, edk2-stable201808 -- Update to qemu-ovmf-secureboot-1.1.3 -- Enable TPM2 support - -* Mon Jul 23 2018 Paolo Bonzini - 20180529gitee3198e672e2-5 -- Fixes for AMD SEV on OVMF_CODE.fd -- Add Provides for bundled OpenSSL - -* Wed Jul 18 2018 Paolo Bonzini - 20180529gitee3198e672e2-4 -- Enable IPv6 - -* Thu Jul 12 2018 Fedora Release Engineering - 20180529gitee3198e672e2-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Wed Jun 20 2018 Paolo Bonzini - 20180529gitee3198e672e2-2 -- Backport two bug fixes from RHEL: connect again virtio-rng devices, and - connect consoles unconditionally in OVMF (ARM firmware already did it) - -* Tue May 29 2018 Paolo Bonzini - 20180529gitee3198e672e2-1 -- Rebase to ee3198e672e2 - -* Tue May 01 2018 Cole Robinson - 20171011git92d07e4-7 -- Bump release for new build - -* Fri Mar 30 2018 Patrick Uiterwijk - 20171011git92d07e4-6 -- Add qemu-ovmf-secureboot (qosb) -- Generate pre-enrolled Secure Boot OVMF VARS files - -* Wed Mar 07 2018 Paolo Bonzini - 20171011git92d07e4-5 -- Fix GCC 8 compilation -- Replace dosfstools and mtools with qemu-img vvfat - -* Wed Feb 07 2018 Fedora Release Engineering - 20171011git92d07e4-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Fri Jan 19 2018 Paolo Bonzini - 20170209git296153c5-3 -- Add OpenSSL patches from Fedora -- Enable TLS_MODE - -* Fri Nov 17 2017 Paolo Bonzini - 20170209git296153c5-2 -- Backport patches 19-21 from RHEL -- Add patches 22-24 to fix SEV slowness -- Add fedora conditionals - -* Tue Nov 14 2017 Paolo Bonzini - 20171011git92d07e4-1 -- Import source and patches from RHEL version -- Update OpenSSL to 1.1.0e -- Refresh 0099-Tweak-the-tools_def-to-support-cross-compiling.patch - -* Mon Nov 13 2017 Paolo Bonzini - 20170209git296153c5-6 -- Allow non-cross builds -- Install /usr/share/OVMF and /usr/share/AAVMF - -* Wed Aug 02 2017 Fedora Release Engineering - 20170209git296153c5-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Wed Jul 26 2017 Fedora Release Engineering - 20170209git296153c5-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Wed Mar 15 2017 Cole Robinson - 20170209git296153c5-3 -- Ship ovmf-ia32 package (bz 1424722) - -* Thu Feb 16 2017 Cole Robinson - 20170209git296153c5-2 -- Update EnrollDefaultKeys patch (bz #1398743) - -* Mon Feb 13 2017 Paolo Bonzini - 20170209git296153c5-1 -- Rebase to git master -- New patch 0010 fixes failure to build from source. - -* Fri Feb 10 2017 Fedora Release Engineering - 20161105git3b25ca8-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Sun Nov 06 2016 Cole Robinson - 20161105git3b25ca8-1 -- Rebase to git master - -* Fri Sep 9 2016 Tom Callaway - 20160418gita8c39ba-5 -- replace legally problematic openssl source with "hobbled" tarball - -* Thu Jul 21 2016 Gerd Hoffmann - 20160418gita8c39ba-4 -- Also build for armv7. - -* Tue Jul 19 2016 Gerd Hoffmann 20160418gita8c39ba-3 -- Update EnrollDefaultKeys patch. - -* Fri Jul 8 2016 Paolo Bonzini - 20160418gita8c39ba-2 -- Distribute edk2-ovmf on aarch64 - -* Sat May 21 2016 Cole Robinson - 20160418gita8c39ba-1 -- Distribute edk2-aarch64 on x86 (bz #1338027) - -* Mon Apr 18 2016 Gerd Hoffmann 20160418gita8c39ba-0 -- Update to latest git. -- Add firmware builds (FatPkg is free now). - -* Mon Feb 15 2016 Cole Robinson 20151127svn18975-3 -- Fix FTBFS gcc warning (bz 1307439) - -* Wed Feb 03 2016 Fedora Release Engineering - 20151127svn18975-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Fri Nov 27 2015 Paolo Bonzini - 20151127svn18975-1 -- Rebase to 20151127svn18975-1 -- Linker script renamed to GccBase.lds - -* Wed Jun 17 2015 Fedora Release Engineering - 20150519svn17469-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Tue May 19 2015 Paolo Bonzini - 20150519svn17469-1 -- Rebase to 20150519svn17469-1 -- edk2-remove-tree-check.patch now upstream - -* Sat May 02 2015 Kalev Lember - 20140724svn2670-6 -- Rebuilt for GCC 5 C++11 ABI change - -* Sat Aug 16 2014 Fedora Release Engineering - 20140724svn2670-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Thu Jul 24 2014 Paolo Bonzini - 20140724svn2670-1 -- Rebase to 20140724svn2670-1 - -* Tue Jun 24 2014 Paolo Bonzini - 20140624svn2649-1 -- Use standalone .tar.xz from buildtools repo - -* Tue Jun 24 2014 Paolo Bonzini - 20140328svn15376-4 -- Install BuildTools/BaseEnv - -* Mon Jun 23 2014 Paolo Bonzini - 20140328svn15376-3 -- Rebase to get GCC48 configuration -- Package EDK_TOOLS_PATH as /usr/share/edk2 -- Package "build" and LzmaF86Compress too, as well as the new - tools Ecc and TianoCompress. - -* Sat Jun 07 2014 Fedora Release Engineering - 20131114svn14844-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Thu Nov 14 2013 Paolo Bonzini - 20131114svn14844-1 -- Upgrade to r14844. -- Remove upstreamed parts of patch 1. - -* Fri Nov 8 2013 Paolo Bonzini - 20130515svn14365-7 -- Make BaseTools compile on ARM. - -* Fri Aug 30 2013 Paolo Bonzini - 20130515svn14365-6 -- Revert previous change; firmware packages should be noarch, and building - BaseTools twice is simply wrong. - -* Mon Aug 19 2013 Kay Sievers - 20130515svn14365-5 -- Add sub-package with EFI shell - -* Sat Aug 03 2013 Fedora Release Engineering - 20130515svn14365-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Thu May 23 2013 Dan Horák 20130515svn14365-3 -- set ExclusiveArch - -* Thu May 16 2013 Paolo Bonzini 20130515svn14365-2 -- Fix edk2-tools-python Requires - -* Wed May 15 2013 Paolo Bonzini 20130515svn14365-1 -- Split edk2-tools-doc and edk2-tools-python -- Fix Python BuildRequires -- Remove FatBinPkg at package creation time. -- Use fully versioned dependency. -- Add comment on how to generate the sources. - -* Thu May 2 2013 Paolo Bonzini 20130502.g732d199-1 -- Create. diff --git a/SPECS/edk2/hvloader-target.txt b/SPECS/edk2/hvloader-target.txt deleted file mode 100644 index ebb9673410..0000000000 --- a/SPECS/edk2/hvloader-target.txt +++ /dev/null @@ -1,69 +0,0 @@ -# -# Copyright (c) 2023, Microsoft Corporation. All rights reserved. -# -# SPDX-License-Identifier: MIT -# -# -# ALL Paths are Relative to WORKSPACE - -# Separate multiple LIST entries with a SINGLE SPACE character, do not use comma characters. -# Un-set an option by either commenting out the line, or not setting a value. - -# -# PROPERTY Type Use Description -# ---------------- -------- -------- ----------------------------------------------------------- -# ACTIVE_PLATFORM Filename Recommended Specify the WORKSPACE relative Path and Filename -# of the platform description file that will be used for the -# build. This line is required if and only if the current -# working directory does not contain one or more description -# files. -ACTIVE_PLATFORM = MdeModulePkg/MdeModulePkg.dsc - -# TARGET List Optional Zero or more of the following: DEBUG, RELEASE, NOOPT -# UserDefined; separated by a space character. -# If the line is missing or no value is specified, all -# valid targets specified in the platform description file -# will attempt to be built. The following line will build -# DEBUG platform target. -TARGET = RELEASE - -# TARGET_ARCH List Optional What kind of architecture is the binary being target for. -# One, or more, of the following, IA32, IPF, X64, EBC, ARM -# or AArch64. -# Multiple values can be specified on a single line, using -# space characters to separate the values. These are used -# during the parsing of a platform description file, -# restricting the build output target(s.) -# The Build Target ARCH is determined by (precedence high to low): -# Command-line: -a ARCH option -# target.txt: TARGET_ARCH values -# DSC file: [Defines] SUPPORTED_ARCHITECTURES tag -# If not specified, then all valid architectures specified -# in the platform file, for which tools are available, will be -# built. -TARGET_ARCH = X64 - -# TOOL_DEFINITION_FILE Filename Optional Specify the name of the filename to use for specifying -# the tools to use for the build. If not specified, -# WORKSPACE/Conf/tools_def.txt will be used for the build. -TOOL_CHAIN_CONF = Conf/tools_def.txt - -# TAGNAME List Optional Specify the name(s) of the tools_def.txt TagName to use. -# If not specified, all applicable TagName tools will be -# used for the build. The list uses space character separation. -TOOL_CHAIN_TAG = GCC5 - -# MAX_CONCURRENT_THREAD_NUMBER NUMBER Optional The number of concurrent threads. If not specified or set -# to zero, tool automatically detect number of processor -# threads. Recommend to set this value to one less than the -# number of your computer cores or CPUs. When value set to 1, -# means disable multi-thread build, value set to more than 1, -# means user specify the thread number to build. Not specify -# the default value in this file. -# MAX_CONCURRENT_THREAD_NUMBER = 1 - - -# BUILD_RULE_CONF Filename Optional Specify the file name to use for the build rules that are followed -# when generating Makefiles. If not specified, the file: -# WORKSPACE/Conf/build_rule.txt will be used -BUILD_RULE_CONF = Conf/build_rule.txt \ No newline at end of file diff --git a/SPECS/edk2/make-tarball.sh b/SPECS/edk2/make-tarball.sh deleted file mode 100755 index 702031020c..0000000000 --- a/SPECS/edk2/make-tarball.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -# args -repo="${1%/}" -ref="${2-HEAD}" -ab="${3-12}" - -# check -if test ! -d "${repo}/.git"; then - echo "usage: $0 [ [ ] ]" - exit 1 -fi - -# get + print info -commit=$(cd $repo; git show --abbrev=$ab --pretty='format:%h' $ref | head -1) -date=$(cd $repo; git show --pretty='format:%cs' $ref | head -1 | tr -d '-') -echo "# $repo $ref -> commit $commit - date $date" - -# create tarball -name="${repo##*/}" -file="${name}-${commit}.tar.xz" -(cd $repo; git archive --format=tar --prefix=${name}-${commit}/ ${commit}) \ - | xz -9ev > "$file" -echo "# $file written" diff --git a/SPECS/edk2/ovmf-whitepaper-c770f8c.txt b/SPECS/edk2/ovmf-whitepaper-c770f8c.txt deleted file mode 100644 index ba727b4918..0000000000 --- a/SPECS/edk2/ovmf-whitepaper-c770f8c.txt +++ /dev/null @@ -1,2422 +0,0 @@ -Open Virtual Machine Firmware (OVMF) Status Report -July 2014 (with updates in August 2014 - January 2015) - -Author: Laszlo Ersek -Copyright (C) 2014-2015, Red Hat, Inc. -CC BY-SA 4.0 - -Abstract --------- - -The Unified Extensible Firmware Interface (UEFI) is a specification that -defines a software interface between an operating system and platform firmware. -UEFI is designed to replace the Basic Input/Output System (BIOS) firmware -interface. - -Hardware platform vendors have been increasingly adopting the UEFI -Specification to govern their boot firmware developments. OVMF (Open Virtual -Machine Firmware), a sub-project of Intel's EFI Development Kit II (edk2), -enables UEFI support for Ia32 and X64 Virtual Machines. - -This paper reports on the status of the OVMF project, treats features and -limitations, gives end-user hints, and examines some areas in-depth. - -Keywords: ACPI, boot options, CSM, edk2, firmware, flash, fw_cfg, KVM, memory -map, non-volatile variables, OVMF, PCD, QEMU, reset vector, S3, Secure Boot, -Smbios, SMM, TianoCore, UEFI, VBE shim, Virtio - -Table of Contents ------------------ - -- Motivation -- Scope -- Example qemu invocation -- Installation of OVMF guests with virt-manager and virt-install -- Supported guest operating systems -- Compatibility Support Module (CSM) -- Phases of the boot process -- Project structure -- Platform Configuration Database (PCD) -- Firmware image structure -- S3 (suspend to RAM and resume) -- A comprehensive memory map of OVMF -- Known Secure Boot limitations -- Variable store and LockBox in SMRAM -- Select features - - X64-specific reset vector for OVMF - - Client library for QEMU's firmware configuration interface - - Guest ACPI tables - - Guest SMBIOS tables - - Platform-specific boot policy - - Virtio drivers - - Platform Driver - - Video driver -- Afterword - -Motivation ----------- - -OVMF extends the usual benefits of virtualization to UEFI. Reasons to use OVMF -include: - -- Legacy-free guests. A UEFI-based environment eliminates dependencies on - legacy address spaces and devices. This is especially beneficial when used - with physically assigned devices where the legacy operating mode is - troublesome to support, ex. assigned graphics cards operating in legacy-free, - non-VGA mode in the guest. - -- Future proof guests. The x86 market is steadily moving towards a legacy-free - platform and guest operating systems may eventually require a UEFI - environment. OVMF provides that next generation firmware support for such - applications. - -- GUID partition tables (GPTs). MBR partition tables represent partition - offsets and sizes with 32-bit integers, in units of 512 byte sectors. This - limits the addressable portion of the disk to 2 TB. GPT represents logical - block addresses with 64 bits. - -- Liberating boot loader binaries from residing in contested and poorly defined - space between the partition table and the partitions. - -- Support for booting off disks (eg. pass-through physical SCSI devices) with a - 4kB physical and logical sector size, i.e. which don't have 512-byte block - emulation. - -- Development and testing of Secure Boot-related features in guest operating - systems. Although OVMF's Secure Boot implementation is currently not secure - against malicious UEFI drivers, UEFI applications, and guest kernels, - trusted guest code that only uses standard UEFI interfaces will find a valid - Secure Boot environment under OVMF, with working key enrollment and signature - validation. This enables development and testing of portable, Secure - Boot-related guest code. - -- Presence of non-volatile UEFI variables. This furthers development and - testing of OS installers, UEFI boot loaders, and unique, dependent guest OS - features. For example, an efivars-backed pstore (persistent storage) - file system works under Linux. - -- Altogether, a near production-level UEFI environment for virtual machines - when Secure Boot is not required. - -Scope ------ - -UEFI and especially Secure Boot have been topics fraught with controversy and -political activism. This paper sidesteps these aspects and strives to focus on -use cases, hands-on information for end users, and technical details. - -Unless stated otherwise, the expression "X supports Y" means "X is technically -compatible with interfaces provided or required by Y". It does not imply -support as an activity performed by natural persons or companies. - -We discuss the status of OVMF at a state no earlier than edk2 SVN revision -16158. The paper concentrates on upstream projects and communities, but -occasionally it pans out about OVMF as it is planned to be shipped (as -Technical Preview) in Red Hat Enterprise Linux 7.1. Such digressions are marked -with the [RHEL] margin notation. - -Although other VMMs and accelerators are known to support (or plan to support) -OVMF to various degrees -- for example, VirtualBox, Xen, BHyVe --, we'll -emphasize OVMF on qemu/KVM, because QEMU and KVM have always been Red Hat's -focus wrt. OVMF. - -The recommended upstream QEMU version is 2.1+. The recommended host Linux -kernel (KVM) version is 3.10+. The recommended QEMU machine type is -"qemu-system-x86_64 -M pc-i440fx-2.1" or later. - -The term "TianoCore" is used interchangeably with "edk2" in this paper. - -Example qemu invocation ------------------------ - -The following commands give a quick foretaste of installing a UEFI operating -system on OVMF, relying only on upstream edk2 and qemu. - -- Clone and build OVMF: - - git clone https://github.com/tianocore/edk2.git - cd edk2 - nice OvmfPkg/build.sh -a X64 -n $(getconf _NPROCESSORS_ONLN) - - (Note that this ad-hoc build will not include the Secure Boot feature.) - -- The build output file, "OVMF.fd", includes not only the executable firmware - code, but the non-volatile variable store as well. For this reason, make a - VM-specific copy of the build output (the variable store should be private to - the virtual machine): - - cp Build/OvmfX64/DEBUG_GCC4?/FV/OVMF.fd fedora.flash - - (The variable store and the firmware executable are also available in the - build output as separate files: "OVMF_VARS.fd" and "OVMF_CODE.fd". This - enables central management and updates of the firmware executable, while each - virtual machine can retain its own variable store.) - -- Download a Fedora LiveCD: - - wget https://dl.fedoraproject.org/pub/fedora/linux/releases/20/Live/x86_64/Fedora-Live-Xfce-x86_64-20-1.iso - -- Create a virtual disk (qcow2 format, 20 GB in size): - - qemu-img create -f qcow2 fedora.img 20G - -- Create the following qemu wrapper script under the name "fedora.sh": - - # Basic virtual machine properties: a recent i440fx machine type, KVM - # acceleration, 2048 MB RAM, two VCPUs. - OPTS="-M pc-i440fx-2.1 -enable-kvm -m 2048 -smp 2" - - # The OVMF binary, including the non-volatile variable store, appears as a - # "normal" qemu drive on the host side, and it is exposed to the guest as a - # persistent flash device. - OPTS="$OPTS -drive if=pflash,format=raw,file=fedora.flash" - - # The hard disk is exposed to the guest as a virtio-block device. OVMF has a - # driver stack that supports such a disk. We specify this disk as first boot - # option. OVMF recognizes the boot order specification. - OPTS="$OPTS -drive id=disk0,if=none,format=qcow2,file=fedora.img" - OPTS="$OPTS -device virtio-blk-pci,drive=disk0,bootindex=0" - - # The Fedora installer disk appears as an IDE CD-ROM in the guest. This is - # the 2nd boot option. - OPTS="$OPTS -drive id=cd0,if=none,format=raw,readonly" - OPTS="$OPTS,file=Fedora-Live-Xfce-x86_64-20-1.iso" - OPTS="$OPTS -device ide-cd,bus=ide.1,drive=cd0,bootindex=1" - - # The following setting enables S3 (suspend to RAM). OVMF supports S3 - # suspend/resume. - OPTS="$OPTS -global PIIX4_PM.disable_s3=0" - - # OVMF emits a number of info / debug messages to the QEMU debug console, at - # ioport 0x402. We configure qemu so that the debug console is indeed - # available at that ioport. We redirect the host side of the debug console to - # a file. - OPTS="$OPTS -global isa-debugcon.iobase=0x402 -debugcon file:fedora.ovmf.log" - - # QEMU accepts various commands and queries from the user on the monitor - # interface. Connect the monitor with the qemu process's standard input and - # output. - OPTS="$OPTS -monitor stdio" - - # A USB tablet device in the guest allows for accurate pointer tracking - # between the host and the guest. - OPTS="$OPTS -device piix3-usb-uhci -device usb-tablet" - - # Provide the guest with a virtual network card (virtio-net). - # - # Normally, qemu provides the guest with a UEFI-conformant network driver - # from the iPXE project, in the form of a PCI expansion ROM. For this test, - # we disable the expansion ROM and allow OVMF's built-in virtio-net driver to - # take effect. - # - # On the host side, we use the SLIRP ("user") network backend, which has - # relatively low performance, but it doesn't require extra privileges from - # the user executing qemu. - OPTS="$OPTS -netdev id=net0,type=user" - OPTS="$OPTS -device virtio-net-pci,netdev=net0,romfile=" - - # A Spice QXL GPU is recommended as the primary VGA-compatible display - # device. It is a full-featured virtual video card, with great operating - # system driver support. OVMF supports it too. - OPTS="$OPTS -device qxl-vga" - - qemu-system-x86_64 $OPTS - -- Start the Fedora guest: - - sh fedora.sh - -- The above command can be used for both installation and later boots of the - Fedora guest. - -- In order to verify basic OVMF network connectivity: - - - Assuming that the non-privileged user running qemu belongs to group G - (where G is a numeric identifier), ensure as root on the host that the - group range in file "/proc/sys/net/ipv4/ping_group_range" includes G. - - - As the non-privileged user, boot the guest as usual. - - - On the TianoCore splash screen, press ESC. - - - Navigate to Boot Manager | EFI Internal Shell - - - In the UEFI Shell, issue the following commands: - - ifconfig -s eth0 dhcp - ping A.B.C.D - - where A.B.C.D is a public IPv4 address in dotted decimal notation that your - host can reach. - - - Type "quit" at the (qemu) monitor prompt. - -Installation of OVMF guests with virt-manager and virt-install --------------------------------------------------------------- - -(1) Assuming OVMF has been installed on the host with the following files: - - /usr/share/OVMF/OVMF_CODE.fd - - /usr/share/OVMF/OVMF_VARS.fd - - locate the "nvram" stanza in "/etc/libvirt/qemu.conf", and edit it as - follows: - - nvram = [ "/usr/share/OVMF/OVMF_CODE.fd:/usr/share/OVMF/OVMF_VARS.fd" ] - -(2) Restart libvirtd with your Linux distribution's service management tool; - for example, - - systemctl restart libvirtd - -(3) In virt-manager, proceed with the guest installation as usual: - - select File | New Virtual Machine, - - advance to Step 5 of 5, - - in Step 5, check "Customize configuration before install", - - click Finish; - - in the customization dialog, select Overview | Firmware, and choose UEFI, - - click Apply and Begin Installation. - -(4) With virt-install: - - LDR="loader=/usr/share/OVMF/OVMF_CODE.fd,loader_ro=yes,loader_type=pflash" - virt-install \ - --name fedora20 \ - --memory 2048 \ - --vcpus 2 \ - --os-variant fedora20 \ - --boot hd,cdrom,$LDR \ - --disk size=20 \ - --disk path=Fedora-Live-Xfce-x86_64-20-1.iso,device=cdrom,bus=scsi - -(5) A popular, distribution-independent, bleeding-edge OVMF package is - available under , courtesy of Gerd Hoffmann. - - The "edk2.git-ovmf-x64" package provides the following files, among others: - - /usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd - - /usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd - - When using this package, adapt steps (1) and (4) accordingly. - -(6) Additionally, the "edk2.git-ovmf-x64" package seeks to simplify the - enablement of Secure Boot in a virtual machine (strictly for development - and testing purposes). - - - Boot the virtual machine off the CD-ROM image called - "/usr/share/edk2.git/ovmf-x64/UefiShell.iso"; before or after installing - the main guest operating system. - - - When the UEFI shell appears, issue the following commands: - - EnrollDefaultKeys.efi - reset -s - - - The EnrollDefaultKeys.efi utility enrolls the following keys: - - - A static example X.509 certificate (CN=TestCommonName) as Platform Key - and first Key Exchange Key. - - The private key matching this certificate has been destroyed (but you - shouldn't trust this statement). - - - "Microsoft Corporation KEK CA 2011" as second Key Exchange Key - (SHA1: 31:59:0b:fd:89:c9:d7:4e:d0:87:df:ac:66:33:4b:39:31:25:4b:30). - - - "Microsoft Windows Production PCA 2011" as first DB entry - (SHA1: 58:0a:6f:4c:c4:e4:b6:69:b9:eb:dc:1b:2b:3e:08:7b:80:d0:67:8d). - - - "Microsoft Corporation UEFI CA 2011" as second DB entry - (SHA1: 46:de:f6:3b:5c:e6:1c:f8:ba:0d:e2:e6:63:9c:10:19:d0:ed:14:f3). - - These keys suffice to boot released versions of popular Linux - distributions (through the shim.efi utility), and Windows 8 and Windows - Server 2012 R2, in Secure Boot mode. - -Supported guest operating systems ---------------------------------- - -Upstream OVMF does not favor some guest operating systems over others for -political or ideological reasons. However, some operating systems are harder to -obtain and/or technically more difficult to support. The general expectation is -that recent UEFI OSes should just work. Please consult the "OvmfPkg/README" -file. - -The following guest OSes were tested with OVMF: -- Red Hat Enterprise Linux 6 -- Red Hat Enterprise Linux 7 -- Fedora 18 -- Fedora 19 -- Fedora 20 -- Windows Server 2008 R2 SP1 -- Windows Server 2012 -- Windows 8 - -Notes about Windows Server 2008 R2 (paraphrasing the "OvmfPkg/README" file): - -- QEMU should be started with one of the "-device qxl-vga" and "-device VGA" - options. - -- Only one video mode, 1024x768x32, is supported at OS runtime. - - Please refer to the section about QemuVideoDxe (OVMF's built-in video driver) - for more details on this limitation. - -- The qxl-vga video card is recommended ("-device qxl-vga"). After booting the - installed guest OS, select the video card in Device Manager, and upgrade the - video driver to the QXL XDDM one. - - The QXL XDDM driver can be downloaded from - , under Guest | Windows binaries. - - This driver enables additional graphics resolutions at OS runtime, and - provides S3 (suspend/resume) capability. - -Notes about Windows Server 2012 and Windows 8: - -- QEMU should be started with the "-device qxl-vga,revision=4" option (or a - later revision, if available). - -- The guest OS's builtin video driver inherits the video mode / frame buffer - from OVMF. There's no way to change the resolution at OS runtime. - - For this reason, a platform driver has been developed for OVMF, which allows - users to change the preferred video mode in the firmware. Please refer to the - section about PlatformDxe for details. - -- It is recommended to upgrade the guest OS's video driver to the QXL WDDM one, - via Device Manager. - - Binaries for the QXL WDDM driver can be found at - (pick a version greater than or - equal to 0.6), while the source code resides at - . - - This driver enables additional graphics resolutions at OS runtime, and - provides S3 (suspend/resume) capability. - -Compatibility Support Module (CSM) ----------------------------------- - -Collaboration between SeaBIOS and OVMF developers has enabled SeaBIOS to be -built as a Compatibility Support Module, and OVMF to embed and use it. - -Benefits of a SeaBIOS CSM include: - -- The ability to boot legacy (non-UEFI) operating systems, such as legacy Linux - systems, Windows 7, OpenBSD 5.2, FreeBSD 8/9, NetBSD, DragonflyBSD, Solaris - 10/11. - -- Legacy (non-UEFI-compliant) PCI expansion ROMs, such as a VGA BIOS, mapped by - QEMU in emulated devices' ROM BARs, are loaded and executed by OVMF. - - For example, this grants the Windows Server 2008 R2 SP1 guest's native, - legacy video driver access to all modes of all QEMU video cards. - -Building the CSM target of the SeaBIOS source tree is out of scope for this -report. Additionally, upstream OVMF does not enable the CSM by default. - -Interested users and developers should look for OVMF's "-D CSM_ENABLE" -build-time option, and check out the continuous -integration repository, which provides CSM-enabled OVMF builds. - -[RHEL] The "OVMF_CODE.fd" firmware image made available on the Red Hat - Enterprise Linux 7.1 host does not include a Compatibility Support - Module, for the following reasons: - - - Virtual machines running officially supported, legacy guest operating - systems should just use the standalone SeaBIOS firmware. Firmware - selection is flexible in virtualization, see eg. "Installation of OVMF - guests with virt-manager and virt-install" above. - - - The 16-bit thunking interface between OVMF and SeaBIOS is very complex - and presents a large debugging and support burden, based on past - experience. - - - Secure Boot is incompatible with CSM. - - - Inter-project dependencies should be minimized whenever possible. - - - Using the default QXL video card, the Windows 2008 R2 SP1 guest can be - installed with its built-in, legacy video driver. Said driver will - select the only available video mode, 1024x768x32. After installation, - the video driver can be upgraded to the full-featured QXL XDDM driver. - -Phases of the boot process --------------------------- - -The PI and UEFI specifications, and Intel's UEFI and EDK II Learning and -Development materials provide ample information on PI and UEFI concepts. The -following is an absolutely minimal, rough glossary that is included only to -help readers new to PI and UEFI understand references in later, OVMF-specific -sections. We defer heavily to the official specifications and the training -materials, and frequently quote them below. - -A central concept to mention early is the GUID -- globally unique identifier. A -GUID is a 128-bit number, written as XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, -where each X stands for a hexadecimal nibble. GUIDs are used to name everything -in PI and in UEFI. Programmers introduce new GUIDs with the "uuidgen" utility, -and standards bodies standardize well-known services by positing their GUIDs. - -The boot process is roughly divided in the following phases: - -- Reset vector code. - -- SEC: Security phase. This phase is the root of firmware integrity. - -- PEI: Pre-EFI Initialization. This phase performs "minimal processor, chipset - and platform configuration for the purpose of discovering memory". Modules in - PEI collectively save their findings about the platform in a list of HOBs - (hand-off blocks). - - When developing PEI code, the Platform Initialization (PI) specification - should be consulted. - -- DXE: Driver eXecution Environment, pronounced as "Dixie". This "is the phase - where the bulk of the booting occurs: devices are enumerated and initialized, - UEFI services are supported, and protocols and drivers are implemented. Also, - the tables that create the UEFI interface are produced". - - On the PEI/DXE boundary, the HOBs produced by PEI are consumed. For example, - this is how the memory space map is configured initially. - -- BDS: Boot Device Selection. It is "responsible for determining how and where - you want to boot the operating system". - - When developing DXE and BDS code, it is mainly the UEFI specification that - should be consulted. When speaking about DXE, BDS is frequently considered to - be a part of it. - -The following concepts are tied to specific boot process phases: - -- PEIM: a PEI Module (pronounced "PIM"). A binary module running in the PEI - phase, consuming some PPIs and producing other PPIs, and producing HOBs. - -- PPI: PEIM-to-PEIM interface. A structure of function pointers and related - data members that establishes a PEI service, or an instance of a PEI service. - PPIs are identified by GUID. - - An example is EFI_PEI_S3_RESUME2_PPI (6D582DBC-DB85-4514-8FCC-5ADF6227B147). - -- DXE driver: a binary module running in the DXE and BDS phases, consuming some - protocols and producing other protocols. - -- Protocol: A structure of function pointers and related data members that - establishes a DXE service, or an instance of a DXE service. Protocols are - identified by GUID. - - An example is EFI_BLOCK_IO_PROTOCOL (964E5B21-6459-11D2-8E39-00A0C969723B). - -- Architectural protocols: a set of standard protocols that are foundational to - the working of a UEFI system. Each architectural protocol has at most one - instance. Architectural protocols are implemented by a subset of DXE drivers. - DXE drivers explicitly list the set of protocols (including architectural - protocols) that they need to work. UEFI drivers can only be loaded once all - architectural protocols have become available during the DXE phase. - - An example is EFI_VARIABLE_WRITE_ARCH_PROTOCOL - (6441F818-6362-4E44-B570-7DBA31DD2453). - -Project structure ------------------ - -The term "OVMF" usually denotes the project (community and development effort) -that provide and maintain the subject matter UEFI firmware for virtual -machines. However the term is also frequently applied to the firmware binary -proper that a virtual machine executes. - -OVMF emerges as a compilation of several modules from the edk2 source -repository. "edk2" stands for EFI Development Kit II; it is a "modern, -feature-rich, cross-platform firmware development environment for the UEFI and -PI specifications". - -The composition of OVMF is dictated by the following build control files: - - OvmfPkg/OvmfPkgIa32.dsc - OvmfPkg/OvmfPkgIa32.fdf - - OvmfPkg/OvmfPkgIa32X64.dsc - OvmfPkg/OvmfPkgIa32X64.fdf - - OvmfPkg/OvmfPkgX64.dsc - OvmfPkg/OvmfPkgX64.fdf - -The format of these files is described in the edk2 DSC and FDF specifications. -Roughly, the DSC file determines: -- library instance resolutions for library class requirements presented by the - modules to be compiled, -- the set of modules to compile. - -The FDF file roughly determines: -- what binary modules (compilation output files, precompiled binaries, graphics - image files, verbatim binary sections) to include in the firmware image, -- how to lay out the firmware image. - -The Ia32 flavor of these files builds a firmware where both PEI and DXE phases -are 32-bit. The Ia32X64 flavor builds a firmware where the PEI phase consists -of 32-bit modules, and the DXE phase is 64-bit. The X64 flavor builds a purely -64-bit firmware. - -The word size of the DXE phase must match the word size of the runtime OS -- a -32-bit DXE can't cooperate with a 64-bit OS, and a 64-bit DXE can't work a -32-bit OS. - -OVMF pulls together modules from across the edk2 tree. For example: - -- common drivers and libraries that are platform independent are usually - located under MdeModulePkg and MdePkg, - -- common but hardware-specific drivers and libraries that match QEMU's - pc-i440fx-* machine type are pulled in from IntelFrameworkModulePkg, - PcAtChipsetPkg and UefiCpuPkg, - -- the platform independent UEFI Shell is built from ShellPkg, - -- OvmfPkg includes drivers and libraries that are useful for virtual machines - and may or may not be specific to QEMU's pc-i440fx-* machine type. - -Platform Configuration Database (PCD) -------------------------------------- - -Like the "Phases of the boot process" section, this one introduces a concept in -very raw form. We defer to the PCD related edk2 specifications, and we won't -discuss implementation details here. Our purpose is only to offer the reader a -usable (albeit possibly inaccurate) definition, so that we can refer to PCDs -later on. - -Colloquially, when we say "PCD", we actually mean "PCD entry"; that is, an -entry stored in the Platform Configuration Database. - -The Platform Configuration Database is -- a firmware-wide -- name-value store -- of scalars and buffers -- where each entry may be - - build-time constant, or - - run-time dynamic, or - - theoretically, a middle option: patchable in the firmware file itself, - using a dedicated tool. (OVMF does not utilize externally patchable - entries.) - -A PCD entry is declared in the DEC file of the edk2 top-level Package directory -whose modules (drivers and libraries) are the primary consumers of the PCD -entry. (See for example OvmfPkg/OvmfPkg.dec). Basically, a PCD in a DEC file -exposes a simple customization point. - -Interest in a PCD entry is communicated to the build system by naming the PCD -entry in the INF file of the interested module (application, driver or -library). The module may read and -- dependent on the PCD entry's category -- -write the PCD entry. - -Let's investigate the characteristics of the Database and the PCD entries. - -- Firmware-wide: technically, all modules may access all entries they are - interested in, assuming they advertise their interest in their INF files. - With careful design, PCDs enable inter-driver propagation of (simple) system - configuration. PCDs are available in both PEI and DXE. - - (UEFI drivers meant to be portable (ie. from third party vendors) are not - supposed to use PCDs, since PCDs qualify internal to the specific edk2 - firmware in question.) - -- Name-value store of scalars and buffers: each PCD has a symbolic name, and a - fixed scalar type (UINT16, UINT32 etc), or VOID* for buffers. Each PCD entry - belongs to a namespace, where a namespace is (obviously) a GUID, defined in - the DEC file. - -- A DEC file can permit several categories for a PCD: - - build-time constant ("FixedAtBuild"), - - patchable in the firmware image ("PatchableInModule", unused in OVMF), - - runtime modifiable ("Dynamic"). - -The platform description file (DSC) of a top-level Package directory may choose -the exact category for a given PCD entry that its modules wish to use, and -assign a default (or constant) initial value to it. - -In addition, the edk2 build system too can initialize PCD entries to values -that it calculates while laying out the flash device image. Such PCD -assignments are described in the FDF control file. - -Firmware image structure ------------------------- - -(We assume the common X64 choice for both PEI and DXE, and the default DEBUG -build target.) - -The OvmfPkg/OvmfPkgX64.fdf file defines the following layout for the flash -device image "OVMF.fd": - - Description Compression type Size - ------------------------------ ---------------------- ------- - Non-volatile data storage open-coded binary data 128 KB - Variable store 56 KB - Event log 4 KB - Working block 4 KB - Spare area 64 KB - - FVMAIN_COMPACT uncompressed 1712 KB - FV Firmware File System file LZMA compressed - PEIFV uncompressed 896 KB - individual PEI modules uncompressed - DXEFV uncompressed 8192 KB - individual DXE modules uncompressed - - SECFV uncompressed 208 KB - SEC driver - reset vector code - -The top-level image consists of three regions (three firmware volumes): -- non-volatile data store (128 KB), -- main firmware volume (FVMAIN_COMPACT, 1712 KB), -- firmware volume containing the reset vector code and the SEC phase code (208 - KB). - -In total, the OVMF.fd file has size 128 KB + 1712 KB + 208 KB == 2 MB. - -(1) The firmware volume with non-volatile data store (128 KB) has the following - internal structure, in blocks of 4 KB: - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ L: event log - LIVE | varstore |L|W| W: working block - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - SPARE | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - The first half of this firmware volume is "live", while the second half is - "spare". The spare half is important when the variable driver reclaims - unused storage and reorganizes the variable store. - - The live half dedicates 14 blocks (56 KB) to the variable store itself. On - top of those, one block is set aside for an event log, and one block is - used as the working block of the fault tolerant write protocol. Fault - tolerant writes are used to recover from an occasional (virtual) power loss - during variable updates. - - The blocks in this firmware volume are accessed, in stacking order from - least abstract to most abstract, by: - - - EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL (provided by - OvmfPkg/QemuFlashFvbServicesRuntimeDxe), - - - EFI_FAULT_TOLERANT_WRITE_PROTOCOL (provided by - MdeModulePkg/Universal/FaultTolerantWriteDxe), - - - architectural protocols instrumental to the runtime UEFI variable - services: - - EFI_VARIABLE_ARCH_PROTOCOL, - - EFI_VARIABLE_WRITE_ARCH_PROTOCOL. - - In a non-secure boot build, the DXE driver providing these architectural - protocols is MdeModulePkg/Universal/Variable/RuntimeDxe. In a secure boot - build, where authenticated variables are available, the DXE driver - offering these protocols is SecurityPkg/VariableAuthenticated/RuntimeDxe. - -(2) The main firmware volume (FVMAIN_COMPACT, 1712 KB) embeds further firmware - volumes. The outermost layer is a Firmware File System (FFS), carrying a - single file. This file holds an LZMA-compressed section, which embeds two - firmware volumes: PEIFV (896 KB) with PEIMs, and DXEFV (8192 KB) with DXE - and UEFI drivers. - - This scheme enables us to build 896 KB worth of PEI drivers and 8192 KB - worth of DXE and UEFI drivers, compress them all with LZMA in one go, and - store the compressed result in 1712 KB, saving room in the flash device. - -(3) The SECFV firmware volume (208 KB) is not compressed. It carries the - "volume top file" with the reset vector code, to end at 4 GB in - guest-physical address space, and the SEC phase driver (OvmfPkg/Sec). - - The last 16 bytes of the volume top file (mapped directly under 4 GB) - contain a NOP slide and a jump instruction. This is where QEMU starts - executing the firmware, at address 0xFFFF_FFF0. The reset vector and the - SEC driver run from flash directly. - - The SEC driver locates FVMAIN_COMPACT in the flash, and decompresses the - main firmware image to RAM. The rest of OVMF (PEI, DXE, BDS phases) run - from RAM. - -As already mentioned, the OVMF.fd file is mapped by qemu's -"hw/block/pflash_cfi01.c" device just under 4 GB in guest-physical address -space, according to the command line option - - -drive if=pflash,format=raw,file=fedora.flash - -(refer to the Example qemu invocation). This is a "ROMD device", which can -switch out of "ROMD mode" and back into it. - -Namely, in the default ROMD mode, the guest-physical address range backed by -the flash device reads and executes as ROM (it does not trap from KVM to QEMU). -The first write access in this mode traps to QEMU, and flips the device out of -ROMD mode. - -In non-ROMD mode, the flash chip is programmed by storing CFI (Common Flash -Interface) command values at the flash-covered addresses; both reads and writes -trap to QEMU, and the flash contents are modified and synchronized to the -host-side file. A special CFI command flips the flash device back to ROMD mode. - -Qemu implements the above based on the KVM_CAP_READONLY_MEM / KVM_MEM_READONLY -KVM features, and OVMF puts it to use in its EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL -implementation, under "OvmfPkg/QemuFlashFvbServicesRuntimeDxe". - -IMPORTANT: Never pass OVMF.fd to qemu with the -bios option. That option maps -the firmware image as ROM into the guest's address space, and forces OVMF to -emulate non-volatile variables with a fallback driver that is bound to have -insufficient and confusing semantics. - -The 128 KB firmware volume with the variable store, discussed under (1), is -also built as a separate host-side file, named "OVMF_VARS.fd". The "rest" is -built into a third file, "OVMF_CODE.fd", which is only 1920 KB in size. The -variable store is mapped into its usual location, at 4 GB - 2 MB = 0xFFE0_0000, -through the following qemu options: - - -drive if=pflash,format=raw,readonly,file=OVMF_CODE.fd \ - -drive if=pflash,format=raw,file=fedora.varstore.fd - -This way qemu configures two flash chips consecutively, with start addresses -growing downwards, which is transparent to OVMF. - -[RHEL] Red Hat Enterprise Linux 7.1 ships a Secure Boot-enabled, X64, DEBUG - firmware only. Furthermore, only the split files ("OVMF_VARS.fd" and - "OVMF_CODE.fd") are available. - -S3 (suspend to RAM and resume) ------------------------------- - -As noted in Example qemu invocation, the - - -global PIIX4_PM.disable_s3=0 - -command line option tells qemu and OVMF if the user would like to enable S3 -support. (This is corresponds to the /domain/pm/suspend-to-mem/@enabled libvirt -domain XML attribute.) - -Implementing / orchestrating S3 was a considerable community effort in OVMF. A -detailed description exceeds the scope of this report; we only make a few -statements. - -(1) S3-related PPIs and protocols are well documented in the PI specification. - -(2) Edk2 contains most modules that are needed to implement S3 on a given - platform. One abstraction that is central to the porting / extending of the - S3-related modules to a new platform is the LockBox library interface, - which a specific platform can fill in by implementing its own LockBox - library instance. - - The LockBox library provides a privileged name-value store (to be addressed - by GUIDs). The privilege separation stretches between the firmware and the - operating system. That is, the S3-related machinery of the firmware saves - some items in the LockBox securely, under well-known GUIDs, before booting - the operating system. During resume (which is a form of warm reset), the - firmware is activated again, and retrieves items from the LockBox. Before - jumping to the OS's resume vector, the LockBox is secured again. - - We'll return to this later when we separately discuss SMRAM and SMM. - -(3) During resume, the DXE and later phases are never reached; only the reset - vector, and the SEC and PEI phases of the firmware run. The platform is - supposed to detect a resume in progress during PEI, and to store that fact - in the BootMode field of the Phase Handoff Information Table (PHIT) HOB. - OVMF keys this off the CMOS, see OvmfPkg/PlatformPei. - - At the end of PEI, the DXE IPL PEIM (Initial Program Load PEI Module, see - MdeModulePkg/Core/DxeIplPeim) examines the Boot Mode, and if it says "S3 - resume in progress", then the IPL branches to the PEIM that exports - EFI_PEI_S3_RESUME2_PPI (provided by UefiCpuPkg/Universal/Acpi/S3Resume2Pei) - rather than loading the DXE core. - - S3Resume2Pei executes the technical steps of the resumption, relying on the - contents of the LockBox. - -(4) During first boot (or after a normal platform reset), when DXE does run, - hardware drivers in the DXE phase are encouraged to "stash" their hardware - configuration steps (eg. accesses to PCI config space, I/O ports, memory - mapped addresses, and so on) in a centrally maintained, so called "S3 boot - script". Hardware accesses are represented with opcodes of a special binary - script language. - - This boot script is to be replayed during resume, by S3Resume2Pei. The - general goal is to bring back hardware devices -- which have been powered - off during suspend -- to their original after-first-boot state, and in - particular, to do so quickly. - - At the moment, OVMF saves only one opcode in the S3 resume boot script: an - INFORMATION opcode, with contents 0xDEADBEEF (in network byte order). The - consensus between Linux developers seems to be that boot firmware is only - responsible for restoring basic chipset state, which OVMF does during PEI - anyway, independently of S3 vs. normal reset. (One example is the power - management registers of the i440fx chipset.) Device and peripheral state is - the responsibility of the runtime operating system. - - Although an experimental OVMF S3 boot script was at one point captured for - the virtual Cirrus VGA card, such a boot script cannot follow eg. video - mode changes effected by the OS. Hence the operating system can never avoid - restoring device state, and most Linux display drivers (eg. stdvga, QXL) - already cover S3 resume fully. - - The XDDM and WDDM driver models used under Windows OSes seem to recognize - this notion of runtime OS responsibility as well. (See the list of OSes - supported by OVMF in a separate section.) - -(5) The S3 suspend/resume data flow in OVMF is included here tersely, for - interested developers. - - (a) BdsLibBootViaBootOption() - EFI_ACPI_S3_SAVE_PROTOCOL [AcpiS3SaveDxe] - - saves ACPI S3 Context to LockBox ---------------------+ - (including FACS address -- FACS ACPI table | - contains OS waking vector) | - | - - prepares boot script: | - EFI_S3_SAVE_STATE_PROTOCOL.Write() [S3SaveStateDxe] | - S3BootScriptLib [PiDxeS3BootScriptLib] | - - opcodes & arguments are saved in NVS. --+ | - | | - - issues a notification by installing | | - EFI_DXE_SMM_READY_TO_LOCK_PROTOCOL | | - | | - (b) EFI_S3_SAVE_STATE_PROTOCOL [S3SaveStateDxe] | | - S3BootScriptLib [PiDxeS3BootScriptLib] | | - - closes script with special opcode <---------+ | - - script is available in non-volatile memory | - via PcdS3BootScriptTablePrivateDataPtr --+ | - | | - BootScriptExecutorDxe | | - S3BootScriptLib [PiDxeS3BootScriptLib] | | - - Knows about boot script location by <----+ | - synchronizing with the other library | - instance via | - PcdS3BootScriptTablePrivateDataPtr. | - - Copies relocated image of itself to | - reserved memory. --------------------------------+ | - - Saved image contains pointer to boot script. ---|--+ | - | | | - Runtime: | | | - | | | - (c) OS is booted, writes OS waking vector to FACS, | | | - suspends machine | | | - | | | - S3 Resume (PEI): | | | - | | | - (d) PlatformPei sets S3 Boot Mode based on CMOS | | | - | | | - (e) DXE core is skipped and EFI_PEI_S3_RESUME2 is | | | - called as last step of PEI | | | - | | | - (f) S3Resume2Pei retrieves from LockBox: | | | - - ACPI S3 Context (path to FACS) <------------------|--|--+ - | | | - +------------------|--|--+ - - Boot Script Executor Image <----------------------+ | | - | | - (g) BootScriptExecutorDxe | | - S3BootScriptLib [PiDxeS3BootScriptLib] | | - - executes boot script <-----------------------------+ | - | - (h) OS waking vector available from ACPI S3 Context / FACS <--+ - is called - -A comprehensive memory map of OVMF ----------------------------------- - -The following section gives a detailed analysis of memory ranges below 4 GB -that OVMF statically uses. - -In the rightmost column, the PCD entry is identified by which the source refers -to the address or size in question. - -The flash-covered range has been discussed previously in "Firmware image -structure", therefore we include it only for completeness. Due to the fact that -this range is always backed by a memory mapped device (and never RAM), it is -unaffected by S3 (suspend to RAM and resume). - -+--------------------------+ 4194304 KB -| | -| SECFV | size: 208 KB -| | -+--------------------------+ 4194096 KB -| | -| FVMAIN_COMPACT | size: 1712 KB -| | -+--------------------------+ 4192384 KB -| | -| variable store | size: 64 KB PcdFlashNvStorageFtwSpareSize -| spare area | -| | -+--------------------------+ 4192320 KB PcdOvmfFlashNvStorageFtwSpareBase -| | -| FTW working block | size: 4 KB PcdFlashNvStorageFtwWorkingSize -| | -+--------------------------+ 4192316 KB PcdOvmfFlashNvStorageFtwWorkingBase -| | -| Event log of | size: 4 KB PcdOvmfFlashNvStorageEventLogSize -| non-volatile storage | -| | -+--------------------------+ 4192312 KB PcdOvmfFlashNvStorageEventLogBase -| | -| variable store | size: 56 KB PcdFlashNvStorageVariableSize -| | -+--------------------------+ 4192256 KB PcdOvmfFlashNvStorageVariableBase - -The flash-mapped image of OVMF.fd covers the entire structure above (2048 KB). - -When using the split files, the address 4192384 KB -(PcdOvmfFlashNvStorageFtwSpareBase + PcdFlashNvStorageFtwSpareSize) is the -boundary between the mapped images of OVMF_VARS.fd (56 KB + 4 KB + 4 KB + 64 KB -= 128 KB) and OVMF_CODE.fd (1712 KB + 208 KB = 1920 KB). - -With regard to RAM that is statically used by OVMF, S3 (suspend to RAM and -resume) complicates matters. Many ranges have been introduced only to support -S3, hence for all ranges below, the following questions will be audited: - -(a) when and how a given range is initialized after first boot of the VM, -(b) how it is protected from memory allocations during DXE, -(c) how it is protected from the OS, -(d) how it is accessed on the S3 resume path, -(e) how it is accessed on the warm reset path. - -Importantly, the term "protected" is meant as protection against inadvertent -reallocations and overwrites by co-operating DXE and OS modules. It does not -imply security against malicious code. - -+--------------------------+ 17408 KB -| | -|DXEFV from FVMAIN_COMPACT | size: 8192 KB PcdOvmfDxeMemFvSize -| decompressed firmware | -| volume with DXE modules | -| | -+--------------------------+ 9216 KB PcdOvmfDxeMemFvBase -| | -|PEIFV from FVMAIN_COMPACT | size: 896 KB PcdOvmfPeiMemFvSize -| decompressed firmware | -| volume with PEI modules | -| | -+--------------------------+ 8320 KB PcdOvmfPeiMemFvBase -| | -| permanent PEI memory for | size: 32 KB PcdS3AcpiReservedMemorySize -| the S3 resume path | -| | -+--------------------------+ 8288 KB PcdS3AcpiReservedMemoryBase -| | -| temporary SEC/PEI heap | size: 32 KB PcdOvmfSecPeiTempRamSize -| and stack | -| | -+--------------------------+ 8256 KB PcdOvmfSecPeiTempRamBase -| | -| unused | size: 32 KB -| | -+--------------------------+ 8224 KB -| | -| SEC's table of | size: 4 KB PcdGuidedExtractHandlerTableSize -| GUIDed section handlers | -| | -+--------------------------+ 8220 KB PcdGuidedExtractHandlerTableAddress -| | -| LockBox storage | size: 4 KB PcdOvmfLockBoxStorageSize -| | -+--------------------------+ 8216 KB PcdOvmfLockBoxStorageBase -| | -| early page tables on X64 | size: 24 KB PcdOvmfSecPageTablesSize -| | -+--------------------------+ 8192 KB PcdOvmfSecPageTablesBase - -(1) Early page tables on X64: - - (a) when and how it is initialized after first boot of the VM - - The range is filled in during the SEC phase - [OvmfPkg/ResetVector/Ia32/PageTables64.asm]. The CR3 register is verified - against the base address in SecCoreStartupWithStack() - [OvmfPkg/Sec/SecMain.c]. - - (b) how it is protected from memory allocations during DXE - - If S3 was enabled on the QEMU command line (see "-global - PIIX4_PM.disable_s3=0" earlier), then InitializeRamRegions() - [OvmfPkg/PlatformPei/MemDetect.c] protects the range with an AcpiNVS memory - allocation HOB, in PEI. - - If S3 was disabled, then this range is not protected. DXE's own page tables - are first built while still in PEI (see HandOffToDxeCore() - [MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c]). Those tables are located - in permanent PEI memory. After CR3 is switched over to them (which occurs - before jumping to the DXE core entry point), we don't have to preserve the - initial tables. - - (c) how it is protected from the OS - - If S3 is enabled, then (1b) reserves it from the OS too. - - If S3 is disabled, then the range needs no protection. - - (d) how it is accessed on the S3 resume path - - It is rewritten same as in (1a), which is fine because (1c) reserved it. - - (e) how it is accessed on the warm reset path - - It is rewritten same as in (1a). - -(2) LockBox storage: - - (a) when and how it is initialized after first boot of the VM - - InitializeRamRegions() [OvmfPkg/PlatformPei/MemDetect.c] zeroes out the - area during PEI. This is correct but not strictly necessary, since on first - boot the area is zero-filled anyway. - - The LockBox signature of the area is filled in by the PEI module or DXE - driver that has been linked against OVMF's LockBoxLib and is run first. The - signature is written in LockBoxLibInitialize() - [OvmfPkg/Library/LockBoxLib/LockBoxLib.c]. - - Any module calling SaveLockBox() [OvmfPkg/Library/LockBoxLib/LockBoxLib.c] - will co-populate this area. - - (b) how it is protected from memory allocations during DXE - - If S3 is enabled, then InitializeRamRegions() - [OvmfPkg/PlatformPei/MemDetect.c] protects the range as AcpiNVS. - - Otherwise, the range is covered with a BootServicesData memory allocation - HOB. - - (c) how it is protected from the OS - - If S3 is enabled, then (2b) protects it sufficiently. - - Otherwise the range requires no runtime protection, and the - BootServicesData allocation type from (2b) ensures that the range will be - released to the OS. - - (d) how it is accessed on the S3 resume path - - The S3 Resume PEIM restores data from the LockBox, which has been correctly - protected in (2c). - - (e) how it is accessed on the warm reset path - - InitializeRamRegions() [OvmfPkg/PlatformPei/MemDetect.c] zeroes out the - range during PEI, effectively emptying the LockBox. Modules will - re-populate the LockBox as described in (2a). - -(3) SEC's table of GUIDed section handlers - - (a) when and how it is initialized after first boot of the VM - - The following two library instances are linked into SecMain: - - IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib, - - MdePkg/Library/BaseExtractGuidedSectionLib. - - The first library registers its LZMA decompressor plugin (which is a called - a "section handler") by calling the second library: - - LzmaDecompressLibConstructor() [GuidedSectionExtraction.c] - ExtractGuidedSectionRegisterHandlers() [BaseExtractGuidedSectionLib.c] - - The second library maintains its table of registered "section handlers", to - be indexed by GUID, in this fixed memory area, independently of S3 - enablement. - - (The decompression of FVMAIN_COMPACT's FFS file section that contains the - PEIFV and DXEFV firmware volumes occurs with the LZMA decompressor - registered above. See (6) and (7) below.) - - (b) how it is protected from memory allocations during DXE - - There is no need to protect this area from DXE: because nothing else in - OVMF links against BaseExtractGuidedSectionLib, the area loses its - significance as soon as OVMF progresses from SEC to PEI, therefore DXE is - allowed to overwrite the region. - - (c) how it is protected from the OS - - When S3 is enabled, we cover the range with an AcpiNVS memory allocation - HOB in InitializeRamRegions(). - - When S3 is disabled, the range is not protected. - - (d) how it is accessed on the S3 resume path - - The table of registered section handlers is again managed by - BaseExtractGuidedSectionLib linked into SecMain exclusively. Section - handler registrations update the table in-place (based on GUID matches). - - (e) how it is accessed on the warm reset path - - If S3 is enabled, then the OS won't damage the table (due to (3c)), thus - see (3d). - - If S3 is disabled, then the OS has most probably overwritten the range with - its own data, hence (3a) -- complete reinitialization -- will come into - effect, based on the table signature check in BaseExtractGuidedSectionLib. - -(4) temporary SEC/PEI heap and stack - - (a) when and how it is initialized after first boot of the VM - - The range is configured in [OvmfPkg/Sec/X64/SecEntry.S] and - SecCoreStartupWithStack() [OvmfPkg/Sec/SecMain.c]. The stack half is read & - written by the CPU transparently. The heap half is used for memory - allocations during PEI. - - Data is migrated out (to permanent PEI stack & memory) in (or soon after) - PublishPeiMemory() [OvmfPkg/PlatformPei/MemDetect.c]. - - (b) how it is protected from memory allocations during DXE - - It is not necessary to protect this range during DXE because its use ends - still in PEI. - - (c) how it is protected from the OS - - If S3 is enabled, then InitializeRamRegions() - [OvmfPkg/PlatformPei/MemDetect.c] reserves it as AcpiNVS. - - If S3 is disabled, then the range doesn't require protection. - - (d) how it is accessed on the S3 resume path - - Same as in (4a), except the target area of the migration triggered by - PublishPeiMemory() [OvmfPkg/PlatformPei/MemDetect.c] is different -- see - (5). - - (e) how it is accessed on the warm reset path - - Same as in (4a). The stack and heap halves both may contain garbage, but it - doesn't matter. - -(5) permanent PEI memory for the S3 resume path - - (a) when and how it is initialized after first boot of the VM - - No particular initialization or use. - - (b) how it is protected from memory allocations during DXE - - We don't need to protect this area during DXE. - - (c) how it is protected from the OS - - When S3 is enabled, InitializeRamRegions() - [OvmfPkg/PlatformPei/MemDetect.c] makes sure the OS stays away by covering - the range with an AcpiNVS memory allocation HOB. - - When S3 is disabled, the range needs no protection. - - (d) how it is accessed on the S3 resume path - - PublishPeiMemory() installs the range as permanent RAM for PEI. The range - will serve as stack and will satisfy allocation requests during the rest of - PEI. OS data won't overlap due to (5c). - - (e) how it is accessed on the warm reset path - - Same as (5a). - -(6) PEIFV -- decompressed firmware volume with PEI modules - - (a) when and how it is initialized after first boot of the VM - - DecompressMemFvs() [OvmfPkg/Sec/SecMain.c] populates the area, by - decompressing the flash-mapped FVMAIN_COMPACT volume's contents. (Refer to - "Firmware image structure".) - - (b) how it is protected from memory allocations during DXE - - When S3 is disabled, PeiFvInitialization() [OvmfPkg/PlatformPei/Fv.c] - covers the range with a BootServicesData memory allocation HOB. - - When S3 is enabled, the same is coverage is ensured, just with the stronger - AcpiNVS memory allocation type. - - (c) how it is protected from the OS - - When S3 is disabled, it is not necessary to keep the range from the OS. - - Otherwise the AcpiNVS type allocation from (6b) provides coverage. - - (d) how it is accessed on the S3 resume path - - Rather than decompressing it again from FVMAIN_COMPACT, GetS3ResumePeiFv() - [OvmfPkg/Sec/SecMain.c] reuses the protected area for parsing / execution - from (6c). - - (e) how it is accessed on the warm reset path - - Same as (6a). - -(7) DXEFV -- decompressed firmware volume with DXE modules - - (a) when and how it is initialized after first boot of the VM - - Same as (6a). - - (b) how it is protected from memory allocations during DXE - - PeiFvInitialization() [OvmfPkg/PlatformPei/Fv.c] covers the range with a - BootServicesData memory allocation HOB. - - (c) how it is protected from the OS - - The OS is allowed to release and reuse this range. - - (d) how it is accessed on the S3 resume path - - It's not; DXE never runs during S3 resume. - - (e) how it is accessed on the warm reset path - - Same as in (7a). - -Known Secure Boot limitations ------------------------------ - -Under "Motivation" we've mentioned that OVMF's Secure Boot implementation is -not suitable for production use yet -- it's only good for development and -testing of standards-conformant, non-malicious guest code (UEFI and operating -system alike). - -Now that we've examined the persistent flash device, the workings of S3, and -the memory map, we can discuss two currently known shortcomings of OVMF's -Secure Boot that in fact make it insecure. (Clearly problems other than these -two might exist; the set of issues considered here is not meant to be -exhaustive.) - -One trait of Secure Boot is tamper-evidence. Secure Boot may not prevent -malicious modification of software components (for example, operating system -drivers), but by being the root of integrity on a platform, it can catch (or -indirectly contribute to catching) unauthorized changes, by way of signature -and certificate checks at the earliest phases of boot. - -If an attacker can tamper with key material stored in authenticated and/or -boot-time only persistent variables (for example, PK, KEK, db, dbt, dbx), then -the intended security of this scheme is compromised. The UEFI 2.4A -specification says - -- in section 28.3.4: - - Platform Keys: - - The public key must be stored in non-volatile storage which is tamper and - delete resistant. - - Key Exchange Keys: - - The public key must be stored in non-volatile storage which is tamper - resistant. - -- in section 28.6.1: - - The signature database variables db, dbt, and dbx must be stored in - tamper-resistant non-volatile storage. - -(1) The combination of QEMU, KVM, and OVMF does not provide this kind of - resistance. The variable store in the emulated flash chip is directly - accessible to, and reprogrammable by, UEFI drivers, applications, and - operating systems. - -(2) Under "S3 (suspend to RAM and resume)" we pointed out that the LockBox - storage must be similarly secure and tamper-resistant. - - On the S3 resume path, the PEIM providing EFI_PEI_S3_RESUME2_PPI - (UefiCpuPkg/Universal/Acpi/S3Resume2Pei) restores and interprets data from - the LockBox that has been saved there during boot. This PEIM, being part of - the firmware, has full access to the platform. If an operating system can - tamper with the contents of the LockBox, then at the next resume the - platform's integrity might be subverted. - - OVMF stores the LockBox in normal guest RAM (refer to the memory map - section above). Operating systems and third party UEFI drivers and UEFI - applications that respect the UEFI memory map will not inadvertently - overwrite the LockBox storage, but there's nothing to prevent eg. a - malicious kernel from modifying the LockBox. - -One means to address these issues is SMM and SMRAM (System Management Mode and -System Management RAM). - -During boot and resume, the firmware can enter and leave SMM and access SMRAM. -Before the DXE phase is left, and control is transferred to the BDS phase (when -third party UEFI drivers and applications can be loaded, and an operating -system can be loaded), SMRAM is locked in hardware, and subsequent modules -cannot access it directly. (See EFI_DXE_SMM_READY_TO_LOCK_PROTOCOL.) - -Once SMRAM has been locked, UEFI drivers and the operating system can enter SMM -by raising a System Management Interrupt (SMI), at which point trusted code -(part of the platform firmware) takes control. SMRAM is also unlocked by -platform reset, at which point the boot firmware takes control again. - -Variable store and LockBox in SMRAM ------------------------------------ - -Edk2 provides almost all components to implement the variable store and the -LockBox in SMRAM. In this section we summarize ideas for utilizing those -facilities. - -The SMRAM and SMM infrastructure in edk2 is built up as follows: - -(1) The platform hardware provides SMM / SMI / SMRAM. - - Qemu/KVM doesn't support these features currently and should implement them - in the longer term. - -(2) The platform vendor (in this case, OVMF developers) implement device - drivers for the platform's System Management Mode: - - - EFI_SMM_CONTROL2_PROTOCOL: for raising a synchronous (and/or) periodic - SMI(s); that is, for entering SMM. - - - EFI_SMM_ACCESS2_PROTOCOL: for describing and accessing SMRAM. - - These protocols are documented in the PI Specification, Volume 4. - -(3) The platform DSC file is to include the following platform-independent - modules: - - - MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf: SMM Initial Program Load - - MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf: SMM Core - -(4) At this point, modules of type DXE_SMM_DRIVER can be loaded. - - Such drivers are privileged. They run in SMM, have access to SMRAM, and are - separated and switched from other drivers through SMIs. Secure - communication between unprivileged (non-SMM) and privileged (SMM) drivers - happens through EFI_SMM_COMMUNICATION_PROTOCOL (implemented by the SMM - Core, see (3)). - - DXE_SMM_DRIVER modules must sanitize their input (coming from unprivileged - drivers) carefully. - -(5) The authenticated runtime variable services driver (for Secure Boot builds) - is located under "SecurityPkg/VariableAuthenticated/RuntimeDxe". OVMF - currently builds the driver (a DXE_RUNTIME_DRIVER module) with the - "VariableRuntimeDxe.inf" control file (refer to "OvmfPkg/OvmfPkgX64.dsc"), - which does not use SMM. - - The directory includes two more INF files: - - - VariableSmm.inf -- module type: DXE_SMM_DRIVER. A privileged driver that - runs in SMM and has access to SMRAM. - - - VariableSmmRuntimeDxe.inf -- module type: DXE_RUNTIME_DRIVER. A - non-privileged driver that implements the variable runtime services - (replacing the current "VariableRuntimeDxe.inf" file) by communicating - with the above privileged SMM half via EFI_SMM_COMMUNICATION_PROTOCOL. - -(6) An SMRAM-based LockBox implementation needs to be discussed in two parts, - because the LockBox is accessed in both PEI and DXE. - - (a) During DXE, drivers save data in the LockBox. A save operation is - layered as follows: - - - The unprivileged driver wishing to store data in the LockBox links - against the "MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxDxeLib.inf" - library instance. - - The library allows the unprivileged driver to format requests for the - privileged SMM LockBox driver (see below), and to parse responses. - - - The privileged SMM LockBox driver is built from - "MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf". This - driver has module type DXE_SMM_DRIVER and can access SMRAM. - - The driver delegates command parsing and response formatting to - "MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf". - - - The above two halves (unprivileged and privileged) mirror what we've - seen in case of the variable service drivers, under (5). - - (b) In PEI, the S3 Resume PEIM (UefiCpuPkg/Universal/Acpi/S3Resume2Pei) - retrieves data from the LockBox. - - Presumably, S3Resume2Pei should be considered an "unprivileged PEIM", - and the SMRAM access should be layered as seen in DXE. Unfortunately, - edk2 does not implement all of the layers in PEI -- the code either - doesn't exist, or it is not open source: - - role | DXE: protocol/module | PEI: PPI/module - -------------+--------------------------------+------------------------------ - unprivileged | any | S3Resume2Pei.inf - driver | | - -------------+--------------------------------+------------------------------ - command | LIBRARY_CLASS = LockBoxLib | LIBRARY_CLASS = LockBoxLib - formatting | | - and response | SmmLockBoxDxeLib.inf | SmmLockBoxPeiLib.inf - parsing | | - -------------+--------------------------------+------------------------------ - privilege | EFI_SMM_COMMUNICATION_PROTOCOL | EFI_PEI_SMM_COMMUNICATION_PPI - separation | | - | PiSmmCore.inf | missing! - -------------+--------------------------------+------------------------------ - platform SMM | EFI_SMM_CONTROL2_PROTOCOL | PEI_SMM_CONTROL_PPI - and SMRAM | EFI_SMM_ACCESS2_PROTOCOL | PEI_SMM_ACCESS_PPI - access | | - | to be done in OVMF | to be done in OVMF - -------------+--------------------------------+------------------------------ - command | LIBRARY_CLASS = LockBoxLib | LIBRARY_CLASS = LockBoxLib - parsing and | | - response | SmmLockBoxSmmLib.inf | missing! - formatting | | - -------------+--------------------------------+------------------------------ - privileged | SmmLockBox.inf | missing! - LockBox | | - driver | | - - Alternatively, in the future OVMF might be able to provide a LockBoxLib - instance (an SmmLockBoxPeiLib substitute) for S3Resume2Pei that - accesses SMRAM directly, eliminating the need for deeper layers in the - stack (that is, EFI_PEI_SMM_COMMUNICATION_PPI and deeper). - - In fact, a "thin" EFI_PEI_SMM_COMMUNICATION_PPI implementation whose - sole Communicate() member invariably returns EFI_NOT_STARTED would - cause the current SmmLockBoxPeiLib library instance to directly perform - full-depth SMRAM access and LockBox search, obviating the "missing" - cells. (With reference to A Tour Beyond BIOS: Implementing S3 Resume - with EDK2, by Jiewen Yao and Vincent Zimmer, October 2014.) - -Select features ---------------- - -In this section we'll browse the top-level "OvmfPkg" package directory, and -discuss the more interesting drivers and libraries that have not been mentioned -thus far. - -X64-specific reset vector for OVMF -.................................. - -The "OvmfPkg/ResetVector" directory customizes the reset vector (found in -"UefiCpuPkg/ResetVector/Vtf0") for "OvmfPkgX64.fdf", that is, when the SEC/PEI -phases run in 64-bit (ie. long) mode. - -The reset vector's control flow looks roughly like: - - resetVector [Ia16/ResetVectorVtf0.asm] - EarlyBspInitReal16 [Ia16/Init16.asm] - Main16 [Main.asm] - EarlyInit16 [Ia16/Init16.asm] - - ; Transition the processor from - ; 16-bit real mode to 32-bit flat mode - TransitionFromReal16To32BitFlat [Ia16/Real16ToFlat32.asm] - - ; Search for the - ; Boot Firmware Volume (BFV) - Flat32SearchForBfvBase [Ia32/SearchForBfvBase.asm] - - ; Search for the SEC entry point - Flat32SearchForSecEntryPoint [Ia32/SearchForSecEntry.asm] - - %ifdef ARCH_IA32 - ; Jump to the 32-bit SEC entry point - %else - ; Transition the processor - ; from 32-bit flat mode - ; to 64-bit flat mode - Transition32FlatTo64Flat [Ia32/Flat32ToFlat64.asm] - - SetCr3ForPageTables64 [Ia32/PageTables64.asm] - ; set CR3 to page tables - ; built into the ROM image - - ; enable PAE - ; set LME - ; enable paging - - ; Jump to the 64-bit SEC entry point - %endif - -On physical platforms, the initial page tables referenced by -SetCr3ForPageTables64 are built statically into the flash device image, and are -present in ROM at runtime. This is fine on physical platforms because the -pre-built page table entries have the Accessed and Dirty bits set from the -start. - -Accordingly, for OVMF running in long mode on qemu/KVM, the initial page tables -were mapped as a KVM_MEM_READONLY slot, as part of QEMU's pflash device (refer -to "Firmware image structure" above). - -In spite of the Accessed and Dirty bits being pre-set in the read-only, -in-flash PTEs, in a virtual machine attempts are made to update said PTE bits, -differently from physical hardware. The component attempting to update the -read-only PTEs can be one of the following: - -- The processor itself, if it supports nested paging, and the user enables that - processor feature, - -- KVM code implementing shadow paging, otherwise. - -The first case presents no user-visible symptoms, but the second case (KVM, -shadow paging) used to cause a triple fault, prior to Linux commit ba6a354 -("KVM: mmu: allow page tables to be in read-only slots"). - -For compatibility with earlier KVM versions, the OvmfPkg/ResetVector directory -adapts the generic reset vector code as follows: - - Transition32FlatTo64Flat [UefiCpuPkg/.../Ia32/Flat32ToFlat64.asm] - - SetCr3ForPageTables64 [OvmfPkg/ResetVector/Ia32/PageTables64.asm] - - ; dynamically build the initial page tables in RAM, at address - ; PcdOvmfSecPageTablesBase (refer to the memory map above), - ; identity-mapping the first 4 GB of address space - - ; set CR3 to PcdOvmfSecPageTablesBase - - ; enable PAE - ; set LME - ; enable paging - -This way the PTEs that earlier KVM versions try to update (during shadow -paging) are located in a read-write memory slot, and the write attempts -succeed. - -Client library for QEMU's firmware configuration interface -.......................................................... - -QEMU provides a write-only, 16-bit wide control port, and a read-write, 8-bit -wide data port for exchanging configuration elements with the firmware. - -The firmware writes a selector (a key) to the control port (0x510), and then -reads the corresponding configuration data (produced by QEMU) from the data -port (0x511). - -If the selected entry is writable, the firmware may overwrite it. If QEMU has -associated a callback with the entry, then when the entry is completely -rewritten, QEMU runs the callback. (OVMF does not rewrite any entries at the -moment.) - -A number of selector values (keys) are predefined. In particular, key 0x19 -selects (returns) a directory of { name, selector, size } triplets, roughly -speaking. - -The firmware can request configuration elements by well-known name as well, by -looking up the selector value first in the directory, by name, and then writing -the selector to the control port. The number of bytes to read subsequently from -the data port is known from the directory entry's "size" field. - -By convention, directory entries (well-known symbolic names of configuration -elements) are formatted as POSIX pathnames. For example, the array selected by -the "etc/system-states" name indicates (among other things) whether the user -enabled S3 support in QEMU. - -The above interface is called "fw_cfg". - -The binary data associated with a symbolic name is called an "fw_cfg file". - -OVMF's fw_cfg client library is found in "OvmfPkg/Library/QemuFwCfgLib". OVMF -discovers many aspects of the virtual system with it; we refer to a few -examples below. - -Guest ACPI tables -................. - -An operating system discovers a good amount of its hardware by parsing ACPI -tables, and by interpreting ACPI objects and methods. On physical hardware, the -platform vendor's firmware installs ACPI tables in memory that match both the -hardware present in the system and the user's firmware configuration ("BIOS -setup"). - -Under qemu/KVM, the owner of the (virtual) hardware configuration is QEMU. -Hardware can easily be reconfigured on the command line. Furthermore, features -like CPU hotplug, PCI hotplug, memory hotplug are continuously developed for -QEMU, and operating systems need direct ACPI support to exploit these features. - -For this reason, QEMU builds its own ACPI tables dynamically, in a -self-descriptive manner, and exports them to the firmware through a complex, -multi-file fw_cfg interface. It is rooted in the "etc/table-loader" fw_cfg -file. (Further details of this interface are out of scope for this report.) - -OVMF's AcpiPlatformDxe driver fetches the ACPI tables, and installs them for -the guest OS with the EFI_ACPI_TABLE_PROTOCOL (which is in turn provided by the -generic "MdeModulePkg/Universal/Acpi/AcpiTableDxe" driver). - -For earlier QEMU versions and machine types (which we generally don't recommend -for OVMF; see "Scope"), the "OvmfPkg/AcpiTables" directory contains a few -static ACPI table templates. When the "etc/table-loader" fw_cfg file is -unavailable, AcpiPlatformDxe installs these default tables (with a little bit -of dynamic patching). - -When OVMF runs in a Xen domU, AcpiTableDxe also installs ACPI tables that -originate from the hypervisor's environment. - -Guest SMBIOS tables -................... - -Quoting the SMBIOS Reference Specification, - - [...] the System Management BIOS Reference Specification addresses how - motherboard and system vendors present management information about their - products in a standard format [...] - -In practice SMBIOS tables are just another set of tables that the platform -vendor's firmware installs in RAM for the operating system, and, importantly, -for management applications running on the OS. Without rehashing the "Guest -ACPI tables" section in full, let's map the OVMF roles seen there from ACPI to -SMBIOS: - - role | ACPI | SMBIOS - -------------------------+-------------------------+------------------------- - fw_cfg file | etc/table-loader | etc/smbios/smbios-tables - -------------------------+-------------------------+------------------------- - OVMF driver | AcpiPlatformDxe | SmbiosPlatformDxe - under "OvmfPkg" | | - -------------------------+-------------------------+------------------------- - Underlying protocol, | EFI_ACPI_TABLE_PROTOCOL | EFI_SMBIOS_PROTOCOL - implemented by generic | | - driver under | Acpi/AcpiTableDxe | SmbiosDxe - "MdeModulePkg/Universal" | | - -------------------------+-------------------------+------------------------- - default tables available | yes | [RHEL] yes, Type0 and - for earlier QEMU machine | | Type1 tables - types, with hot-patching | | - -------------------------+-------------------------+------------------------- - tables fetched in Xen | yes | yes - domUs | | - -Platform-specific boot policy -............................. - -OVMF's BDS (Boot Device Selection) phase is implemented by -IntelFrameworkModulePkg/Universal/BdsDxe. Roughly speaking, this large driver: - -- provides the EFI BDS architectural protocol (which DXE transfers control to - after dispatching all DXE drivers), - -- connects drivers to devices, - -- enumerates boot devices, - -- auto-generates boot options, - -- provides "BIOS setup" screens, such as: - - - Boot Manager, for booting an option, - - - Boot Maintenance Manager, for adding, deleting, and reordering boot - options, changing console properties etc, - - - Device Manager, where devices can register configuration forms, including - - - Secure Boot configuration forms, - - - OVMF's Platform Driver form (see under PlatformDxe). - -Firmware that includes the "IntelFrameworkModulePkg/Universal/BdsDxe" driver -can customize its behavior by providing an instance of the PlatformBdsLib -library class. The driver links against this platform library, and the -platform library can call Intel's BDS utility functions from -"IntelFrameworkModulePkg/Library/GenericBdsLib". - -OVMF's PlatformBdsLib instance can be found in -"OvmfPkg/Library/PlatformBdsLib". The main function where the BdsDxe driver -enters the library is PlatformBdsPolicyBehavior(). We mention two OVMF -particulars here. - -(1) OVMF is capable of loading kernel images directly from fw_cfg, matching - QEMU's -kernel, -initrd, and -append command line options. This feature is - useful for rapid, repeated Linux kernel testing, and is implemented in the - following call tree: - - PlatformBdsPolicyBehavior() [OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c] - TryRunningQemuKernel() [OvmfPkg/Library/PlatformBdsLib/QemuKernel.c] - LoadLinux*() [OvmfPkg/Library/LoadLinuxLib/Linux.c] - - OvmfPkg/Library/LoadLinuxLib ports the efilinux bootloader project into - OvmfPkg. - -(2) OVMF seeks to comply with the boot order specification passed down by QEMU - over fw_cfg. - - (a) About Boot Modes - - During the PEI phase, OVMF determines and stores the Boot Mode in the - PHIT HOB (already mentioned in "S3 (suspend to RAM and resume)"). The - boot mode is supposed to influence the rest of the system, for example it - distinguishes S3 resume (BOOT_ON_S3_RESUME) from a "normal" boot. - - In general, "normal" boots can be further differentiated from each other; - for example for speed reasons. When the firmware can tell during PEI that - the chassis has not been opened since last power-up, then it might want - to save time by not connecting all devices and not enumerating all boot - options from scratch; it could just rely on the stored results of the - last enumeration. The matching BootMode value, to be set during PEI, - would be BOOT_ASSUMING_NO_CONFIGURATION_CHANGES. - - OVMF only sets one of the following two boot modes, based on CMOS - contents: - - BOOT_ON_S3_RESUME, - - BOOT_WITH_FULL_CONFIGURATION. - - For BOOT_ON_S3_RESUME, please refer to "S3 (suspend to RAM and resume)". - The other boot mode supported by OVMF, BOOT_WITH_FULL_CONFIGURATION, is - an appropriate "catch-all" for a virtual machine, where hardware can - easily change from boot to boot. - - (b) Auto-generation of boot options - - Accordingly, when not resuming from S3 sleep (*), OVMF always connects - all devices, and enumerates all bootable devices as new boot options - (non-volatile variables called Boot####). - - (*) During S3 resume, DXE is not reached, hence BDS isn't either. - - The auto-enumerated boot options are stored in the BootOrder non-volatile - variable after any preexistent options. (Boot options may exist before - auto-enumeration eg. because the user added them manually with the Boot - Maintenance Manager or the efibootmgr utility. They could also originate - from an earlier auto-enumeration.) - - PlatformBdsPolicyBehavior() [OvmfPkg/.../BdsPlatform.c] - TryRunningQemuKernel() [OvmfPkg/.../QemuKernel.c] - BdsLibConnectAll() [IntelFrameworkModulePkg/.../BdsConnect.c] - BdsLibEnumerateAllBootOption() [IntelFrameworkModulePkg/.../BdsBoot.c] - BdsLibBuildOptionFromHandle() [IntelFrameworkModulePkg/.../BdsBoot.c] - BdsLibRegisterNewOption() [IntelFrameworkModulePkg/.../BdsMisc.c] - // - // Append the new option number to the original option order - // - - (c) Relative UEFI device paths in boot options - - The handling of relative ("short-form") UEFI device paths is best - demonstrated through an example, and by quoting the UEFI 2.4A - specification. - - A short-form hard drive UEFI device path could be (displaying each device - path node on a separate line for readability): - - HD(1,GPT,14DD1CC5-D576-4BBF-8858-BAF877C8DF61,0x800,0x64000)/ - \EFI\fedora\shim.efi - - This device path lacks prefix nodes (eg. hardware or messaging type - nodes) that would lead to the hard drive. During load option processing, - the above short-form or relative device path could be matched against the - following absolute device path: - - PciRoot(0x0)/ - Pci(0x4,0x0)/ - HD(1,GPT,14DD1CC5-D576-4BBF-8858-BAF877C8DF61,0x800,0x64000)/ - \EFI\fedora\shim.efi - - The motivation for this type of device path matching / completion is to - allow the user to move around the hard drive (for example, to plug a - controller in a different PCI slot, or to expose the block device on a - different iSCSI path) and still enable the firmware to find the hard - drive. - - The UEFI specification says, - - 9.3.6 Media Device Path - 9.3.6.1 Hard Drive - - [...] Section 3.1.2 defines special rules for processing the Hard - Drive Media Device Path. These special rules enable a disk's location - to change and still have the system boot from the disk. [...] - - 3.1.2 Load Option Processing - - [...] The boot manager must [...] support booting from a short-form - device path that starts with the first element being a hard drive - media device path [...]. The boot manager must use the GUID or - signature and partition number in the hard drive device path to match - it to a device in the system. If the drive supports the GPT - partitioning scheme the GUID in the hard drive media device path is - compared with the UniquePartitionGuid field of the GUID Partition - Entry [...]. If the drive supports the PC-AT MBR scheme the signature - in the hard drive media device path is compared with the - UniqueMBRSignature in the Legacy Master Boot Record [...]. If a - signature match is made, then the partition number must also be - matched. The hard drive device path can be appended to the matching - hardware device path and normal boot behavior can then be used. If - more than one device matches the hard drive device path, the boot - manager will pick one arbitrarily. Thus the operating system must - ensure the uniqueness of the signatures on hard drives to guarantee - deterministic boot behavior. - - Edk2 implements and exposes the device path completion logic in the - already referenced "IntelFrameworkModulePkg/Library/GenericBdsLib" - library, in the BdsExpandPartitionPartialDevicePathToFull() function. - - (d) Filtering and reordering the boot options based on fw_cfg - - Once we have an "all-inclusive", partly preexistent, partly freshly - auto-generated boot option list from bullet (b), OVMF loads QEMU's - requested boot order from fw_cfg, and filters and reorders the list from - (b) with it: - - PlatformBdsPolicyBehavior() [OvmfPkg/.../BdsPlatform.c] - TryRunningQemuKernel() [OvmfPkg/.../QemuKernel.c] - BdsLibConnectAll() [IntelFrameworkModulePkg/.../BdsConnect.c] - BdsLibEnumerateAllBootOption() [IntelFrameworkModulePkg/.../BdsBoot.c] - SetBootOrderFromQemu() [OvmfPkg/.../QemuBootOrder.c] - - According to the (preferred) "-device ...,bootindex=N" and the (legacy) - '-boot order=drives' command line options, QEMU requests a boot order - from the firmware through the "bootorder" fw_cfg file. (For a bootindex - example, refer to the "Example qemu invocation" section.) - - This fw_cfg file consists of OpenFirmware (OFW) device paths -- note: not - UEFI device paths! --, one per line. An example list is: - - /pci@i0cf8/scsi@4/disk@0,0 - /pci@i0cf8/ide@1,1/drive@1/disk@0 - /pci@i0cf8/ethernet@3/ethernet-phy@0 - - OVMF filters and reorders the boot option list from bullet (b) with the - following nested loops algorithm: - - new_uefi_order := - for each qemu_ofw_path in QEMU's OpenFirmware device path list: - qemu_uefi_path_prefix := translate(qemu_ofw_path) - - for each boot_option in current_uefi_order: - full_boot_option := complete(boot_option) - - if match(qemu_uefi_path_prefix, full_boot_option): - append(new_uefi_order, boot_option) - break - - for each unmatched boot_option in current_uefi_order: - if survives(boot_option): - append(new_uefi_order, boot_option) - - current_uefi_order := new_uefi_order - - OVMF iterates over QEMU's OFW device paths in order, translates each to a - UEFI device path prefix, tries to match the translated prefix against the - UEFI boot options (which are completed from relative form to absolute - form for the purpose of prefix matching), and if there's a match, the - matching boot option is appended to the new boot order (which starts out - empty). - - (We elaborate on the translate() function under bullet (e). The - complete() function has been explained in bullet (c).) - - In addition, UEFI boot options that remain unmatched after filtering and - reordering are post-processed, and some of them "survive". Due to the - fact that OpenFirmware device paths have less expressive power than their - UEFI counterparts, some UEFI boot options are simply inexpressible (hence - unmatchable) by the nested loops algorithm. - - An important example is the memory-mapped UEFI shell, whose UEFI device - path is inexpressible by QEMU's OFW device paths: - - MemoryMapped(0xB,0x900000,0x10FFFFF)/ - FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1) - - (Side remark: notice that the address range visible in the MemoryMapped() - node corresponds to DXEFV under "comprehensive memory map of OVMF"! In - addition, the FvFile() node's GUID originates from the FILE_GUID entry of - "ShellPkg/Application/Shell/Shell.inf".) - - The UEFI shell can be booted by pressing ESC in OVMF on the TianoCore - splash screen, and navigating to Boot Manager | EFI Internal Shell. If - the "survival policy" was not implemented, the UEFI shell's boot option - would always be filtered out. - - The current "survival policy" preserves all boot options that start with - neither PciRoot() nor HD(). - - (e) Translating QEMU's OpenFirmware device paths to UEFI device path - prefixes - - In this section we list the (strictly heuristical) mappings currently - performed by OVMF. - - The "prefix only" nature of the translation output is rooted minimally in - the fact that QEMU's OpenFirmware device paths cannot carry pathnames - within filesystems. There's no way to specify eg. - - \EFI\fedora\shim.efi - - in an OFW device path, therefore a UEFI device path translated from an - OFW device path can at best be a prefix (not a full match) of a UEFI - device path that ends with "\EFI\fedora\shim.efi". - - - IDE disk, IDE CD-ROM: - - OpenFirmware device path: - - /pci@i0cf8/ide@1,1/drive@0/disk@0 - ^ ^ ^ ^ ^ - | | | | master or slave - | | | primary or secondary - | PCI slot & function holding IDE controller - PCI root at system bus port, PIO - - UEFI device path prefix: - - PciRoot(0x0)/Pci(0x1,0x1)/Ata(Primary,Master,0x0) - ^ - fixed LUN - - - Floppy disk: - - OpenFirmware device path: - - /pci@i0cf8/isa@1/fdc@03f0/floppy@0 - ^ ^ ^ ^ - | | | A: or B: - | | ISA controller io-port (hex) - | PCI slot holding ISA controller - PCI root at system bus port, PIO - - UEFI device path prefix: - - PciRoot(0x0)/Pci(0x1,0x0)/Floppy(0x0) - ^ - ACPI UID (A: or B:) - - - Virtio-block disk: - - OpenFirmware device path: - - /pci@i0cf8/scsi@6[,3]/disk@0,0 - ^ ^ ^ ^ ^ - | | | fixed - | | PCI function corresponding to disk (optional) - | PCI slot holding disk - PCI root at system bus port, PIO - - UEFI device path prefixes (dependent on the presence of a nonzero PCI - function in the OFW device path): - - PciRoot(0x0)/Pci(0x6,0x0)/HD( - PciRoot(0x0)/Pci(0x6,0x3)/HD( - - - Virtio-scsi disk and virtio-scsi passthrough: - - OpenFirmware device path: - - /pci@i0cf8/scsi@7[,3]/channel@0/disk@2,3 - ^ ^ ^ ^ ^ - | | | | LUN - | | | target - | | channel (unused, fixed 0) - | PCI slot[, function] holding SCSI controller - PCI root at system bus port, PIO - - UEFI device path prefixes (dependent on the presence of a nonzero PCI - function in the OFW device path): - - PciRoot(0x0)/Pci(0x7,0x0)/Scsi(0x2,0x3) - PciRoot(0x0)/Pci(0x7,0x3)/Scsi(0x2,0x3) - - - Emulated and passed-through (physical) network cards: - - OpenFirmware device path: - - /pci@i0cf8/ethernet@3[,2] - ^ ^ - | PCI slot[, function] holding Ethernet card - PCI root at system bus port, PIO - - UEFI device path prefixes (dependent on the presence of a nonzero PCI - function in the OFW device path): - - PciRoot(0x0)/Pci(0x3,0x0) - PciRoot(0x0)/Pci(0x3,0x2) - -Virtio drivers -.............. - -UEFI abstracts various types of hardware resources into protocols, and allows -firmware developers to implement those protocols in device drivers. The Virtio -Specification defines various types of virtual hardware for virtual machines. -Connecting the two specifications, OVMF provides UEFI drivers for QEMU's -virtio-block, virtio-scsi, and virtio-net devices. - -The following diagram presents the protocol and driver stack related to Virtio -devices in edk2 and OVMF. Each node in the graph identifies a protocol and/or -the edk2 driver that produces it. Nodes on the top are more abstract. - - EFI_BLOCK_IO_PROTOCOL EFI_SIMPLE_NETWORK_PROTOCOL - [OvmfPkg/VirtioBlkDxe] [OvmfPkg/VirtioNetDxe] - | | - | EFI_EXT_SCSI_PASS_THRU_PROTOCOL | - | [OvmfPkg/VirtioScsiDxe] | - | | | - +------------------------+--------------------------+ - | - VIRTIO_DEVICE_PROTOCOL - | - +---------------------+---------------------+ - | | - [OvmfPkg/VirtioPciDeviceDxe] [custom platform drivers] - | | - | | - EFI_PCI_IO_PROTOCOL [OvmfPkg/Library/VirtioMmioDeviceLib] - [MdeModulePkg/Bus/Pci/PciBusDxe] direct MMIO register access - -The top three drivers produce standard UEFI abstractions: the Block IO -Protocol, the Extended SCSI Pass Thru Protocol, and the Simple Network -Protocol, for virtio-block, virtio-scsi, and virtio-net devices, respectively. - -Comparing these device-specific virtio drivers to each other, we can determine: - -- They all conform to the UEFI Driver Model. This means that their entry point - functions don't immediately start to search for devices and to drive them, - they only register instances of the EFI_DRIVER_BINDING_PROTOCOL. The UEFI - Driver Model then enumerates devices and chains matching drivers - automatically. - -- They are as minimal as possible, while remaining correct (refer to source - code comments for details). For example, VirtioBlkDxe and VirtioScsiDxe both - support only one request in flight. - - In theory, VirtioBlkDxe could implement EFI_BLOCK_IO2_PROTOCOL, which allows - queueing. Similarly, VirtioScsiDxe does not support the non-blocking mode of - EFI_EXT_SCSI_PASS_THRU_PROTOCOL.PassThru(). (Which is permitted by the UEFI - specification.) Both VirtioBlkDxe and VirtioScsiDxe delegate synchronous - request handling to "OvmfPkg/Library/VirtioLib". This limitation helps keep - the implementation simple, and testing thus far seems to imply satisfactory - performance, for a virtual boot firmware. - - VirtioNetDxe cannot avoid queueing, because EFI_SIMPLE_NETWORK_PROTOCOL - requires it on the interface level. Consequently, VirtioNetDxe is - significantly more complex than VirtioBlkDxe and VirtioScsiDxe. Technical - notes are provided in "OvmfPkg/VirtioNetDxe/TechNotes.txt". - -- None of these drivers access hardware directly. Instead, the Virtio Device - Protocol (OvmfPkg/Include/Protocol/VirtioDevice.h) collects / extracts virtio - operations defined in the Virtio Specification, and these backend-independent - virtio device drivers go through the abstract VIRTIO_DEVICE_PROTOCOL. - - IMPORTANT: the VIRTIO_DEVICE_PROTOCOL is not a standard UEFI protocol. It is - internal to edk2 and not described in the UEFI specification. It should only - be used by drivers and applications that live inside the edk2 source tree. - -Currently two providers exist for VIRTIO_DEVICE_PROTOCOL: - -- The first one is the "more traditional" virtio-pci backend, implemented by - OvmfPkg/VirtioPciDeviceDxe. This driver also complies with the UEFI Driver - Model. It consumes an instance of the EFI_PCI_IO_PROTOCOL, and, if the PCI - device/function under probing appears to be a virtio device, it produces a - Virtio Device Protocol instance for it. The driver translates abstract virtio - operations to PCI accesses. - -- The second provider, the virtio-mmio backend, is a library, not a driver, - living in OvmfPkg/Library/VirtioMmioDeviceLib. This library translates - abstract virtio operations to MMIO accesses. - - The virtio-mmio backend is only a library -- rather than a standalone, UEFI - Driver Model-compliant driver -- because the type of resource it consumes, an - MMIO register block base address, is not enumerable. - - In other words, while the PCI root bridge driver and the PCI bus driver - produce instances of EFI_PCI_IO_PROTOCOL automatically, thereby enabling the - UEFI Driver Model to probe devices and stack up drivers automatically, no - such enumeration exists for MMIO register blocks. - - For this reason, VirtioMmioDeviceLib needs to be linked into thin, custom - platform drivers that dispose over this kind of information. As soon as a - driver knows about the MMIO register block base addresses, it can pass each - to the library, and then the VIRTIO_DEVICE_PROTOCOL will be instantiated - (assuming a valid virtio-mmio register block of course). From that point on - the UEFI Driver Model again takes care of the chaining. - - Typically, such a custom driver does not conform to the UEFI Driver Model - (because that would presuppose auto-enumeration for MMIO register blocks). - Hence it has the following responsibilities: - - - it shall behave as a "wrapper" UEFI driver around the library, - - - it shall know virtio-mmio base addresses, - - - in its entry point function, it shall create a new UEFI handle with an - instance of the EFI_DEVICE_PATH_PROTOCOL for each virtio-mmio device it - knows the base address for, - - - it shall call VirtioMmioInstallDevice() on those handles, with the - corresponding base addresses. - - OVMF itself does not employ VirtioMmioDeviceLib. However, the library is used - (or has been tested as Proof-of-Concept) in the following 64-bit and 32-bit - ARM emulator setups: - - - in "RTSM_VE_FOUNDATIONV8_EFI.fd" and "FVP_AARCH64_EFI.fd", on ARM Holdings' - ARM(R) v8-A Foundation Model and ARM(R) AEMv8-A Base Platform FVP - emulators, respectively: - - EFI_BLOCK_IO_PROTOCOL - [OvmfPkg/VirtioBlkDxe] - | - VIRTIO_DEVICE_PROTOCOL - [ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/ArmFvpDxe.inf] - | - [OvmfPkg/Library/VirtioMmioDeviceLib] - direct MMIO register access - - - in "RTSM_VE_CORTEX-A15_EFI.fd" and "RTSM_VE_CORTEX-A15_MPCORE_EFI.fd", on - "qemu-system-arm -M vexpress-a15": - - EFI_BLOCK_IO_PROTOCOL EFI_SIMPLE_NETWORK_PROTOCOL - [OvmfPkg/VirtioBlkDxe] [OvmfPkg/VirtioNetDxe] - | | - +------------------+---------------+ - | - VIRTIO_DEVICE_PROTOCOL - [ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/ArmFvpDxe.inf] - | - [OvmfPkg/Library/VirtioMmioDeviceLib] - direct MMIO register access - - In the above ARM / VirtioMmioDeviceLib configurations, VirtioBlkDxe was - tested with booting Linux distributions, while VirtioNetDxe was tested with - pinging public IPv4 addresses from the UEFI shell. - -Platform Driver -............... - -Sometimes, elements of persistent firmware configuration are best exposed to -the user in a friendly way. OVMF's platform driver (OvmfPkg/PlatformDxe) -presents such settings on the "OVMF Platform Configuration" dialog: - -- Press ESC on the TianoCore splash screen, -- Navigate to Device Manager | OVMF Platform Configuration. - -At the moment, OVMF's platform driver handles only one setting: the preferred -graphics resolution. This is useful for two purposes: - -- Some UEFI shell commands, like DRIVERS and DEVICES, benefit from a wide - display. Using the MODE shell command, the user can switch to a larger text - resolution (limited by the graphics resolution), and see the command output - in a more easily consumable way. - - [RHEL] The list of text modes available to the MODE command is also limited - by ConSplitterDxe (found under MdeModulePkg/Universal/Console). - ConSplitterDxe builds an intersection of text modes that are - simultaneously supported by all consoles that ConSplitterDxe - multiplexes console output to. - - In practice, the strongest text mode restriction comes from - TerminalDxe, which provides console I/O on serial ports. TerminalDxe - has a very limited built-in list of text modes, heavily pruning the - intersection built by ConSplitterDxe, and made available to the MODE - command. - - On the Red Hat Enterprise Linux 7.1 host, TerminalDxe's list of modes - has been extended with text resolutions that match the Spice QXL GPU's - common graphics resolutions. This way a "full screen" text mode should - always be available in the MODE command. - -- The other advantage of controlling the graphics resolution lies with UEFI - operating systems that don't (yet) have a native driver for QEMU's virtual - video cards -- eg. the Spice QXL GPU. Such OSes may choose to inherit the - properties of OVMF's EFI_GRAPHICS_OUTPUT_PROTOCOL (provided by - OvmfPkg/QemuVideoDxe, see later). - - Although the display can be used at runtime in such cases, by direct - framebuffer access, its properties, for example, the resolution, cannot be - modified. The platform driver allows the user to select the preferred GOP - resolution, reboot, and let the guest OS inherit that preferred resolution. - -The platform driver has three access points: the "normal" driver entry point, a -set of HII callbacks, and a GOP installation callback. - -(1) Driver entry point: the PlatformInit() function. - - (a) First, this function loads any available settings, and makes them take - effect. For the preferred graphics resolution in particular, this means - setting the following PCDs: - - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution - - These PCDs influence the GraphicsConsoleDxe driver (located under - MdeModulePkg/Universal/Console), which switches to the preferred - graphics mode, and produces EFI_SIMPLE_TEXT_OUTPUT_PROTOCOLs on GOPs: - - EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL - [MdeModulePkg/Universal/Console/GraphicsConsoleDxe] - | - EFI_GRAPHICS_OUTPUT_PROTOCOL - [OvmfPkg/QemuVideoDxe] - | - EFI_PCI_IO_PROTOCOL - [MdeModulePkg/Bus/Pci/PciBusDxe] - - (b) Second, the driver entry point registers the user interface, including - HII callbacks. - - (c) Third, the driver entry point registers a GOP installation callback. - -(2) HII callbacks and the user interface. - - The Human Interface Infrastructure (HII) "is a set of protocols that allow - a UEFI driver to provide the ability to register user interface and - configuration content with the platform firmware". - - OVMF's platform driver: - - - provides a static, basic, visual form (PlatformForms.vfr), written in the - Visual Forms Representation language, - - - includes a UCS-16 encoded message catalog (Platform.uni), - - - includes source code that dynamically populates parts of the form, with - the help of MdeModulePkg/Library/UefiHiiLib -- this library simplifies - the handling of IFR (Internal Forms Representation) opcodes, - - - processes form actions that the user takes (Callback() function), - - - loads and saves platform configuration in a private, non-volatile - variable (ExtractConfig() and RouteConfig() functions). - - The ExtractConfig() HII callback implements the following stack of - conversions, for loading configuration and presenting it to the user: - - MultiConfigAltResp -- form engine / HII communication - ^ - | - [BlockToConfig] - | - MAIN_FORM_STATE -- binary representation of form/widget - ^ state - | - [PlatformConfigToFormState] - | - PLATFORM_CONFIG -- accessible to DXE and UEFI drivers - ^ - | - [PlatformConfigLoad] - | - UEFI non-volatile variable -- accessible to external utilities - - The layers are very similar for the reverse direction, ie. when taking - input from the user, and saving the configuration (RouteConfig() HII - callback): - - ConfigResp -- form engine / HII communication - | - [ConfigToBlock] - | - v - MAIN_FORM_STATE -- binary representation of form/widget - | state - [FormStateToPlatformConfig] - | - v - PLATFORM_CONFIG -- accessible to DXE and UEFI drivers - | - [PlatformConfigSave] - | - v - UEFI non-volatile variable -- accessible to external utilities - -(3) When the platform driver starts, a GOP may not be available yet. Thus the - driver entry point registers a callback (the GopInstalled() function) for - GOP installations. - - When the first GOP is produced (usually by QemuVideoDxe, or potentially by - a third party video driver), PlatformDxe retrieves the list of graphics - modes the GOP supports, and dynamically populates the drop-down list of - available resolutions on the form. The GOP installation callback is then - removed. - -Video driver -............ - -OvmfPkg/QemuVideoDxe is OVMF's built-in video driver. We can divide its -services in two parts: graphics output protocol (primary), and Int10h (VBE) -shim (secondary). - -(1) QemuVideoDxe conforms to the UEFI Driver Model; it produces an instance of - the EFI_GRAPHICS_OUTPUT_PROTOCOL (GOP) on each PCI display that it supports - and is connected to: - - EFI_GRAPHICS_OUTPUT_PROTOCOL - [OvmfPkg/QemuVideoDxe] - | - EFI_PCI_IO_PROTOCOL - [MdeModulePkg/Bus/Pci/PciBusDxe] - - It supports the following QEMU video cards: - - - Cirrus 5430 ("-device cirrus-vga"), - - Standard VGA ("-device VGA"), - - QXL VGA ("-device qxl-vga", "-device qxl"). - - For Cirrus the following resolutions and color depths are available: - 640x480x32, 800x600x32, 1024x768x24. On stdvga and QXL a long list of - resolutions is available. The list is filtered against the frame buffer - size during initialization. - - The size of the QXL VGA compatibility framebuffer can be changed with the - - -device qxl-vga,vgamem_mb=$NUM_MB - - QEMU option. If $NUM_MB exceeds 32, then the following is necessary - instead: - - -device qxl-vga,vgamem_mb=$NUM_MB,ram_size_mb=$((NUM_MB*2)) - - because the compatibility framebuffer can't cover more than half of PCI BAR - #0. The latter defaults to 64MB in size, and is controlled by the - "ram_size_mb" property. - -(2) When QemuVideoDxe binds the first Standard VGA or QXL VGA device, and there - is no real VGA BIOS present in the C to F segments (which could originate - from a legacy PCI option ROM -- refer to "Compatibility Support Module - (CSM)"), then QemuVideoDxe installs a minimal, "fake" VGA BIOS -- an Int10h - (VBE) "shim". - - The shim is implemented in 16-bit assembly in - "OvmfPkg/QemuVideoDxe/VbeShim.asm". The "VbeShim.sh" shell script assembles - it and formats it as a C array ("VbeShim.h") with the help of the "nasm" - utility. The driver's InstallVbeShim() function copies the shim in place - (the C segment), and fills in the VBE Info and VBE Mode Info structures. - The real-mode 10h interrupt vector is pointed to the shim's handler. - - The shim is (correctly) irrelevant and invisible for all UEFI operating - systems we know about -- except Windows Server 2008 R2 and other Windows - operating systems in that family. - - Namely, the Windows 2008 R2 SP1 (and Windows 7) UEFI guest's default video - driver dereferences the real mode Int10h vector, loads the pointed-to - handler code, and executes what it thinks to be VGA BIOS services in an - internal real-mode emulator. Consequently, video mode switching used not to - work in Windows 2008 R2 SP1 when it ran on the "pure UEFI" build of OVMF, - making the guest uninstallable. Hence the (otherwise optional, non-default) - Compatibility Support Module (CSM) ended up a requirement for running such - guests. - - The hard dependency on the sophisticated SeaBIOS CSM and the complex - supporting edk2 infrastructure, for enabling this family of guests, was - considered suboptimal by some members of the upstream community, - - [RHEL] and was certainly considered a serious maintenance disadvantage for - Red Hat Enterprise Linux 7.1 hosts. - - Thus, the shim has been collaboratively developed for the Windows 7 / - Windows Server 2008 R2 family. The shim provides a real stdvga / QXL - implementation for the few services that are in fact necessary for the - Windows 2008 R2 SP1 (and Windows 7) UEFI guest, plus some "fakes" that the - guest invokes but whose effect is not important. The only supported mode is - 1024x768x32, which is enough to install the guest and then upgrade its - video driver to the full-featured QXL XDDM one. - - The C segment is not present in the UEFI memory map prepared by OVMF. - Memory space that would cover it is never added (either in PEI, in the form - of memory resource descriptor HOBs, or in DXE, via gDS->AddMemorySpace()). - This way the handler body is invisible to all other UEFI guests, and the - rest of edk2. - - The Int10h real-mode IVT entry is covered with a Boot Services Code page, - making that too inaccessible to the rest of edk2. Due to the allocation - type, UEFI guest OSes different from the Windows Server 2008 family can - reclaim the page at zero. (The Windows 2008 family accesses that page - regardless of the allocation type.) - -Afterword ---------- - -After the bulk of this document was written in July 2014, OVMF development has -not stopped. To name two significant code contributions from the community: in -January 2015, OVMF runs on the "q35" machine type of QEMU, and it features a -driver for Xen paravirtual block devices (and another for the underlying Xen -bus). - -Furthermore, a dedicated virtualization platform has been contributed to -ArmPlatformPkg that plays a role parallel to OvmfPkg's. It targets the "virt" -machine type of qemu-system-arm and qemu-system-aarch64. Parts of OvmfPkg are -being refactored and modularized so they can be reused in -"ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc". diff --git a/SPECS/elfutils/CVE-2024-25260.patch b/SPECS/elfutils/CVE-2024-25260.patch new file mode 100644 index 0000000000..834e077aa5 --- /dev/null +++ b/SPECS/elfutils/CVE-2024-25260.patch @@ -0,0 +1,37 @@ +From c0e0ac70a6add189194581be409a0ac0eb0a971b Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Mon, 13 Nov 2023 22:38:10 +0100 +Subject: [PATCH] backends: Fix arm_machine_flag_name version string. + +arm_machine_flag_name checks the version byte and if not zero returns +a version string. There are only 5 versions defined. So check the +version byte is not larger. + + * backends/arm_machineflagname.c (arm_machine_flag_name): + Check version <= 0, otherwise return NULL. + +https://sourceware.org/bugzilla/show_bug.cgi?id=31058 + +Signed-off-by: Mark Wielaard +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://sourceware.org/git/?p=elfutils.git;a=patch;h=373f5212677235fc3ca6068b887111554790f944 +--- + backends/arm_machineflagname.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/backends/arm_machineflagname.c b/backends/arm_machineflagname.c +index e93092a..d700d5f 100644 +--- a/backends/arm_machineflagname.c ++++ b/backends/arm_machineflagname.c +@@ -48,7 +48,7 @@ arm_machine_flag_name (Elf64_Word orig, Elf64_Word *flagref) + "Version5 EABI", + }; + *flagref &= ~((Elf64_Word) EF_ARM_EABIMASK); +- return vername[version - 1]; ++ return version <= 5 ? vername[version - 1] : NULL; + } + switch (EF_ARM_EABI_VERSION (orig)) + { +-- +2.45.4 + diff --git a/SPECS/elfutils/elfutils.spec b/SPECS/elfutils/elfutils.spec index f440508069..cf20fdfb70 100644 --- a/SPECS/elfutils/elfutils.spec +++ b/SPECS/elfutils/elfutils.spec @@ -4,7 +4,7 @@ Summary: A collection of utilities and DSOs to handle compiled objects Name: elfutils Version: 0.189 -Release: 7%{?dist} +Release: 8%{?dist} License: GPLv3+ AND (GPLv2+ OR LGPLv3+) Vendor: Intel Corporation Distribution: Edge Microvisor Toolkit @@ -17,6 +17,7 @@ Patch0: CVE-2025-1372.patch Patch1: CVE-2025-1376.patch Patch2: CVE-2025-1377.patch Patch3: CVE-2025-1352.patch +Patch4: CVE-2024-25260.patch BuildRequires: bison >= 1.875 BuildRequires: bzip2-devel @@ -283,6 +284,10 @@ fi %defattr(-,root,root) %changelog +* Mon Jan 5 2025 Lee Chee Yang - 0.189-8 +- merge from Azure Linux 3.0.20251206-3.0 +- Patch for CVE-2024-25260 + * Mon Sep 8 2025 Lee Chee Yang - 0.189-7 - merge from Azure Linux 3.0.20250910-3.0. - add patch for CVE-2025-1352 diff --git a/SPECS/etcd/etcd.service b/SPECS/etcd/etcd.service deleted file mode 100644 index 7290a91d9a..0000000000 --- a/SPECS/etcd/etcd.service +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=Etcd Server -After=network.target - -[Service] -Type=notify -WorkingDirectory=/var/lib/etcd/ -ExecStart=/usr/bin/etcd --config-file /etc/etcd/etcd-default-conf.yml -Restart=on-failure -LimitNOFILE=65536 - -[Install] -WantedBy=multi-user.target diff --git a/SPECS/etcd/etcd.signatures.json b/SPECS/etcd/etcd.signatures.json deleted file mode 100644 index f3e8ce4eef..0000000000 --- a/SPECS/etcd/etcd.signatures.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Signatures": { - "etcd.service": "4550a4967ba35670051cbfd9b4edf1fc57c0f1d7a07e51f88351ac44c76d8066", - "etcd-3.5.21.tar.gz": "76d7fcafe4fcc957fcd45671226b992c16e5f5e724935dea9df0190ac2b13481", - "etcd-3.5.21-vendor.tar.gz": "b4c072080f0ca47c1d447b6547165b943206cb5cb71dbd35a9e68079fdeac5a7" - } -} diff --git a/SPECS/etcd/etcd.spec b/SPECS/etcd/etcd.spec deleted file mode 100644 index 504943df71..0000000000 --- a/SPECS/etcd/etcd.spec +++ /dev/null @@ -1,320 +0,0 @@ -%global _default_patch_fuzz 2 - -Summary: A highly-available key value store for shared configuration -Name: etcd -Version: 3.5.21 -Release: 2%{?dist} -License: ASL 2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: System Environment/Security -URL: https://github.com/etcd-io/etcd/ -Source0: https://github.com/etcd-io/etcd/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -Source1: etcd.service -# Below is a manually created tarball, no download link. -# We're using vendored Go modules from this tarball, since network is disabled during build time. -# -# How to re-build this file: -# 1. either download etcd source tarball or git clone etcd repo from github and checkout relevant tag -# 2. execute 'go mod vendor' in 'server', 'etcdctl' and 'etcdutl' folders -# and create tarball containting 'vendor' folder for each -# (naming rule for tarball is 'vendor-[component].tar.gz', e.g.: 'vendor-server.tar.gz') -# 3. create 'vendor' tarballs for dump tools -# a. cd 'tools/etcd-dump-db' folder, create 'go.mod' file ('go mod init go.etcd.io/etcd/tools/etcd-dump-db/v3') -# b. populate 'go.mod' file ('go mod tidy') -# c. add replace rules in 'go.mod' making sure that each etcd dependency is taken locally, -# e.g. add the following (and remove them from require section): -# replace ( -# go.etcd.io/etcd/api/v3 v3.5.1 => ../../api -# go.etcd.io/etcd/server/v3 v3.5.1 => ../../server -# ) -# d. create vendor folder ('go mod vendor') -# e. create tarball containing 'vendor' folder and 'go.mod' and 'go.sum' files -# (same naming rules than described above) -# f. repeat above operations for 'etcd-dump-logs' folder -# 4. create 'etcd-%{version}-vendor.tar.gz' tarball containing all tarballs created above -# -# NOTES: -# - You require GNU tar version 1.28+. -# - The additional options enable generation of a tarball with the same hash every time regardless of the environment. -# See: https://reproducible-builds.org/docs/archives/ -# - You can use the following tar command to create the tarballs -# tar --sort=name --mtime="2021-11-10 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cJf [tarball name] [folder to tar] -Source2: %{name}-%{version}-vendor.tar.gz -BuildRequires: golang >= 1.16 - -%description -A highly-available key value store for shared configuration and service discovery. - -%package tools -Summary: Diagnostic tools for etcd -Group: System Environment/Security -Requires: %{name} = %{version}-%{release} - -%description tools -A highly-available key value store for shared configuration and service discovery. -The etcd-tools package contains the etcd-dump-db and etcd-dump-logs diagnostic -tools. - -%prep -%autosetup -N -p1 -tar --no-same-owner -xf %{SOURCE2} - -%build -%define ETCD_OUT_DIR %{_builddir}/%{name}-%{version}/bin -mkdir -p %{ETCD_OUT_DIR} - -# build etcd -for component in server etcdctl etcdutl; do - pushd $component - tar --no-same-owner -xf %{_builddir}/%{name}-%{version}/vendor-$component.tar.gz - go build \ - -o %{ETCD_OUT_DIR} \ - -ldflags=-X=go.etcd.io/etcd/api/v3/version.GitSHA=v%{version} - popd -done - -# build tools -%define ETCD_TOOLS_OUT_DIR %{_builddir}/%{name}-%{version}/bin/tools -mkdir -p %{ETCD_TOOLS_OUT_DIR} - -for component in etcd-dump-db etcd-dump-logs; do - pushd tools/$component - tar --no-same-owner -xf %{_builddir}/%{name}-%{version}/vendor-$component.tar.gz - go build \ - -o %{ETCD_TOOLS_OUT_DIR} - popd -done - -%install -install -vdm755 %{buildroot}%{_bindir} -install -vdm755 %{buildroot}/%{_docdir}/%{name}-%{version} -install -vdm755 %{buildroot}/lib/systemd/system -install -vdm 0755 %{buildroot}%{_sysconfdir}/etcd -install -vpm 0755 -T etcd.conf.yml.sample %{buildroot}%{_sysconfdir}/etcd/etcd-default-conf.yml - -chown -R root:root %{buildroot}%{_bindir} -chown -R root:root %{buildroot}/%{_docdir}/%{name}-%{version} - -# note that 'server' should be renamed 'etcd' -mv %{_builddir}/%{name}-%{version}/bin/server %{buildroot}%{_bindir}/etcd -mv %{_builddir}/%{name}-%{version}/bin/etcdctl %{buildroot}%{_bindir}/ -mv %{_builddir}/%{name}-%{version}/bin/etcdutl %{buildroot}%{_bindir}/ - -mv %{_builddir}/%{name}-%{version}/README.md %{buildroot}/%{_docdir}/%{name}-%{version}/ -mv %{_builddir}/%{name}-%{version}/etcdctl/README.md %{buildroot}/%{_docdir}/%{name}-%{version}/README-etcdctl.md -mv %{_builddir}/%{name}-%{version}/etcdctl/READMEv2.md %{buildroot}/%{_docdir}/%{name}-%{version}/READMEv2-etcdctl.md -mv %{_builddir}/%{name}-%{version}/etcdutl/README.md %{buildroot}/%{_docdir}/%{name}-%{version}/README-etcdutl.md - -# tools -install -vdm755 %{buildroot}/%{_docdir}/%{name}-%{version}-tools -chown -R root:root %{buildroot}/%{_docdir}/%{name}-%{version}-tools - -mv %{_builddir}/%{name}-%{version}/bin/tools/etcd-dump-logs %{buildroot}%{_bindir}/ -mv %{_builddir}/%{name}-%{version}/bin/tools/etcd-dump-db %{buildroot}%{_bindir}/ - -mv %{_builddir}/%{name}-%{version}/tools/etcd-dump-db/README.md %{buildroot}/%{_docdir}/%{name}-%{version}-tools/README-etcd-dump-db.md -mv %{_builddir}/%{name}-%{version}/tools/etcd-dump-logs/README.md %{buildroot}/%{_docdir}/%{name}-%{version}-tools/README-etcd-dump-logs.md - -install -vdm755 %{buildroot}/lib/systemd/system-preset -echo "disable etcd.service" > %{buildroot}/lib/systemd/system-preset/50-etcd.preset - -cp %{SOURCE1} %{buildroot}/lib/systemd/system -install -vdm755 %{buildroot}%{_sharedstatedir}/etcd - -%post -p /sbin/ldconfig -%postun -p /sbin/ldconfig - -%files -%license LICENSE -%{_bindir}/etcd -%{_bindir}/etcdctl -%{_bindir}/etcdutl -/%{_docdir}/%{name}-%{version}/* -/lib/systemd/system/etcd.service -/lib/systemd/system-preset/50-etcd.preset -%dir %{_sharedstatedir}/etcd -%config(noreplace) %{_sysconfdir}/etcd/etcd-default-conf.yml - -%files tools -%license LICENSE -%{_bindir}/etcd-dump-* -/%{_docdir}/%{name}-%{version}-tools/* - -%changelog -* Fri May 30 2025 Ranjan Dutta - 3.5.21-2 -- merge from Azure Linux 3.0.20250521-3.0 -- Auto-upgrade to 3.5.21 - for CVE-2025-30204 [High] - -* Fri Mar 21 2025 Anuj Mittal - 3.5.18-2 -- Bump Release to rebuild - -* Tue Feb 04 2025 CBL-Mariner Servicing Account - 3.5.18-1 -- Auto-upgrade to 3.5.18 - Upgrade to fix CVE-2023-39325, CVE-2023-44487 and CVE-2023-45288. - -* Tue Dec 03 2024 bhapathak - 3.5.12-2 -- Patch CVE-2024-24786 - -* Fri May 24 2024 CBL-Mariner Servicing Account - 3.5.12-1 -- Auto-upgrade to 3.5.12 - none - -* Wed Oct 18 2023 Nicolas Guibourge - 3.5.9-1 -- Upgrade to 3.5.9 to match version required by kubernetes - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 3.5.6-12 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 3.5.6-11 -- Bump release to rebuild with updated version of Go. - -* Wed Aug 23 2023 Rachel Menge - 3.5.6-10 -- Patch CVE-2023-32082 -- Update patch fuzz to 2 for backporting patch - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 3.5.6-9 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 3.5.6-8 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 3.5.6-7 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 19 2023 Bala - 3.5.6-6 -- Patch CVE-2021-28235 -- Update patch fuzz to 1 for backporting patch - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 3.5.6-5 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 3.5.6-4 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 3.5.6-3 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 3.5.6-2 -- Bump release to rebuild with go 1.19.5 - -* Thu Jan 19 2023 CBL-Mariner Servicing Account - 3.5.6-1 -- Auto-upgrade to 3.5.6 - version required by Kubernetes - -* Thu Jan 19 2023 CBL-Mariner Servicing Account - 3.5.5-1 -- Auto-upgrade to 3.5.5 - version required by Kubernetes - -* Thu Jan 19 2023 CBL-Mariner Servicing Account - 3.5.4-1 -- Auto-upgrade to 3.5.4 - version required by Kubernetes - -* Thu Jan 19 2023 CBL-Mariner Servicing Account - 3.5.3-1 -- Auto-upgrade to 3.5.3 - version required by Kubernetes - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 3.5.1-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 3.5.1-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717. - -* Tue Nov 01 2022 Olivia Crain - 3.5.1-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 3.5.1-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 3.5.1-2 -- Bump release to rebuild with golang 1.18.3 - -* Thu Apr 21 2022 Nicolas Guibourge - 3.5.1-1 -- Upgrade to 3.5.1 - -* Tue Feb 08 2022 Nicolas Guibourge - 3.5.0-3 -- Remove clean section - -* Wed Jan 19 2022 Henry Li - 3.5.0-2 -- Increment release for force republishing using golang 1.16.12 - -* Tue Dec 28 2021 Nicolas Guibourge - 3.5.0-1 -- Upgrade to version 3.5.0 - -* Tue Nov 02 2021 Thomas Crain - 3.4.13-6 -- Increment release for force republishing using golang 1.16.9 - -* Fri Aug 06 2021 Nicolas Guibourge 3.4.13-5 -- Increment release to force republishing using golang 1.16.7. - -* Thu Aug 05 2021 Tom Fay - 3.4.13-4 -- Add etcd-tools package. - -* Tue Jun 08 2021 Henry Beberman 3.4.13-3 -- Increment release to force republishing using golang 1.15.13. - -* Mon Apr 26 2021 Nicolas Guibourge 3.4.13-2 -- Increment release to force republishing using golang 1.15.11. - -* Mon Jan 25 2021 Nicolas Guibourge 3.4.13-1 -- Update to version 3.4.13. - -* Thu Dec 10 2020 Andrew Phelps 3.3.25-2 -- Increment release to force republishing using golang 1.15. - -* Thu Sep 03 2020 Joe Schmitt 3.3.25-1 -- Update to version 3.3.25 which fixes CVE-2020-15106, CVE-2020-15112, CVE-2020-15114, and CVE-2020-15115. - -* Sat May 09 2020 Nick Samson 3.3.11-2 -- Added %%license line automatically - -* Thu May 07 2020 Nicolas Ontiveros 3.3.11-1 -- Upgrade to version 3.3.11, which fixes CVE-2018-16886. -- Update summary. - -* Thu Apr 30 2020 Emre Girgin 3.3.9-4 -- Renaming go to golang - -* Wed Apr 08 2020 Pawel Winogrodzki 3.3.9-3 -- Fixed "Source0" tag. -- License verified and "License" tag updated. -- Removed "%%define sha1". - -* Tue Sep 03 2019 Mateusz Malisz 3.3.9-2 -- Initial CBL-Mariner import from Photon (license: Apache2). - -* Fri Sep 21 2018 Sujay G 3.3.9-1 -- Bump etcd version to 3.3.9 - -* Mon Sep 18 2017 Alexey Makhalov 3.1.5-4 -- Remove shadow requires - -* Sun Aug 27 2017 Vinay Kulkarni 3.1.5-3 -- File based configuration for etcd service. - -* Wed May 31 2017 Harish Udaiya Kumar 3.1.5-2 -- Provide preset file to disable service by default - -* Thu Apr 06 2017 Anish Swaminathan 3.1.5-1 -- Upgraded to version 3.1.5, build from sources - -* Fri Sep 2 2016 Xiaolin Li 3.0.9-1 -- Upgraded to version 3.0.9 - -* Fri Jun 24 2016 Xiaolin Li 2.3.7-1 -- Upgraded to version 2.3.7 - -* Wed May 25 2016 Nick Shi 2.2.5-3 -- Changing etcd service type from simple to notify - -* Tue May 24 2016 Priyesh Padmavilasom 2.2.5-2 -- GA - Bump release of all rpms - -* Tue Feb 23 2016 Harish Udaiya Kumar 2.2.5-1 -- Upgraded to version 2.2.5 - -* Tue Jul 28 2015 Divya Thaluru 2.1.1-2 -- Adding etcd service file - -* Tue Jul 21 2015 Vinay Kulkarni 2.1.1-1 -- Update to version etcd v2.1.1 - -* Tue Mar 10 2015 Divya Thaluru 2.0.4-1 -- Initial build. First version diff --git a/SPECS/etcd/generate_source_tarball.sh b/SPECS/etcd/generate_source_tarball.sh deleted file mode 100755 index 41989d06c9..0000000000 --- a/SPECS/etcd/generate_source_tarball.sh +++ /dev/null @@ -1,147 +0,0 @@ -#!/bin/bash -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -# Quit on failure -set -e - -PKG_VERSION="" -SRC_TARBALL="" -OUT_FOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# parameters: -# -# --srcTarball : src tarball file -# this file contains the 'initial' source code of the component -# and should be replaced with the new/modified src code -# --outFolder : folder where to copy the new tarball(s) -# --pkgVersion : package version -# -PARAMS="" -while (( "$#" )); do - case "$1" in - --srcTarball) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - SRC_TARBALL=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --outFolder) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - OUT_FOLDER=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --pkgVersion) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - PKG_VERSION=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - -*|--*=) # unsupported flags - echo "Error: Unsupported flag $1" >&2 - exit 1 - ;; - *) # preserve positional arguments - PARAMS="$PARAMS $1" - shift - ;; - esac -done - -echo "--srcTarball -> $SRC_TARBALL" -echo "--outFolder -> $OUT_FOLDER" -echo "--pkgVersion -> $PKG_VERSION" - -if [ -z "$PKG_VERSION" ]; then - echo "--pkgVersion parameter cannot be empty" - exit 1 -fi - -echo "-- create temp folder" -tmpdir=$(mktemp -d) -function cleanup { - echo "+++ cleanup -> remove $tmpdir" - # rm -rf $tmpdir -} -trap cleanup EXIT - -tarball_folder="$tmpdir/tarballFolder" -mkdir -p $tarball_folder - -pushd $tmpdir > /dev/null - -PKG_NAME="etcd" -NAME_VER="$PKG_NAME-$PKG_VERSION" -VENDOR_TARBALL="$OUT_FOLDER/$NAME_VER-vendor.tar.gz" - -echo "Unpacking source tarball..." -tar -xf $SRC_TARBALL - -cd "$NAME_VER" -echo "Get vendored modules" -for component in server etcdctl etcdutl; do - pushd $component - echo "===================================" - echo "Get vendored modules for $component" - go mod vendor - - component_tarball="$tarball_folder/vendor-$component.tar.gz" - echo "" - echo "Tar vendored modules in $component_tarball" - tar --sort=name \ - --mtime="2021-04-26 00:00Z" \ - --owner=0 --group=0 --numeric-owner \ - --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ - -cf "$component_tarball" vendor - popd -done - -for component in etcd-dump-db etcd-dump-logs; do - pushd tools/$component - echo "===================================" - echo "Get vendored modules for $component" - go mod init go.etcd.io/etcd/tools/$component/v3 - go mod tidy - go mod vendor - - echo "" - echo "Prepare files to tar" - tmp_tarball_dir="$tmpdir/$component" - mkdir -p $tmp_tarball_dir - cp go.mod $tmp_tarball_dir - cp go.sum $tmp_tarball_dir - cp -r vendor $tmp_tarball_dir - - component_tarball="$tarball_folder/vendor-$component.tar.gz" - cd $tmp_tarball_dir - echo "Tar vendored modules in $component_tarball" - tar --sort=name \ - --mtime="2021-04-26 00:00Z" \ - --owner=0 --group=0 --numeric-owner \ - --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ - -cf "$component_tarball" . - popd -done - -echo "" -echo "=========================" -echo "Tar all vendored tarballs" -cd $tarball_folder -tar --sort=name \ - --mtime="2021-04-26 00:00Z" \ - --owner=0 --group=0 --numeric-owner \ - --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ - -cf "$VENDOR_TARBALL" . - -popd > /dev/null -echo "Etcd vendored modules are available at $VENDOR_TARBALL" diff --git a/SPECS/expat/CVE-2024-8176.patch b/SPECS/expat/CVE-2024-8176.patch new file mode 100644 index 0000000000..47f38ef6dd --- /dev/null +++ b/SPECS/expat/CVE-2024-8176.patch @@ -0,0 +1,1398 @@ +From 35a1dea4c07cb0f13f0736d3a8821a696c27f8b1 Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Thu, 20 Mar 2025 06:36:42 +0000 +Subject: [PATCH] Fix for CVE-2024-8176 + +Upstream source: https://github.com/libexpat/libexpat/pull/973 + +Signed-off-by: Kshitiz Godara +--- + Changes | 30 ++- + lib/xmlparse.c | 566 ++++++++++++++++++++++++++++++++------------ + tests/alloc_tests.c | 27 +++ + tests/basic_tests.c | 187 ++++++++++++++- + tests/handlers.c | 15 ++ + tests/handlers.h | 5 + + tests/misc_tests.c | 43 ++++ + 7 files changed, 717 insertions(+), 156 deletions(-) + +diff --git a/Changes b/Changes +index aa19f70..75c62d6 100644 +--- a/Changes ++++ b/Changes +@@ -11,7 +11,6 @@ + !! The following topics need *additional skilled C developers* to progress !! + !! in a timely manner or at all (loosely ordered by descending priority): !! + !! !! +-!! - fixing a complex non-public security issue, !! + !! - teaming up on researching and fixing future security reports and !! + !! ClusterFuzz findings with few-days-max response times in communication !! + !! in order to (1) have a sound fix ready before the end of a 90 days !! +@@ -30,6 +29,35 @@ + !! THANK YOU! Sebastian Pipping -- Berlin, 2024-03-09 !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + ++ Security fixes: ++ #893 #??? CVE-2024-8176 -- Fix crash from chaining a large number ++ of entities caused by stack overflow by resolving use of ++ recursion, for all three uses of entities: ++ - general entities in character data ("&g1;") ++ - general entities in attribute values ("") ++ - parameter entities ("%p1;") ++ Known impact is (reliable and easy) denial of service: ++ CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H/E:H/RL:O/RC:C ++ (Base Score: 7.5, Temporal Score: 7.2) ++ Please note that a layer of compression around XML can ++ significantly reduce the minimum attack payload size. ++ ++ Special thanks to: ++ Alexander Gieringer ++ Berkay Eren Ürün ++ Jann Horn ++ Mark Brand ++ Sebastian Andrzej Siewior ++ Snild Dolkow ++ Thomas Pröll ++ Tomas Korbar ++ valord577 ++ and ++ Google Project Zero ++ Linutronix ++ Red Hat ++ Siemens ++ + Release 2.6.4 Wed November 6 2024 + Security fixes: + #915 CVE-2024-50602 -- Fix crash within function XML_ResumeParser +diff --git a/lib/xmlparse.c b/lib/xmlparse.c +index a4e091e..473c791 100644 +--- a/lib/xmlparse.c ++++ b/lib/xmlparse.c +@@ -39,7 +39,7 @@ + Copyright (c) 2022 Sean McBride + Copyright (c) 2023 Owain Davies + Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow +- Copyright (c) 2024 Berkay Eren Ürün ++ Copyright (c) 2024-2025 Berkay Eren Ürün + Copyright (c) 2024 Hanno Böck + Licensed under the MIT license: + +@@ -325,6 +325,10 @@ typedef struct { + const XML_Char *publicId; + const XML_Char *notation; + XML_Bool open; ++ XML_Bool hasMore; /* true if entity has not been completely processed */ ++ /* An entity can be open while being already completely processed (hasMore == ++ XML_FALSE). The reason is the delayed closing of entities until their inner ++ entities are processed and closed */ + XML_Bool is_param; + XML_Bool is_internal; /* true if declared in internal subset outside PE */ + } ENTITY; +@@ -415,6 +419,12 @@ typedef struct { + int *scaffIndex; + } DTD; + ++enum EntityType { ++ ENTITY_INTERNAL, ++ ENTITY_ATTRIBUTE, ++ ENTITY_VALUE, ++}; ++ + typedef struct open_internal_entity { + const char *internalEventPtr; + const char *internalEventEndPtr; +@@ -422,6 +432,7 @@ typedef struct open_internal_entity { + ENTITY *entity; + int startTagLevel; + XML_Bool betweenDecl; /* WFC: PE Between Declarations */ ++ enum EntityType type; + } OPEN_INTERNAL_ENTITY; + + enum XML_Account { +@@ -481,8 +492,8 @@ static enum XML_Error doProlog(XML_Parser parser, const ENCODING *enc, + const char *next, const char **nextPtr, + XML_Bool haveMore, XML_Bool allowClosingDoctype, + enum XML_Account account); +-static enum XML_Error processInternalEntity(XML_Parser parser, ENTITY *entity, +- XML_Bool betweenDecl); ++static enum XML_Error processEntity(XML_Parser parser, ENTITY *entity, ++ XML_Bool betweenDecl, enum EntityType type); + static enum XML_Error doContent(XML_Parser parser, int startTagLevel, + const ENCODING *enc, const char *start, + const char *end, const char **endPtr, +@@ -513,18 +524,22 @@ static enum XML_Error storeAttributeValue(XML_Parser parser, + const char *ptr, const char *end, + STRING_POOL *pool, + enum XML_Account account); +-static enum XML_Error appendAttributeValue(XML_Parser parser, +- const ENCODING *enc, +- XML_Bool isCdata, const char *ptr, +- const char *end, STRING_POOL *pool, +- enum XML_Account account); ++static enum XML_Error ++appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, ++ const char *ptr, const char *end, STRING_POOL *pool, ++ enum XML_Account account, const char **nextPtr); + static ATTRIBUTE_ID *getAttributeId(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end); + static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType); + #if XML_GE == 1 + static enum XML_Error storeEntityValue(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end, +- enum XML_Account account); ++ enum XML_Account account, ++ const char **nextPtr); ++static enum XML_Error callStoreEntityValue(XML_Parser parser, ++ const ENCODING *enc, ++ const char *start, const char *end, ++ enum XML_Account account); + #else + static enum XML_Error storeSelfEntityValue(XML_Parser parser, ENTITY *entity); + #endif +@@ -709,6 +724,10 @@ struct XML_ParserStruct { + const char *m_positionPtr; + OPEN_INTERNAL_ENTITY *m_openInternalEntities; + OPEN_INTERNAL_ENTITY *m_freeInternalEntities; ++ OPEN_INTERNAL_ENTITY *m_openAttributeEntities; ++ OPEN_INTERNAL_ENTITY *m_freeAttributeEntities; ++ OPEN_INTERNAL_ENTITY *m_openValueEntities; ++ OPEN_INTERNAL_ENTITY *m_freeValueEntities; + XML_Bool m_defaultExpandInternalEntities; + int m_tagLevel; + ENTITY *m_declEntity; +@@ -756,6 +775,7 @@ struct XML_ParserStruct { + ACCOUNTING m_accounting; + ENTITY_STATS m_entity_stats; + #endif ++ XML_Bool m_reenter; + }; + + #define MALLOC(parser, s) (parser->m_mem.malloc_fcn((s))) +@@ -1028,7 +1048,29 @@ callProcessor(XML_Parser parser, const char *start, const char *end, + #if defined(XML_TESTING) + g_bytesScanned += (unsigned)have_now; + #endif +- const enum XML_Error ret = parser->m_processor(parser, start, end, endPtr); ++ // Run in a loop to eliminate dangerous recursion depths ++ enum XML_Error ret; ++ *endPtr = start; ++ while (1) { ++ // Use endPtr as the new start in each iteration, since it will ++ // be set to the next start point by m_processor. ++ ret = parser->m_processor(parser, *endPtr, end, endPtr); ++ ++ // Make parsing status (and in particular XML_SUSPENDED) take ++ // precedence over re-enter flag when they disagree ++ if (parser->m_parsingStatus.parsing != XML_PARSING) { ++ parser->m_reenter = XML_FALSE; ++ } ++ ++ if (! parser->m_reenter) { ++ break; ++ } ++ ++ parser->m_reenter = XML_FALSE; ++ if (ret != XML_ERROR_NONE) ++ return ret; ++ } ++ + if (ret == XML_ERROR_NONE) { + // if we consumed nothing, remember what we had on this parse attempt. + if (*endPtr == start) { +@@ -1139,6 +1181,8 @@ parserCreate(const XML_Char *encodingName, + parser->m_freeBindingList = NULL; + parser->m_freeTagList = NULL; + parser->m_freeInternalEntities = NULL; ++ parser->m_freeAttributeEntities = NULL; ++ parser->m_freeValueEntities = NULL; + + parser->m_groupSize = 0; + parser->m_groupConnector = NULL; +@@ -1241,6 +1285,8 @@ parserInit(XML_Parser parser, const XML_Char *encodingName) { + parser->m_eventEndPtr = NULL; + parser->m_positionPtr = NULL; + parser->m_openInternalEntities = NULL; ++ parser->m_openAttributeEntities = NULL; ++ parser->m_openValueEntities = NULL; + parser->m_defaultExpandInternalEntities = XML_TRUE; + parser->m_tagLevel = 0; + parser->m_tagStack = NULL; +@@ -1251,6 +1297,8 @@ parserInit(XML_Parser parser, const XML_Char *encodingName) { + parser->m_unknownEncodingData = NULL; + parser->m_parentParser = NULL; + parser->m_parsingStatus.parsing = XML_INITIALIZED; ++ // Reentry can only be triggered inside m_processor calls ++ parser->m_reenter = XML_FALSE; + #ifdef XML_DTD + parser->m_isParamEntity = XML_FALSE; + parser->m_useForeignDTD = XML_FALSE; +@@ -1310,6 +1358,24 @@ XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) { + openEntity->next = parser->m_freeInternalEntities; + parser->m_freeInternalEntities = openEntity; + } ++ /* move m_openAttributeEntities to m_freeAttributeEntities (i.e. same task but ++ * for attributes) */ ++ openEntityList = parser->m_openAttributeEntities; ++ while (openEntityList) { ++ OPEN_INTERNAL_ENTITY *openEntity = openEntityList; ++ openEntityList = openEntity->next; ++ openEntity->next = parser->m_freeAttributeEntities; ++ parser->m_freeAttributeEntities = openEntity; ++ } ++ /* move m_openValueEntities to m_freeValueEntities (i.e. same task but ++ * for value entities) */ ++ openEntityList = parser->m_openValueEntities; ++ while (openEntityList) { ++ OPEN_INTERNAL_ENTITY *openEntity = openEntityList; ++ openEntityList = openEntity->next; ++ openEntity->next = parser->m_freeValueEntities; ++ parser->m_freeValueEntities = openEntity; ++ } + moveToFreeBindingList(parser, parser->m_inheritedBindings); + FREE(parser, parser->m_unknownEncodingMem); + if (parser->m_unknownEncodingRelease) +@@ -1323,6 +1389,19 @@ XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) { + return XML_TRUE; + } + ++static XML_Bool ++parserBusy(XML_Parser parser) { ++ switch (parser->m_parsingStatus.parsing) { ++ case XML_PARSING: ++ case XML_SUSPENDED: ++ return XML_TRUE; ++ case XML_INITIALIZED: ++ case XML_FINISHED: ++ default: ++ return XML_FALSE; ++ } ++} ++ + enum XML_Status XMLCALL + XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) { + if (parser == NULL) +@@ -1331,8 +1410,7 @@ XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) { + XXX There's no way for the caller to determine which of the + XXX possible error cases caused the XML_STATUS_ERROR return. + */ +- if (parser->m_parsingStatus.parsing == XML_PARSING +- || parser->m_parsingStatus.parsing == XML_SUSPENDED) ++ if (parserBusy(parser)) + return XML_STATUS_ERROR; + + /* Get rid of any previous encoding name */ +@@ -1569,7 +1647,34 @@ XML_ParserFree(XML_Parser parser) { + entityList = entityList->next; + FREE(parser, openEntity); + } +- ++ /* free m_openAttributeEntities and m_freeAttributeEntities */ ++ entityList = parser->m_openAttributeEntities; ++ for (;;) { ++ OPEN_INTERNAL_ENTITY *openEntity; ++ if (entityList == NULL) { ++ if (parser->m_freeAttributeEntities == NULL) ++ break; ++ entityList = parser->m_freeAttributeEntities; ++ parser->m_freeAttributeEntities = NULL; ++ } ++ openEntity = entityList; ++ entityList = entityList->next; ++ FREE(parser, openEntity); ++ } ++ /* free m_openValueEntities and m_freeValueEntities */ ++ entityList = parser->m_openValueEntities; ++ for (;;) { ++ OPEN_INTERNAL_ENTITY *openEntity; ++ if (entityList == NULL) { ++ if (parser->m_freeValueEntities == NULL) ++ break; ++ entityList = parser->m_freeValueEntities; ++ parser->m_freeValueEntities = NULL; ++ } ++ openEntity = entityList; ++ entityList = entityList->next; ++ FREE(parser, openEntity); ++ } + destroyBindings(parser->m_freeBindingList, parser); + destroyBindings(parser->m_inheritedBindings, parser); + poolDestroy(&parser->m_tempPool); +@@ -1611,8 +1716,7 @@ XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) { + return XML_ERROR_INVALID_ARGUMENT; + #ifdef XML_DTD + /* block after XML_Parse()/XML_ParseBuffer() has been called */ +- if (parser->m_parsingStatus.parsing == XML_PARSING +- || parser->m_parsingStatus.parsing == XML_SUSPENDED) ++ if (parserBusy(parser)) + return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; + parser->m_useForeignDTD = useDTD; + return XML_ERROR_NONE; +@@ -1627,8 +1731,7 @@ XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) { + if (parser == NULL) + return; + /* block after XML_Parse()/XML_ParseBuffer() has been called */ +- if (parser->m_parsingStatus.parsing == XML_PARSING +- || parser->m_parsingStatus.parsing == XML_SUSPENDED) ++ if (parserBusy(parser)) + return; + parser->m_ns_triplets = do_nst ? XML_TRUE : XML_FALSE; + } +@@ -1897,8 +2000,7 @@ XML_SetParamEntityParsing(XML_Parser parser, + if (parser == NULL) + return 0; + /* block after XML_Parse()/XML_ParseBuffer() has been called */ +- if (parser->m_parsingStatus.parsing == XML_PARSING +- || parser->m_parsingStatus.parsing == XML_SUSPENDED) ++ if (parserBusy(parser)) + return 0; + #ifdef XML_DTD + parser->m_paramEntityParsing = peParsing; +@@ -1915,8 +2017,7 @@ XML_SetHashSalt(XML_Parser parser, unsigned long hash_salt) { + if (parser->m_parentParser) + return XML_SetHashSalt(parser->m_parentParser, hash_salt); + /* block after XML_Parse()/XML_ParseBuffer() has been called */ +- if (parser->m_parsingStatus.parsing == XML_PARSING +- || parser->m_parsingStatus.parsing == XML_SUSPENDED) ++ if (parserBusy(parser)) + return 0; + parser->m_hash_secret_salt = hash_salt; + return 1; +@@ -2230,6 +2331,11 @@ XML_GetBuffer(XML_Parser parser, int len) { + return parser->m_bufferEnd; + } + ++static void ++triggerReenter(XML_Parser parser) { ++ parser->m_reenter = XML_TRUE; ++} ++ + enum XML_Status XMLCALL + XML_StopParser(XML_Parser parser, XML_Bool resumable) { + if (parser == NULL) +@@ -2704,8 +2810,9 @@ static enum XML_Error PTRCALL + contentProcessor(XML_Parser parser, const char *start, const char *end, + const char **endPtr) { + enum XML_Error result = doContent( +- parser, 0, parser->m_encoding, start, end, endPtr, +- (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_ACCOUNT_DIRECT); ++ parser, parser->m_parentParser ? 1 : 0, parser->m_encoding, start, end, ++ endPtr, (XML_Bool)! parser->m_parsingStatus.finalBuffer, ++ XML_ACCOUNT_DIRECT); + if (result == XML_ERROR_NONE) { + if (! storeRawNames(parser)) + return XML_ERROR_NO_MEMORY; +@@ -2793,6 +2900,11 @@ externalEntityInitProcessor3(XML_Parser parser, const char *start, + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; ++ case XML_PARSING: ++ if (parser->m_reenter) { ++ return XML_ERROR_UNEXPECTED_STATE; // LCOV_EXCL_LINE ++ } ++ /* Fall through */ + default: + start = next; + } +@@ -2966,7 +3078,7 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, + reportDefault(parser, enc, s, next); + break; + } +- result = processInternalEntity(parser, entity, XML_FALSE); ++ result = processEntity(parser, entity, XML_FALSE, ENTITY_INTERNAL); + if (result != XML_ERROR_NONE) + return result; + } else if (parser->m_externalEntityRefHandler) { +@@ -3092,7 +3204,9 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, + } + if ((parser->m_tagLevel == 0) + && (parser->m_parsingStatus.parsing != XML_FINISHED)) { +- if (parser->m_parsingStatus.parsing == XML_SUSPENDED) ++ if (parser->m_parsingStatus.parsing == XML_SUSPENDED ++ || (parser->m_parsingStatus.parsing == XML_PARSING ++ && parser->m_reenter)) + parser->m_processor = epilogProcessor; + else + return epilogProcessor(parser, next, end, nextPtr); +@@ -3153,7 +3267,9 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, + } + if ((parser->m_tagLevel == 0) + && (parser->m_parsingStatus.parsing != XML_FINISHED)) { +- if (parser->m_parsingStatus.parsing == XML_SUSPENDED) ++ if (parser->m_parsingStatus.parsing == XML_SUSPENDED ++ || (parser->m_parsingStatus.parsing == XML_PARSING ++ && parser->m_reenter)) + parser->m_processor = epilogProcessor; + else + return epilogProcessor(parser, next, end, nextPtr); +@@ -3293,6 +3409,12 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; ++ case XML_PARSING: ++ if (parser->m_reenter) { ++ *nextPtr = next; ++ return XML_ERROR_NONE; ++ } ++ /* Fall through */ + default:; + } + } +@@ -4217,6 +4339,11 @@ doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; ++ case XML_PARSING: ++ if (parser->m_reenter) { ++ return XML_ERROR_UNEXPECTED_STATE; // LCOV_EXCL_LINE ++ } ++ /* Fall through */ + default:; + } + } +@@ -4549,7 +4676,7 @@ entityValueInitProcessor(XML_Parser parser, const char *s, const char *end, + } + /* found end of entity value - can store it now */ + return storeEntityValue(parser, parser->m_encoding, s, end, +- XML_ACCOUNT_DIRECT); ++ XML_ACCOUNT_DIRECT, NULL); + } else if (tok == XML_TOK_XML_DECL) { + enum XML_Error result; + result = processXmlDecl(parser, 0, start, next); +@@ -4676,7 +4803,7 @@ entityValueProcessor(XML_Parser parser, const char *s, const char *end, + break; + } + /* found end of entity value - can store it now */ +- return storeEntityValue(parser, enc, s, end, XML_ACCOUNT_DIRECT); ++ return storeEntityValue(parser, enc, s, end, XML_ACCOUNT_DIRECT, NULL); + } + start = next; + } +@@ -5119,9 +5246,9 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end, + #if XML_GE == 1 + // This will store the given replacement text in + // parser->m_declEntity->textPtr. +- enum XML_Error result +- = storeEntityValue(parser, enc, s + enc->minBytesPerChar, +- next - enc->minBytesPerChar, XML_ACCOUNT_NONE); ++ enum XML_Error result = callStoreEntityValue( ++ parser, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar, ++ XML_ACCOUNT_NONE); + if (parser->m_declEntity) { + parser->m_declEntity->textPtr = poolStart(&dtd->entityValuePool); + parser->m_declEntity->textLen +@@ -5546,7 +5673,7 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end, + enum XML_Error result; + XML_Bool betweenDecl + = (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); +- result = processInternalEntity(parser, entity, betweenDecl); ++ result = processEntity(parser, entity, betweenDecl, ENTITY_INTERNAL); + if (result != XML_ERROR_NONE) + return result; + handleDefault = XML_FALSE; +@@ -5751,6 +5878,12 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end, + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; ++ case XML_PARSING: ++ if (parser->m_reenter) { ++ *nextPtr = next; ++ return XML_ERROR_NONE; ++ } ++ /* Fall through */ + default: + s = next; + tok = XmlPrologTok(enc, s, end, &next); +@@ -5825,21 +5958,49 @@ epilogProcessor(XML_Parser parser, const char *s, const char *end, + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; ++ case XML_PARSING: ++ if (parser->m_reenter) { ++ return XML_ERROR_UNEXPECTED_STATE; // LCOV_EXCL_LINE ++ } ++ /* Fall through */ + default:; + } + } + } + + static enum XML_Error +-processInternalEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl) { +- const char *textStart, *textEnd; +- const char *next; +- enum XML_Error result; +- OPEN_INTERNAL_ENTITY *openEntity; ++processEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl, ++ enum EntityType type) { ++ OPEN_INTERNAL_ENTITY *openEntity, **openEntityList, **freeEntityList; ++ switch (type) { ++ case ENTITY_INTERNAL: ++ parser->m_processor = internalEntityProcessor; ++ openEntityList = &parser->m_openInternalEntities; ++ freeEntityList = &parser->m_freeInternalEntities; ++ break; ++ case ENTITY_ATTRIBUTE: ++ openEntityList = &parser->m_openAttributeEntities; ++ freeEntityList = &parser->m_freeAttributeEntities; ++ break; ++ case ENTITY_VALUE: ++ openEntityList = &parser->m_openValueEntities; ++ freeEntityList = &parser->m_freeValueEntities; ++ break; ++ /* default case serves merely as a safety net in case of a ++ * wrong entityType. Therefore we exclude the following lines ++ * from the test coverage. ++ * ++ * LCOV_EXCL_START ++ */ ++ default: ++ // Should not reach here ++ assert(0); ++ /* LCOV_EXCL_STOP */ ++ } + +- if (parser->m_freeInternalEntities) { +- openEntity = parser->m_freeInternalEntities; +- parser->m_freeInternalEntities = openEntity->next; ++ if (*freeEntityList) { ++ openEntity = *freeEntityList; ++ *freeEntityList = openEntity->next; + } else { + openEntity + = (OPEN_INTERNAL_ENTITY *)MALLOC(parser, sizeof(OPEN_INTERNAL_ENTITY)); +@@ -5847,55 +6008,34 @@ processInternalEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl) { + return XML_ERROR_NO_MEMORY; + } + entity->open = XML_TRUE; ++ entity->hasMore = XML_TRUE; + #if XML_GE == 1 + entityTrackingOnOpen(parser, entity, __LINE__); + #endif + entity->processed = 0; +- openEntity->next = parser->m_openInternalEntities; +- parser->m_openInternalEntities = openEntity; ++ openEntity->next = *openEntityList; ++ *openEntityList = openEntity; + openEntity->entity = entity; ++ openEntity->type = type; + openEntity->startTagLevel = parser->m_tagLevel; + openEntity->betweenDecl = betweenDecl; + openEntity->internalEventPtr = NULL; + openEntity->internalEventEndPtr = NULL; +- textStart = (const char *)entity->textPtr; +- textEnd = (const char *)(entity->textPtr + entity->textLen); +- /* Set a safe default value in case 'next' does not get set */ +- next = textStart; +- +- if (entity->is_param) { +- int tok +- = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); +- result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, +- tok, next, &next, XML_FALSE, XML_FALSE, +- XML_ACCOUNT_ENTITY_EXPANSION); +- } else { +- result = doContent(parser, parser->m_tagLevel, parser->m_internalEncoding, +- textStart, textEnd, &next, XML_FALSE, +- XML_ACCOUNT_ENTITY_EXPANSION); +- } + +- if (result == XML_ERROR_NONE) { +- if (textEnd != next && parser->m_parsingStatus.parsing == XML_SUSPENDED) { +- entity->processed = (int)(next - textStart); +- parser->m_processor = internalEntityProcessor; +- } else if (parser->m_openInternalEntities->entity == entity) { +-#if XML_GE == 1 +- entityTrackingOnClose(parser, entity, __LINE__); +-#endif /* XML_GE == 1 */ +- entity->open = XML_FALSE; +- parser->m_openInternalEntities = openEntity->next; +- /* put openEntity back in list of free instances */ +- openEntity->next = parser->m_freeInternalEntities; +- parser->m_freeInternalEntities = openEntity; +- } ++ // Only internal entities make use of the reenter flag ++ // therefore no need to set it for other entity types ++ if (type == ENTITY_INTERNAL) { ++ triggerReenter(parser); + } +- return result; ++ return XML_ERROR_NONE; + } + + static enum XML_Error PTRCALL + internalEntityProcessor(XML_Parser parser, const char *s, const char *end, + const char **nextPtr) { ++ UNUSED_P(s); ++ UNUSED_P(end); ++ UNUSED_P(nextPtr); + ENTITY *entity; + const char *textStart, *textEnd; + const char *next; +@@ -5905,68 +6045,67 @@ internalEntityProcessor(XML_Parser parser, const char *s, const char *end, + return XML_ERROR_UNEXPECTED_STATE; + + entity = openEntity->entity; +- textStart = ((const char *)entity->textPtr) + entity->processed; +- textEnd = (const char *)(entity->textPtr + entity->textLen); +- /* Set a safe default value in case 'next' does not get set */ +- next = textStart; +- +- if (entity->is_param) { +- int tok +- = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); +- result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, +- tok, next, &next, XML_FALSE, XML_TRUE, +- XML_ACCOUNT_ENTITY_EXPANSION); +- } else { +- result = doContent(parser, openEntity->startTagLevel, +- parser->m_internalEncoding, textStart, textEnd, &next, +- XML_FALSE, XML_ACCOUNT_ENTITY_EXPANSION); +- } + +- if (result != XML_ERROR_NONE) +- return result; ++ // This will return early ++ if (entity->hasMore) { ++ textStart = ((const char *)entity->textPtr) + entity->processed; ++ textEnd = (const char *)(entity->textPtr + entity->textLen); ++ /* Set a safe default value in case 'next' does not get set */ ++ next = textStart; ++ ++ if (entity->is_param) { ++ int tok ++ = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); ++ result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, ++ tok, next, &next, XML_FALSE, XML_FALSE, ++ XML_ACCOUNT_ENTITY_EXPANSION); ++ } else { ++ result = doContent(parser, openEntity->startTagLevel, ++ parser->m_internalEncoding, textStart, textEnd, &next, ++ XML_FALSE, XML_ACCOUNT_ENTITY_EXPANSION); ++ } ++ ++ if (result != XML_ERROR_NONE) ++ return result; ++ // Check if entity is complete, if not, mark down how much of it is ++ // processed ++ if (textEnd != next ++ && (parser->m_parsingStatus.parsing == XML_SUSPENDED ++ || (parser->m_parsingStatus.parsing == XML_PARSING ++ && parser->m_reenter))) { ++ entity->processed = (int)(next - (const char *)entity->textPtr); ++ return result; ++ } + +- if (textEnd != next && parser->m_parsingStatus.parsing == XML_SUSPENDED) { +- entity->processed = (int)(next - (const char *)entity->textPtr); ++ // Entity is complete. We cannot close it here since we need to first ++ // process its possible inner entities (which are added to the ++ // m_openInternalEntities during doProlog or doContent calls above) ++ entity->hasMore = XML_FALSE; ++ triggerReenter(parser); + return result; +- } ++ } // End of entity processing, "if" block will return here + ++ // Remove fully processed openEntity from open entity list. + #if XML_GE == 1 + entityTrackingOnClose(parser, entity, __LINE__); + #endif ++ // openEntity is m_openInternalEntities' head, as we set it at the start of ++ // this function and we skipped doProlog and doContent calls with hasMore set ++ // to false. This means we can directly remove the head of ++ // m_openInternalEntities ++ assert(parser->m_openInternalEntities == openEntity); + entity->open = XML_FALSE; +- parser->m_openInternalEntities = openEntity->next; ++ parser->m_openInternalEntities = parser->m_openInternalEntities->next; ++ + /* put openEntity back in list of free instances */ + openEntity->next = parser->m_freeInternalEntities; + parser->m_freeInternalEntities = openEntity; + +- // If there are more open entities we want to stop right here and have the +- // upcoming call to XML_ResumeParser continue with entity content, or it would +- // be ignored altogether. +- if (parser->m_openInternalEntities != NULL +- && parser->m_parsingStatus.parsing == XML_SUSPENDED) { +- return XML_ERROR_NONE; +- } +- +- if (entity->is_param) { +- int tok; +- parser->m_processor = prologProcessor; +- tok = XmlPrologTok(parser->m_encoding, s, end, &next); +- return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr, +- (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE, +- XML_ACCOUNT_DIRECT); +- } else { +- parser->m_processor = contentProcessor; +- /* see externalEntityContentProcessor vs contentProcessor */ +- result = doContent(parser, parser->m_parentParser ? 1 : 0, +- parser->m_encoding, s, end, nextPtr, +- (XML_Bool)! parser->m_parsingStatus.finalBuffer, +- XML_ACCOUNT_DIRECT); +- if (result == XML_ERROR_NONE) { +- if (! storeRawNames(parser)) +- return XML_ERROR_NO_MEMORY; +- } +- return result; ++ if (parser->m_openInternalEntities == NULL) { ++ parser->m_processor = entity->is_param ? prologProcessor : contentProcessor; + } ++ triggerReenter(parser); ++ return XML_ERROR_NONE; + } + + static enum XML_Error PTRCALL +@@ -5982,8 +6121,70 @@ static enum XML_Error + storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + const char *ptr, const char *end, STRING_POOL *pool, + enum XML_Account account) { +- enum XML_Error result +- = appendAttributeValue(parser, enc, isCdata, ptr, end, pool, account); ++ const char *next = ptr; ++ enum XML_Error result = XML_ERROR_NONE; ++ ++ while (1) { ++ if (! parser->m_openAttributeEntities) { ++ result = appendAttributeValue(parser, enc, isCdata, next, end, pool, ++ account, &next); ++ } else { ++ OPEN_INTERNAL_ENTITY *const openEntity = parser->m_openAttributeEntities; ++ if (! openEntity) ++ return XML_ERROR_UNEXPECTED_STATE; ++ ++ ENTITY *const entity = openEntity->entity; ++ const char *const textStart ++ = ((const char *)entity->textPtr) + entity->processed; ++ const char *const textEnd ++ = (const char *)(entity->textPtr + entity->textLen); ++ /* Set a safe default value in case 'next' does not get set */ ++ const char *nextInEntity = textStart; ++ if (entity->hasMore) { ++ result = appendAttributeValue( ++ parser, parser->m_internalEncoding, isCdata, textStart, textEnd, ++ pool, XML_ACCOUNT_ENTITY_EXPANSION, &nextInEntity); ++ if (result != XML_ERROR_NONE) ++ break; ++ // Check if entity is complete, if not, mark down how much of it is ++ // processed. A XML_SUSPENDED check here is not required as ++ // appendAttributeValue will never suspend the parser. ++ if (textEnd != nextInEntity) { ++ entity->processed ++ = (int)(nextInEntity - (const char *)entity->textPtr); ++ continue; ++ } ++ ++ // Entity is complete. We cannot close it here since we need to first ++ // process its possible inner entities (which are added to the ++ // m_openAttributeEntities during appendAttributeValue) ++ entity->hasMore = XML_FALSE; ++ continue; ++ } // End of entity processing, "if" block skips the rest ++ ++ // Remove fully processed openEntity from open entity list. ++#if XML_GE == 1 ++ entityTrackingOnClose(parser, entity, __LINE__); ++#endif ++ // openEntity is m_openAttributeEntities' head, since we set it at the ++ // start of this function and because we skipped appendAttributeValue call ++ // with hasMore set to false. This means we can directly remove the head ++ // of m_openAttributeEntities ++ assert(parser->m_openAttributeEntities == openEntity); ++ entity->open = XML_FALSE; ++ parser->m_openAttributeEntities = parser->m_openAttributeEntities->next; ++ ++ /* put openEntity back in list of free instances */ ++ openEntity->next = parser->m_freeAttributeEntities; ++ parser->m_freeAttributeEntities = openEntity; ++ } ++ ++ // Break if an error occurred or there is nothing left to process ++ if (result || (parser->m_openAttributeEntities == NULL && end == next)) { ++ break; ++ } ++ } ++ + if (result) + return result; + if (! isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) +@@ -5996,7 +6197,7 @@ storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + static enum XML_Error + appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + const char *ptr, const char *end, STRING_POOL *pool, +- enum XML_Account account) { ++ enum XML_Account account, const char **nextPtr) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ + #ifndef XML_DTD + UNUSED_P(account); +@@ -6014,6 +6215,9 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + #endif + switch (tok) { + case XML_TOK_NONE: ++ if (nextPtr) { ++ *nextPtr = next; ++ } + return XML_ERROR_NONE; + case XML_TOK_INVALID: + if (enc == parser->m_encoding) +@@ -6154,21 +6358,11 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; + } else { + enum XML_Error result; +- const XML_Char *textEnd = entity->textPtr + entity->textLen; +- entity->open = XML_TRUE; +-#if XML_GE == 1 +- entityTrackingOnOpen(parser, entity, __LINE__); +-#endif +- result = appendAttributeValue(parser, parser->m_internalEncoding, +- isCdata, (const char *)entity->textPtr, +- (const char *)textEnd, pool, +- XML_ACCOUNT_ENTITY_EXPANSION); +-#if XML_GE == 1 +- entityTrackingOnClose(parser, entity, __LINE__); +-#endif +- entity->open = XML_FALSE; +- if (result) +- return result; ++ result = processEntity(parser, entity, XML_FALSE, ENTITY_ATTRIBUTE); ++ if ((result == XML_ERROR_NONE) && (nextPtr != NULL)) { ++ *nextPtr = next; ++ } ++ return result; + } + } break; + default: +@@ -6197,7 +6391,7 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + static enum XML_Error + storeEntityValue(XML_Parser parser, const ENCODING *enc, + const char *entityTextPtr, const char *entityTextEnd, +- enum XML_Account account) { ++ enum XML_Account account, const char **nextPtr) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ + STRING_POOL *pool = &(dtd->entityValuePool); + enum XML_Error result = XML_ERROR_NONE; +@@ -6215,8 +6409,9 @@ storeEntityValue(XML_Parser parser, const ENCODING *enc, + return XML_ERROR_NO_MEMORY; + } + ++ const char *next; + for (;;) { +- const char *next ++ next + = entityTextPtr; /* XmlEntityValueTok doesn't always set the last arg */ + int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); + +@@ -6278,16 +6473,8 @@ storeEntityValue(XML_Parser parser, const ENCODING *enc, + } else + dtd->keepProcessing = dtd->standalone; + } else { +- entity->open = XML_TRUE; +- entityTrackingOnOpen(parser, entity, __LINE__); +- result = storeEntityValue( +- parser, parser->m_internalEncoding, (const char *)entity->textPtr, +- (const char *)(entity->textPtr + entity->textLen), +- XML_ACCOUNT_ENTITY_EXPANSION); +- entityTrackingOnClose(parser, entity, __LINE__); +- entity->open = XML_FALSE; +- if (result) +- goto endEntityValue; ++ result = processEntity(parser, entity, XML_FALSE, ENTITY_VALUE); ++ goto endEntityValue; + } + break; + } +@@ -6375,6 +6562,81 @@ endEntityValue: + # ifdef XML_DTD + parser->m_prologState.inEntityValue = oldInEntityValue; + # endif /* XML_DTD */ ++ // If 'nextPtr' is given, it should be updated during the processing ++ if (nextPtr != NULL) { ++ *nextPtr = next; ++ } ++ return result; ++} ++ ++static enum XML_Error ++callStoreEntityValue(XML_Parser parser, const ENCODING *enc, ++ const char *entityTextPtr, const char *entityTextEnd, ++ enum XML_Account account) { ++ const char *next = entityTextPtr; ++ enum XML_Error result = XML_ERROR_NONE; ++ while (1) { ++ if (! parser->m_openValueEntities) { ++ result ++ = storeEntityValue(parser, enc, next, entityTextEnd, account, &next); ++ } else { ++ OPEN_INTERNAL_ENTITY *const openEntity = parser->m_openValueEntities; ++ if (! openEntity) ++ return XML_ERROR_UNEXPECTED_STATE; ++ ++ ENTITY *const entity = openEntity->entity; ++ const char *const textStart ++ = ((const char *)entity->textPtr) + entity->processed; ++ const char *const textEnd ++ = (const char *)(entity->textPtr + entity->textLen); ++ /* Set a safe default value in case 'next' does not get set */ ++ const char *nextInEntity = textStart; ++ if (entity->hasMore) { ++ result = storeEntityValue(parser, parser->m_internalEncoding, textStart, ++ textEnd, XML_ACCOUNT_ENTITY_EXPANSION, ++ &nextInEntity); ++ if (result != XML_ERROR_NONE) ++ break; ++ // Check if entity is complete, if not, mark down how much of it is ++ // processed. A XML_SUSPENDED check here is not required as ++ // appendAttributeValue will never suspend the parser. ++ if (textEnd != nextInEntity) { ++ entity->processed ++ = (int)(nextInEntity - (const char *)entity->textPtr); ++ continue; ++ } ++ ++ // Entity is complete. We cannot close it here since we need to first ++ // process its possible inner entities (which are added to the ++ // m_openValueEntities during storeEntityValue) ++ entity->hasMore = XML_FALSE; ++ continue; ++ } // End of entity processing, "if" block skips the rest ++ ++ // Remove fully processed openEntity from open entity list. ++# if XML_GE == 1 ++ entityTrackingOnClose(parser, entity, __LINE__); ++# endif ++ // openEntity is m_openValueEntities' head, since we set it at the ++ // start of this function and because we skipped storeEntityValue call ++ // with hasMore set to false. This means we can directly remove the head ++ // of m_openValueEntities ++ assert(parser->m_openValueEntities == openEntity); ++ entity->open = XML_FALSE; ++ parser->m_openValueEntities = parser->m_openValueEntities->next; ++ ++ /* put openEntity back in list of free instances */ ++ openEntity->next = parser->m_freeValueEntities; ++ parser->m_freeValueEntities = openEntity; ++ } ++ ++ // Break if an error occurred or there is nothing left to process ++ if (result ++ || (parser->m_openValueEntities == NULL && entityTextEnd == next)) { ++ break; ++ } ++ } ++ + return result; + } + +diff --git a/tests/alloc_tests.c b/tests/alloc_tests.c +index e5d46eb..12ea3b2 100644 +--- a/tests/alloc_tests.c ++++ b/tests/alloc_tests.c +@@ -19,6 +19,7 @@ + Copyright (c) 2020 Tim Gates + Copyright (c) 2021 Donghee Na + Copyright (c) 2023 Sony Corporation / Snild Dolkow ++ Copyright (c) 2025 Berkay Eren Ürün + Licensed under the MIT license: + + Permission is hereby granted, free of charge, to any person obtaining +@@ -450,6 +451,31 @@ START_TEST(test_alloc_internal_entity) { + } + END_TEST + ++START_TEST(test_alloc_parameter_entity) { ++ const char *text = "\">" ++ "%param1;" ++ "]> &internal;content"; ++ int i; ++ const int alloc_test_max_repeats = 30; ++ ++ for (i = 0; i < alloc_test_max_repeats; i++) { ++ g_allocation_count = i; ++ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS); ++ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE) ++ != XML_STATUS_ERROR) ++ break; ++ alloc_teardown(); ++ alloc_setup(); ++ } ++ g_allocation_count = -1; ++ if (i == 0) ++ fail("Parameter entity processed despite duff allocator"); ++ if (i == alloc_test_max_repeats) ++ fail("Parameter entity not processed at max allocation count"); ++} ++END_TEST ++ + /* Test the robustness against allocation failure of element handling + * Based on test_dtd_default_handling(). + */ +@@ -2079,6 +2105,7 @@ make_alloc_test_case(Suite *s) { + tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_external_entity); + tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_ext_entity_set_encoding); + tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_internal_entity); ++ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_parameter_entity); + tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_default_handling); + tcase_add_test(tc_alloc, test_alloc_explicit_encoding); + tcase_add_test(tc_alloc, test_alloc_set_base); +diff --git a/tests/basic_tests.c b/tests/basic_tests.c +index d38b8fd..f0025fc 100644 +--- a/tests/basic_tests.c ++++ b/tests/basic_tests.c +@@ -10,7 +10,7 @@ + Copyright (c) 2003 Greg Stein + Copyright (c) 2005-2007 Steven Solie + Copyright (c) 2005-2012 Karl Waclawek +- Copyright (c) 2016-2024 Sebastian Pipping ++ Copyright (c) 2016-2025 Sebastian Pipping + Copyright (c) 2017-2022 Rhodri James + Copyright (c) 2017 Joe Orton + Copyright (c) 2017 José Gutiérrez de la Concha +@@ -19,6 +19,7 @@ + Copyright (c) 2020 Tim Gates + Copyright (c) 2021 Donghee Na + Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow ++ Copyright (c) 2024-2025 Berkay Eren Ürün + Licensed under the MIT license: + + Permission is hereby granted, free of charge, to any person obtaining +@@ -3960,7 +3961,7 @@ START_TEST(test_skipped_null_loaded_ext_entity) { + = {"\n" + "\n" + "%pe2;\n", +- external_entity_null_loader}; ++ external_entity_null_loader, NULL}; + + XML_SetUserData(g_parser, &test_data); + XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS); +@@ -3978,7 +3979,7 @@ START_TEST(test_skipped_unloaded_ext_entity) { + = {"\n" + "\n" + "%pe2;\n", +- NULL}; ++ NULL, NULL}; + + XML_SetUserData(g_parser, &test_data); + XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS); +@@ -5278,6 +5279,151 @@ START_TEST(test_pool_integrity_with_unfinished_attr) { + } + END_TEST + ++/* Test a possible early return location in internalEntityProcessor */ ++START_TEST(test_entity_ref_no_elements) { ++ const char *const text = "\n" ++ "]> &e1;"; // intentionally missing newline ++ ++ XML_Parser parser = XML_ParserCreate(NULL); ++ assert_true(_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE) ++ == XML_STATUS_ERROR); ++ assert_true(XML_GetErrorCode(parser) == XML_ERROR_NO_ELEMENTS); ++ XML_ParserFree(parser); ++} ++END_TEST ++ ++/* Tests if chained entity references lead to unbounded recursion */ ++START_TEST(test_deep_nested_entity) { ++ const size_t N_LINES = 60000; ++ const size_t SIZE_PER_LINE = 50; ++ ++ char *const text = (char *)malloc((N_LINES + 4) * SIZE_PER_LINE); ++ if (text == NULL) { ++ fail("malloc failed"); ++ } ++ ++ char *textPtr = text; ++ ++ // Create the XML ++ textPtr += snprintf(textPtr, SIZE_PER_LINE, ++ "\n"); ++ ++ for (size_t i = 1; i < N_LINES; ++i) { ++ textPtr += snprintf(textPtr, SIZE_PER_LINE, " \n", ++ (long unsigned)i, (long unsigned)(i - 1)); ++ } ++ ++ snprintf(textPtr, SIZE_PER_LINE, "]> &s%lu;\n", ++ (long unsigned)(N_LINES - 1)); ++ ++ const XML_Char *const expected = XCS("deepText"); ++ ++ CharData storage; ++ CharData_Init(&storage); ++ ++ XML_Parser parser = XML_ParserCreate(NULL); ++ ++ XML_SetCharacterDataHandler(parser, accumulate_characters); ++ XML_SetUserData(parser, &storage); ++ ++ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE) ++ == XML_STATUS_ERROR) ++ xml_failure(parser); ++ ++ CharData_CheckXMLChars(&storage, expected); ++ XML_ParserFree(parser); ++ free(text); ++} ++END_TEST ++ ++/* Tests if chained entity references in attributes ++lead to unbounded recursion */ ++START_TEST(test_deep_nested_attribute_entity) { ++ const size_t N_LINES = 60000; ++ const size_t SIZE_PER_LINE = 100; ++ ++ char *const text = (char *)malloc((N_LINES + 4) * SIZE_PER_LINE); ++ if (text == NULL) { ++ fail("malloc failed"); ++ } ++ ++ char *textPtr = text; ++ ++ // Create the XML ++ textPtr += snprintf(textPtr, SIZE_PER_LINE, ++ "\n"); ++ ++ for (size_t i = 1; i < N_LINES; ++i) { ++ textPtr += snprintf(textPtr, SIZE_PER_LINE, " \n", ++ (long unsigned)i, (long unsigned)(i - 1)); ++ } ++ ++ snprintf(textPtr, SIZE_PER_LINE, "]> mainText\n", ++ (long unsigned)(N_LINES - 1)); ++ ++ AttrInfo doc_info[] = {{XCS("name"), XCS("deepText")}, {NULL, NULL}}; ++ ElementInfo info[] = {{XCS("foo"), 1, NULL, NULL}, {NULL, 0, NULL, NULL}}; ++ info[0].attributes = doc_info; ++ ++ XML_Parser parser = XML_ParserCreate(NULL); ++ ParserAndElementInfo parserPlusElemenInfo = {parser, info}; ++ ++ XML_SetStartElementHandler(parser, counting_start_element_handler); ++ XML_SetUserData(parser, &parserPlusElemenInfo); ++ ++ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE) ++ == XML_STATUS_ERROR) ++ xml_failure(parser); ++ ++ XML_ParserFree(parser); ++ free(text); ++} ++END_TEST ++ ++START_TEST(test_deep_nested_entity_delayed_interpretation) { ++ const size_t N_LINES = 70000; ++ const size_t SIZE_PER_LINE = 100; ++ ++ char *const text = (char *)malloc((N_LINES + 4) * SIZE_PER_LINE); ++ if (text == NULL) { ++ fail("malloc failed"); ++ } ++ ++ char *textPtr = text; ++ ++ // Create the XML ++ textPtr += snprintf(textPtr, SIZE_PER_LINE, ++ "\n"); ++ ++ for (size_t i = 1; i < N_LINES; ++i) { ++ textPtr += snprintf(textPtr, SIZE_PER_LINE, ++ " \n", (long unsigned)i, ++ (long unsigned)(i - 1)); ++ } ++ ++ snprintf(textPtr, SIZE_PER_LINE, ++ " \">\n" ++ " %%define_g;\n" ++ "]>\n" ++ "\n", ++ (long unsigned)(N_LINES - 1)); ++ ++ XML_Parser parser = XML_ParserCreate(NULL); ++ ++ XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS); ++ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE) ++ == XML_STATUS_ERROR) ++ xml_failure(parser); ++ ++ XML_ParserFree(parser); ++ free(text); ++} ++END_TEST ++ + START_TEST(test_nested_entity_suspend) { + const char *const text = "'>\n" +@@ -5308,6 +5454,35 @@ START_TEST(test_nested_entity_suspend) { + } + END_TEST + ++START_TEST(test_nested_entity_suspend_2) { ++ const char *const text = "\n" ++ " \n" ++ " \n" ++ "]>\n" ++ "&ge3;"; ++ const XML_Char *const expected = XCS("head3") XCS("head2") XCS("head1") ++ XCS("Z") XCS("tail1") XCS("tail2") XCS("tail3"); ++ CharData storage; ++ CharData_Init(&storage); ++ XML_Parser parser = XML_ParserCreate(NULL); ++ ParserPlusStorage parserPlusStorage = {parser, &storage}; ++ ++ XML_SetCharacterDataHandler(parser, accumulate_char_data_and_suspend); ++ XML_SetUserData(parser, &parserPlusStorage); ++ ++ enum XML_Status status = XML_Parse(parser, text, (int)strlen(text), XML_TRUE); ++ while (status == XML_STATUS_SUSPENDED) { ++ status = XML_ResumeParser(parser); ++ } ++ if (status != XML_STATUS_OK) ++ xml_failure(parser); ++ ++ CharData_CheckXMLChars(&storage, expected); ++ XML_ParserFree(parser); ++} ++END_TEST ++ + /* Regression test for quadratic parsing on large tokens */ + START_TEST(test_big_tokens_scale_linearly) { + const struct { +@@ -6147,7 +6322,13 @@ make_basic_test_case(Suite *s) { + tcase_add_test(tc_basic, test_empty_element_abort); + tcase_add_test__ifdef_xml_dtd(tc_basic, + test_pool_integrity_with_unfinished_attr); ++ tcase_add_test__if_xml_ge(tc_basic, test_entity_ref_no_elements); ++ tcase_add_test__if_xml_ge(tc_basic, test_deep_nested_entity); ++ tcase_add_test__if_xml_ge(tc_basic, test_deep_nested_attribute_entity); ++ tcase_add_test__if_xml_ge(tc_basic, ++ test_deep_nested_entity_delayed_interpretation); + tcase_add_test__if_xml_ge(tc_basic, test_nested_entity_suspend); ++ tcase_add_test__if_xml_ge(tc_basic, test_nested_entity_suspend_2); + tcase_add_test(tc_basic, test_big_tokens_scale_linearly); + tcase_add_test(tc_basic, test_set_reparse_deferral); + tcase_add_test(tc_basic, test_reparse_deferral_is_inherited); +diff --git a/tests/handlers.c b/tests/handlers.c +index 0211985..bdb5b0e 100644 +--- a/tests/handlers.c ++++ b/tests/handlers.c +@@ -1882,6 +1882,21 @@ accumulate_entity_decl(void *userData, const XML_Char *entityName, + CharData_AppendXMLChars(storage, XCS("\n"), 1); + } + ++ ++void XMLCALL ++accumulate_char_data_and_suspend(void *userData, const XML_Char *s, int len) { ++ ParserPlusStorage *const parserPlusStorage = (ParserPlusStorage *)userData; ++ ++ CharData_AppendXMLChars(parserPlusStorage->storage, s, len); ++ ++ for (int i = 0; i < len; i++) { ++ if (s[i] == 'Z') { ++ XML_StopParser(parserPlusStorage->parser, /*resumable=*/XML_TRUE); ++ break; ++ } ++ } ++} ++ + void XMLCALL + accumulate_start_element(void *userData, const XML_Char *name, + const XML_Char **atts) { +diff --git a/tests/handlers.h b/tests/handlers.h +index 8850bb9..4d6a08d 100644 +--- a/tests/handlers.h ++++ b/tests/handlers.h +@@ -325,6 +325,7 @@ extern int XMLCALL external_entity_devaluer(XML_Parser parser, + typedef struct ext_hdlr_data { + const char *parse_text; + XML_ExternalEntityRefHandler handler; ++ CharData *storage; + } ExtHdlrData; + + extern int XMLCALL external_entity_oneshot_loader(XML_Parser parser, +@@ -569,6 +570,10 @@ extern void XMLCALL accumulate_entity_decl( + const XML_Char *systemId, const XML_Char *publicId, + const XML_Char *notationName); + ++extern void XMLCALL accumulate_char_data_and_suspend(void *userData, ++ const XML_Char *s, ++ int len); ++ + extern void XMLCALL accumulate_start_element(void *userData, + const XML_Char *name, + const XML_Char **atts); +diff --git a/tests/misc_tests.c b/tests/misc_tests.c +index 9afe092..f9a78f6 100644 +--- a/tests/misc_tests.c ++++ b/tests/misc_tests.c +@@ -59,6 +59,9 @@ + #include "handlers.h" + #include "misc_tests.h" + ++void XMLCALL accumulate_characters_ext_handler(void *userData, ++ const XML_Char *s, int len); ++ + /* Test that a failure to allocate the parser structure fails gracefully */ + START_TEST(test_misc_alloc_create_parser) { + XML_Memory_Handling_Suite memsuite = {duff_allocator, realloc, free}; +@@ -519,6 +522,45 @@ START_TEST(test_misc_stopparser_rejects_unstarted_parser) { + } + END_TEST + ++/* Adaptation of accumulate_characters that takes ExtHdlrData input to work with ++ * test_renter_loop_finite_content below */ ++void XMLCALL ++accumulate_characters_ext_handler(void *userData, const XML_Char *s, int len) { ++ ExtHdlrData *const test_data = (ExtHdlrData *)userData; ++ CharData_AppendXMLChars(test_data->storage, s, len); ++} ++ ++/* Test that internalEntityProcessor does not re-enter forever; ++ * based on files tests/xmlconf/xmltest/valid/ext-sa/012.{xml,ent} */ ++START_TEST(test_renter_loop_finite_content) { ++ CharData storage; ++ CharData_Init(&storage); ++ const char *const text = "\n" ++ "\n" ++ "\n" ++ "\n" ++ "\n" ++ "\n" ++ "]>\n" ++ "&e1;\n"; ++ ExtHdlrData test_data = {"&e4;\n", external_entity_null_loader, &storage}; ++ const XML_Char *const expected = XCS("(e5)\n"); ++ ++ XML_Parser parser = XML_ParserCreate(NULL); ++ assert_true(parser != NULL); ++ XML_SetUserData(parser, &test_data); ++ XML_SetExternalEntityRefHandler(parser, external_entity_oneshot_loader); ++ XML_SetCharacterDataHandler(parser, accumulate_characters_ext_handler); ++ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE) ++ == XML_STATUS_ERROR) ++ xml_failure(parser); ++ ++ CharData_CheckXMLChars(&storage, expected); ++ XML_ParserFree(parser); ++} ++END_TEST ++ + void + make_miscellaneous_test_case(Suite *s) { + TCase *tc_misc = tcase_create("miscellaneous tests"); +@@ -545,4 +587,5 @@ make_miscellaneous_test_case(Suite *s) { + tcase_add_test(tc_misc, test_misc_char_handler_stop_without_leak); + tcase_add_test(tc_misc, test_misc_resumeparser_not_crashing); + tcase_add_test(tc_misc, test_misc_stopparser_rejects_unstarted_parser); ++ tcase_add_test__if_xml_ge(tc_misc, test_renter_loop_finite_content); + } +-- +2.48.1.431.g5a526e5e18 + diff --git a/SPECS/expat/CVE-2025-59375.patch b/SPECS/expat/CVE-2025-59375.patch new file mode 100644 index 0000000000..23b0c12c36 --- /dev/null +++ b/SPECS/expat/CVE-2025-59375.patch @@ -0,0 +1,1691 @@ +From 0872c189db6e457084fca335662a9cb49e8ec4c7 Mon Sep 17 00:00:00 2001 +From: Sebastian Pipping +Date: Mon, 1 Sep 2025 18:06:59 +0200 + +Upstream Patch Reference: https://patch-diff.githubusercontent.com/raw/libexpat/libexpat/pull/1034.diff.patch +Upstream PR: https://github.com/libexpat/libexpat/pull/1034 + +Modified patch to apply to AzureLinux +Modified by: akhila-guruju +Date: Mon, 22 Sep 2025 11:33:11 +0000 +Subject: [PATCH] Address CVE-2025-59375 + +--- + doc/reference.html | 118 +++++++- + doc/xmlwf.1 | 30 +- + doc/xmlwf.xml | 26 +- + fuzz/xml_parse_fuzzer.c | 14 +- + fuzz/xml_parsebuffer_fuzzer.c | 14 +- + lib/expat.h | 15 +- + lib/internal.h | 8 + + lib/libexpat.def.cmake | 3 + + lib/xmlparse.c | 521 ++++++++++++++++++++++++++++------ + tests/alloc_tests.c | 214 ++++++++++++++ + tests/basic_tests.c | 4 + + tests/nsalloc_tests.c | 5 + + xmlwf/xmlwf.c | 11 +- + xmlwf/xmlwf_helpgen.py | 3 + + 14 files changed, 874 insertions(+), 112 deletions(-) + +diff --git a/doc/reference.html b/doc/reference.html +index c2ae9bb..8f14b01 100644 +--- a/doc/reference.html ++++ b/doc/reference.html +@@ -157,6 +157,8 @@ interface.

+ + +@@ -1900,7 +1902,7 @@ struct XML_cp { +

Sets a handler for element declarations in a DTD. The handler gets + called with the name of the element in the declaration and a pointer + to a structure that contains the element model. It's the user code's +-responsibility to free model when finished with it. See ++responsibility to free model when finished with via a call to + XML_FreeContentModel. + There is no need to free the model from the handler, it can be kept + around and freed at a later stage.

+@@ -2262,6 +2264,120 @@ XML_SetBillionLaughsAttackProtectionActivationThreshold(XML_Parser p, +

+ + ++

XML_SetAllocTrackerMaximumAmplification

++
++/* Added in Expat 2.7.2. */
++XML_Bool
++XML_SetAllocTrackerMaximumAmplification(XML_Parser p,
++                                        float maximumAmplificationFactor);
++
++
++

++ Sets the maximum tolerated amplification factor ++ between direct input and bytes of dynamic memory allocated ++ (default: 100.0) ++ of parser p to maximumAmplificationFactor, and ++ returns XML_TRUE upon success and XML_FALSE upon error. ++

++ ++

++ Note: ++ There are three types of allocations that intentionally bypass tracking and limiting: ++

++ ++ ++

The amplification factor is calculated as ..

++
amplification := allocated / direct
++

++ .. while parsing, whereas ++ direct is the number of bytes read from the primary document in parsing and ++ allocated is the number of bytes of dynamic memory allocated in the parser hierarchy. ++

++ ++

For a call to XML_SetAllocTrackerMaximumAmplification to succeed:

++
    ++
  • parser p must be a non-NULL root parser (without any parent parsers) and
  • ++
  • maximumAmplificationFactor must be non-NaN and greater than or equal to 1.0.
  • ++
++ ++

++ Note: ++ If you ever need to increase this value for non-attack payload, ++ please file a bug report. ++

++ ++

++ Note: ++ Amplifications factors greater than 100 can been observed near the start of parsing ++ even with benign files in practice. ++ ++ So if you do reduce the maximum allowed amplification, ++ please make sure that the activation threshold is still big enough ++ to not end up with undesired false positives (i.e. benign files being rejected). ++

++
++ ++

XML_SetAllocTrackerActivationThreshold

++
++/* Added in Expat 2.7.2. */
++XML_Bool
++XML_SetAllocTrackerActivationThreshold(XML_Parser p,
++                                       unsigned long long activationThresholdBytes);
++
++
++

++ Sets number of allocated bytes of dynamic memory ++ needed to activate protection against disproportionate use of RAM ++ (default: 64 MiB) ++ of parser p to activationThresholdBytes, and ++ returns XML_TRUE upon success and XML_FALSE upon error. ++

++ ++

++ Note: ++ For types of allocations that intentionally bypass tracking and limiting, please see ++ XML_SetAllocTrackerMaximumAmplification ++ above. ++

++ ++

For a call to XML_SetAllocTrackerActivationThreshold to succeed:

++
    ++
  • parser p must be a non-NULL root parser (without any parent parsers).
  • ++
++ ++

++ Note: ++ If you ever need to increase this value for non-attack payload, ++ please file a bug report. ++

++
++ +

XML_SetReparseDeferralEnabled

+
+ /* Added in Expat 2.6.0. */
+diff --git a/doc/xmlwf.1 b/doc/xmlwf.1
+index 61b3025..5f50ba9 100644
+--- a/doc/xmlwf.1
++++ b/doc/xmlwf.1
+@@ -5,7 +5,7 @@
+ \\$2 \(la\\$1\(ra\\$3
+ ..
+ .if \n(.g .mso www.tmac
+-.TH XMLWF 1 "November 6, 2024" "" ""
++.TH XMLWF 1 "September 16, 2025" "" ""
+ .SH NAME
+ xmlwf \- Determines if an XML document is well-formed
+ .SH SYNOPSIS
+@@ -88,7 +88,11 @@ supports both.
+ .TP 
+ \*(T<\fB\-a\fR\*(T> \fIfactor\fR
+ Sets the maximum tolerated amplification factor
+-for protection against billion laughs attacks (default: 100.0).
++for protection against amplification attacks
++like the billion laughs attack
++(default: 100.0
++for the sum of direct and indirect output and also
++for allocations of dynamic memory).
+ The amplification factor is calculated as ..
+ 
+ .nf
+@@ -97,12 +101,22 @@ The amplification factor is calculated as ..
+           
+ .fi
+ 
+-\&.. while parsing, whereas
++\&.. with regard to use of entities and ..
++
++.nf
++
++            amplification := allocated / direct
++          
++.fi
++
++\&.. with regard to dynamic memory while parsing.
+  is the number of bytes read
+-from the primary document in parsing and
++from the primary document in parsing,
+  is the number of bytes
+ added by expanding entities and reading of external DTD files,
+-combined.
++combined, and
++ is the total number of bytes of dynamic memory
++allocated (and not freed) per hierarchy of parsers.
+ 
+ \fINOTE\fR:
+ If you ever need to increase this value for non-attack payload,
+@@ -110,8 +124,10 @@ please file a bug report.
+ .TP 
+ \*(T<\fB\-b\fR\*(T> \fIbytes\fR
+ Sets the number of output bytes (including amplification)
+-needed to activate protection against billion laughs attacks
+-(default: 8 MiB).
++needed to activate protection against amplification attacks
++like billion laughs
++(default: 8 MiB for the sum of direct and indirect output,
++and 64 MiB for allocations of dynamic memory).
+ This can be thought of as an "activation threshold".
+ 
+ \fINOTE\fR:
+diff --git a/doc/xmlwf.xml b/doc/xmlwf.xml
+index cf6d984..d152e6f 100644
+--- a/doc/xmlwf.xml
++++ b/doc/xmlwf.xml
+@@ -158,19 +158,31 @@ supports both.
+         
+           
+             Sets the maximum tolerated amplification factor
+-            for protection against billion laughs attacks (default: 100.0).
++            for protection against amplification attacks
++            like the billion laughs attack
++            (default: 100.0
++            for the sum of direct and indirect output and also
++            for allocations of dynamic memory).
+             The amplification factor is calculated as ..
+           
+           
+             amplification := (direct + indirect) / direct
+           
+           
+-            .. while parsing, whereas
++            .. with regard to use of entities and ..
++          
++          
++            amplification := allocated / direct
++          
++          
++            .. with regard to dynamic memory while parsing.
+             <direct> is the number of bytes read
+-              from the primary document in parsing and
++              from the primary document in parsing,
+             <indirect> is the number of bytes
+               added by expanding entities and reading of external DTD files,
+-              combined.
++              combined, and
++            <allocated> is the total number of bytes of dynamic memory
++              allocated (and not freed) per hierarchy of parsers.
+           
+           
+             NOTE:
+@@ -185,8 +197,10 @@ supports both.
+         
+           
+             Sets the number of output bytes (including amplification)
+-            needed to activate protection against billion laughs attacks
+-            (default: 8 MiB).
++            needed to activate protection against amplification attacks
++            like billion laughs
++            (default: 8 MiB for the sum of direct and indirect output,
++            and 64 MiB for allocations of dynamic memory).
+             This can be thought of as an "activation threshold".
+           
+           
+diff --git a/fuzz/xml_parse_fuzzer.c b/fuzz/xml_parse_fuzzer.c
+index a7e8414..677fe59 100644
+--- a/fuzz/xml_parse_fuzzer.c
++++ b/fuzz/xml_parse_fuzzer.c
+@@ -89,15 +89,17 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ 
+   XML_Parser externalEntityParser
+       = XML_ExternalEntityParserCreate(parentParser, "e1", NULL);
+-  assert(externalEntityParser);
+-  ParseOneInput(externalEntityParser, data, size);
+-  XML_ParserFree(externalEntityParser);
++  if (externalEntityParser != NULL) {
++    ParseOneInput(externalEntityParser, data, size);
++    XML_ParserFree(externalEntityParser);
++  }
+ 
+   XML_Parser externalDtdParser
+       = XML_ExternalEntityParserCreate(parentParser, NULL, NULL);
+-  assert(externalDtdParser);
+-  ParseOneInput(externalDtdParser, data, size);
+-  XML_ParserFree(externalDtdParser);
++  if (externalDtdParser != NULL) {
++    ParseOneInput(externalDtdParser, data, size);
++    XML_ParserFree(externalDtdParser);
++  }
+ 
+   // finally frees this parser which served as parent
+   XML_ParserFree(parentParser);
+diff --git a/fuzz/xml_parsebuffer_fuzzer.c b/fuzz/xml_parsebuffer_fuzzer.c
+index 0327aa9..7939f20 100644
+--- a/fuzz/xml_parsebuffer_fuzzer.c
++++ b/fuzz/xml_parsebuffer_fuzzer.c
+@@ -101,15 +101,17 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ 
+   XML_Parser externalEntityParser
+       = XML_ExternalEntityParserCreate(parentParser, "e1", NULL);
+-  assert(externalEntityParser);
+-  ParseOneInput(externalEntityParser, data, size);
+-  XML_ParserFree(externalEntityParser);
++  if (externalEntityParser != NULL) {
++    ParseOneInput(externalEntityParser, data, size);
++    XML_ParserFree(externalEntityParser);
++  }
+ 
+   XML_Parser externalDtdParser
+       = XML_ExternalEntityParserCreate(parentParser, NULL, NULL);
+-  assert(externalDtdParser);
+-  ParseOneInput(externalDtdParser, data, size);
+-  XML_ParserFree(externalDtdParser);
++  if (externalDtdParser != NULL) {
++    ParseOneInput(externalDtdParser, data, size);
++    XML_ParserFree(externalDtdParser);
++  }
+ 
+   // finally frees this parser which served as parent
+   XML_ParserFree(parentParser);
+diff --git a/lib/expat.h b/lib/expat.h
+index 523b37d..df207e9 100644
+--- a/lib/expat.h
++++ b/lib/expat.h
+@@ -1032,7 +1032,10 @@ enum XML_FeatureEnum {
+   XML_FEATURE_BILLION_LAUGHS_ATTACK_PROTECTION_MAXIMUM_AMPLIFICATION_DEFAULT,
+   XML_FEATURE_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT,
+   /* Added in Expat 2.6.0. */
+-  XML_FEATURE_GE
++  XML_FEATURE_GE,
++  /* Added in Expat 2.7.2. */
++  XML_FEATURE_ALLOC_TRACKER_MAXIMUM_AMPLIFICATION_DEFAULT,
++  XML_FEATURE_ALLOC_TRACKER_ACTIVATION_THRESHOLD_DEFAULT,
+   /* Additional features must be added to the end of this enum. */
+ };
+ 
+@@ -1057,6 +1060,16 @@ XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+ XMLPARSEAPI(XML_Bool)
+ XML_SetBillionLaughsAttackProtectionActivationThreshold(
+     XML_Parser parser, unsigned long long activationThresholdBytes);
++
++/* Added in Expat 2.7.2. */
++XMLPARSEAPI(XML_Bool)
++XML_SetAllocTrackerMaximumAmplification(XML_Parser parser,
++                                        float maximumAmplificationFactor);
++
++/* Added in Expat 2.7.2. */
++XMLPARSEAPI(XML_Bool)
++XML_SetAllocTrackerActivationThreshold(
++    XML_Parser parser, unsigned long long activationThresholdBytes);
+ #endif
+ 
+ /* Added in Expat 2.6.0. */
+diff --git a/lib/internal.h b/lib/internal.h
+index 167ec36..1b763ff 100644
+--- a/lib/internal.h
++++ b/lib/internal.h
+@@ -145,6 +145,11 @@
+   100.0f
+ #define EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT    \
+   8388608 // 8 MiB, 2^23
++
++#define EXPAT_ALLOC_TRACKER_MAXIMUM_AMPLIFICATION_DEFAULT 100.0f
++#define EXPAT_ALLOC_TRACKER_ACTIVATION_THRESHOLD_DEFAULT                       \
++  67108864 // 64 MiB, 2^26
++
+ /* NOTE END */
+ 
+ #include "expat.h" // so we can use type XML_Parser below
+@@ -168,6 +173,9 @@ extern
+ #endif
+     XML_Bool g_reparseDeferralEnabledDefault; // written ONLY in runtests.c
+ #if defined(XML_TESTING)
++void *expat_malloc(XML_Parser parser, size_t size, int sourceLine);
++void expat_free(XML_Parser parser, void *ptr, int sourceLine);
++void *expat_realloc(XML_Parser parser, void *ptr, size_t size, int sourceLine);
+ extern unsigned int g_bytesScanned; // used for testing only
+ #endif
+ 
+diff --git a/lib/libexpat.def.cmake b/lib/libexpat.def.cmake
+index 10ee9cd..7a3a7ec 100644
+--- a/lib/libexpat.def.cmake
++++ b/lib/libexpat.def.cmake
+@@ -79,3 +79,6 @@ EXPORTS
+ @_EXPAT_COMMENT_DTD_OR_GE@ XML_SetBillionLaughsAttackProtectionMaximumAmplification @70
+ ; added with version 2.6.0
+   XML_SetReparseDeferralEnabled @71
++; added with version 2.7.2
++@_EXPAT_COMMENT_DTD_OR_GE@ XML_SetAllocTrackerMaximumAmplification @72
++@_EXPAT_COMMENT_DTD_OR_GE@ XML_SetAllocTrackerActivationThreshold @73
+diff --git a/lib/xmlparse.c b/lib/xmlparse.c
+index 473c791..e2847b1 100644
+--- a/lib/xmlparse.c
++++ b/lib/xmlparse.c
+@@ -234,7 +234,7 @@ typedef struct {
+   unsigned char power;
+   size_t size;
+   size_t used;
+-  const XML_Memory_Handling_Suite *mem;
++  XML_Parser parser;
+ } HASH_TABLE;
+ 
+ static size_t keylen(KEY s);
+@@ -357,7 +357,7 @@ typedef struct {
+   const XML_Char *end;
+   XML_Char *ptr;
+   XML_Char *start;
+-  const XML_Memory_Handling_Suite *mem;
++  XML_Parser parser;
+ } STRING_POOL;
+ 
+ /* The XML_Char before the name is used to determine whether
+@@ -452,6 +452,14 @@ typedef struct accounting {
+   unsigned long long activationThresholdBytes;
+ } ACCOUNTING;
+ 
++typedef struct MALLOC_TRACKER {
++  XmlBigCount bytesAllocated;
++  XmlBigCount peakBytesAllocated; // updated live only for debug level >=2
++  unsigned long debugLevel;
++  float maximumAmplificationFactor; // >=1.0
++  XmlBigCount activationThresholdBytes;
++} MALLOC_TRACKER;
++
+ typedef struct entity_stats {
+   unsigned int countEverOpened;
+   unsigned int currentDepth;
+@@ -555,27 +563,24 @@ static XML_Bool setContext(XML_Parser parser, const XML_Char *context);
+ 
+ static void FASTCALL normalizePublicId(XML_Char *s);
+ 
+-static DTD *dtdCreate(const XML_Memory_Handling_Suite *ms);
++static DTD *dtdCreate(XML_Parser parser);
+ /* do not call if m_parentParser != NULL */
+-static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms);
+-static void dtdDestroy(DTD *p, XML_Bool isDocEntity,
+-                       const XML_Memory_Handling_Suite *ms);
++static void dtdReset(DTD *p, XML_Parser parser);
++static void dtdDestroy(DTD *p, XML_Bool isDocEntity, XML_Parser parser);
+ static int dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd,
+-                   const XML_Memory_Handling_Suite *ms);
++                   XML_Parser parser);
+ static int copyEntityTable(XML_Parser oldParser, HASH_TABLE *newTable,
+                            STRING_POOL *newPool, const HASH_TABLE *oldTable);
+ static NAMED *lookup(XML_Parser parser, HASH_TABLE *table, KEY name,
+                      size_t createSize);
+-static void FASTCALL hashTableInit(HASH_TABLE *table,
+-                                   const XML_Memory_Handling_Suite *ms);
++static void FASTCALL hashTableInit(HASH_TABLE *table, XML_Parser parser);
+ static void FASTCALL hashTableClear(HASH_TABLE *table);
+ static void FASTCALL hashTableDestroy(HASH_TABLE *table);
+ static void FASTCALL hashTableIterInit(HASH_TABLE_ITER *iter,
+                                        const HASH_TABLE *table);
+ static NAMED *FASTCALL hashTableIterNext(HASH_TABLE_ITER *iter);
+ 
+-static void FASTCALL poolInit(STRING_POOL *pool,
+-                              const XML_Memory_Handling_Suite *ms);
++static void FASTCALL poolInit(STRING_POOL *pool, XML_Parser parser);
+ static void FASTCALL poolClear(STRING_POOL *pool);
+ static void FASTCALL poolDestroy(STRING_POOL *pool);
+ static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc,
+@@ -595,15 +600,15 @@ static XML_Content *build_model(XML_Parser parser);
+ static ELEMENT_TYPE *getElementType(XML_Parser parser, const ENCODING *enc,
+                                     const char *ptr, const char *end);
+ 
+-static XML_Char *copyString(const XML_Char *s,
+-                            const XML_Memory_Handling_Suite *memsuite);
++static XML_Char *copyString(const XML_Char *s, XML_Parser parser);
+ 
+ static unsigned long generate_hash_secret_salt(XML_Parser parser);
+ static XML_Bool startParsing(XML_Parser parser);
+ 
+ static XML_Parser parserCreate(const XML_Char *encodingName,
+                                const XML_Memory_Handling_Suite *memsuite,
+-                               const XML_Char *nameSep, DTD *dtd);
++                               const XML_Char *nameSep, DTD *dtd,
++                               XML_Parser parentParser);
+ 
+ static void parserInit(XML_Parser parser, const XML_Char *encodingName);
+ 
+@@ -773,14 +778,232 @@ struct XML_ParserStruct {
+   unsigned long m_hash_secret_salt;
+ #if XML_GE == 1
+   ACCOUNTING m_accounting;
++  MALLOC_TRACKER m_alloc_tracker;
+   ENTITY_STATS m_entity_stats;
+ #endif
+   XML_Bool m_reenter;
+ };
+ 
+-#define MALLOC(parser, s) (parser->m_mem.malloc_fcn((s)))
+-#define REALLOC(parser, p, s) (parser->m_mem.realloc_fcn((p), (s)))
+-#define FREE(parser, p) (parser->m_mem.free_fcn((p)))
++#if XML_GE == 1
++#  define MALLOC(parser, s) (expat_malloc((parser), (s), __LINE__))
++#  define REALLOC(parser, p, s) (expat_realloc((parser), (p), (s), __LINE__))
++#  define FREE(parser, p) (expat_free((parser), (p), __LINE__))
++#else
++#  define MALLOC(parser, s) (parser->m_mem.malloc_fcn((s)))
++#  define REALLOC(parser, p, s) (parser->m_mem.realloc_fcn((p), (s)))
++#  define FREE(parser, p) (parser->m_mem.free_fcn((p)))
++#endif
++
++#if XML_GE == 1
++static void
++expat_heap_stat(XML_Parser rootParser, char operator, XmlBigCount absDiff,
++                XmlBigCount newTotal, XmlBigCount peakTotal, int sourceLine) {
++  // NOTE: This can be +infinity or -nan
++  const float amplification
++      = (float)newTotal / (float)rootParser->m_accounting.countBytesDirect;
++  fprintf(
++      stderr,
++      "expat: Allocations(%p): Direct " EXPAT_FMT_ULL("10") ", allocated %c" EXPAT_FMT_ULL(
++          "10") " to " EXPAT_FMT_ULL("10") " (" EXPAT_FMT_ULL("10") " peak), amplification %8.2f (xmlparse.c:%d)\n",
++      (void *)rootParser, rootParser->m_accounting.countBytesDirect, operator,
++      absDiff, newTotal, peakTotal, (double)amplification, sourceLine);
++}
++
++static bool
++expat_heap_increase_tolerable(XML_Parser rootParser, XmlBigCount increase,
++                              int sourceLine) {
++  assert(rootParser != NULL);
++  assert(increase > 0);
++
++  XmlBigCount newTotal = 0;
++  bool tolerable = true;
++
++  // Detect integer overflow
++  if ((XmlBigCount)-1 - rootParser->m_alloc_tracker.bytesAllocated < increase) {
++    tolerable = false;
++  } else {
++    newTotal = rootParser->m_alloc_tracker.bytesAllocated + increase;
++
++    if (newTotal >= rootParser->m_alloc_tracker.activationThresholdBytes) {
++      assert(newTotal > 0);
++      // NOTE: This can be +infinity when dividing by zero but not -nan
++      const float amplification
++          = (float)newTotal / (float)rootParser->m_accounting.countBytesDirect;
++      if (amplification
++          > rootParser->m_alloc_tracker.maximumAmplificationFactor) {
++        tolerable = false;
++      }
++    }
++  }
++
++  if (! tolerable && (rootParser->m_alloc_tracker.debugLevel >= 1)) {
++    expat_heap_stat(rootParser, '+', increase, newTotal, newTotal, sourceLine);
++  }
++
++  return tolerable;
++}
++
++#  if defined(XML_TESTING)
++void *
++#  else
++static void *
++#  endif
++expat_malloc(XML_Parser parser, size_t size, int sourceLine) {
++  // Detect integer overflow
++  if (SIZE_MAX - size < sizeof(size_t)) {
++    return NULL;
++  }
++
++  const XML_Parser rootParser = getRootParserOf(parser, NULL);
++  assert(rootParser->m_parentParser == NULL);
++
++  const size_t bytesToAllocate = sizeof(size_t) + size;
++
++  if ((XmlBigCount)-1 - rootParser->m_alloc_tracker.bytesAllocated
++      < bytesToAllocate) {
++    return NULL; // i.e. signal integer overflow as out-of-memory
++  }
++
++  if (! expat_heap_increase_tolerable(rootParser, bytesToAllocate,
++                                      sourceLine)) {
++    return NULL; // i.e. signal violation as out-of-memory
++  }
++
++  // Actually allocate
++  void *const mallocedPtr = parser->m_mem.malloc_fcn(bytesToAllocate);
++
++  if (mallocedPtr == NULL) {
++    return NULL;
++  }
++
++  // Update in-block recorded size
++  *(size_t *)mallocedPtr = size;
++
++  // Update accounting
++  rootParser->m_alloc_tracker.bytesAllocated += bytesToAllocate;
++
++  // Report as needed
++  if (rootParser->m_alloc_tracker.debugLevel >= 2) {
++    if (rootParser->m_alloc_tracker.bytesAllocated
++        > rootParser->m_alloc_tracker.peakBytesAllocated) {
++      rootParser->m_alloc_tracker.peakBytesAllocated
++          = rootParser->m_alloc_tracker.bytesAllocated;
++    }
++    expat_heap_stat(rootParser, '+', bytesToAllocate,
++                    rootParser->m_alloc_tracker.bytesAllocated,
++                    rootParser->m_alloc_tracker.peakBytesAllocated, sourceLine);
++  }
++
++  return (char *)mallocedPtr + sizeof(size_t);
++}
++
++#  if defined(XML_TESTING)
++void
++#  else
++static void
++#  endif
++expat_free(XML_Parser parser, void *ptr, int sourceLine) {
++  assert(parser != NULL);
++
++  if (ptr == NULL) {
++    return;
++  }
++
++  const XML_Parser rootParser = getRootParserOf(parser, NULL);
++  assert(rootParser->m_parentParser == NULL);
++
++  // Extract size (to the eyes of malloc_fcn/realloc_fcn) and
++  // the original pointer returned by malloc/realloc
++  void *const mallocedPtr = (char *)ptr - sizeof(size_t);
++  const size_t bytesAllocated = sizeof(size_t) + *(size_t *)mallocedPtr;
++
++  // Update accounting
++  assert(rootParser->m_alloc_tracker.bytesAllocated >= bytesAllocated);
++  rootParser->m_alloc_tracker.bytesAllocated -= bytesAllocated;
++
++  // Report as needed
++  if (rootParser->m_alloc_tracker.debugLevel >= 2) {
++    expat_heap_stat(rootParser, '-', bytesAllocated,
++                    rootParser->m_alloc_tracker.bytesAllocated,
++                    rootParser->m_alloc_tracker.peakBytesAllocated, sourceLine);
++  }
++
++  // NOTE: This may be freeing rootParser, so freeing has to come last
++  parser->m_mem.free_fcn(mallocedPtr);
++}
++
++#  if defined(XML_TESTING)
++void *
++#  else
++static void *
++#  endif
++expat_realloc(XML_Parser parser, void *ptr, size_t size, int sourceLine) {
++  assert(parser != NULL);
++
++  if (ptr == NULL) {
++    return expat_malloc(parser, size, sourceLine);
++  }
++
++  if (size == 0) {
++    expat_free(parser, ptr, sourceLine);
++    return NULL;
++  }
++
++  const XML_Parser rootParser = getRootParserOf(parser, NULL);
++  assert(rootParser->m_parentParser == NULL);
++
++  // Extract original size (to the eyes of the caller) and the original
++  // pointer returned by malloc/realloc
++  void *mallocedPtr = (char *)ptr - sizeof(size_t);
++  const size_t prevSize = *(size_t *)mallocedPtr;
++
++  // Classify upcoming change
++  const bool isIncrease = (size > prevSize);
++  const size_t absDiff
++      = (size > prevSize) ? (size - prevSize) : (prevSize - size);
++
++  // Ask for permission from accounting
++  if (isIncrease) {
++    if (! expat_heap_increase_tolerable(rootParser, absDiff, sourceLine)) {
++      return NULL; // i.e. signal violation as out-of-memory
++    }
++  }
++
++  // Actually allocate
++  mallocedPtr = parser->m_mem.realloc_fcn(mallocedPtr, sizeof(size_t) + size);
++
++  if (mallocedPtr == NULL) {
++    return NULL;
++  }
++
++  // Update accounting
++  if (isIncrease) {
++    assert((XmlBigCount)-1 - rootParser->m_alloc_tracker.bytesAllocated
++           >= absDiff);
++    rootParser->m_alloc_tracker.bytesAllocated += absDiff;
++  } else { // i.e. decrease
++    assert(rootParser->m_alloc_tracker.bytesAllocated >= absDiff);
++    rootParser->m_alloc_tracker.bytesAllocated -= absDiff;
++  }
++
++  // Report as needed
++  if (rootParser->m_alloc_tracker.debugLevel >= 2) {
++    if (rootParser->m_alloc_tracker.bytesAllocated
++        > rootParser->m_alloc_tracker.peakBytesAllocated) {
++      rootParser->m_alloc_tracker.peakBytesAllocated
++          = rootParser->m_alloc_tracker.bytesAllocated;
++    }
++    expat_heap_stat(rootParser, isIncrease ? '+' : '-', absDiff,
++                    rootParser->m_alloc_tracker.bytesAllocated,
++                    rootParser->m_alloc_tracker.peakBytesAllocated, sourceLine);
++  }
++
++  // Update in-block recorded size
++  *(size_t *)mallocedPtr = size;
++
++  return (char *)mallocedPtr + sizeof(size_t);
++}
++#endif // XML_GE == 1
+ 
+ XML_Parser XMLCALL
+ XML_ParserCreate(const XML_Char *encodingName) {
+@@ -1100,19 +1323,40 @@ XML_Parser XMLCALL
+ XML_ParserCreate_MM(const XML_Char *encodingName,
+                     const XML_Memory_Handling_Suite *memsuite,
+                     const XML_Char *nameSep) {
+-  return parserCreate(encodingName, memsuite, nameSep, NULL);
++  return parserCreate(encodingName, memsuite, nameSep, NULL, NULL);
+ }
+ 
+ static XML_Parser
+ parserCreate(const XML_Char *encodingName,
+              const XML_Memory_Handling_Suite *memsuite, const XML_Char *nameSep,
+-             DTD *dtd) {
+-  XML_Parser parser;
++             DTD *dtd, XML_Parser parentParser) {
++  XML_Parser parser = NULL;
++
++#if XML_GE == 1
++  const size_t increase = sizeof(size_t) + sizeof(struct XML_ParserStruct);
++
++  if (parentParser != NULL) {
++    const XML_Parser rootParser = getRootParserOf(parentParser, NULL);
++    if (! expat_heap_increase_tolerable(rootParser, increase, __LINE__)) {
++      return NULL;
++    }
++  }
++#else
++  UNUSED_P(parentParser);
++#endif
+ 
+   if (memsuite) {
+     XML_Memory_Handling_Suite *mtemp;
++#if XML_GE == 1
++    void *const sizeAndParser = memsuite->malloc_fcn(
++        sizeof(size_t) + sizeof(struct XML_ParserStruct));
++    if (sizeAndParser != NULL) {
++      *(size_t *)sizeAndParser = sizeof(struct XML_ParserStruct);
++      parser = (XML_Parser)((char *)sizeAndParser + sizeof(size_t));
++#else
+     parser = memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
+     if (parser != NULL) {
++#endif
+       mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
+       mtemp->malloc_fcn = memsuite->malloc_fcn;
+       mtemp->realloc_fcn = memsuite->realloc_fcn;
+@@ -1120,18 +1364,67 @@ parserCreate(const XML_Char *encodingName,
+     }
+   } else {
+     XML_Memory_Handling_Suite *mtemp;
++#if XML_GE == 1
++    void *const sizeAndParser
++        = (XML_Parser)malloc(sizeof(size_t) + sizeof(struct XML_ParserStruct));
++    if (sizeAndParser != NULL) {
++      *(size_t *)sizeAndParser = sizeof(struct XML_ParserStruct);
++      parser = (XML_Parser)((char *)sizeAndParser + sizeof(size_t));
++#else
+     parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct));
+     if (parser != NULL) {
++#endif
+       mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
+       mtemp->malloc_fcn = malloc;
+       mtemp->realloc_fcn = realloc;
+       mtemp->free_fcn = free;
+     }
+-  }
++  } // cppcheck-suppress[memleak symbolName=sizeAndParser] // Cppcheck >=2.18.0
+ 
+   if (! parser)
+     return parser;
+ 
++#if XML_GE == 1
++  // Initialize .m_alloc_tracker
++  memset(&parser->m_alloc_tracker, 0, sizeof(MALLOC_TRACKER));
++  if (parentParser == NULL) {
++    parser->m_alloc_tracker.debugLevel
++        = getDebugLevel("EXPAT_MALLOC_DEBUG", 0u);
++    parser->m_alloc_tracker.maximumAmplificationFactor
++        = EXPAT_ALLOC_TRACKER_MAXIMUM_AMPLIFICATION_DEFAULT;
++    parser->m_alloc_tracker.activationThresholdBytes
++        = EXPAT_ALLOC_TRACKER_ACTIVATION_THRESHOLD_DEFAULT;
++
++    // NOTE: This initialization needs to come this early because these fields
++    //       are read by allocation tracking code
++    parser->m_parentParser = NULL;
++    parser->m_accounting.countBytesDirect = 0;
++  } else {
++    parser->m_parentParser = parentParser;
++  }
++
++  // Record XML_ParserStruct allocation we did a few lines up before
++  const XML_Parser rootParser = getRootParserOf(parser, NULL);
++  assert(rootParser->m_parentParser == NULL);
++  assert(SIZE_MAX - rootParser->m_alloc_tracker.bytesAllocated >= increase);
++  rootParser->m_alloc_tracker.bytesAllocated += increase;
++
++  // Report on allocation
++  if (rootParser->m_alloc_tracker.debugLevel >= 2) {
++    if (rootParser->m_alloc_tracker.bytesAllocated
++        > rootParser->m_alloc_tracker.peakBytesAllocated) {
++      rootParser->m_alloc_tracker.peakBytesAllocated
++          = rootParser->m_alloc_tracker.bytesAllocated;
++    }
++
++    expat_heap_stat(rootParser, '+', increase,
++                    rootParser->m_alloc_tracker.bytesAllocated,
++                    rootParser->m_alloc_tracker.peakBytesAllocated, __LINE__);
++  }
++#else
++  parser->m_parentParser = NULL;
++#endif // XML_GE == 1
++
+   parser->m_buffer = NULL;
+   parser->m_bufferLim = NULL;
+ 
+@@ -1166,7 +1459,7 @@ parserCreate(const XML_Char *encodingName,
+   if (dtd)
+     parser->m_dtd = dtd;
+   else {
+-    parser->m_dtd = dtdCreate(&parser->m_mem);
++    parser->m_dtd = dtdCreate(parser);
+     if (parser->m_dtd == NULL) {
+       FREE(parser, parser->m_dataBuf);
+       FREE(parser, parser->m_atts);
+@@ -1200,8 +1493,8 @@ parserCreate(const XML_Char *encodingName,
+ 
+   parser->m_protocolEncodingName = NULL;
+ 
+-  poolInit(&parser->m_tempPool, &(parser->m_mem));
+-  poolInit(&parser->m_temp2Pool, &(parser->m_mem));
++  poolInit(&parser->m_tempPool, parser);
++  poolInit(&parser->m_temp2Pool, parser);
+   parserInit(parser, encodingName);
+ 
+   if (encodingName && ! parser->m_protocolEncodingName) {
+@@ -1233,7 +1526,7 @@ parserInit(XML_Parser parser, const XML_Char *encodingName) {
+   parser->m_processor = prologInitProcessor;
+   XmlPrologStateInit(&parser->m_prologState);
+   if (encodingName != NULL) {
+-    parser->m_protocolEncodingName = copyString(encodingName, &(parser->m_mem));
++    parser->m_protocolEncodingName = copyString(encodingName, parser);
+   }
+   parser->m_curBase = NULL;
+   XmlInitEncoding(&parser->m_initEncoding, &parser->m_encoding, 0);
+@@ -1295,7 +1588,6 @@ parserInit(XML_Parser parser, const XML_Char *encodingName) {
+   parser->m_unknownEncodingMem = NULL;
+   parser->m_unknownEncodingRelease = NULL;
+   parser->m_unknownEncodingData = NULL;
+-  parser->m_parentParser = NULL;
+   parser->m_parsingStatus.parsing = XML_INITIALIZED;
+   // Reentry can only be triggered inside m_processor calls
+   parser->m_reenter = XML_FALSE;
+@@ -1385,7 +1677,7 @@ XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) {
+   FREE(parser, (void *)parser->m_protocolEncodingName);
+   parser->m_protocolEncodingName = NULL;
+   parserInit(parser, encodingName);
+-  dtdReset(parser->m_dtd, &parser->m_mem);
++  dtdReset(parser->m_dtd, parser);
+   return XML_TRUE;
+ }
+ 
+@@ -1421,7 +1713,7 @@ XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) {
+     parser->m_protocolEncodingName = NULL;
+   else {
+     /* Copy the new encoding name into allocated memory */
+-    parser->m_protocolEncodingName = copyString(encodingName, &(parser->m_mem));
++    parser->m_protocolEncodingName = copyString(encodingName, parser);
+     if (! parser->m_protocolEncodingName)
+       return XML_STATUS_ERROR;
+   }
+@@ -1530,9 +1822,10 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context,
+   */
+   if (parser->m_ns) {
+     XML_Char tmp[2] = {parser->m_namespaceSeparator, 0};
+-    parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);
++    parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd, oldParser);
+   } else {
+-    parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd);
++    parser
++        = parserCreate(encodingName, &parser->m_mem, NULL, newDtd, oldParser);
+   }
+ 
+   if (! parser)
+@@ -1576,7 +1869,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context,
+   parser->m_prologState.inEntityValue = oldInEntityValue;
+   if (context) {
+ #endif /* XML_DTD */
+-    if (! dtdCopy(oldParser, parser->m_dtd, oldDtd, &parser->m_mem)
++    if (! dtdCopy(oldParser, parser->m_dtd, oldDtd, parser)
+         || ! setContext(parser, context)) {
+       XML_ParserFree(parser);
+       return NULL;
+@@ -1688,14 +1981,16 @@ XML_ParserFree(XML_Parser parser) {
+ #else
+   if (parser->m_dtd)
+ #endif /* XML_DTD */
+-    dtdDestroy(parser->m_dtd, (XML_Bool)! parser->m_parentParser,
+-               &parser->m_mem);
++    dtdDestroy(parser->m_dtd, (XML_Bool)! parser->m_parentParser, parser);
+   FREE(parser, (void *)parser->m_atts);
+ #ifdef XML_ATTR_INFO
+   FREE(parser, (void *)parser->m_attInfo);
+ #endif
+   FREE(parser, parser->m_groupConnector);
+-  FREE(parser, parser->m_buffer);
++  // NOTE: We are avoiding FREE(..) here because parser->m_buffer
++  //       is not being allocated with MALLOC(..) but with plain
++  //       .malloc_fcn(..).
++  parser->m_mem.free_fcn(parser->m_buffer);
+   FREE(parser, parser->m_dataBuf);
+   FREE(parser, parser->m_nsAtts);
+   FREE(parser, parser->m_unknownEncodingMem);
+@@ -2287,7 +2582,9 @@ XML_GetBuffer(XML_Parser parser, int len) {
+         parser->m_errorCode = XML_ERROR_NO_MEMORY;
+         return NULL;
+       }
+-      newBuf = (char *)MALLOC(parser, bufferSize);
++      // NOTE: We are avoiding MALLOC(..) here to leave limiting
++      //       the input size to the application using Expat.
++      newBuf = (char *)parser->m_mem.malloc_fcn(bufferSize);
+       if (newBuf == 0) {
+         parser->m_errorCode = XML_ERROR_NO_MEMORY;
+         return NULL;
+@@ -2298,7 +2595,10 @@ XML_GetBuffer(XML_Parser parser, int len) {
+         memcpy(newBuf, &parser->m_bufferPtr[-keep],
+                EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr)
+                    + keep);
+-        FREE(parser, parser->m_buffer);
++        // NOTE: We are avoiding FREE(..) here because parser->m_buffer
++        //       is not being allocated with MALLOC(..) but with plain
++        //       .malloc_fcn(..).
++        parser->m_mem.free_fcn(parser->m_buffer);
+         parser->m_buffer = newBuf;
+         parser->m_bufferEnd
+             = parser->m_buffer
+@@ -2314,7 +2614,10 @@ XML_GetBuffer(XML_Parser parser, int len) {
+       if (parser->m_bufferPtr) {
+         memcpy(newBuf, parser->m_bufferPtr,
+                EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr));
+-        FREE(parser, parser->m_buffer);
++        // NOTE: We are avoiding FREE(..) here because parser->m_buffer
++        //       is not being allocated with MALLOC(..) but with plain
++        //       .malloc_fcn(..).
++        parser->m_mem.free_fcn(parser->m_buffer);
+         parser->m_bufferEnd
+             = newBuf
+               + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr);
+@@ -2492,28 +2795,43 @@ XML_GetCurrentColumnNumber(XML_Parser parser) {
+ 
+ void XMLCALL
+ XML_FreeContentModel(XML_Parser parser, XML_Content *model) {
+-  if (parser != NULL)
+-    FREE(parser, model);
++  if (parser == NULL)
++    return;
++
++  // NOTE: We are avoiding FREE(..) here because the content model
++  //       has been created using plain .malloc_fcn(..) rather than MALLOC(..).
++  parser->m_mem.free_fcn(model);
+ }
+ 
+ void *XMLCALL
+ XML_MemMalloc(XML_Parser parser, size_t size) {
+   if (parser == NULL)
+     return NULL;
+-  return MALLOC(parser, size);
++
++  // NOTE: We are avoiding MALLOC(..) here to not include
++  //       user allocations with allocation tracking and limiting.
++  return parser->m_mem.malloc_fcn(size);
+ }
+ 
+ void *XMLCALL
+ XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) {
+   if (parser == NULL)
+     return NULL;
+-  return REALLOC(parser, ptr, size);
++
++  // NOTE: We are avoiding REALLOC(..) here to not include
++  //       user allocations with allocation tracking and limiting.
++  return parser->m_mem.realloc_fcn(ptr, size);
+ }
+ 
+ void XMLCALL
+ XML_MemFree(XML_Parser parser, void *ptr) {
+-  if (parser != NULL)
+-    FREE(parser, ptr);
++  if (parser == NULL)
++    return;
++
++  // NOTE: We are avoiding FREE(..) here because XML_MemMalloc and
++  //       XML_MemRealloc are not using MALLOC(..) and REALLOC(..)
++  //       but plain .malloc_fcn(..) and .realloc_fcn(..), internally.
++  parser->m_mem.free_fcn(ptr);
+ }
+ 
+ void XMLCALL
+@@ -2713,6 +3031,13 @@ XML_GetFeatureList(void) {
+        EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT},
+       /* Added in Expat 2.6.0. */
+       {XML_FEATURE_GE, XML_L("XML_GE"), 0},
++      /* Added in Expat 2.7.2. */
++      {XML_FEATURE_ALLOC_TRACKER_MAXIMUM_AMPLIFICATION_DEFAULT,
++       XML_L("XML_AT_MAX_AMP"),
++       (long int)EXPAT_ALLOC_TRACKER_MAXIMUM_AMPLIFICATION_DEFAULT},
++      {XML_FEATURE_ALLOC_TRACKER_ACTIVATION_THRESHOLD_DEFAULT,
++       XML_L("XML_AT_ACT_THRES"),
++       (long int)EXPAT_ALLOC_TRACKER_ACTIVATION_THRESHOLD_DEFAULT},
+ #endif
+       {XML_FEATURE_END, NULL, 0}};
+ 
+@@ -2741,6 +3066,29 @@ XML_SetBillionLaughsAttackProtectionActivationThreshold(
+   parser->m_accounting.activationThresholdBytes = activationThresholdBytes;
+   return XML_TRUE;
+ }
++
++XML_Bool XMLCALL
++XML_SetAllocTrackerMaximumAmplification(XML_Parser parser,
++                                        float maximumAmplificationFactor) {
++  if ((parser == NULL) || (parser->m_parentParser != NULL)
++      || isnan(maximumAmplificationFactor)
++      || (maximumAmplificationFactor < 1.0f)) {
++    return XML_FALSE;
++  }
++  parser->m_alloc_tracker.maximumAmplificationFactor
++      = maximumAmplificationFactor;
++  return XML_TRUE;
++}
++
++XML_Bool XMLCALL
++XML_SetAllocTrackerActivationThreshold(
++    XML_Parser parser, unsigned long long activationThresholdBytes) {
++  if ((parser == NULL) || (parser->m_parentParser != NULL)) {
++    return XML_FALSE;
++  }
++  parser->m_alloc_tracker.activationThresholdBytes = activationThresholdBytes;
++  return XML_TRUE;
++}
+ #endif /* XML_GE == 1 */
+ 
+ XML_Bool XMLCALL
+@@ -5726,8 +6074,12 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
+     case XML_ROLE_CONTENT_EMPTY:
+       if (dtd->in_eldecl) {
+         if (parser->m_elementDeclHandler) {
++          // NOTE: We are avoiding MALLOC(..) here to so that
++          //       applications that are not using XML_FreeContentModel but
++          //       plain free(..) or .free_fcn() to free the content model's
++          //       memory are safe.
+           XML_Content *content
+-              = (XML_Content *)MALLOC(parser, sizeof(XML_Content));
++              = (XML_Content *)parser->m_mem.malloc_fcn(sizeof(XML_Content));
+           if (! content)
+             return XML_ERROR_NO_MEMORY;
+           content->quant = XML_CQUANT_NONE;
+@@ -7116,19 +7468,19 @@ normalizePublicId(XML_Char *publicId) {
+ }
+ 
+ static DTD *
+-dtdCreate(const XML_Memory_Handling_Suite *ms) {
+-  DTD *p = ms->malloc_fcn(sizeof(DTD));
++dtdCreate(XML_Parser parser) {
++  DTD *p = MALLOC(parser, sizeof(DTD));
+   if (p == NULL)
+     return p;
+-  poolInit(&(p->pool), ms);
+-  poolInit(&(p->entityValuePool), ms);
+-  hashTableInit(&(p->generalEntities), ms);
+-  hashTableInit(&(p->elementTypes), ms);
+-  hashTableInit(&(p->attributeIds), ms);
+-  hashTableInit(&(p->prefixes), ms);
++  poolInit(&(p->pool), parser);
++  poolInit(&(p->entityValuePool), parser);
++  hashTableInit(&(p->generalEntities), parser);
++  hashTableInit(&(p->elementTypes), parser);
++  hashTableInit(&(p->attributeIds), parser);
++  hashTableInit(&(p->prefixes), parser);
+ #ifdef XML_DTD
+   p->paramEntityRead = XML_FALSE;
+-  hashTableInit(&(p->paramEntities), ms);
++  hashTableInit(&(p->paramEntities), parser);
+ #endif /* XML_DTD */
+   p->defaultPrefix.name = NULL;
+   p->defaultPrefix.binding = NULL;
+@@ -7148,7 +7500,7 @@ dtdCreate(const XML_Memory_Handling_Suite *ms) {
+ }
+ 
+ static void
+-dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) {
++dtdReset(DTD *p, XML_Parser parser) {
+   HASH_TABLE_ITER iter;
+   hashTableIterInit(&iter, &(p->elementTypes));
+   for (;;) {
+@@ -7156,7 +7508,7 @@ dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) {
+     if (! e)
+       break;
+     if (e->allocDefaultAtts != 0)
+-      ms->free_fcn(e->defaultAtts);
++      FREE(parser, e->defaultAtts);
+   }
+   hashTableClear(&(p->generalEntities));
+ #ifdef XML_DTD
+@@ -7173,9 +7525,9 @@ dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) {
+ 
+   p->in_eldecl = XML_FALSE;
+ 
+-  ms->free_fcn(p->scaffIndex);
++  FREE(parser, p->scaffIndex);
+   p->scaffIndex = NULL;
+-  ms->free_fcn(p->scaffold);
++  FREE(parser, p->scaffold);
+   p->scaffold = NULL;
+ 
+   p->scaffLevel = 0;
+@@ -7189,7 +7541,7 @@ dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) {
+ }
+ 
+ static void
+-dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) {
++dtdDestroy(DTD *p, XML_Bool isDocEntity, XML_Parser parser) {
+   HASH_TABLE_ITER iter;
+   hashTableIterInit(&iter, &(p->elementTypes));
+   for (;;) {
+@@ -7197,7 +7549,7 @@ dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) {
+     if (! e)
+       break;
+     if (e->allocDefaultAtts != 0)
+-      ms->free_fcn(e->defaultAtts);
++      FREE(parser, e->defaultAtts);
+   }
+   hashTableDestroy(&(p->generalEntities));
+ #ifdef XML_DTD
+@@ -7209,10 +7561,10 @@ dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) {
+   poolDestroy(&(p->pool));
+   poolDestroy(&(p->entityValuePool));
+   if (isDocEntity) {
+-    ms->free_fcn(p->scaffIndex);
+-    ms->free_fcn(p->scaffold);
++    FREE(parser, p->scaffIndex);
++    FREE(parser, p->scaffold);
+   }
+-  ms->free_fcn(p);
++  FREE(parser, p);
+ }
+ 
+ /* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise.
+@@ -7220,7 +7572,7 @@ dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) {
+ */
+ static int
+ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd,
+-        const XML_Memory_Handling_Suite *ms) {
++        XML_Parser parser) {
+   HASH_TABLE_ITER iter;
+ 
+   /* Copy the prefix table. */
+@@ -7301,7 +7653,7 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd,
+       }
+ #endif
+       newE->defaultAtts
+-          = ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
++          = MALLOC(parser, oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
+       if (! newE->defaultAtts) {
+         return 0;
+       }
+@@ -7463,7 +7815,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) {
+     /* table->size is a power of 2 */
+     table->size = (size_t)1 << INIT_POWER;
+     tsize = table->size * sizeof(NAMED *);
+-    table->v = table->mem->malloc_fcn(tsize);
++    table->v = MALLOC(table->parser, tsize);
+     if (! table->v) {
+       table->size = 0;
+       return NULL;
+@@ -7503,7 +7855,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) {
+       }
+ 
+       size_t tsize = newSize * sizeof(NAMED *);
+-      NAMED **newV = table->mem->malloc_fcn(tsize);
++      NAMED **newV = MALLOC(table->parser, tsize);
+       if (! newV)
+         return NULL;
+       memset(newV, 0, tsize);
+@@ -7519,7 +7871,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) {
+           }
+           newV[j] = table->v[i];
+         }
+-      table->mem->free_fcn(table->v);
++      FREE(table->parser, table->v);
+       table->v = newV;
+       table->power = newPower;
+       table->size = newSize;
+@@ -7532,7 +7884,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) {
+       }
+     }
+   }
+-  table->v[i] = table->mem->malloc_fcn(createSize);
++  table->v[i] = MALLOC(table->parser, createSize);
+   if (! table->v[i])
+     return NULL;
+   memset(table->v[i], 0, createSize);
+@@ -7545,7 +7897,7 @@ static void FASTCALL
+ hashTableClear(HASH_TABLE *table) {
+   size_t i;
+   for (i = 0; i < table->size; i++) {
+-    table->mem->free_fcn(table->v[i]);
++    FREE(table->parser, table->v[i]);
+     table->v[i] = NULL;
+   }
+   table->used = 0;
+@@ -7555,17 +7907,17 @@ static void FASTCALL
+ hashTableDestroy(HASH_TABLE *table) {
+   size_t i;
+   for (i = 0; i < table->size; i++)
+-    table->mem->free_fcn(table->v[i]);
+-  table->mem->free_fcn(table->v);
++    FREE(table->parser, table->v[i]);
++  FREE(table->parser, table->v);
+ }
+ 
+ static void FASTCALL
+-hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) {
++hashTableInit(HASH_TABLE *p, XML_Parser parser) {
+   p->power = 0;
+   p->size = 0;
+   p->used = 0;
+   p->v = NULL;
+-  p->mem = ms;
++  p->parser = parser;
+ }
+ 
+ static void FASTCALL
+@@ -7585,13 +7937,13 @@ hashTableIterNext(HASH_TABLE_ITER *iter) {
+ }
+ 
+ static void FASTCALL
+-poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) {
++poolInit(STRING_POOL *pool, XML_Parser parser) {
+   pool->blocks = NULL;
+   pool->freeBlocks = NULL;
+   pool->start = NULL;
+   pool->ptr = NULL;
+   pool->end = NULL;
+-  pool->mem = ms;
++  pool->parser = parser;
+ }
+ 
+ static void FASTCALL
+@@ -7618,13 +7970,13 @@ poolDestroy(STRING_POOL *pool) {
+   BLOCK *p = pool->blocks;
+   while (p) {
+     BLOCK *tem = p->next;
+-    pool->mem->free_fcn(p);
++    FREE(pool->parser, p);
+     p = tem;
+   }
+   p = pool->freeBlocks;
+   while (p) {
+     BLOCK *tem = p->next;
+-    pool->mem->free_fcn(p);
++    FREE(pool->parser, p);
+     p = tem;
+   }
+ }
+@@ -7779,8 +8131,8 @@ poolGrow(STRING_POOL *pool) {
+     if (bytesToAllocate == 0)
+       return XML_FALSE;
+ 
+-    temp = (BLOCK *)pool->mem->realloc_fcn(pool->blocks,
+-                                           (unsigned)bytesToAllocate);
++    temp = (BLOCK *)REALLOC(pool->parser, pool->blocks,
++                            (unsigned)bytesToAllocate);
+     if (temp == NULL)
+       return XML_FALSE;
+     pool->blocks = temp;
+@@ -7820,7 +8172,7 @@ poolGrow(STRING_POOL *pool) {
+     if (bytesToAllocate == 0)
+       return XML_FALSE;
+ 
+-    tem = pool->mem->malloc_fcn(bytesToAllocate);
++    tem = MALLOC(pool->parser, bytesToAllocate);
+     if (! tem)
+       return XML_FALSE;
+     tem->size = blockSize;
+@@ -7935,7 +8287,10 @@ build_model(XML_Parser parser) {
+   const size_t allocsize = (dtd->scaffCount * sizeof(XML_Content)
+                             + (dtd->contentStringLen * sizeof(XML_Char)));
+ 
+-  ret = (XML_Content *)MALLOC(parser, allocsize);
++  // NOTE: We are avoiding MALLOC(..) here to so that
++  //       applications that are not using XML_FreeContentModel but plain
++  //       free(..) or .free_fcn() to free the content model's memory are safe.
++  ret = (XML_Content *)parser->m_mem.malloc_fcn(allocsize);
+   if (! ret)
+     return NULL;
+ 
+@@ -8056,7 +8411,7 @@ getElementType(XML_Parser parser, const ENCODING *enc, const char *ptr,
+ }
+ 
+ static XML_Char *
+-copyString(const XML_Char *s, const XML_Memory_Handling_Suite *memsuite) {
++copyString(const XML_Char *s, XML_Parser parser) {
+   size_t charsRequired = 0;
+   XML_Char *result;
+ 
+@@ -8068,7 +8423,7 @@ copyString(const XML_Char *s, const XML_Memory_Handling_Suite *memsuite) {
+   charsRequired++;
+ 
+   /* Now allocate space for the copy */
+-  result = memsuite->malloc_fcn(charsRequired * sizeof(XML_Char));
++  result = MALLOC(parser, charsRequired * sizeof(XML_Char));
+   if (result == NULL)
+     return NULL;
+   /* Copy the original into place */
+diff --git a/tests/alloc_tests.c b/tests/alloc_tests.c
+index 12ea3b2..47004a9 100644
+--- a/tests/alloc_tests.c
++++ b/tests/alloc_tests.c
+@@ -46,10 +46,16 @@
+ #  undef NDEBUG /* because test suite relies on assert(...) at the moment */
+ #endif
+ 
++#include  /* NAN, INFINITY */
++#include 
++#include  /* for SIZE_MAX */
+ #include 
+ #include 
+ 
++#include "expat_config.h"
++
+ #include "expat.h"
++#include "internal.h"
+ #include "common.h"
+ #include "minicheck.h"
+ #include "dummy.h"
+@@ -2085,6 +2091,203 @@ START_TEST(test_alloc_reset_after_external_entity_parser_create_fail) {
+ }
+ END_TEST
+ 
++START_TEST(test_alloc_tracker_size_recorded) {
++  XML_Memory_Handling_Suite memsuite = {malloc, realloc, free};
++
++  bool values[] = {true, false};
++  for (size_t i = 0; i < sizeof(values) / sizeof(values[0]); i++) {
++    const bool useMemSuite = values[i];
++    set_subtest("useMemSuite=%d", (int)useMemSuite);
++    XML_Parser parser = useMemSuite
++                            ? XML_ParserCreate_MM(NULL, &memsuite, XCS("|"))
++                            : XML_ParserCreate(NULL);
++
++#if XML_GE == 1
++    void *ptr = expat_malloc(parser, 10, -1);
++
++    assert_true(ptr != NULL);
++    assert_true(*((size_t *)ptr - 1) == 10);
++
++    assert_true(expat_realloc(parser, ptr, SIZE_MAX / 2, -1) == NULL);
++
++    assert_true(*((size_t *)ptr - 1) == 10); // i.e. unchanged
++
++    ptr = expat_realloc(parser, ptr, 20, -1);
++
++    assert_true(ptr != NULL);
++    assert_true(*((size_t *)ptr - 1) == 20);
++
++    expat_free(parser, ptr, -1);
++#endif
++
++    XML_ParserFree(parser);
++  }
++}
++END_TEST
++
++START_TEST(test_alloc_tracker_maximum_amplification) {
++  if (g_reparseDeferralEnabledDefault == XML_TRUE) {
++    return;
++  }
++
++  XML_Parser parser = XML_ParserCreate(NULL);
++
++  // Get .m_accounting.countBytesDirect from 0 to 3
++  const char *const chunk = "";
++  assert_true(_XML_Parse_SINGLE_BYTES(parser, chunk, (int)strlen(chunk),
++                                      /*isFinal=*/XML_FALSE)
++              == XML_STATUS_OK);
++
++#if XML_GE == 1
++  // Stop activation threshold from interfering
++  assert_true(XML_SetAllocTrackerActivationThreshold(parser, 0) == XML_TRUE);
++
++  // Exceed maximum amplification: should be rejected.
++  assert_true(expat_malloc(parser, 1000, -1) == NULL);
++
++  // Increase maximum amplification, and try the same amount once more: should
++  // work.
++  assert_true(XML_SetAllocTrackerMaximumAmplification(parser, 3000.0f)
++              == XML_TRUE);
++
++  void *const ptr = expat_malloc(parser, 1000, -1);
++  assert_true(ptr != NULL);
++  expat_free(parser, ptr, -1);
++#endif
++
++  XML_ParserFree(parser);
++}
++END_TEST
++
++START_TEST(test_alloc_tracker_threshold) {
++  XML_Parser parser = XML_ParserCreate(NULL);
++
++#if XML_GE == 1
++  // Exceed maximum amplification *before* (default) threshold: should work.
++  void *const ptr = expat_malloc(parser, 1000, -1);
++  assert_true(ptr != NULL);
++  expat_free(parser, ptr, -1);
++
++  // Exceed maximum amplification *after* threshold: should be rejected.
++  assert_true(XML_SetAllocTrackerActivationThreshold(parser, 999) == XML_TRUE);
++  assert_true(expat_malloc(parser, 1000, -1) == NULL);
++#endif
++
++  XML_ParserFree(parser);
++}
++END_TEST
++
++START_TEST(test_alloc_tracker_getbuffer_unlimited) {
++  XML_Parser parser = XML_ParserCreate(NULL);
++
++#if XML_GE == 1
++  // Artificially lower threshold
++  assert_true(XML_SetAllocTrackerActivationThreshold(parser, 0) == XML_TRUE);
++
++  // Self-test: Prove that threshold is as rejecting as expected
++  assert_true(expat_malloc(parser, 1000, -1) == NULL);
++#endif
++  // XML_GetBuffer should be allowed to pass, though
++  assert_true(XML_GetBuffer(parser, 1000) != NULL);
++
++  XML_ParserFree(parser);
++}
++END_TEST
++
++START_TEST(test_alloc_tracker_api) {
++  XML_Parser parserWithoutParent = XML_ParserCreate(NULL);
++  XML_Parser parserWithParent = XML_ExternalEntityParserCreate(
++      parserWithoutParent, XCS("entity123"), NULL);
++  if (parserWithoutParent == NULL)
++    fail("parserWithoutParent is NULL");
++  if (parserWithParent == NULL)
++    fail("parserWithParent is NULL");
++
++#if XML_GE == 1
++  // XML_SetAllocTrackerMaximumAmplification, error cases
++  if (XML_SetAllocTrackerMaximumAmplification(NULL, 123.0f) == XML_TRUE)
++    fail("Call with NULL parser is NOT supposed to succeed");
++  if (XML_SetAllocTrackerMaximumAmplification(parserWithParent, 123.0f)
++      == XML_TRUE)
++    fail("Call with non-root parser is NOT supposed to succeed");
++  if (XML_SetAllocTrackerMaximumAmplification(parserWithoutParent, NAN)
++      == XML_TRUE)
++    fail("Call with NaN limit is NOT supposed to succeed");
++  if (XML_SetAllocTrackerMaximumAmplification(parserWithoutParent, -1.0f)
++      == XML_TRUE)
++    fail("Call with negative limit is NOT supposed to succeed");
++  if (XML_SetAllocTrackerMaximumAmplification(parserWithoutParent, 0.9f)
++      == XML_TRUE)
++    fail("Call with positive limit <1.0 is NOT supposed to succeed");
++
++  // XML_SetAllocTrackerMaximumAmplification, success cases
++  if (XML_SetAllocTrackerMaximumAmplification(parserWithoutParent, 1.0f)
++      == XML_FALSE)
++    fail("Call with positive limit >=1.0 is supposed to succeed");
++  if (XML_SetAllocTrackerMaximumAmplification(parserWithoutParent, 123456.789f)
++      == XML_FALSE)
++    fail("Call with positive limit >=1.0 is supposed to succeed");
++  if (XML_SetAllocTrackerMaximumAmplification(parserWithoutParent, INFINITY)
++      == XML_FALSE)
++    fail("Call with positive limit >=1.0 is supposed to succeed");
++
++  // XML_SetAllocTrackerActivationThreshold, error cases
++  if (XML_SetAllocTrackerActivationThreshold(NULL, 123) == XML_TRUE)
++    fail("Call with NULL parser is NOT supposed to succeed");
++  if (XML_SetAllocTrackerActivationThreshold(parserWithParent, 123) == XML_TRUE)
++    fail("Call with non-root parser is NOT supposed to succeed");
++
++  // XML_SetAllocTrackerActivationThreshold, success cases
++  if (XML_SetAllocTrackerActivationThreshold(parserWithoutParent, 123)
++      == XML_FALSE)
++    fail("Call with non-NULL parentless parser is supposed to succeed");
++#endif // XML_GE == 1
++
++  XML_ParserFree(parserWithParent);
++  XML_ParserFree(parserWithoutParent);
++}
++END_TEST
++
++START_TEST(test_mem_api_cycle) {
++  XML_Parser parser = XML_ParserCreate(NULL);
++
++  void *ptr = XML_MemMalloc(parser, 10);
++
++  assert_true(ptr != NULL);
++  memset(ptr, 'x', 10); // assert writability, with ASan in mind
++
++  ptr = XML_MemRealloc(parser, ptr, 20);
++
++  assert_true(ptr != NULL);
++  memset(ptr, 'y', 20); // assert writability, with ASan in mind
++
++  XML_MemFree(parser, ptr);
++
++  XML_ParserFree(parser);
++}
++END_TEST
++
++START_TEST(test_mem_api_unlimited) {
++  XML_Parser parser = XML_ParserCreate(NULL);
++
++#if XML_GE == 1
++  assert_true(XML_SetAllocTrackerActivationThreshold(parser, 0) == XML_TRUE);
++#endif
++
++  void *ptr = XML_MemMalloc(parser, 1000);
++
++  assert_true(ptr != NULL);
++
++  ptr = XML_MemRealloc(parser, ptr, 2000);
++
++  assert_true(ptr != NULL);
++
++  XML_MemFree(parser, ptr);
++
++  XML_ParserFree(parser);
++}
++END_TEST
++
+ void
+ make_alloc_test_case(Suite *s) {
+   TCase *tc_alloc = tcase_create("allocation tests");
+@@ -2151,4 +2354,15 @@ make_alloc_test_case(Suite *s) {
+ 
+   tcase_add_test__ifdef_xml_dtd(
+       tc_alloc, test_alloc_reset_after_external_entity_parser_create_fail);
++
++  tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_tracker_size_recorded);
++  tcase_add_test__ifdef_xml_dtd(tc_alloc,
++                                test_alloc_tracker_maximum_amplification);
++  tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_tracker_threshold);
++  tcase_add_test__ifdef_xml_dtd(tc_alloc,
++                                test_alloc_tracker_getbuffer_unlimited);
++  tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_tracker_api);
++
++  tcase_add_test(tc_alloc, test_mem_api_cycle);
++  tcase_add_test__ifdef_xml_dtd(tc_alloc, test_mem_api_unlimited);
+ }
+diff --git a/tests/basic_tests.c b/tests/basic_tests.c
+index f0025fc..da5c0d4 100644
+--- a/tests/basic_tests.c
++++ b/tests/basic_tests.c
+@@ -3002,6 +3002,10 @@ START_TEST(test_buffer_can_grow_to_max) {
+   for (int i = 0; i < num_prefixes; ++i) {
+     set_subtest("\"%s\"", prefixes[i]);
+     XML_Parser parser = XML_ParserCreate(NULL);
++#if XML_GE == 1
++    assert_true(XML_SetAllocTrackerActivationThreshold(parser, (size_t)-1)
++                == XML_TRUE); // i.e. deactivate
++#endif
+     const int prefix_len = (int)strlen(prefixes[i]);
+     const enum XML_Status s
+         = _XML_Parse_SINGLE_BYTES(parser, prefixes[i], prefix_len, XML_FALSE);
+diff --git a/tests/nsalloc_tests.c b/tests/nsalloc_tests.c
+index ec88586..a8f5718 100644
+--- a/tests/nsalloc_tests.c
++++ b/tests/nsalloc_tests.c
+@@ -454,10 +454,15 @@ START_TEST(test_nsalloc_realloc_attributes) {
+     nsalloc_teardown();
+     nsalloc_setup();
+   }
++#if XML_GE == 1
++  assert_true(
++      i == 0); // because expat_realloc relies on expat_malloc to some extent
++#else
+   if (i == 0)
+     fail("Parsing worked despite failing reallocations");
+   else if (i == max_realloc_count)
+     fail("Parsing failed at max reallocation count");
++#endif
+ }
+ END_TEST
+ 
+diff --git a/xmlwf/xmlwf.c b/xmlwf/xmlwf.c
+index 7c0a8cd..92adb1a 100644
+--- a/xmlwf/xmlwf.c
++++ b/xmlwf/xmlwf.c
+@@ -913,11 +913,11 @@ usage(const XML_Char *prog, int rc) {
+       T("  -t             write no XML output for [t]iming of plain parsing\n")
+       T("  -N             enable adding doctype and [n]otation declarations\n")
+       T("\n")
+-      T("billion laughs attack protection:\n")
++      T("amplification attack protection (e.g. billion laughs):\n")
+       T("  NOTE: If you ever need to increase these values for non-attack payload, please file a bug report.\n")
+       T("\n")
+       T("  -a FACTOR      set maximum tolerated [a]mplification factor (default: 100.0)\n")
+-      T("  -b BYTES       set number of output [b]ytes needed to activate (default: 8 MiB)\n")
++      T("  -b BYTES       set number of output [b]ytes needed to activate (default: 8 MiB/64 MiB)\n")
+       T("\n")
+       T("reparse deferral:\n")
+       T("  -q             disable reparse deferral, and allow [q]uadratic parse runtime with large tokens\n")
+@@ -926,6 +926,10 @@ usage(const XML_Char *prog, int rc) {
+       T("  -h, --help     show this [h]elp message and exit\n")
+       T("  -v, --version  show program's [v]ersion number and exit\n")
+       T("\n")
++      T("environment variables:\n")
++      T("  EXPAT_MALLOC_DEBUG=(0|1|2)\n")
++      T("                 Control verbosity of allocation tracker (default: 0)\n")
++      T("\n")
+       T("exit status:\n")
+       T("  0              the input files are well-formed and the output (if requested) was written successfully\n")
+       T("  1              could not allocate data structures, signals a serious problem with execution environment\n")
+@@ -1171,12 +1175,15 @@ tmain(int argc, XML_Char **argv) {
+ #if XML_GE == 1
+       XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+           parser, attackMaximumAmplification);
++      XML_SetAllocTrackerMaximumAmplification(parser,
++                                              attackMaximumAmplification);
+ #endif
+     }
+     if (attackThresholdGiven) {
+ #if XML_GE == 1
+       XML_SetBillionLaughsAttackProtectionActivationThreshold(
+           parser, attackThresholdBytes);
++      XML_SetAllocTrackerActivationThreshold(parser, attackThresholdBytes);
+ #else
+       (void)attackThresholdBytes; // silence -Wunused-but-set-variable
+ #endif
+diff --git a/xmlwf/xmlwf_helpgen.py b/xmlwf/xmlwf_helpgen.py
+index 3d32f5d..dcae018 100755
+--- a/xmlwf/xmlwf_helpgen.py
++++ b/xmlwf/xmlwf_helpgen.py
+@@ -32,6 +32,9 @@
+ import argparse
+ 
+ epilog = """
++environment variables:
++  EXPAT_MALLOC_DEBUG=(0|1|2)
++                 Control verbosity of allocation tracker (default: 0)
+ exit status:
+   0              the input files are well-formed and the output (if requested) was written successfully
+   1              could not allocate data structures, signals a serious problem with execution environment
+-- 
+2.43.0
+
diff --git a/SPECS/expat/CVE-2026-24515.patch b/SPECS/expat/CVE-2026-24515.patch
new file mode 100644
index 0000000000..f83bc89770
--- /dev/null
+++ b/SPECS/expat/CVE-2026-24515.patch
@@ -0,0 +1,169 @@
+From 8b3805af3dde1f5424bdd704da688def3a81ff9f Mon Sep 17 00:00:00 2001
+From: Sebastian Pipping 
+Date: Sun, 18 Jan 2026 17:53:37 +0100
+Subject: [PATCH 1/3] lib: Make XML_ExternalEntityParserCreate copy unknown
+ encoding handler user data
+
+Patch suggested by Artiphishell Inc.
+---
+ lib/xmlparse.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/lib/xmlparse.c b/lib/xmlparse.c
+index e2847b1..d804753 100644
+--- a/lib/xmlparse.c
++++ b/lib/xmlparse.c
+@@ -1742,6 +1742,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context,
+   XML_ExternalEntityRefHandler oldExternalEntityRefHandler;
+   XML_SkippedEntityHandler oldSkippedEntityHandler;
+   XML_UnknownEncodingHandler oldUnknownEncodingHandler;
++  void *oldUnknownEncodingHandlerData;
+   XML_ElementDeclHandler oldElementDeclHandler;
+   XML_AttlistDeclHandler oldAttlistDeclHandler;
+   XML_EntityDeclHandler oldEntityDeclHandler;
+@@ -1787,6 +1788,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context,
+   oldExternalEntityRefHandler = parser->m_externalEntityRefHandler;
+   oldSkippedEntityHandler = parser->m_skippedEntityHandler;
+   oldUnknownEncodingHandler = parser->m_unknownEncodingHandler;
++  oldUnknownEncodingHandlerData = parser->m_unknownEncodingHandlerData;
+   oldElementDeclHandler = parser->m_elementDeclHandler;
+   oldAttlistDeclHandler = parser->m_attlistDeclHandler;
+   oldEntityDeclHandler = parser->m_entityDeclHandler;
+@@ -1847,6 +1849,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context,
+   parser->m_externalEntityRefHandler = oldExternalEntityRefHandler;
+   parser->m_skippedEntityHandler = oldSkippedEntityHandler;
+   parser->m_unknownEncodingHandler = oldUnknownEncodingHandler;
++  parser->m_unknownEncodingHandlerData = oldUnknownEncodingHandlerData;
+   parser->m_elementDeclHandler = oldElementDeclHandler;
+   parser->m_attlistDeclHandler = oldAttlistDeclHandler;
+   parser->m_entityDeclHandler = oldEntityDeclHandler;
+-- 
+2.45.4
+
+
+From 0b2599c6eff2f0f9d20ec7423621f2928f989c1a Mon Sep 17 00:00:00 2001
+From: Sebastian Pipping 
+Date: Sun, 18 Jan 2026 17:26:31 +0100
+Subject: [PATCH 2/3] tests: Cover effect of XML_SetUnknownEncodingHandler user
+ data
+
+---
+ tests/basic_tests.c | 42 ++++++++++++++++++++++++++++++++++++++++++
+ tests/handlers.c    | 10 ++++++++++
+ tests/handlers.h    |  3 +++
+ 3 files changed, 55 insertions(+)
+
+diff --git a/tests/basic_tests.c b/tests/basic_tests.c
+index da5c0d4..2db2a76 100644
+--- a/tests/basic_tests.c
++++ b/tests/basic_tests.c
+@@ -4440,6 +4440,46 @@ START_TEST(test_unknown_encoding_invalid_attr_value) {
+ }
+ END_TEST
+ 
++START_TEST(test_unknown_encoding_user_data_primary) {
++  // This test is based on ideas contributed by Artiphishell Inc.
++  const char *const text = "\n"
++                           "\n";
++  XML_Parser parser = XML_ParserCreate(NULL);
++  XML_SetUnknownEncodingHandler(parser,
++                                user_data_checking_unknown_encoding_handler,
++                                (void *)(intptr_t)0xC0FFEE);
++
++  assert_true(_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
++              == XML_STATUS_OK);
++
++  XML_ParserFree(parser);
++}
++END_TEST
++
++START_TEST(test_unknown_encoding_user_data_secondary) {
++  // This test is based on ideas contributed by Artiphishell Inc.
++  const char *const text_main = "\n"
++                                "]>\n"
++                                "&ext;\n";
++  const char *const text_external = "\n"
++                                    "data";
++  ExtTest2 test_data = {text_external, (int)strlen(text_external), NULL, NULL};
++  XML_Parser parser = XML_ParserCreate(NULL);
++  XML_SetExternalEntityRefHandler(parser, external_entity_loader2);
++  XML_SetUnknownEncodingHandler(parser,
++                                user_data_checking_unknown_encoding_handler,
++                                (void *)(intptr_t)0xC0FFEE);
++  XML_SetUserData(parser, &test_data);
++
++  assert_true(_XML_Parse_SINGLE_BYTES(parser, text_main, (int)strlen(text_main),
++                                      XML_TRUE)
++              == XML_STATUS_OK);
++
++  XML_ParserFree(parser);
++}
++END_TEST
++
+ /* Test an external entity parser set to use latin-1 detects UTF-16
+  * BOMs correctly.
+  */
+@@ -6284,6 +6324,8 @@ make_basic_test_case(Suite *s) {
+   tcase_add_test(tc_basic, test_unknown_encoding_invalid_surrogate);
+   tcase_add_test(tc_basic, test_unknown_encoding_invalid_high);
+   tcase_add_test(tc_basic, test_unknown_encoding_invalid_attr_value);
++  tcase_add_test(tc_basic, test_unknown_encoding_user_data_primary);
++  tcase_add_test(tc_basic, test_unknown_encoding_user_data_secondary);
+   tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_latin1_utf16le_bom);
+   tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_latin1_utf16be_bom);
+   tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_latin1_utf16le_bom2);
+diff --git a/tests/handlers.c b/tests/handlers.c
+index bdb5b0e..5078014 100644
+--- a/tests/handlers.c
++++ b/tests/handlers.c
+@@ -45,6 +45,7 @@
+ #  undef NDEBUG /* because test suite relies on assert(...) at the moment */
+ #endif
+ 
++#include 
+ #include 
+ #include 
+ #include 
+@@ -407,6 +408,15 @@ long_encoding_handler(void *userData, const XML_Char *encoding,
+   return XML_STATUS_OK;
+ }
+ 
++int XMLCALL
++user_data_checking_unknown_encoding_handler(void *userData,
++                                            const XML_Char *encoding,
++                                            XML_Encoding *info) {
++  const intptr_t number = (intptr_t)userData;
++  assert_true(number == 0xC0FFEE);
++  return long_encoding_handler(userData, encoding, info);
++}
++
+ /* External Entity Handlers */
+ 
+ int XMLCALL
+diff --git a/tests/handlers.h b/tests/handlers.h
+index 4d6a08d..ac4ca94 100644
+--- a/tests/handlers.h
++++ b/tests/handlers.h
+@@ -159,6 +159,9 @@ extern int XMLCALL long_encoding_handler(void *userData,
+                                          const XML_Char *encoding,
+                                          XML_Encoding *info);
+ 
++extern int XMLCALL user_data_checking_unknown_encoding_handler(
++    void *userData, const XML_Char *encoding, XML_Encoding *info);
++
+ /* External Entity Handlers */
+ 
+ typedef struct ExtOption {
+-- 
+2.45.4
+
+
+From dea97bc0c894b5494f2e4d46d6076d49dc227e8f Mon Sep 17 00:00:00 2001
+From: Sebastian Pipping 
+Date: Sun, 18 Jan 2026 18:19:25 +0100
+Subject: [PATCH 3/3] Changes: Document CVE-2026-24515
+
+-- 
+2.45.4
+
diff --git a/SPECS/expat/CVE-2026-25210.patch b/SPECS/expat/CVE-2026-25210.patch
new file mode 100644
index 0000000000..204ac03cca
--- /dev/null
+++ b/SPECS/expat/CVE-2026-25210.patch
@@ -0,0 +1,93 @@
+From 5ffd029337a8db6b3bef77ecd0a040b3e1e573f2 Mon Sep 17 00:00:00 2001
+From: Matthew Fernandez 
+Date: Thu, 2 Oct 2025 17:15:15 -0700
+Subject: [PATCH 1/3] lib: Make a doubling more readable
+
+Suggested-by: Sebastian Pipping 
+---
+ lib/xmlparse.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/xmlparse.c b/lib/xmlparse.c
+index d804753..a48acd2 100644
+--- a/lib/xmlparse.c
++++ b/lib/xmlparse.c
+@@ -3492,7 +3492,7 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
+             tag->name.strLen = convLen;
+             break;
+           }
+-          bufSize = (int)(tag->bufEnd - tag->buf) << 1;
++          bufSize = (int)(tag->bufEnd - tag->buf) * 2;
+           {
+             char *temp = (char *)REALLOC(parser, tag->buf, bufSize);
+             if (temp == NULL)
+-- 
+2.45.4
+
+
+From 07d55b4f18ded4740946a9a436e787b3c178176c Mon Sep 17 00:00:00 2001
+From: Matthew Fernandez 
+Date: Thu, 2 Oct 2025 17:15:15 -0700
+Subject: [PATCH 2/3] lib: Realign a size with the `REALLOC` type signature it
+ is passed into
+
+Note that this implicitly assumes `tag->bufEnd >= tag->buf`, which should
+already be guaranteed true.
+---
+ lib/xmlparse.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/lib/xmlparse.c b/lib/xmlparse.c
+index a48acd2..ed505b7 100644
+--- a/lib/xmlparse.c
++++ b/lib/xmlparse.c
+@@ -3481,7 +3481,6 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
+         const char *fromPtr = tag->rawName;
+         toPtr = (XML_Char *)tag->buf;
+         for (;;) {
+-          int bufSize;
+           int convLen;
+           const enum XML_Convert_Result convert_res
+               = XmlConvert(enc, &fromPtr, rawNameEnd, (ICHAR **)&toPtr,
+@@ -3492,7 +3491,7 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
+             tag->name.strLen = convLen;
+             break;
+           }
+-          bufSize = (int)(tag->bufEnd - tag->buf) * 2;
++          const size_t bufSize = (size_t)(tag->bufEnd - tag->buf) * 2;
+           {
+             char *temp = (char *)REALLOC(parser, tag->buf, bufSize);
+             if (temp == NULL)
+-- 
+2.45.4
+
+
+From 3776e1554b8b9506387ec8a0591560898fb1ef87 Mon Sep 17 00:00:00 2001
+From: Matthew Fernandez 
+Date: Thu, 2 Oct 2025 17:15:15 -0700
+Subject: [PATCH 3/3] lib: Introduce an integer overflow check for tag buffer
+ reallocation
+
+Suggested-by: Sebastian Pipping 
+Signed-off-by: Azure Linux Security Servicing Account 
+Upstream-reference: https://github.com/libexpat/libexpat/pull/1075.patch
+---
+ lib/xmlparse.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/lib/xmlparse.c b/lib/xmlparse.c
+index ed505b7..0bf913c 100644
+--- a/lib/xmlparse.c
++++ b/lib/xmlparse.c
+@@ -3491,6 +3491,8 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
+             tag->name.strLen = convLen;
+             break;
+           }
++          if (SIZE_MAX / 2 < (size_t)(tag->bufEnd - tag->buf))
++            return XML_ERROR_NO_MEMORY;
+           const size_t bufSize = (size_t)(tag->bufEnd - tag->buf) * 2;
+           {
+             char *temp = (char *)REALLOC(parser, tag->buf, bufSize);
+-- 
+2.45.4
+
diff --git a/SPECS/expat/expat.signatures.json b/SPECS/expat/expat.signatures.json
new file mode 100644
index 0000000000..faaee12cd6
--- /dev/null
+++ b/SPECS/expat/expat.signatures.json
@@ -0,0 +1,5 @@
+{
+ "Signatures": {
+  "expat-2.6.4.tar.bz2": "8dc480b796163d4436e6f1352e71800a774f73dbae213f1860b60607d2a83ada"
+ }
+}
\ No newline at end of file
diff --git a/SPECS/expat/expat.spec b/SPECS/expat/expat.spec
new file mode 100644
index 0000000000..4c10cf9167
--- /dev/null
+++ b/SPECS/expat/expat.spec
@@ -0,0 +1,148 @@
+%define         underscore_version %(echo %{version} | cut -d. -f1-3 --output-delimiter="_")
+Summary:        An XML parser library
+Name:           expat
+Version:        2.6.4
+Release:        4%{?dist}
+License:        MIT
+Vendor:         Intel Corporation
+Distribution:   Edge Microvisor Toolkit
+Group:          System Environment/GeneralLibraries
+URL:            https://libexpat.github.io/
+Source0:        https://github.com/libexpat/libexpat/releases/download/R_%{underscore_version}/%{name}-%{version}.tar.bz2
+Patch0:         CVE-2024-8176.patch
+Patch1:         CVE-2025-59375.patch
+Patch2:         CVE-2026-24515.patch
+Patch3:         CVE-2026-25210.patch
+Requires:       %{name}-libs = %{version}-%{release}
+
+BuildRequires: autoconf, libtool, xmlto, gcc-c++
+BuildRequires: make
+BuildRequires: gnupg2
+
+%description
+The Expat package contains a stream oriented C library for parsing XML.
+
+%package devel
+Summary:        Header and development files for expat
+Requires:       %{name} = %{version}-%{release}
+
+%description    devel
+It contains the libraries and header files to create applications
+
+%package libs
+Summary:        Libraries for expat
+Group:          System Environment/Libraries
+
+%description libs
+This package contains minimal set of shared expat libraries.
+
+%prep
+%autosetup -p1
+
+%build
+%configure \
+	CFLAGS="%{optflags}" \
+	CXXFLAGS="%{optflags}" \
+	--disable-static
+%make_build
+
+%install
+%make_install
+find %{buildroot} -type f -name "*.la" -delete -print
+rm -rf %{buildroot}/%{_docdir}/%{name}
+%{_fixperms} %{buildroot}/*
+
+%check
+%make_build check
+
+%ldconfig_scriptlets
+
+%files
+%defattr(-,root,root)
+%doc AUTHORS Changes
+%{_bindir}/*
+
+%files devel
+%{_includedir}/*
+%{_libdir}/pkgconfig/*
+%{_libdir}/libexpat.so
+%{_libdir}/cmake/expat-%{version}
+%{_mandir}/man1/xmlwf.1.gz
+
+%files libs
+%license COPYING
+%{_libdir}/libexpat.so.1*
+
+%changelog
+* Thu Jan 8 2025 Lee Chee Yang  - 2.6.4-3
+- add BuildRequires
+- Patch for CVE-2026-25210
+- Patch for CVE-2026-24515
+- Initial Edge Microvisor Toolkit import from Azure Linux (license: MIT).
+
+* Tue Sep 23 2025 Akhila Guruju  - 2.6.4-2
+- Fix CVE-2025-59375 with a patch
+
+* Thu Mar 20 2025 Kshitiz Godara  - 2.6.4-1
+- Fix CVE-2024-8176 with a patch
+
+* Wed Oct 30 2024 Sindhu Karri  - 2.6.3-2
+- Fix CVE-2024-50602 with a patch
+
+* Wed Sep 04 2024 Gary Swalling  - 2.6.3-1
+- Upgrade to 2.6.3 to fix CVE-2024-45490, CVE-2024-45491, CVE-2024-45492
+
+* Wed May 22 2024 Neha Agarwal  - 2.6.2-1
+- Upgrade to v2.6.2 to fix CVE-2024-28757
+
+* Wed Oct 26 2022 CBL-Mariner Servicing Account  - 2.5.0-1
+- Upgrade to 2.5.0
+
+* Mon Sep 19 2022 Betty Lakes  - 2.4.8-2
+- Add the patch to address CVE-2022-40674
+
+* Wed Apr 13 2022 Rachel Menge  - 2.4.8-1
+- Update source to 2.4.8 to address CVE-2022-23852, CVE-2022-23990,
+  CVE-2022-25235, CVE-2022-25236
+
+* Tue Apr 12 2022 Pawel Winogrodzki  - 2.4.3-2
+- Fixing "%%underscore_version" macro definition.
+
+* Sun Jan 16 2022 Rachel Menge  - 2.4.3-1
+- Update source to 2.4.3 to address CVE-2021-46143, CVE-2021-45960,
+  CVE-2022-22822 to CVE-2022-22827
+
+* Fri Nov 19 2021 Max Brodeur-Urbas  - 2.4.1-1
+- Update to 2.4.1
+- License verified
+- Removed reference to manfiles, generation causes circular dependency.
+
+* Sat May 09 2020 Nick Samson  - 2.2.6-4
+- Added %%license line automatically
+
+* Wed Apr 22 2020 Nicolas Ontiveros  2.2.6-3
+- Fix CVE-2018-20843.
+- Remove sha1 macro.
+- Update URL.
+- Update Source0.
+
+* Tue Sep 03 2019 Mateusz Malisz  2.2.6-2
+- Initial CBL-Mariner import from Photon (license: Apache2).
+
+* Thu Sep 20 2018 Sujay G  2.2.6-1
+- Bump expat version to 2.2.6
+
+* Tue Sep 26 2017 Anish Swaminathan  2.2.4-1
+- Updating version, fixes CVE-2017-9233,  CVE-2016-9063, CVE-2016-0718
+
+* Fri Apr 14 2017 Alexey Makhalov  2.2.0-2
+- Added -libs and -devel subpackages
+
+* Fri Oct 21 2016 Kumar Kaushik  2.2.0-1
+- Updating Source/Fixing CVE-2015-1283.
+
+* Tue May 24 2016 Priyesh Padmavilasom  2.1.0-2
+- GA - Bump release of all rpms
+
+* Wed Nov 5 2014 Divya Thaluru  2.1.0-1
+- Initial build. First version
diff --git a/SPECS/fluent-bit/CVE-2025-12969.patch b/SPECS/fluent-bit/CVE-2025-12969.patch
new file mode 100644
index 0000000000..1515d2a49c
--- /dev/null
+++ b/SPECS/fluent-bit/CVE-2025-12969.patch
@@ -0,0 +1,321 @@
+From e42b5cebbdd3d9c702babf446a3143abf78e2d87 Mon Sep 17 00:00:00 2001
+From: Hiroshi Hatake 
+Date: Fri, 3 Oct 2025 16:14:34 +0900
+Subject: [PATCH] in_forward: Handle shared_key lifetime correctly
+
+Signed-off-by: Hiroshi Hatake 
+
+Upstream Patch reference: https://patch-diff.githubusercontent.com/raw/fluent/fluent-bit/pull/10973.diff
+---
+ plugins/in_forward/fw.c        |  10 +++
+ plugins/in_forward/fw.h        |   4 +-
+ plugins/in_forward/fw_config.c |  41 +++++++--
+ plugins/in_forward/fw_conn.c   |  13 ++-
+ tests/runtime/in_forward.c     | 156 +++++++++++++++++++++++++++++++++
+ 5 files changed, 215 insertions(+), 9 deletions(-)
+
+diff --git a/plugins/in_forward/fw.c b/plugins/in_forward/fw.c
+index 20c3946..9b55409 100644
+--- a/plugins/in_forward/fw.c
++++ b/plugins/in_forward/fw.c
+@@ -334,6 +334,16 @@ static int in_fw_init(struct flb_input_instance *ins,
+         return -1;
+     }
+ 
++    /* Users-only configuration must be rejected unless a (possibly empty) shared key is enabled. */
++    if (mk_list_size(&ctx->users) > 0 &&
++        ctx->shared_key == NULL &&
++        ctx->empty_shared_key == FLB_FALSE) {
++        flb_plg_error(ctx->ins, "security.users is set but no shared_key or empty_shared_key");
++        delete_users(ctx);
++        fw_config_destroy(ctx);
++        return -1;
++    }
++
+     flb_input_downstream_set(ctx->downstream, ctx->ins);
+ 
+     flb_net_socket_nonblocking(ctx->downstream->server_fd);
+diff --git a/plugins/in_forward/fw.h b/plugins/in_forward/fw.h
+index 4cd270e..455826a 100644
+--- a/plugins/in_forward/fw.h
++++ b/plugins/in_forward/fw.h
+@@ -60,9 +60,11 @@ struct flb_in_fw_config {
+     flb_sds_t unix_perm_str;        /* Permission (config map)     */
+ 
+     /* secure forward */
+-    flb_sds_t shared_key;        /* shared key                   */
++    flb_sds_t shared_key;         /* shared key      */
++    int owns_shared_key;          /* own flag of shared key */
+     flb_sds_t self_hostname;     /* hostname used in certificate  */
+     struct mk_list users;        /* username and password pairs  */
++    int empty_shared_key;        /* use an empty string as shared key */
+ 
+     int coll_fd;
+     struct flb_downstream *downstream; /* Client manager          */
+diff --git a/plugins/in_forward/fw_config.c b/plugins/in_forward/fw_config.c
+index b3a2293..235ee8c 100644
+--- a/plugins/in_forward/fw_config.c
++++ b/plugins/in_forward/fw_config.c
+@@ -26,6 +26,35 @@
+ #include "fw_conn.h"
+ #include "fw_config.h"
+ 
++static void fw_destroy_shared_key(struct flb_in_fw_config *config)
++{
++    if (config->owns_shared_key && config->shared_key) {
++        flb_sds_destroy(config->shared_key);
++    }
++
++    config->shared_key = NULL;
++    config->owns_shared_key = FLB_FALSE;
++}
++
++static int fw_create_empty_shared_key(struct flb_in_fw_config *config,
++                                      struct flb_input_instance *i_ins)
++{
++    flb_sds_t empty_key = flb_sds_create("");
++    if (!empty_key) {
++        flb_plg_error(i_ins, "empty shared_key alloc failed");
++        return -1;
++    }
++    else {
++        if (config->owns_shared_key && config->shared_key) {
++            flb_sds_destroy(config->shared_key);
++        }
++        config->shared_key = empty_key;
++        config->owns_shared_key = FLB_TRUE;
++    }
++
++    return 0;
++}
++
+ struct flb_in_fw_config *fw_config_init(struct flb_input_instance *i_ins)
+ {
+     char tmp[16];
+@@ -86,12 +115,10 @@ struct flb_in_fw_config *fw_config_init(struct flb_input_instance *i_ins)
+     }
+ 
+     /* Shared Key */
+-    p = flb_input_get_property("shared_key", i_ins);
+-    if (p) {
+-        config->shared_key = flb_sds_create(p);
+-    }
+-    else {
+-        config->shared_key = NULL;
++    if (config->empty_shared_key) {
++        if (fw_create_empty_shared_key(config, i_ins) == -1) {
++            return NULL;
++        }
+     }
+ 
+     /* Self Hostname */
+@@ -132,7 +159,7 @@ int fw_config_destroy(struct flb_in_fw_config *config)
+         flb_free(config->tcp_port);
+     }
+ 
+-    flb_sds_destroy(config->shared_key);
++    fw_destroy_shared_key(config);
+     flb_sds_destroy(config->self_hostname);
+ 
+     flb_free(config);
+diff --git a/plugins/in_forward/fw_conn.c b/plugins/in_forward/fw_conn.c
+index 9446525..90219d0 100644
+--- a/plugins/in_forward/fw_conn.c
++++ b/plugins/in_forward/fw_conn.c
+@@ -142,7 +142,18 @@ struct fw_conn *fw_conn_add(struct flb_connection *connection, struct flb_in_fw_
+     }
+ 
+     conn->handshake_status = FW_HANDSHAKE_ESTABLISHED;
+-    if (ctx->shared_key != NULL) {
++    /*
++     * Always force the secure-forward handshake when:
++     *  - a shared key is configured, or
++     *  - empty_shared_key is enabled (empty string shared key), or
++     *  - user authentication is configured (users > 0).
++     *
++     * This closes the gap where "users-only" previously skipped authentication entirely.
++     */
++    conn->handshake_status = FW_HANDSHAKE_ESTABLISHED; /* default */
++    if (ctx->shared_key != NULL ||
++        ctx->empty_shared_key == FLB_TRUE ||
++        mk_list_size(&ctx->users) > 0) {
+         conn->handshake_status = FW_HANDSHAKE_HELO;
+         helo = flb_malloc(sizeof(struct flb_in_fw_helo));
+         if (!helo) {
+diff --git a/tests/runtime/in_forward.c b/tests/runtime/in_forward.c
+index 6cabfa9..fdef739 100644
+--- a/tests/runtime/in_forward.c
++++ b/tests/runtime/in_forward.c
+@@ -566,6 +566,158 @@ void flb_test_unix_perm()
+ #endif /* FLB_HAVE_UNIX_SOCKET */
+ 
+ 
++static int cb_count_only(void *record, size_t size, void *data)
++{
++    int n = get_output_num();
++    set_output_num(n + 1);
++    flb_free(record);
++    return 0;
++}
++
++
++static flb_ctx_t *fw_make_ctx_with_forward(int *in_ffd_out, int *out_ffd_out)
++{
++    struct flb_lib_out_cb cb = {0};
++    flb_ctx_t *ctx;
++    int in_ffd, out_ffd, ret;
++
++    ctx = flb_create();
++    TEST_CHECK(ctx != NULL);
++    if (!ctx) { return NULL; }
++
++    flb_service_set(ctx,
++                    "Flush", "0.200000000",
++                    "Grace", "1",
++                    "Log_Level", "error",
++                    NULL);
++
++    /* forward input */
++    in_ffd = flb_input(ctx, (char *) "forward", NULL);
++    TEST_CHECK(in_ffd >= 0);
++    if (in_ffd < 0) { flb_destroy(ctx); return NULL; }
++
++    /* lib output: count only (no payload check) */
++    cb.cb   = cb_count_only;
++    cb.data = NULL;
++    out_ffd = flb_output(ctx, (char *) "lib", (void *) &cb);
++    TEST_CHECK(out_ffd >= 0);
++    if (out_ffd < 0) {
++        flb_destroy(ctx);
++        return NULL;
++    }
++    ret = flb_output_set(ctx, out_ffd,
++                         "match", "*",
++                         "format", "json",
++                         NULL);
++    TEST_CHECK(ret == 0);
++
++    if (in_ffd_out)  *in_ffd_out  = in_ffd;
++    if (out_ffd_out) *out_ffd_out = out_ffd;
++    return ctx;
++}
++
++/* 1) users-only => must fail to start (fail-close) */
++void flb_test_fw_auth_users_only_fail_start()
++{
++    flb_ctx_t *ctx;
++    int in_ffd, out_ffd, ret;
++
++    ctx = fw_make_ctx_with_forward(&in_ffd, &out_ffd);
++    TEST_CHECK(ctx != NULL);
++    if (!ctx) {
++        return;
++    }
++
++    ret = flb_input_set(ctx, in_ffd,
++                        "tag", "test",
++                        "security.users", "alice s3cr3t",
++                        NULL);
++    TEST_CHECK(ret == 0);
++
++    ret = flb_start(ctx);
++    TEST_CHECK(ret != 0);
++    if (ret == 0) {
++        TEST_MSG("users-only config unexpectedly started; fail-close not enforced");
++        flb_stop(ctx);
++    }
++    flb_destroy(ctx);
++}
++
++/* 2) empty_shared_key + users => start OK */
++void flb_test_fw_auth_empty_shared_key_plus_users_start_ok()
++{
++    flb_ctx_t *ctx;
++    int in_ffd, out_ffd, ret;
++
++    ctx = fw_make_ctx_with_forward(&in_ffd, &out_ffd);
++    TEST_CHECK(ctx != NULL);
++    if (!ctx) { return; }
++
++    ret = flb_input_set(ctx, in_ffd,
++                        "tag", "test",
++                        "empty_shared_key", "true",
++                        "security.users", "alice s3cr3t",
++                        NULL);
++    TEST_CHECK(ret == 0);
++
++    ret = flb_start(ctx);
++    TEST_CHECK(ret == 0);
++    if (ret == 0) {
++        flb_stop(ctx);
++    }
++    flb_destroy(ctx);
++}
++
++/* 3) shared_key only => start OK (backward compatible) */
++void flb_test_fw_auth_shared_key_only_start_ok()
++{
++    flb_ctx_t *ctx;
++    int in_ffd, out_ffd, ret;
++
++    ctx = fw_make_ctx_with_forward(&in_ffd, &out_ffd);
++    TEST_CHECK(ctx != NULL);
++    if (!ctx) { return; }
++
++    ret = flb_input_set(ctx, in_ffd,
++                        "tag", "test",
++                        "shared_key", "k",
++                        NULL);
++    TEST_CHECK(ret == 0);
++
++    ret = flb_start(ctx);
++    TEST_CHECK(ret == 0);
++    if (ret == 0) {
++        flb_stop(ctx);
++    }
++    flb_destroy(ctx);
++}
++
++/* 4) shared_key + users => start OK (both checks) */
++void flb_test_fw_auth_shared_key_plus_users_start_ok()
++{
++    flb_ctx_t *ctx;
++    int in_ffd, out_ffd, ret;
++
++    ctx = fw_make_ctx_with_forward(&in_ffd, &out_ffd);
++    TEST_CHECK(ctx != NULL);
++    if (!ctx) { return; }
++
++    ret = flb_input_set(ctx, in_ffd,
++                        "tag", "test",
++                        "shared_key", "k",
++                        "security.users", "alice s3cr3t",
++                        NULL);
++    TEST_CHECK(ret == 0);
++
++    ret = flb_start(ctx);
++    TEST_CHECK(ret == 0);
++    if (ret == 0) {
++        flb_stop(ctx);
++    }
++    flb_destroy(ctx);
++}
++
++
+ TEST_LIST = {
+     {"forward", flb_test_forward},
+     {"forward_port", flb_test_forward_port},
+@@ -574,6 +726,10 @@ TEST_LIST = {
+     {"unix_path", flb_test_unix_path},
+     {"unix_perm", flb_test_unix_perm},
+ #endif
++    {"fw_auth_users_only_fail_start", flb_test_fw_auth_users_only_fail_start},
++    {"fw_auth_empty_shared_key_plus_users_start_ok", flb_test_fw_auth_empty_shared_key_plus_users_start_ok},
++    {"fw_auth_shared_key_only_start_ok", flb_test_fw_auth_shared_key_only_start_ok},
++    {"fw_auth_shared_key_plus_users_start_ok", flb_test_fw_auth_shared_key_plus_users_start_ok},
+     {NULL, NULL}
+ };
+ 
+-- 
+2.45.4
+
diff --git a/SPECS/fluent-bit/CVE-2025-12970.patch b/SPECS/fluent-bit/CVE-2025-12970.patch
new file mode 100644
index 0000000000..7cd290adb4
--- /dev/null
+++ b/SPECS/fluent-bit/CVE-2025-12970.patch
@@ -0,0 +1,191 @@
+From 8a25d3b24fa4edde3e9cfdb878ce6c2c6e3d7e5b Mon Sep 17 00:00:00 2001
+From: Eduardo Silva 
+Date: Thu, 2 Oct 2025 16:36:54 -0600
+Subject: [PATCH] in_docker: add helper for container name parsing
+
+Signed-off-by: Eduardo Silva 
+Signed-off-by: Azure Linux Security Servicing Account 
+Upstream-reference: https://github.com/fluent/fluent-bit/pull/10972.patch
+---
+ plugins/in_docker/cgroup_v1.c | 32 +----------------------
+ plugins/in_docker/cgroup_v2.c | 32 +----------------------
+ plugins/in_docker/docker.c    | 48 +++++++++++++++++++++++++++++++++++
+ plugins/in_docker/docker.h    |  2 ++
+ 4 files changed, 52 insertions(+), 62 deletions(-)
+
+diff --git a/plugins/in_docker/cgroup_v1.c b/plugins/in_docker/cgroup_v1.c
+index ab40147..86a64b1 100644
+--- a/plugins/in_docker/cgroup_v1.c
++++ b/plugins/in_docker/cgroup_v1.c
+@@ -213,36 +213,6 @@ static char *get_config_file(struct flb_docker *ctx, char *id)
+     return path;
+ }
+ 
+-static char *extract_name(char *line, char *start)
+-{
+-    int skip = 9;
+-    int len = 0;
+-    char *name;
+-    char buff[256];
+-    char *curr;
+-
+-    if (start != NULL) {
+-        curr = start + skip;
+-        while (*curr != '"') {
+-            buff[len++] = *curr;
+-            curr++;
+-        }
+-
+-        if (len > 0) {
+-            name = (char *) flb_calloc(len + 1, sizeof(char));
+-            if (!name) {
+-                flb_errno();
+-                return NULL;
+-            }
+-            memcpy(name, buff, len);
+-
+-            return name;
+-        }
+-    }
+-
+-    return NULL;
+-}
+-
+ static char *get_container_name(struct flb_docker *ctx, char *id)
+ {
+     char *container_name = NULL;
+@@ -266,7 +236,7 @@ static char *get_container_name(struct flb_docker *ctx, char *id)
+     while ((line = read_line(f))) {
+         char *index = strstr(line, DOCKER_NAME_ARG);
+         if (index != NULL) {
+-            container_name = extract_name(line, index);
++            container_name = docker_extract_name(line, index);
+             flb_free(line);
+             break;
+         }
+diff --git a/plugins/in_docker/cgroup_v2.c b/plugins/in_docker/cgroup_v2.c
+index 295483c..301fceb 100644
+--- a/plugins/in_docker/cgroup_v2.c
++++ b/plugins/in_docker/cgroup_v2.c
+@@ -230,36 +230,6 @@ static char *get_config_file(struct flb_docker *ctx, char *id)
+     return path;
+ }
+ 
+-static char *extract_name(char *line, char *start)
+-{
+-    int skip = 9;
+-    int len = 0;
+-    char *name;
+-    char buff[256];
+-    char *curr;
+-
+-    if (start != NULL) {
+-        curr = start + skip;
+-        while (*curr != '"') {
+-            buff[len++] = *curr;
+-            curr++;
+-        }
+-
+-        if (len > 0) {
+-            name = (char *) flb_calloc(len + 1, sizeof(char));
+-            if (!name) {
+-                flb_errno();
+-                return NULL;
+-            }
+-            memcpy(name, buff, len);
+-
+-            return name;
+-        }
+-    }
+-
+-    return NULL;
+-}
+-
+ static char *get_container_name(struct flb_docker *ctx, char *id)
+ {
+     char *container_name = NULL;
+@@ -283,7 +253,7 @@ static char *get_container_name(struct flb_docker *ctx, char *id)
+     while ((line = read_line(f))) {
+         char *index = strstr(line, DOCKER_NAME_ARG);
+         if (index != NULL) {
+-            container_name = extract_name(line, index);
++            container_name = docker_extract_name(line, index);
+             flb_free(line);
+             break;
+         }
+diff --git a/plugins/in_docker/docker.c b/plugins/in_docker/docker.c
+index 2a1389e..5701c68 100644
+--- a/plugins/in_docker/docker.c
++++ b/plugins/in_docker/docker.c
+@@ -29,9 +29,57 @@
+ #include 
+ #include 
+ #include 
++#include 
+ 
+ #include "docker.h"
+ 
++char *docker_extract_name(const char *line, const char *start)
++{
++    const char *curr;
++    const char *end;
++    size_t len;
++    char *name;
++
++    if (line == NULL || start == NULL) {
++        return NULL;
++    }
++
++    curr = start + strlen(DOCKER_NAME_ARG);
++    if (*curr != ':') {
++        curr = strchr(curr, ':');
++        if (curr == NULL) {
++            return NULL;
++        }
++    }
++
++    curr++;
++    while (*curr != '\0' && isspace((unsigned char) *curr)) {
++        curr++;
++    }
++
++    if (*curr != '"') {
++        return NULL;
++    }
++
++    curr++;
++    end = strchr(curr, '"');
++    if (end == NULL || end <= curr) {
++        return NULL;
++    }
++
++    len = end - curr;
++    name = flb_malloc(len + 1);
++    if (name == NULL) {
++        flb_errno();
++        return NULL;
++    }
++
++    memcpy(name, curr, len);
++    name[len] = '\0';
++
++    return name;
++}
++
+ static int cb_docker_collect(struct flb_input_instance *i_ins,
+                              struct flb_config *config, void *in_context);
+ 
+diff --git a/plugins/in_docker/docker.h b/plugins/in_docker/docker.h
+index e6f61c1..9a1c9ae 100644
+--- a/plugins/in_docker/docker.h
++++ b/plugins/in_docker/docker.h
+@@ -119,4 +119,6 @@ struct flb_docker {
+ int in_docker_collect(struct flb_input_instance *i_ins,
+                       struct flb_config *config, void *in_context);
+ docker_info *in_docker_init_docker_info(char *id);
++char *docker_extract_name(const char *line, const char *start);
++
+ #endif
+-- 
+2.45.4
+
diff --git a/SPECS/fluent-bit/CVE-2025-12977.patch b/SPECS/fluent-bit/CVE-2025-12977.patch
new file mode 100644
index 0000000000..fd7c70f1d1
--- /dev/null
+++ b/SPECS/fluent-bit/CVE-2025-12977.patch
@@ -0,0 +1,595 @@
+From d9fa9ab839ec684efd0132d6d672a0cf961790a1 Mon Sep 17 00:00:00 2001
+From: Eduardo Silva 
+Date: Thu, 2 Oct 2025 10:40:39 -0600
+Subject: [PATCH] in_elasticsearch: reimplement tag_key lookup with record
+ accessor api
+
+Replace manual key lookup with record accessor pattern for better
+performance and support for nested/complex key patterns.
+
+Signed-off-by: Eduardo Silva 
+
+Upstream Patch reference: https://patch-diff.githubusercontent.com/raw/fluent/fluent-bit/pull/10967.diff
+---
+ plugins/in_elasticsearch/in_elasticsearch.h   |   6 +-
+ .../in_elasticsearch_bulk_prot.c              |  77 ++++---------
+ .../in_elasticsearch_config.c                 |  13 +++
+ plugins/in_http/http.h                        |   4 +-
+ plugins/in_http/http_config.c                 |  17 ++-
+ plugins/in_http/http_prot.c                   | 104 +++++++-----------
+ plugins/in_splunk/splunk.c                    |   6 +
+ plugins/in_splunk/splunk.h                    |   4 +-
+ plugins/in_splunk/splunk_config.c             |  14 +++
+ plugins/in_splunk/splunk_prot.c               |  76 ++++---------
+ 10 files changed, 143 insertions(+), 178 deletions(-)
+
+diff --git a/plugins/in_elasticsearch/in_elasticsearch.h b/plugins/in_elasticsearch/in_elasticsearch.h
+index 10deb62..7911cb7 100644
+--- a/plugins/in_elasticsearch/in_elasticsearch.h
++++ b/plugins/in_elasticsearch/in_elasticsearch.h
+@@ -25,6 +25,7 @@
+ #include 
+ #include 
+ #include 
++#include 
+ 
+ #include 
+ #include 
+@@ -35,14 +36,15 @@
+ struct flb_in_elasticsearch {
+     flb_sds_t listen;
+     flb_sds_t tcp_port;
+-    const char *tag_key;
+-    const char *meta_key;
++    flb_sds_t tag_key;
++    flb_sds_t meta_key;
+     flb_sds_t hostname;
+     flb_sds_t es_version;
+     char cluster_name[16];
+     char node_name[12];
+ 
+     struct flb_log_event_encoder *log_encoder;
++    struct flb_record_accessor *ra_tag_key;
+ 
+     struct flb_input_instance *ins;
+ 
+diff --git a/plugins/in_elasticsearch/in_elasticsearch_bulk_prot.c b/plugins/in_elasticsearch/in_elasticsearch_bulk_prot.c
+index c705af6..f7414a7 100644
+--- a/plugins/in_elasticsearch/in_elasticsearch_bulk_prot.c
++++ b/plugins/in_elasticsearch/in_elasticsearch_bulk_prot.c
+@@ -22,6 +22,8 @@
+ #include 
+ #include 
+ #include 
++#include 
++#include 
+ 
+ #include 
+ #include 
+@@ -245,67 +247,32 @@ static int send_response(struct in_elasticsearch_bulk_conn *conn, int http_statu
+ /* implements functionality to get tag from key in record */
+ static flb_sds_t tag_key(struct flb_in_elasticsearch *ctx, msgpack_object *map)
+ {
+-    size_t map_size = map->via.map.size;
+-    msgpack_object_kv *kv;
+-    msgpack_object  key;
+-    msgpack_object  val;
+-    char *key_str = NULL;
+-    char *val_str = NULL;
+-    size_t key_str_size = 0;
+-    size_t val_str_size = 0;
+-    int j;
+-    int check = FLB_FALSE;
+-    int found = FLB_FALSE;
+-    flb_sds_t tag;
+-
+-    kv = map->via.map.ptr;
++    flb_sds_t tag = NULL;
++    struct flb_ra_value *ra_val;
+ 
+-    for(j=0; j < map_size; j++) {
+-        check = FLB_FALSE;
+-        found = FLB_FALSE;
+-        key = (kv+j)->key;
+-        if (key.type == MSGPACK_OBJECT_BIN) {
+-            key_str  = (char *) key.via.bin.ptr;
+-            key_str_size = key.via.bin.size;
+-            check = FLB_TRUE;
+-        }
+-        if (key.type == MSGPACK_OBJECT_STR) {
+-            key_str  = (char *) key.via.str.ptr;
+-            key_str_size = key.via.str.size;
+-            check = FLB_TRUE;
+-        }
+-
+-        if (check == FLB_TRUE) {
+-            if (strncmp(ctx->tag_key, key_str, key_str_size) == 0) {
+-                val = (kv+j)->val;
+-                if (val.type == MSGPACK_OBJECT_BIN) {
+-                    val_str  = (char *) val.via.bin.ptr;
+-                    val_str_size = val.via.str.size;
+-                    found = FLB_TRUE;
+-                    break;
+-                }
+-                if (val.type == MSGPACK_OBJECT_STR) {
+-                    val_str  = (char *) val.via.str.ptr;
+-                    val_str_size = val.via.str.size;
+-                    found = FLB_TRUE;
+-                    break;
+-                }
+-            }
+-        }
++    /* If no record accessor is configured, return NULL */
++    if (!ctx->ra_tag_key) {
++        return NULL;
+     }
+ 
+-    if (found == FLB_TRUE) {
+-        tag = flb_sds_create_len(val_str, val_str_size);
+-        if (!tag) {
+-            flb_errno();
+-            return NULL;
+-        }
+-        return tag;
++    /* Use record accessor to get the value */
++    ra_val = flb_ra_get_value_object(ctx->ra_tag_key, *map);
++    if (!ra_val) {
++        flb_plg_warn(ctx->ins, "Could not find tag_key %s in record", ctx->tag_key);
++        return NULL;
+     }
+ 
++    /* Convert the value to string */
++    if (ra_val->type == FLB_RA_STRING) {
++        tag = flb_sds_create_len(ra_val->o.via.str.ptr, ra_val->o.via.str.size);
++    }
++    else {
++        flb_plg_error(ctx->ins, "tag_key %s value is not a string or binary", ctx->tag_key);
++    }
+ 
+-    flb_plg_error(ctx->ins, "Could not find tag_key %s in record", ctx->tag_key);
+-    return NULL;
++    /* Clean up the record accessor value */
++    flb_ra_key_value_destroy(ra_val);
++    return tag;
+ }
+ 
+ static int get_write_op(struct flb_in_elasticsearch *ctx, msgpack_object *map, flb_sds_t *out_write_op, size_t *out_key_size)
+diff --git a/plugins/in_elasticsearch/in_elasticsearch_config.c b/plugins/in_elasticsearch/in_elasticsearch_config.c
+index 56b5a4e..18da268 100644
+--- a/plugins/in_elasticsearch/in_elasticsearch_config.c
++++ b/plugins/in_elasticsearch/in_elasticsearch_config.c
+@@ -67,12 +67,25 @@ struct flb_in_elasticsearch *in_elasticsearch_config_create(struct flb_input_ins
+         return NULL;
+     }
+ 
++    /* Create record accessor for tag_key if specified */
++    if (ctx->tag_key) {
++        ctx->ra_tag_key = flb_ra_create(ctx->tag_key, FLB_TRUE);
++        if (!ctx->ra_tag_key) {
++            flb_plg_error(ctx->ins, "invalid record accessor pattern for tag_key: %s", ctx->tag_key);
++            in_elasticsearch_config_destroy(ctx);
++            return NULL;
++        }
++    }
+ 
+     return ctx;
+ }
+ 
+ int in_elasticsearch_config_destroy(struct flb_in_elasticsearch *ctx)
+ {
++    if (ctx->ra_tag_key) {
++        flb_ra_destroy(ctx->ra_tag_key);
++    }
++
+     flb_log_event_encoder_destroy(ctx->log_encoder);
+ 
+     /* release all connections */
+diff --git a/plugins/in_http/http.h b/plugins/in_http/http.h
+index 4298a37..2e37967 100644
+--- a/plugins/in_http/http.h
++++ b/plugins/in_http/http.h
+@@ -25,6 +25,7 @@
+ #include 
+ #include 
+ #include 
++#include 
+ 
+ #include 
+ #include 
+@@ -36,7 +37,8 @@ struct flb_http {
+     int successful_response_code;
+     flb_sds_t listen;
+     flb_sds_t tcp_port;
+-    const char *tag_key;
++    flb_sds_t tag_key;
++    struct flb_record_accessor *ra_tag_key;
+ 
+     /* Success HTTP headers */
+     struct mk_list *success_headers;
+diff --git a/plugins/in_http/http_config.c b/plugins/in_http/http_config.c
+index 343e699..eb3afc8 100644
+--- a/plugins/in_http/http_config.c
++++ b/plugins/in_http/http_config.c
+@@ -69,9 +69,7 @@ struct flb_http *http_config_create(struct flb_input_instance *ins)
+ 
+     if (ret != FLB_EVENT_ENCODER_SUCCESS) {
+         flb_plg_error(ctx->ins, "error initializing event encoder : %d", ret);
+-
+         http_config_destroy(ctx);
+-
+         return NULL;
+     }
+ 
+@@ -79,10 +77,19 @@ struct flb_http *http_config_create(struct flb_input_instance *ins)
+ 
+     if (ctx->success_headers_str == NULL) {
+         http_config_destroy(ctx);
+-
+         return NULL;
+     }
+ 
++    /* Create record accessor for tag_key if specified */
++    if (ctx->tag_key) {
++        ctx->ra_tag_key = flb_ra_create(ctx->tag_key, FLB_TRUE);
++        if (!ctx->ra_tag_key) {
++            flb_plg_error(ctx->ins, "invalid record accessor pattern for tag_key: %s", ctx->tag_key);
++            http_config_destroy(ctx);
++            return NULL;
++        }
++    }
++
+     flb_config_map_foreach(header_iterator, header_pair, ctx->success_headers) {
+         header_name = mk_list_entry_first(header_pair->val.list,
+                                           struct flb_slist_entry,
+@@ -126,6 +133,10 @@ struct flb_http *http_config_create(struct flb_input_instance *ins)
+ 
+ int http_config_destroy(struct flb_http *ctx)
+ {
++    if (ctx->ra_tag_key) {
++        flb_ra_destroy(ctx->ra_tag_key);
++    }
++
+     /* release all connections */
+     http_conn_release_all(ctx);
+ 
+diff --git a/plugins/in_http/http_prot.c b/plugins/in_http/http_prot.c
+index f38264e..5d9bc8a 100644
+--- a/plugins/in_http/http_prot.c
++++ b/plugins/in_http/http_prot.c
+@@ -21,6 +21,8 @@
+ #include 
+ #include 
+ #include 
++#include 
++#include 
+ 
+ #include 
+ #include 
+@@ -36,8 +38,8 @@ static inline char hex2nibble(char c)
+     if ((c >= 0x30) && (c <= '9')) {
+         return c - 0x30;
+     }
+-    // 0x30-0x39 are digits, 0x41-0x46 A-F,
+-    // so there is a gap at 0x40
++
++    /* 0x30-0x39 are digits, 0x41-0x46 A-F, so there is a gap at 0x40 */
+     if ((c >= 'A') && (c <= 'F')) {
+         return (c - 'A') + 10;
+     }
+@@ -145,70 +147,54 @@ static int send_response(struct http_conn *conn, int http_status, char *message)
+     return 0;
+ }
+ 
+-/* implements functionality to get tag from key in record */
+-static flb_sds_t tag_key(struct flb_http *ctx, msgpack_object *map)
++static void sanitize_tag(flb_sds_t tag)
+ {
+-    size_t map_size = map->via.map.size;
+-    msgpack_object_kv *kv;
+-    msgpack_object  key;
+-    msgpack_object  val;
+-    char *key_str = NULL;
+-    char *val_str = NULL;
+-    size_t key_str_size = 0;
+-    size_t val_str_size = 0;
+-    int j;
+-    int check = FLB_FALSE;
+-    int found = FLB_FALSE;
+-    flb_sds_t tag;
++    size_t i;
+ 
+-    kv = map->via.map.ptr;
++    if (!tag) {
++        return;
++    }
+ 
+-    for(j=0; j < map_size; j++) {
+-        check = FLB_FALSE;
+-        found = FLB_FALSE;
+-        key = (kv+j)->key;
+-        if (key.type == MSGPACK_OBJECT_BIN) {
+-            key_str  = (char *) key.via.bin.ptr;
+-            key_str_size = key.via.bin.size;
+-            check = FLB_TRUE;
+-        }
+-        if (key.type == MSGPACK_OBJECT_STR) {
+-            key_str  = (char *) key.via.str.ptr;
+-            key_str_size = key.via.str.size;
+-            check = FLB_TRUE;
++    for (i = 0; i < flb_sds_len(tag); i++) {
++        if (!isalnum(tag[i]) && tag[i] != '_' && tag[i] != '.') {
++            tag[i] = '_';
+         }
++    }
++}
+ 
+-        if (check == FLB_TRUE) {
+-            if (strncmp(ctx->tag_key, key_str, key_str_size) == 0) {
+-                val = (kv+j)->val;
+-                if (val.type == MSGPACK_OBJECT_BIN) {
+-                    val_str  = (char *) val.via.bin.ptr;
+-                    val_str_size = val.via.str.size;
+-                    found = FLB_TRUE;
+-                    break;
+-                }
+-                if (val.type == MSGPACK_OBJECT_STR) {
+-                    val_str  = (char *) val.via.str.ptr;
+-                    val_str_size = val.via.str.size;
+-                    found = FLB_TRUE;
+-                    break;
+-                }
+-            }
+-        }
++/* implements functionality to get tag from key in record */
++static flb_sds_t tag_key(struct flb_http *ctx, msgpack_object *map)
++{
++    struct flb_ra_value *ra_val;
++    flb_sds_t tag = NULL;
++
++    /* If no record accessor is configured, return NULL */
++    if (!ctx->ra_tag_key) {
++        return NULL;
+     }
+ 
+-    if (found == FLB_TRUE) {
+-        tag = flb_sds_create_len(val_str, val_str_size);
+-        if (!tag) {
+-            flb_errno();
+-            return NULL;
++    /* Use record accessor to get the value */
++    ra_val = flb_ra_get_value_object(ctx->ra_tag_key, *map);
++    if (!ra_val) {
++        flb_plg_debug(ctx->ins, "Could not find tag_key %s in record", ctx->tag_key);
++        return NULL;
++    }
++
++    /* Convert the value to string */
++    if (ra_val->type == FLB_RA_STRING) {
++        tag = flb_sds_create_len(ra_val->o.via.str.ptr, ra_val->o.via.str.size);
++        if (tag) {
++            sanitize_tag(tag);
+         }
+-        return tag;
++    }
++    else {
++        flb_plg_debug(ctx->ins, "tag_key %s value is not a string", ctx->tag_key);
+     }
+ 
++    /* Clean up the record accessor value */
++    flb_ra_key_value_destroy(ra_val);
+ 
+-    flb_plg_error(ctx->ins, "Could not find tag_key %s in record", ctx->tag_key);
+-    return NULL;
++    return tag;
+ }
+ 
+ static int process_pack_record(struct flb_http *ctx, struct flb_time *tm,
+@@ -586,7 +572,6 @@ int http_prot_handle(struct flb_http *ctx, struct http_conn *conn,
+                      struct mk_http_session *session,
+                      struct mk_http_request *request)
+ {
+-    int i;
+     int ret;
+     int len;
+     char *uri;
+@@ -635,12 +620,7 @@ int http_prot_handle(struct flb_http *ctx, struct http_conn *conn,
+         /* New tag skipping the URI '/' */
+         flb_sds_cat_safe(&tag, uri + 1, len - 1);
+ 
+-        /* Sanitize, only allow alphanum chars */
+-        for (i = 0; i < flb_sds_len(tag); i++) {
+-            if (!isalnum(tag[i]) && tag[i] != '_' && tag[i] != '.') {
+-                tag[i] = '_';
+-            }
+-        }
++        sanitize_tag(tag);
+     }
+ 
+     mk_mem_free(uri);
+diff --git a/plugins/in_splunk/splunk.c b/plugins/in_splunk/splunk.c
+index b10dfa8..edab642 100644
+--- a/plugins/in_splunk/splunk.c
++++ b/plugins/in_splunk/splunk.c
+@@ -133,6 +133,9 @@ static int in_splunk_init(struct flb_input_instance *ins,
+         ctx->http_server.request_callback = splunk_prot_handle_ng;
+ 
+         flb_input_downstream_set(ctx->http_server.downstream, ctx->ins);
++
++        flb_plg_info(ctx->ins, "listening on %s:%u",
++                     ins->host.listen, ins->host.port);
+     }
+     else {
+         ctx->downstream = flb_downstream_create(FLB_TRANSPORT_TCP,
+@@ -155,6 +158,8 @@ static int in_splunk_init(struct flb_input_instance *ins,
+ 
+         flb_input_downstream_set(ctx->downstream, ctx->ins);
+ 
++        flb_plg_info(ctx->ins, "listening on %s:%s", ctx->listen, ctx->tcp_port);
++
+         /* Collect upon data available on the standard input */
+         ret = flb_input_set_collector_socket(ins,
+                                             in_splunk_collect,
+@@ -170,6 +175,7 @@ static int in_splunk_init(struct flb_input_instance *ins,
+         ctx->collector_id = ret;
+     }
+ 
++
+     return 0;
+ }
+ 
+diff --git a/plugins/in_splunk/splunk.h b/plugins/in_splunk/splunk.h
+index 5dc4645..ef04edf 100644
+--- a/plugins/in_splunk/splunk.h
++++ b/plugins/in_splunk/splunk.h
+@@ -25,6 +25,7 @@
+ #include 
+ #include 
+ #include 
++#include 
+ 
+ #include 
+ #include 
+@@ -41,7 +42,8 @@ struct flb_splunk_tokens {
+ struct flb_splunk {
+     flb_sds_t listen;
+     flb_sds_t tcp_port;
+-    const char *tag_key;
++    flb_sds_t tag_key;
++    struct flb_record_accessor *ra_tag_key;
+ 
+     /* Success HTTP headers */
+     struct mk_list *success_headers;
+diff --git a/plugins/in_splunk/splunk_config.c b/plugins/in_splunk/splunk_config.c
+index a7c5886..3907d5a 100644
+--- a/plugins/in_splunk/splunk_config.c
++++ b/plugins/in_splunk/splunk_config.c
+@@ -229,11 +229,25 @@ struct flb_splunk *splunk_config_create(struct flb_input_instance *ins)
+         }
+     }
+ 
++    /* Create record accessor for tag_key if specified */
++    if (ctx->tag_key) {
++        ctx->ra_tag_key = flb_ra_create(ctx->tag_key, FLB_TRUE);
++        if (!ctx->ra_tag_key) {
++            flb_plg_error(ctx->ins, "invalid record accessor pattern for tag_key: %s", ctx->tag_key);
++            splunk_config_destroy(ctx);
++            return NULL;
++        }
++    }
++
+     return ctx;
+ }
+ 
+ int splunk_config_destroy(struct flb_splunk *ctx)
+ {
++    if (ctx->ra_tag_key) {
++        flb_ra_destroy(ctx->ra_tag_key);
++    }
++
+     /* release all connections */
+     splunk_conn_release_all(ctx);
+ 
+diff --git a/plugins/in_splunk/splunk_prot.c b/plugins/in_splunk/splunk_prot.c
+index cf614b0..f53f24c 100644
+--- a/plugins/in_splunk/splunk_prot.c
++++ b/plugins/in_splunk/splunk_prot.c
+@@ -22,6 +22,8 @@
+ #include 
+ #include 
+ #include 
++#include 
++#include 
+ 
+ #include 
+ #include 
+@@ -149,67 +151,33 @@ static int send_json_message_response(struct splunk_conn *conn, int http_status,
+ /* implements functionality to get tag from key in record */
+ static flb_sds_t tag_key(struct flb_splunk *ctx, msgpack_object *map)
+ {
+-    size_t map_size = map->via.map.size;
+-    msgpack_object_kv *kv;
+-    msgpack_object  key;
+-    msgpack_object  val;
+-    char *key_str = NULL;
+-    char *val_str = NULL;
+-    size_t key_str_size = 0;
+-    size_t val_str_size = 0;
+-    int j;
+-    int check = FLB_FALSE;
+-    int found = FLB_FALSE;
+-    flb_sds_t tag;
++    flb_sds_t tag = NULL;
++    struct flb_ra_value *ra_val;
+ 
+-    kv = map->via.map.ptr;
+-
+-    for(j=0; j < map_size; j++) {
+-        check = FLB_FALSE;
+-        found = FLB_FALSE;
+-        key = (kv+j)->key;
+-        if (key.type == MSGPACK_OBJECT_BIN) {
+-            key_str  = (char *) key.via.bin.ptr;
+-            key_str_size = key.via.bin.size;
+-            check = FLB_TRUE;
+-        }
+-        if (key.type == MSGPACK_OBJECT_STR) {
+-            key_str  = (char *) key.via.str.ptr;
+-            key_str_size = key.via.str.size;
+-            check = FLB_TRUE;
+-        }
++    /* If no record accessor is configured, return NULL */
++    if (!ctx->ra_tag_key) {
++        return NULL;
++    }
+ 
+-        if (check == FLB_TRUE) {
+-            if (strncmp(ctx->tag_key, key_str, key_str_size) == 0) {
+-                val = (kv+j)->val;
+-                if (val.type == MSGPACK_OBJECT_BIN) {
+-                    val_str  = (char *) val.via.bin.ptr;
+-                    val_str_size = val.via.str.size;
+-                    found = FLB_TRUE;
+-                    break;
+-                }
+-                if (val.type == MSGPACK_OBJECT_STR) {
+-                    val_str  = (char *) val.via.str.ptr;
+-                    val_str_size = val.via.str.size;
+-                    found = FLB_TRUE;
+-                    break;
+-                }
+-            }
+-        }
++    /* Use record accessor to get the value */
++    ra_val = flb_ra_get_value_object(ctx->ra_tag_key, *map);
++    if (!ra_val) {
++        flb_plg_debug(ctx->ins, "Could not find tag_key %s in record", ctx->tag_key);
++        return NULL;
+     }
+ 
+-    if (found == FLB_TRUE) {
+-        tag = flb_sds_create_len(val_str, val_str_size);
+-        if (!tag) {
+-            flb_errno();
+-            return NULL;
+-        }
+-        return tag;
++    /* Convert the value to string */
++    if (ra_val->type == FLB_RA_STRING) {
++        tag = flb_sds_create_len(ra_val->o.via.str.ptr, ra_val->o.via.str.size);
++    }
++    else {
++        flb_plg_debug(ctx->ins, "tag_key %s value is not a string", ctx->tag_key);
+     }
+ 
++    /* Clean up the record accessor value */
++    flb_ra_key_value_destroy(ra_val);
+ 
+-    flb_plg_error(ctx->ins, "Could not find tag_key %s in record", ctx->tag_key);
+-    return NULL;
++    return tag;
+ }
+ 
+ /*
+-- 
+2.45.4
+
diff --git a/SPECS/fluent-bit/CVE-2025-58749.patch b/SPECS/fluent-bit/CVE-2025-58749.patch
new file mode 100644
index 0000000000..8b210db8c2
--- /dev/null
+++ b/SPECS/fluent-bit/CVE-2025-58749.patch
@@ -0,0 +1,48 @@
+From 95f506a6e77d3ac7588eac7263f95558edfa7f3b Mon Sep 17 00:00:00 2001
+From: Liu Jia 
+Date: Mon, 15 Sep 2025 15:19:51 +0800
+Subject: [PATCH] Merge commit from fork
+
+* fix overflow in check_bulk_memory_overflow
+
+Upstream Patch reference: https://github.com/bytecodealliance/wasm-micro-runtime/commit/95f506a6e77d3ac7588eac7263f95558edfa7f3b.patch
+---
+ .../core/iwasm/compilation/aot_emit_memory.c       | 14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+diff --git a/lib/wasm-micro-runtime-WAMR-1.3.0/core/iwasm/compilation/aot_emit_memory.c b/lib/wasm-micro-runtime-WAMR-1.3.0/core/iwasm/compilation/aot_emit_memory.c
+index 8c35c3f..6a01c25 100644
+--- a/lib/wasm-micro-runtime-WAMR-1.3.0/core/iwasm/compilation/aot_emit_memory.c
++++ b/lib/wasm-micro-runtime-WAMR-1.3.0/core/iwasm/compilation/aot_emit_memory.c
+@@ -880,7 +880,7 @@ static LLVMValueRef
+ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
+                            LLVMValueRef offset, LLVMValueRef bytes)
+ {
+-    LLVMValueRef maddr, max_addr, cmp;
++    LLVMValueRef maddr, max_addr, cmp, cmp1, offset1;
+     LLVMValueRef mem_base_addr;
+     LLVMBasicBlockRef block_curr = LLVMGetInsertBlock(comp_ctx->builder);
+     LLVMBasicBlockRef check_succ;
+@@ -922,8 +922,18 @@ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
+         if (mem_data_size > 0 && mem_offset + mem_len <= mem_data_size) {
+             /* inside memory space */
+             /* maddr = mem_base_addr + moffset */
++            /* Perform zero extension in advance to avoid LLVMBuildInBoundsGEP2
++             * interpreting a negative address due to sign extension when
++             * mem_offset >= 2GiB */
++            if (comp_ctx->pointer_size == sizeof(uint64)) {
++                offset1 = I64_CONST(mem_offset);
++            }
++            else {
++                offset1 = I32_CONST((uint32)mem_offset);
++            }
++            CHECK_LLVM_CONST(offset1);
+             if (!(maddr = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
+-                                                mem_base_addr, &offset, 1,
++                                                mem_base_addr, &offset1, 1,
+                                                 "maddr"))) {
+                 aot_set_last_error("llvm build add failed.");
+                 goto fail;
+-- 
+2.45.4
+
diff --git a/SPECS/fluent-bit/CVE-2025-62408.patch b/SPECS/fluent-bit/CVE-2025-62408.patch
new file mode 100644
index 0000000000..1e00daf2a5
--- /dev/null
+++ b/SPECS/fluent-bit/CVE-2025-62408.patch
@@ -0,0 +1,357 @@
+From 714bf5675c541bd1e668a8db8e67ce012651e618 Mon Sep 17 00:00:00 2001
+From: Brad House 
+Date: Mon, 8 Dec 2025 10:12:08 -0500
+Subject: [PATCH] Merge commit from fork
+
+* reproducer test case
+
+* enqueue callbacks to be processed within process_answer rather than calling directly as that may lead to the connection being destroyed
+
+* combine requeue and endqueue into a single queue with a flag to simplify the implementation
+
+* add back queue notification
+
+Modified to apply to Azure Linux
+Upstream Patch Reference: https://github.com/c-ares/c-ares/commit/714bf5675c541bd1e668a8db8e67ce012651e618.patch
+---
+ lib/c-ares-1.33.1/src/lib/ares_private.h    | 10 +--
+ lib/c-ares-1.33.1/src/lib/ares_process.c    | 97 ++++++++++++++++-----
+ lib/c-ares-1.33.1/src/lib/ares_qcache.c     | 20 +++--
+ lib/c-ares-1.33.1/test/ares-test-mock-ai.cc | 32 +++++++
+ 4 files changed, 125 insertions(+), 34 deletions(-)
+
+diff --git a/lib/c-ares-1.33.1/src/lib/ares_private.h b/lib/c-ares-1.33.1/src/lib/ares_private.h
+index 2605c9e..c1bf536 100644
+--- a/lib/c-ares-1.33.1/src/lib/ares_private.h
++++ b/lib/c-ares-1.33.1/src/lib/ares_private.h
+@@ -466,7 +466,7 @@ ares_status_t ares__requeue_query(ares_query_t            *query,
+                                   const ares_timeval_t    *now,
+                                   ares_status_t            status,
+                                   ares_bool_t              inc_try_count,
+-                                  const ares_dns_record_t *dnsrec,
++                                  ares_dns_record_t       *dnsrec,
+                                   ares__array_t           **requeue);
+ 
+ /*! Count the number of labels (dots+1) in a domain */
+@@ -764,10 +764,10 @@ ares_status_t ares__qcache_create(ares_rand_state *rand_state,
+                                   unsigned int     max_ttl,
+                                   ares__qcache_t **cache_out);
+ void          ares__qcache_flush(ares__qcache_t *cache);
+-ares_status_t ares_qcache_insert(ares_channel_t       *channel,
+-                                 const ares_timeval_t *now,
+-                                 const ares_query_t   *query,
+-                                 ares_dns_record_t    *dnsrec);
++ares_status_t ares_qcache_insert(ares_channel_t          *channel,
++                                 const ares_timeval_t    *now,
++                                 const ares_query_t      *query,
++                                 const ares_dns_record_t *dnsrec);
+ ares_status_t ares_qcache_fetch(ares_channel_t           *channel,
+                                 const ares_timeval_t     *now,
+                                 const ares_dns_record_t  *dnsrec,
+diff --git a/lib/c-ares-1.33.1/src/lib/ares_process.c b/lib/c-ares-1.33.1/src/lib/ares_process.c
+index e84c36a..fa042dd 100644
+--- a/lib/c-ares-1.33.1/src/lib/ares_process.c
++++ b/lib/c-ares-1.33.1/src/lib/ares_process.c
+@@ -66,7 +66,8 @@ static ares_bool_t same_address(const struct sockaddr  *sa,
+                                 const struct ares_addr *aa);
+ static void        end_query(ares_channel_t *channel, ares_server_t *server,
+                              ares_query_t *query, ares_status_t status,
+-                             const ares_dns_record_t *dnsrec);
++                             ares_dns_record_t *dnsrec,
++                             ares__array_t **requeue);
+ 
+ static void        ares__query_disassociate_from_conn(ares_query_t *query)
+ {
+@@ -300,16 +301,27 @@ static void write_tcp_data(ares_channel_t *channel, fd_set *write_fds,
+   }
+ }
+ 
++typedef enum {
++  REQUEUE_REQUEUE  = 1,
++  REQUEUE_ENDQUERY = 2
++} requeue_type_t;
++
+ /* Simple data structure to store a query that needs to be requeued with
+  * optional server */
+ typedef struct {
+-  unsigned short qid;
+-  ares_server_t *server; /* optional */
++  requeue_type_t     type;   /* type of entry, requeue or endquery */
++  unsigned short     qid;    /* query id */
++  ares_server_t     *server; /* requeue only: optional */
++  ares_status_t      status; /* endquery only */
++  ares_dns_record_t *dnsrec; /* endquery only: optional */
+ } ares_requeue_t;
+ 
+-static ares_status_t ares_append_requeue(ares__array_t **requeue,
+-                                         ares_query_t *query,
+-                                         ares_server_t *server)
++static ares_status_t ares_append_requeue_int(ares__array_t     **requeue,
++                                             requeue_type_t     type,
++                                             ares_query_t      *query,
++                                             ares_server_t     *server,
++                                             ares_status_t      status,
++                                             ares_dns_record_t *dnsrec)
+ {
+   ares_requeue_t entry;
+ 
+@@ -322,11 +334,30 @@ static ares_status_t ares_append_requeue(ares__array_t **requeue,
+ 
+   ares__query_disassociate_from_conn(query);
+ 
++  entry.type   = type;
+   entry.qid    = query->qid;
+   entry.server = server;
++  entry.status = status;
++  entry.dnsrec = dnsrec;
+   return ares__array_insertdata_last(*requeue, &entry);
+ }
+ 
++static ares_status_t ares_append_requeue(ares__array_t **requeue,
++                                         ares_query_t  *query,
++                                         ares_server_t *server)
++{
++  return ares_append_requeue_int(requeue, REQUEUE_REQUEUE, query, server, 0,
++    NULL);
++}
++
++static ares_status_t ares_append_endqueue(ares__array_t     **requeue,
++                                          ares_query_t      *query,
++                                          ares_status_t      status,
++                                          ares_dns_record_t *dnsrec)
++{
++  return ares_append_requeue_int(requeue, REQUEUE_ENDQUERY, query, NULL, status,
++    dnsrec);
++}
+ 
+ /* If any TCP socket selects true for reading, read some data,
+  * allocate a buffer if we finish reading the length word, and process
+@@ -423,13 +454,24 @@ cleanup:
+       break;
+     }
+ 
+-    /* Query disappeared */
+     query = ares__htable_szvp_get_direct(channel->queries_by_qid, entry.qid);
+-    if (query == NULL) {
+-      continue;
++    if (entry.type == REQUEUE_REQUEUE) {
++      /* query disappeared */
++      if (query == NULL) {
++        continue;
++      }
++      ares__send_query(query, now);
++    } else { /* REQUEUE_ENDQUERY */
++      if (query != NULL) {
++        query->callback(query->arg, entry.status, query->timeouts, entry.dnsrec);
++        ares__free_query(query);
++      }
++      ares_dns_record_destroy(entry.dnsrec);
+     }
+-
+-    ares__send_query(query, now);
++  }
++  /* Don't forget to send notification if queue emptied */
++  if (requeue != NULL) {
++    ares_queue_notify_empty(channel);
+   }
+   ares__array_destroy(requeue);
+ }
+@@ -749,7 +791,7 @@ static ares_status_t process_answer(ares_channel_t      *channel,
+       ares_dns_get_opt_rr_const(rdnsrec) == NULL) {
+     status = rewrite_without_edns(query);
+     if (status != ARES_SUCCESS) {
+-      end_query(channel, server, query, status, NULL);
++      end_query(channel, server, query, status, NULL, NULL);
+       goto cleanup;
+     }
+ 
+@@ -795,6 +837,7 @@ static ares_status_t process_answer(ares_channel_t      *channel,
+       server_increment_failures(server, query->using_tcp);
+       status = ares__requeue_query(query, now, status, ARES_TRUE, rdnsrec,
+                                    requeue);
++      rdnsrec = NULL; /* Free'd by ares_requeue_query() */
+ 
+       if (status != ARES_ENOMEM) {
+         /* Should any of these cause a connection termination?
+@@ -807,12 +850,11 @@ static ares_status_t process_answer(ares_channel_t      *channel,
+ 
+   /* If cache insertion was successful, it took ownership.  We ignore
+    * other cache insertion failures. */
+-  if (ares_qcache_insert(channel, now, query, rdnsrec) == ARES_SUCCESS) {
+-    is_cached = ARES_TRUE;
+-  }
++  ares_qcache_insert(channel, now, query, rdnsrec);
+ 
+   server_set_good(server, query->using_tcp);
+-  end_query(channel, server, query, ARES_SUCCESS, rdnsrec);
++  end_query(channel, server, query, ARES_SUCCESS, rdnsrec, requeue);
++  rdnsrec = NULL; /* Free'd by the requeue */
+ 
+   status = ARES_SUCCESS;
+ 
+@@ -845,7 +887,7 @@ ares_status_t ares__requeue_query(ares_query_t            *query,
+                                   const ares_timeval_t    *now,
+                                   ares_status_t            status,
+                                   ares_bool_t              inc_try_count,
+-                                  const ares_dns_record_t *dnsrec,
++                                  ares_dns_record_t       *dnsrec,
+                                   ares__array_t           **requeue)
+ {
+   ares_channel_t *channel = query->channel;
+@@ -862,6 +904,7 @@ ares_status_t ares__requeue_query(ares_query_t            *query,
+   }
+ 
+   if (query->try_count < max_tries && !query->no_retries) {
++    ares_dns_record_destroy(dnsrec);
+     if (requeue != NULL) {
+       return ares_append_requeue(requeue, query, NULL);
+     }
+@@ -873,7 +916,7 @@ ares_status_t ares__requeue_query(ares_query_t            *query,
+     query->error_status = ARES_ETIMEOUT;
+   }
+ 
+-  end_query(channel, NULL, query, query->error_status, dnsrec);
++  end_query(channel, NULL, query, query->error_status, dnsrec, requeue);
+   return ARES_ETIMEOUT;
+ }
+ 
+@@ -1151,7 +1194,7 @@ ares_status_t ares__send_query(ares_query_t *query, const ares_timeval_t *now)
+   }
+ 
+   if (server == NULL) {
+-    end_query(channel, server, query, ARES_ENOSERVER /* ? */, NULL);
++    end_query(channel, server, query, ARES_ENOSERVER /* ? */, NULL, NULL);
+     return ARES_ENOSERVER;
+   }
+ 
+@@ -1172,7 +1215,7 @@ ares_status_t ares__send_query(ares_query_t *query, const ares_timeval_t *now)
+ 
+       /* Anything else is not retryable, likely ENOMEM */
+       default:
+-        end_query(channel, server, query, status, NULL);
++        end_query(channel, server, query, status, NULL, NULL);
+         return status;
+     }
+   }
+@@ -1186,7 +1229,7 @@ ares_status_t ares__send_query(ares_query_t *query, const ares_timeval_t *now)
+ 
+     case ARES_ENOMEM:
+       /* Not retryable */
+-      end_query(channel, server, query, status, NULL);
++      end_query(channel, server, query, status, NULL, NULL);
+       return status;
+ 
+     /* These conditions are retryable as they are server-specific
+@@ -1220,7 +1263,7 @@ ares_status_t ares__send_query(ares_query_t *query, const ares_timeval_t *now)
+     ares__slist_insert(channel->queries_by_timeout, query);
+   if (!query->node_queries_by_timeout) {
+     /* LCOV_EXCL_START: OutOfMemory */
+-    end_query(channel, server, query, ARES_ENOMEM, NULL);
++    end_query(channel, server, query, ARES_ENOMEM, NULL, NULL);
+     return ARES_ENOMEM;
+     /* LCOV_EXCL_STOP */
+   }
+@@ -1233,7 +1276,7 @@ ares_status_t ares__send_query(ares_query_t *query, const ares_timeval_t *now)
+ 
+   if (query->node_queries_to_conn == NULL) {
+     /* LCOV_EXCL_START: OutOfMemory */
+-    end_query(channel, server, query, ARES_ENOMEM, NULL);
++    end_query(channel, server, query, ARES_ENOMEM, NULL, NULL);
+     return ARES_ENOMEM;
+     /* LCOV_EXCL_STOP */
+   }
+@@ -1344,10 +1387,16 @@ static void ares_detach_query(ares_query_t *query)
+ 
+ static void end_query(ares_channel_t *channel, ares_server_t *server,
+                       ares_query_t *query, ares_status_t status,
+-                      const ares_dns_record_t *dnsrec)
++                      ares_dns_record_t *dnsrec, ares__array_t **requeue)
+ {
+   ares_metrics_record(query, server, status, dnsrec);
+ 
++  /* Delay calling the query callback */
++  if (requeue != NULL) {
++    ares_append_endqueue(requeue, query, status, dnsrec);
++    return;
++  }
++
+   /* Invoke the callback. */
+   query->callback(query->arg, status, query->timeouts, dnsrec);
+   ares__free_query(query);
+diff --git a/lib/c-ares-1.33.1/src/lib/ares_qcache.c b/lib/c-ares-1.33.1/src/lib/ares_qcache.c
+index 9725212..8a5b4b0 100644
+--- a/lib/c-ares-1.33.1/src/lib/ares_qcache.c
++++ b/lib/c-ares-1.33.1/src/lib/ares_qcache.c
+@@ -422,10 +422,20 @@ done:
+   return status;
+ }
+ 
+-ares_status_t ares_qcache_insert(ares_channel_t       *channel,
+-                                 const ares_timeval_t *now,
+-                                 const ares_query_t   *query,
+-                                 ares_dns_record_t    *dnsrec)
++ares_status_t ares_qcache_insert(ares_channel_t          *channel,
++                                 const ares_timeval_t    *now,
++                                 const ares_query_t      *query,
++                                 const ares_dns_record_t *dnsrec)
+ {
+-  return ares__qcache_insert(channel->qcache, dnsrec, query->query, now);
++  ares_dns_record_t *dupdns = ares_dns_record_duplicate(dnsrec);
++  ares_status_t      status;
++
++  if (dupdns == NULL) {
++    return ARES_ENOMEM;
++  }
++  status = ares_qcache_insert(channel->qcache, dupdns, query->query, now);
++  if (status != ARES_SUCCESS) {
++    ares_dns_record_destroy(dupdns);
++  }
++  return status;
+ }
+diff --git a/lib/c-ares-1.33.1/test/ares-test-mock-ai.cc b/lib/c-ares-1.33.1/test/ares-test-mock-ai.cc
+index ad61b04..9771a21 100644
+--- a/lib/c-ares-1.33.1/test/ares-test-mock-ai.cc
++++ b/lib/c-ares-1.33.1/test/ares-test-mock-ai.cc
+@@ -805,7 +805,39 @@ TEST_P(MockUDPChannelTestAI, TriggerResendThenConnFailEDNS) {
+   EXPECT_THAT(result.ai_, IncludesV6Address("2121:0000:0000:0000:0000:0000:0000:0303"));
+ }
+ 
++TEST_P(MockUDPChannelTestAI, ConnectionRefusedOnSearchDomainRetry) {
++  DNSPacket badrsp4;
++  badrsp4.set_response().set_aa()
++    .add_question(new DNSQuestion("www.google.com", T_A))
++    .set_rcode(NXDOMAIN);
++
++  EXPECT_CALL(server_, OnRequest("www.google.com", T_A))
++    .WillOnce(SetReplyAndFailSend(&server_, &badrsp4));
++
++  DNSPacket goodrsp4;
++  goodrsp4.set_response().set_aa()
++    .add_question(new DNSQuestion("www.google.com.first.com", T_A))
++    .add_answer(new DNSARR("www.google.com.first.com", 0x0100, {0x01, 0x02, 0x03, 0x04}));
++
++  EXPECT_CALL(server_, OnRequest("www.google.com.first.com", T_A))
++    .WillOnce(SetReply(&server_, &goodrsp4));
++
++  ares_socket_functions sock_funcs;
++  memset(&sock_funcs, 0, sizeof(sock_funcs));
+ 
++  sock_funcs.asendv = ares_sendv_fail;
++
++  ares_set_socket_functions(channel_, &sock_funcs, NULL);
++
++  AddrInfoResult result;
++  struct ares_addrinfo_hints hints = {0, 0, 0, 0};
++  hints.ai_family = AF_INET;
++  hints.ai_flags = ARES_AI_NOSORT;
++  ares_getaddrinfo(channel_, "www.google.com", NULL, &hints,
++                   AddrInfoCallback, &result);
++
++  Process();
++}
+ 
+ class MockEDNSChannelTestAI : public MockFlagsChannelOptsTestAI {
+  public:
+-- 
+2.43.0
+
diff --git a/SPECS/fluent-bit/fluent-bit.signatures.json b/SPECS/fluent-bit/fluent-bit.signatures.json
index cb3ed9d7fe..e48e6bf823 100644
--- a/SPECS/fluent-bit/fluent-bit.signatures.json
+++ b/SPECS/fluent-bit/fluent-bit.signatures.json
@@ -1,6 +1,6 @@
 {
  "Signatures": {
-  "fluent-bit-3.1.9.tar.gz": "ac3a3e235e7f8a92d35f10c99f400f0b0571417a92e3c4caa467073733d42547",
+  "fluent-bit-3.1.10.tar.gz": "9ec909e8ce04bc8f3b09862c781956c40da18f60e8ae92b154114b4e20edc5fa",
   "fluent_bit.fc": "d59e8180da8c7000c56362ace40e628e9caf7c21047df2a41a1b00dd6c96d5ab",
   "fluent_bit.te": "af9350c3885430cc075212b4a1bedc381062c54d187dc58138dc285131283663"
  }
diff --git a/SPECS/fluent-bit/fluent-bit.spec b/SPECS/fluent-bit/fluent-bit.spec
index 4d22720ed3..a8ed045be2 100644
--- a/SPECS/fluent-bit/fluent-bit.spec
+++ b/SPECS/fluent-bit/fluent-bit.spec
@@ -1,12 +1,13 @@
 Summary:        Fast and Lightweight Log processor and forwarder for Linux, BSD and OSX
 Name:           fluent-bit
-Version:        3.1.9
-Release:        17%{?dist}
+Version:        3.1.10
+Release:        4%{?dist}
 License:        Apache-2.0
 Vendor:         Intel Corporation
 Distribution:   Edge Microvisor Toolkit
 URL:            https://fluentbit.io
 Source0:        https://github.com/fluent/%{name}/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
+# add selinux policies for BMA
 Source1:        fluent_bit.te
 Source2:        fluent_bit.fc
 Patch0:         CVE-2024-34250.patch
@@ -15,9 +16,12 @@ Patch2:         CVE-2024-27532.patch
 Patch3:         CVE-2024-50608.patch
 Patch4:         CVE-2024-50609.patch
 Patch5:         CVE-2025-31498.patch
-Patch6:         CVE-2025-29087.patch
-Patch7:         CVE-2023-53154.patch
-Patch8:         CVE-2025-54126.patch
+Patch6:         CVE-2025-54126.patch
+Patch7:         CVE-2025-58749.patch
+Patch8:         CVE-2025-12970.patch
+Patch9:         CVE-2025-12977.patch
+Patch10:        CVE-2025-12969.patch
+Patch11:        CVE-2025-62408.patch
 BuildRequires:  bison
 BuildRequires:  cmake
 BuildRequires:  cyrus-sasl-devel
@@ -187,6 +191,17 @@ install -m 644 %{modulename}.pp %{buildroot}%{_datadir}/selinux/packages/%{modul
 %selinux_modules_uninstall -s %{selinuxtype} %{modulename}
 
 %changelog
+* Mon Feb 23 2026 Lee Chee Yang  - 3.1.10-4
+- merge from Azure Linux 3.0.20260107-3.0
+- Patch for CVE-2025-62408
+- Patch for CVE-2025-12977 and CVE-2025-12969
+
+* Mon Jan 5 2025 Lee Chee Yang  - 3.1.10-2
+- merge from Azure Linux 3.0.20251206-3.0
+- Upgrade to 3.1.10
+- Patch for CVE-2025-12970
+- Patch for CVE-2025-58749
+
 * Thu Nov 05 2025 Kishan Mochi  - 3.1.9-17
 - remove inbm selinux
 
diff --git a/SPECS/gcc/0011-libsanitizer-Remove-crypt-and-crypt_r-interceptors.patch b/SPECS/gcc/0011-libsanitizer-Remove-crypt-and-crypt_r-interceptors.patch
deleted file mode 100644
index e3b2e24988..0000000000
--- a/SPECS/gcc/0011-libsanitizer-Remove-crypt-and-crypt_r-interceptors.patch
+++ /dev/null
@@ -1,140 +0,0 @@
-From 9b116160a1482c5c0c199f9c21d78a527d11d9ea Mon Sep 17 00:00:00 2001
-From: Fangrui Song 
-Date: Fri, 28 Apr 2023 09:59:17 -0700
-Subject: [PATCH] Remove crypt and crypt_r interceptors
-
-From Florian Weimer's D144073
-
-> On GNU/Linux (glibc), the crypt and crypt_r functions are not part of the main shared object (libc.so.6), but libcrypt (with multiple possible sonames). The sanitizer libraries do not depend on libcrypt, so it can happen that during sanitizer library initialization, no real implementation will be found because the crypt, crypt_r functions are not present in the process image (yet). If its interceptors are called nevertheless, this results in a call through a null pointer when the sanitizer library attempts to forward the call to the real implementation.
->
-> Many distributions have already switched to libxcrypt, a library that is separate from glibc and that can be build with sanitizers directly (avoiding the need for interceptors). This patch disables building the interceptor for glibc targets.
-
-Let's remove crypt and crypt_r interceptors (D68431) to fix issues with
-newer glibc.
-
-For older glibc, msan will not know that an uninstrumented crypt_r call
-initializes `data`, so there is a risk for false positives. However, with some
-codebase survey, I think crypt_r uses are very few and the call sites typically
-have a `memset(&data, 0, sizeof(data));` anyway.
-
-Fix https://github.com/google/sanitizers/issues/1365
-Related: https://bugzilla.redhat.com/show_bug.cgi?id=2169432
-
-Reviewed By: #sanitizers, fweimer, thesamesam, vitalybuka
-
-Differential Revision: https://reviews.llvm.org/D149403
----
- .../sanitizer_common_interceptors.inc         | 37 -------------------
- .../sanitizer_platform_interceptors.h         |  2 -
- .../sanitizer_platform_limits_posix.cpp       |  8 ----
- .../sanitizer_platform_limits_posix.h         |  1 -
- 4 files changed, 48 deletions(-)
-
-diff --git a/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc b/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc
-index ba4b80081f0f..662c41997422 100644
---- a/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc
-+++ b/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc
-@@ -10187,41 +10187,6 @@ INTERCEPTOR(SSIZE_T, getrandom, void *buf, SIZE_T buflen, unsigned int flags) {
- #define INIT_GETRANDOM
- #endif
-
--#if SANITIZER_INTERCEPT_CRYPT
--INTERCEPTOR(char *, crypt, char *key, char *salt) {
--  void *ctx;
--  COMMON_INTERCEPTOR_ENTER(ctx, crypt, key, salt);
--  COMMON_INTERCEPTOR_READ_RANGE(ctx, key, internal_strlen(key) + 1);
--  COMMON_INTERCEPTOR_READ_RANGE(ctx, salt, internal_strlen(salt) + 1);
--  char *res = REAL(crypt)(key, salt);
--  if (res != nullptr)
--    COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, internal_strlen(res) + 1);
--  return res;
--}
--#define INIT_CRYPT COMMON_INTERCEPT_FUNCTION(crypt);
--#else
--#define INIT_CRYPT
--#endif
--
--#if SANITIZER_INTERCEPT_CRYPT_R
--INTERCEPTOR(char *, crypt_r, char *key, char *salt, void *data) {
--  void *ctx;
--  COMMON_INTERCEPTOR_ENTER(ctx, crypt_r, key, salt, data);
--  COMMON_INTERCEPTOR_READ_RANGE(ctx, key, internal_strlen(key) + 1);
--  COMMON_INTERCEPTOR_READ_RANGE(ctx, salt, internal_strlen(salt) + 1);
--  char *res = REAL(crypt_r)(key, salt, data);
--  if (res != nullptr) {
--    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data,
--                                   __sanitizer::struct_crypt_data_sz);
--    COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, internal_strlen(res) + 1);
--  }
--  return res;
--}
--#define INIT_CRYPT_R COMMON_INTERCEPT_FUNCTION(crypt_r);
--#else
--#define INIT_CRYPT_R
--#endif
--
- #if SANITIZER_INTERCEPT_GETENTROPY
- INTERCEPTOR(int, getentropy, void *buf, SIZE_T buflen) {
-   void *ctx;
-@@ -10772,8 +10737,6 @@ static void InitializeCommonInterceptors() {
-   INIT_GETUSERSHELL;
-   INIT_SL_INIT;
-   INIT_GETRANDOM;
--  INIT_CRYPT;
--  INIT_CRYPT_R;
-   INIT_GETENTROPY;
-   INIT_QSORT;
-   INIT_QSORT_R;
-diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h b/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h
-index 8307b1ec28bf..d50166ee6ce0 100644
---- a/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h
-+++ b/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h
-@@ -571,8 +571,6 @@
- #define SANITIZER_INTERCEPT_FDEVNAME SI_FREEBSD
- #define SANITIZER_INTERCEPT_GETUSERSHELL (SI_POSIX && !SI_ANDROID)
- #define SANITIZER_INTERCEPT_SL_INIT (SI_FREEBSD || SI_NETBSD)
--#define SANITIZER_INTERCEPT_CRYPT (SI_POSIX && !SI_ANDROID)
--#define SANITIZER_INTERCEPT_CRYPT_R (SI_LINUX && !SI_ANDROID)
-
- #define SANITIZER_INTERCEPT_GETRANDOM \
-   ((SI_LINUX && __GLIBC_PREREQ(2, 25)) || SI_FREEBSD)
-diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
-index c85cf1626a75..bcbd143d19de 100644
---- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
-+++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
-@@ -176,10 +176,6 @@ typedef struct user_fpregs elf_fpregset_t;
- #  include "sanitizer_platform_interceptors.h"
- #  include "sanitizer_platform_limits_posix.h"
-
--#if SANITIZER_INTERCEPT_CRYPT_R
--#include 
--#endif
--
- namespace __sanitizer {
-   unsigned struct_utsname_sz = sizeof(struct utsname);
-   unsigned struct_stat_sz = sizeof(struct stat);
-@@ -283,10 +279,6 @@ namespace __sanitizer {
-   unsigned struct_statvfs64_sz = sizeof(struct statvfs64);
- #endif // SANITIZER_LINUX && !SANITIZER_ANDROID
-
--#if SANITIZER_INTERCEPT_CRYPT_R
--  unsigned struct_crypt_data_sz = sizeof(struct crypt_data);
--#endif
--
- #if SANITIZER_LINUX && !SANITIZER_ANDROID
-   unsigned struct_timex_sz = sizeof(struct timex);
-   unsigned struct_msqid_ds_sz = sizeof(struct msqid_ds);
-diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
-index 44dd3d9e22d1..29ebb304a9ba 100644
---- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
-+++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
-@@ -319,7 +319,6 @@ extern unsigned struct_msqid_ds_sz;
- extern unsigned struct_mq_attr_sz;
- extern unsigned struct_timex_sz;
- extern unsigned struct_statvfs_sz;
--extern unsigned struct_crypt_data_sz;
- #endif  // SANITIZER_LINUX && !SANITIZER_ANDROID
-
- struct __sanitizer_iovec {
---
-2.41.0
diff --git a/SPECS/gcc/CVE-2019-15847.nopatch b/SPECS/gcc/CVE-2019-15847.nopatch
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/SPECS/gcc/CVE-2023-4039.patch b/SPECS/gcc/CVE-2023-4039.patch
deleted file mode 100644
index 7a7a399c0b..0000000000
--- a/SPECS/gcc/CVE-2023-4039.patch
+++ /dev/null
@@ -1,3056 +0,0 @@
-From 71a2aa2127283f450c623d3604dbcabe0e14a8d4 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:12 +0100
-Subject: [PATCH 01/19] aarch64: Use local frame vars in shrink-wrapping code
-
-aarch64_layout_frame uses a shorthand for referring to
-cfun->machine->frame:
-
-  aarch64_frame &frame = cfun->machine->frame;
-
-This patch does the same for some other heavy users of the structure.
-No functional change intended.
-
-gcc/
-	* config/aarch64/aarch64.cc (aarch64_save_callee_saves): Use
-	a local shorthand for cfun->machine->frame.
-	(aarch64_restore_callee_saves, aarch64_get_separate_components):
-	(aarch64_process_components): Likewise.
-	(aarch64_allocate_and_probe_stack_space): Likewise.
-	(aarch64_expand_prologue, aarch64_expand_epilogue): Likewise.
-	(aarch64_layout_frame): Use existing shorthand for one more case.
----
- gcc/config/aarch64/aarch64.cc | 123 ++++++++++++++++++----------------
- 1 file changed, 64 insertions(+), 59 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 822a2b49a46..5d473d161d9 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8612,7 +8612,7 @@ aarch64_layout_frame (void)
-   frame.is_scs_enabled
-     = (!crtl->calls_eh_return
-        && sanitize_flags_p (SANITIZE_SHADOW_CALL_STACK)
--       && known_ge (cfun->machine->frame.reg_offset[LR_REGNUM], 0));
-+       && known_ge (frame.reg_offset[LR_REGNUM], 0));
- 
-   /* When shadow call stack is enabled, the scs_pop in the epilogue will
-      restore x30, and we don't need to pop x30 again in the traditional
-@@ -9078,6 +9078,7 @@ aarch64_save_callee_saves (poly_int64 start_offset,
- 			   unsigned start, unsigned limit, bool skip_wb,
- 			   bool hard_fp_valid_p)
- {
-+  aarch64_frame &frame = cfun->machine->frame;
-   rtx_insn *insn;
-   unsigned regno;
-   unsigned regno2;
-@@ -9092,8 +9093,8 @@ aarch64_save_callee_saves (poly_int64 start_offset,
-       bool frame_related_p = aarch64_emit_cfi_for_reg_p (regno);
- 
-       if (skip_wb
--	  && (regno == cfun->machine->frame.wb_push_candidate1
--	      || regno == cfun->machine->frame.wb_push_candidate2))
-+	  && (regno == frame.wb_push_candidate1
-+	      || regno == frame.wb_push_candidate2))
- 	continue;
- 
-       if (cfun->machine->reg_is_wrapped_separately[regno])
-@@ -9101,7 +9102,7 @@ aarch64_save_callee_saves (poly_int64 start_offset,
- 
-       machine_mode mode = aarch64_reg_save_mode (regno);
-       reg = gen_rtx_REG (mode, regno);
--      offset = start_offset + cfun->machine->frame.reg_offset[regno];
-+      offset = start_offset + frame.reg_offset[regno];
-       rtx base_rtx = stack_pointer_rtx;
-       poly_int64 sp_offset = offset;
- 
-@@ -9114,7 +9115,7 @@ aarch64_save_callee_saves (poly_int64 start_offset,
- 	{
- 	  gcc_assert (known_eq (start_offset, 0));
- 	  poly_int64 fp_offset
--	    = cfun->machine->frame.below_hard_fp_saved_regs_size;
-+	    = frame.below_hard_fp_saved_regs_size;
- 	  if (hard_fp_valid_p)
- 	    base_rtx = hard_frame_pointer_rtx;
- 	  else
-@@ -9136,8 +9137,7 @@ aarch64_save_callee_saves (poly_int64 start_offset,
- 	  && (regno2 = aarch64_next_callee_save (regno + 1, limit)) <= limit
- 	  && !cfun->machine->reg_is_wrapped_separately[regno2]
- 	  && known_eq (GET_MODE_SIZE (mode),
--		       cfun->machine->frame.reg_offset[regno2]
--		       - cfun->machine->frame.reg_offset[regno]))
-+		       frame.reg_offset[regno2] - frame.reg_offset[regno]))
- 	{
- 	  rtx reg2 = gen_rtx_REG (mode, regno2);
- 	  rtx mem2;
-@@ -9187,6 +9187,7 @@ static void
- aarch64_restore_callee_saves (poly_int64 start_offset, unsigned start,
- 			      unsigned limit, bool skip_wb, rtx *cfi_ops)
- {
-+  aarch64_frame &frame = cfun->machine->frame;
-   unsigned regno;
-   unsigned regno2;
-   poly_int64 offset;
-@@ -9203,13 +9204,13 @@ aarch64_restore_callee_saves (poly_int64 start_offset, unsigned start,
-       rtx reg, mem;
- 
-       if (skip_wb
--	  && (regno == cfun->machine->frame.wb_pop_candidate1
--	      || regno == cfun->machine->frame.wb_pop_candidate2))
-+	  && (regno == frame.wb_pop_candidate1
-+	      || regno == frame.wb_pop_candidate2))
- 	continue;
- 
-       machine_mode mode = aarch64_reg_save_mode (regno);
-       reg = gen_rtx_REG (mode, regno);
--      offset = start_offset + cfun->machine->frame.reg_offset[regno];
-+      offset = start_offset + frame.reg_offset[regno];
-       rtx base_rtx = stack_pointer_rtx;
-       if (mode == VNx2DImode && BYTES_BIG_ENDIAN)
- 	aarch64_adjust_sve_callee_save_base (mode, base_rtx, anchor_reg,
-@@ -9220,8 +9221,7 @@ aarch64_restore_callee_saves (poly_int64 start_offset, unsigned start,
- 	  && (regno2 = aarch64_next_callee_save (regno + 1, limit)) <= limit
- 	  && !cfun->machine->reg_is_wrapped_separately[regno2]
- 	  && known_eq (GET_MODE_SIZE (mode),
--		       cfun->machine->frame.reg_offset[regno2]
--		       - cfun->machine->frame.reg_offset[regno]))
-+		       frame.reg_offset[regno2] - frame.reg_offset[regno]))
- 	{
- 	  rtx reg2 = gen_rtx_REG (mode, regno2);
- 	  rtx mem2;
-@@ -9326,6 +9326,7 @@ offset_12bit_unsigned_scaled_p (machine_mode mode, poly_int64 offset)
- static sbitmap
- aarch64_get_separate_components (void)
- {
-+  aarch64_frame &frame = cfun->machine->frame;
-   sbitmap components = sbitmap_alloc (LAST_SAVED_REGNUM + 1);
-   bitmap_clear (components);
- 
-@@ -9342,18 +9343,18 @@ aarch64_get_separate_components (void)
- 	if (mode == VNx2DImode && BYTES_BIG_ENDIAN)
- 	  continue;
- 
--	poly_int64 offset = cfun->machine->frame.reg_offset[regno];
-+	poly_int64 offset = frame.reg_offset[regno];
- 
- 	/* If the register is saved in the first SVE save slot, we use
- 	   it as a stack probe for -fstack-clash-protection.  */
- 	if (flag_stack_clash_protection
--	    && maybe_ne (cfun->machine->frame.below_hard_fp_saved_regs_size, 0)
-+	    && maybe_ne (frame.below_hard_fp_saved_regs_size, 0)
- 	    && known_eq (offset, 0))
- 	  continue;
- 
- 	/* Get the offset relative to the register we'll use.  */
- 	if (frame_pointer_needed)
--	  offset -= cfun->machine->frame.below_hard_fp_saved_regs_size;
-+	  offset -= frame.below_hard_fp_saved_regs_size;
- 	else
- 	  offset += crtl->outgoing_args_size;
- 
-@@ -9372,11 +9373,11 @@ aarch64_get_separate_components (void)
-   /* If the spare predicate register used by big-endian SVE code
-      is call-preserved, it must be saved in the main prologue
-      before any saves that use it.  */
--  if (cfun->machine->frame.spare_pred_reg != INVALID_REGNUM)
--    bitmap_clear_bit (components, cfun->machine->frame.spare_pred_reg);
-+  if (frame.spare_pred_reg != INVALID_REGNUM)
-+    bitmap_clear_bit (components, frame.spare_pred_reg);
- 
--  unsigned reg1 = cfun->machine->frame.wb_push_candidate1;
--  unsigned reg2 = cfun->machine->frame.wb_push_candidate2;
-+  unsigned reg1 = frame.wb_push_candidate1;
-+  unsigned reg2 = frame.wb_push_candidate2;
-   /* If registers have been chosen to be stored/restored with
-      writeback don't interfere with them to avoid having to output explicit
-      stack adjustment instructions.  */
-@@ -9485,6 +9486,7 @@ aarch64_get_next_set_bit (sbitmap bmp, unsigned int start)
- static void
- aarch64_process_components (sbitmap components, bool prologue_p)
- {
-+  aarch64_frame &frame = cfun->machine->frame;
-   rtx ptr_reg = gen_rtx_REG (Pmode, frame_pointer_needed
- 			     ? HARD_FRAME_POINTER_REGNUM
- 			     : STACK_POINTER_REGNUM);
-@@ -9499,9 +9501,9 @@ aarch64_process_components (sbitmap components, bool prologue_p)
-       machine_mode mode = aarch64_reg_save_mode (regno);
-       
-       rtx reg = gen_rtx_REG (mode, regno);
--      poly_int64 offset = cfun->machine->frame.reg_offset[regno];
-+      poly_int64 offset = frame.reg_offset[regno];
-       if (frame_pointer_needed)
--	offset -= cfun->machine->frame.below_hard_fp_saved_regs_size;
-+	offset -= frame.below_hard_fp_saved_regs_size;
-       else
- 	offset += crtl->outgoing_args_size;
- 
-@@ -9526,14 +9528,14 @@ aarch64_process_components (sbitmap components, bool prologue_p)
- 	  break;
- 	}
- 
--      poly_int64 offset2 = cfun->machine->frame.reg_offset[regno2];
-+      poly_int64 offset2 = frame.reg_offset[regno2];
-       /* The next register is not of the same class or its offset is not
- 	 mergeable with the current one into a pair.  */
-       if (aarch64_sve_mode_p (mode)
- 	  || !satisfies_constraint_Ump (mem)
- 	  || GP_REGNUM_P (regno) != GP_REGNUM_P (regno2)
- 	  || (crtl->abi->id () == ARM_PCS_SIMD && FP_REGNUM_P (regno))
--	  || maybe_ne ((offset2 - cfun->machine->frame.reg_offset[regno]),
-+	  || maybe_ne ((offset2 - frame.reg_offset[regno]),
- 		       GET_MODE_SIZE (mode)))
- 	{
- 	  insn = emit_insn (set);
-@@ -9555,7 +9557,7 @@ aarch64_process_components (sbitmap components, bool prologue_p)
-       /* REGNO2 can be saved/restored in a pair with REGNO.  */
-       rtx reg2 = gen_rtx_REG (mode, regno2);
-       if (frame_pointer_needed)
--	offset2 -= cfun->machine->frame.below_hard_fp_saved_regs_size;
-+	offset2 -= frame.below_hard_fp_saved_regs_size;
-       else
- 	offset2 += crtl->outgoing_args_size;
-       rtx addr2 = plus_constant (Pmode, ptr_reg, offset2);
-@@ -9650,6 +9652,7 @@ aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
- 					bool frame_related_p,
- 					bool final_adjustment_p)
- {
-+  aarch64_frame &frame = cfun->machine->frame;
-   HOST_WIDE_INT guard_size
-     = 1 << param_stack_clash_protection_guard_size;
-   HOST_WIDE_INT guard_used_by_caller = STACK_CLASH_CALLER_GUARD;
-@@ -9670,25 +9673,25 @@ aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
-        register as a probe.  We can't assume that LR was saved at position 0
-        though, so treat any space below it as unprobed.  */
-   if (final_adjustment_p
--      && known_eq (cfun->machine->frame.below_hard_fp_saved_regs_size, 0))
-+      && known_eq (frame.below_hard_fp_saved_regs_size, 0))
-     {
--      poly_int64 lr_offset = cfun->machine->frame.reg_offset[LR_REGNUM];
-+      poly_int64 lr_offset = frame.reg_offset[LR_REGNUM];
-       if (known_ge (lr_offset, 0))
- 	min_probe_threshold -= lr_offset.to_constant ();
-       else
- 	gcc_assert (!flag_stack_clash_protection || known_eq (poly_size, 0));
-     }
- 
--  poly_int64 frame_size = cfun->machine->frame.frame_size;
-+  poly_int64 frame_size = frame.frame_size;
- 
-   /* We should always have a positive probe threshold.  */
-   gcc_assert (min_probe_threshold > 0);
- 
-   if (flag_stack_clash_protection && !final_adjustment_p)
-     {
--      poly_int64 initial_adjust = cfun->machine->frame.initial_adjust;
--      poly_int64 sve_callee_adjust = cfun->machine->frame.sve_callee_adjust;
--      poly_int64 final_adjust = cfun->machine->frame.final_adjust;
-+      poly_int64 initial_adjust = frame.initial_adjust;
-+      poly_int64 sve_callee_adjust = frame.sve_callee_adjust;
-+      poly_int64 final_adjust = frame.final_adjust;
- 
-       if (known_eq (frame_size, 0))
- 	{
-@@ -9977,17 +9980,18 @@ aarch64_epilogue_uses (int regno)
- void
- aarch64_expand_prologue (void)
- {
--  poly_int64 frame_size = cfun->machine->frame.frame_size;
--  poly_int64 initial_adjust = cfun->machine->frame.initial_adjust;
--  HOST_WIDE_INT callee_adjust = cfun->machine->frame.callee_adjust;
--  poly_int64 final_adjust = cfun->machine->frame.final_adjust;
--  poly_int64 callee_offset = cfun->machine->frame.callee_offset;
--  poly_int64 sve_callee_adjust = cfun->machine->frame.sve_callee_adjust;
-+  aarch64_frame &frame = cfun->machine->frame;
-+  poly_int64 frame_size = frame.frame_size;
-+  poly_int64 initial_adjust = frame.initial_adjust;
-+  HOST_WIDE_INT callee_adjust = frame.callee_adjust;
-+  poly_int64 final_adjust = frame.final_adjust;
-+  poly_int64 callee_offset = frame.callee_offset;
-+  poly_int64 sve_callee_adjust = frame.sve_callee_adjust;
-   poly_int64 below_hard_fp_saved_regs_size
--    = cfun->machine->frame.below_hard_fp_saved_regs_size;
--  unsigned reg1 = cfun->machine->frame.wb_push_candidate1;
--  unsigned reg2 = cfun->machine->frame.wb_push_candidate2;
--  bool emit_frame_chain = cfun->machine->frame.emit_frame_chain;
-+    = frame.below_hard_fp_saved_regs_size;
-+  unsigned reg1 = frame.wb_push_candidate1;
-+  unsigned reg2 = frame.wb_push_candidate2;
-+  bool emit_frame_chain = frame.emit_frame_chain;
-   rtx_insn *insn;
- 
-   if (flag_stack_clash_protection && known_eq (callee_adjust, 0))
-@@ -10018,7 +10022,7 @@ aarch64_expand_prologue (void)
-     }
- 
-   /* Push return address to shadow call stack.  */
--  if (cfun->machine->frame.is_scs_enabled)
-+  if (frame.is_scs_enabled)
-     emit_insn (gen_scs_push ());
- 
-   if (flag_stack_usage_info)
-@@ -10057,7 +10061,7 @@ aarch64_expand_prologue (void)
- 
-   /* The offset of the frame chain record (if any) from the current SP.  */
-   poly_int64 chain_offset = (initial_adjust + callee_adjust
--			     - cfun->machine->frame.hard_fp_offset);
-+			     - frame.hard_fp_offset);
-   gcc_assert (known_ge (chain_offset, 0));
- 
-   /* The offset of the bottom of the save area from the current SP.  */
-@@ -10160,16 +10164,17 @@ aarch64_use_return_insn_p (void)
- void
- aarch64_expand_epilogue (bool for_sibcall)
- {
--  poly_int64 initial_adjust = cfun->machine->frame.initial_adjust;
--  HOST_WIDE_INT callee_adjust = cfun->machine->frame.callee_adjust;
--  poly_int64 final_adjust = cfun->machine->frame.final_adjust;
--  poly_int64 callee_offset = cfun->machine->frame.callee_offset;
--  poly_int64 sve_callee_adjust = cfun->machine->frame.sve_callee_adjust;
-+  aarch64_frame &frame = cfun->machine->frame;
-+  poly_int64 initial_adjust = frame.initial_adjust;
-+  HOST_WIDE_INT callee_adjust = frame.callee_adjust;
-+  poly_int64 final_adjust = frame.final_adjust;
-+  poly_int64 callee_offset = frame.callee_offset;
-+  poly_int64 sve_callee_adjust = frame.sve_callee_adjust;
-   poly_int64 below_hard_fp_saved_regs_size
--    = cfun->machine->frame.below_hard_fp_saved_regs_size;
--  unsigned reg1 = cfun->machine->frame.wb_pop_candidate1;
--  unsigned reg2 = cfun->machine->frame.wb_pop_candidate2;
--  unsigned int last_gpr = (cfun->machine->frame.is_scs_enabled
-+    = frame.below_hard_fp_saved_regs_size;
-+  unsigned reg1 = frame.wb_pop_candidate1;
-+  unsigned reg2 = frame.wb_pop_candidate2;
-+  unsigned int last_gpr = (frame.is_scs_enabled
- 			   ? R29_REGNUM : R30_REGNUM);
-   rtx cfi_ops = NULL;
-   rtx_insn *insn;
-@@ -10203,7 +10208,7 @@ aarch64_expand_epilogue (bool for_sibcall)
-   /* We need to add memory barrier to prevent read from deallocated stack.  */
-   bool need_barrier_p
-     = maybe_ne (get_frame_size ()
--		+ cfun->machine->frame.saved_varargs_size, 0);
-+		+ frame.saved_varargs_size, 0);
- 
-   /* Emit a barrier to prevent loads from a deallocated stack.  */
-   if (maybe_gt (final_adjust, crtl->outgoing_args_size)
-@@ -10284,7 +10289,7 @@ aarch64_expand_epilogue (bool for_sibcall)
-     }
- 
-   /* Pop return address from shadow call stack.  */
--  if (cfun->machine->frame.is_scs_enabled)
-+  if (frame.is_scs_enabled)
-     {
-       machine_mode mode = aarch64_reg_save_mode (R30_REGNUM);
-       rtx reg = gen_rtx_REG (mode, R30_REGNUM);
-@@ -12740,24 +12745,24 @@ aarch64_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
- poly_int64
- aarch64_initial_elimination_offset (unsigned from, unsigned to)
- {
-+  aarch64_frame &frame = cfun->machine->frame;
-+
-   if (to == HARD_FRAME_POINTER_REGNUM)
-     {
-       if (from == ARG_POINTER_REGNUM)
--	return cfun->machine->frame.hard_fp_offset;
-+	return frame.hard_fp_offset;
- 
-       if (from == FRAME_POINTER_REGNUM)
--	return cfun->machine->frame.hard_fp_offset
--	       - cfun->machine->frame.locals_offset;
-+	return frame.hard_fp_offset - frame.locals_offset;
-     }
- 
-   if (to == STACK_POINTER_REGNUM)
-     {
-       if (from == FRAME_POINTER_REGNUM)
--	  return cfun->machine->frame.frame_size
--		 - cfun->machine->frame.locals_offset;
-+	return frame.frame_size - frame.locals_offset;
-     }
- 
--  return cfun->machine->frame.frame_size;
-+  return frame.frame_size;
- }
- 
- 
--- 
-2.39.4
-
-
-From 89a9fa287706c5011f61926eaf65e7b996b963a3 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:12 +0100
-Subject: [PATCH 02/19] aarch64: Avoid a use of callee_offset
-
-When we emit the frame chain, i.e. when we reach Here in this statement
-of aarch64_expand_prologue:
-
-  if (emit_frame_chain)
-    {
-      // Here
-      ...
-    }
-
-the stack is in one of two states:
-
-- We've allocated up to the frame chain, but no more.
-
-- We've allocated the whole frame, and the frame chain is within easy
-  reach of the new SP.
-
-The offset of the frame chain from the current SP is available
-in aarch64_frame as callee_offset.  It is also available as the
-chain_offset local variable, where the latter is calculated from other
-data.  (However, chain_offset is not always equal to callee_offset when
-!emit_frame_chain, so chain_offset isn't redundant.)
-
-In c600df9a4060da3c6121ff4d0b93f179eafd69d1 I switched to using
-chain_offset for the initialisation of the hard frame pointer:
-
-       aarch64_add_offset (Pmode, hard_frame_pointer_rtx,
--                         stack_pointer_rtx, callee_offset,
-+                         stack_pointer_rtx, chain_offset,
-                          tmp1_rtx, tmp0_rtx, frame_pointer_needed);
-
-But the later REG_CFA_ADJUST_CFA handling still used callee_offset.
-
-I think the difference is harmless, but it's more logical for the
-CFA note to be in sync, and it's more convenient for later patches
-if it uses chain_offset.
-
-gcc/
-	* config/aarch64/aarch64.cc (aarch64_expand_prologue): Use
-	chain_offset rather than callee_offset.
----
- gcc/config/aarch64/aarch64.cc | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 5d473d161d9..4f233c95140 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -9985,7 +9985,6 @@ aarch64_expand_prologue (void)
-   poly_int64 initial_adjust = frame.initial_adjust;
-   HOST_WIDE_INT callee_adjust = frame.callee_adjust;
-   poly_int64 final_adjust = frame.final_adjust;
--  poly_int64 callee_offset = frame.callee_offset;
-   poly_int64 sve_callee_adjust = frame.sve_callee_adjust;
-   poly_int64 below_hard_fp_saved_regs_size
-     = frame.below_hard_fp_saved_regs_size;
-@@ -10098,8 +10097,7 @@ aarch64_expand_prologue (void)
- 	     implicit.  */
- 	  if (!find_reg_note (insn, REG_CFA_ADJUST_CFA, NULL_RTX))
- 	    {
--	      rtx src = plus_constant (Pmode, stack_pointer_rtx,
--				       callee_offset);
-+	      rtx src = plus_constant (Pmode, stack_pointer_rtx, chain_offset);
- 	      add_reg_note (insn, REG_CFA_ADJUST_CFA,
- 			    gen_rtx_SET (hard_frame_pointer_rtx, src));
- 	    }
--- 
-2.39.4
-
-
-From b36a2a78040722dab6124366c5d6baf8eaf80aef Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:13 +0100
-Subject: [PATCH 03/19] aarch64: Explicitly handle frames with no saved
- registers
-
-If a frame has no saved registers, it can be allocated in one go.
-There is no need to treat the areas below and above the saved
-registers as separate.
-
-And if we allocate the frame in one go, it should be allocated
-as the initial_adjust rather than the final_adjust.  This allows the
-frame size to grow to guard_size - guard_used_by_caller before a stack
-probe is needed.  (A frame with no register saves is necessarily a
-leaf frame.)
-
-This is a no-op as thing stand, since a leaf function will have
-no outgoing arguments, and so all the frame will be above where
-the saved registers normally go.
-
-gcc/
-	* config/aarch64/aarch64.cc (aarch64_layout_frame): Explicitly
-	allocate the frame in one go if there are no saved registers.
----
- gcc/config/aarch64/aarch64.cc | 8 +++++---
- 1 file changed, 5 insertions(+), 3 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 4f233c95140..37643041ffb 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8639,9 +8639,11 @@ aarch64_layout_frame (void)
- 
-   HOST_WIDE_INT const_size, const_outgoing_args_size, const_fp_offset;
-   HOST_WIDE_INT const_saved_regs_size;
--  if (frame.frame_size.is_constant (&const_size)
--      && const_size < max_push_offset
--      && known_eq (frame.hard_fp_offset, const_size))
-+  if (known_eq (frame.saved_regs_size, 0))
-+    frame.initial_adjust = frame.frame_size;
-+  else if (frame.frame_size.is_constant (&const_size)
-+	   && const_size < max_push_offset
-+	   && known_eq (frame.hard_fp_offset, const_size))
-     {
-       /* Simple, small frame with no outgoing arguments:
- 
--- 
-2.39.4
-
-
-From ada2ab0093596be707f23a3466ac82cff59fcffe Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:13 +0100
-Subject: [PATCH 04/19] aarch64: Add bytes_below_saved_regs to frame info
-
-The frame layout code currently hard-codes the assumption that
-the number of bytes below the saved registers is equal to the
-size of the outgoing arguments.  This patch abstracts that
-value into a new field of aarch64_frame.
-
-gcc/
-	* config/aarch64/aarch64.h (aarch64_frame::bytes_below_saved_regs): New
-	field.
-	* config/aarch64/aarch64.cc (aarch64_layout_frame): Initialize it,
-	and use it instead of crtl->outgoing_args_size.
-	(aarch64_get_separate_components): Use bytes_below_saved_regs instead
-	of outgoing_args_size.
-	(aarch64_process_components): Likewise.
----
- gcc/config/aarch64/aarch64.cc | 71 ++++++++++++++++++-----------------
- gcc/config/aarch64/aarch64.h  |  5 +++
- 2 files changed, 41 insertions(+), 35 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 37643041ffb..dacc2b0e4dd 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8478,6 +8478,8 @@ aarch64_layout_frame (void)
-   gcc_assert (crtl->is_leaf
- 	      || maybe_ne (frame.reg_offset[R30_REGNUM], SLOT_NOT_REQUIRED));
- 
-+  frame.bytes_below_saved_regs = crtl->outgoing_args_size;
-+
-   /* Now assign stack slots for the registers.  Start with the predicate
-      registers, since predicate LDR and STR have a relatively small
-      offset range.  These saves happen below the hard frame pointer.  */
-@@ -8582,18 +8584,18 @@ aarch64_layout_frame (void)
- 
-   poly_int64 varargs_and_saved_regs_size = offset + frame.saved_varargs_size;
- 
--  poly_int64 above_outgoing_args
-+  poly_int64 saved_regs_and_above
-     = aligned_upper_bound (varargs_and_saved_regs_size
- 			   + get_frame_size (),
- 			   STACK_BOUNDARY / BITS_PER_UNIT);
- 
-   frame.hard_fp_offset
--    = above_outgoing_args - frame.below_hard_fp_saved_regs_size;
-+    = saved_regs_and_above - frame.below_hard_fp_saved_regs_size;
- 
-   /* Both these values are already aligned.  */
--  gcc_assert (multiple_p (crtl->outgoing_args_size,
-+  gcc_assert (multiple_p (frame.bytes_below_saved_regs,
- 			  STACK_BOUNDARY / BITS_PER_UNIT));
--  frame.frame_size = above_outgoing_args + crtl->outgoing_args_size;
-+  frame.frame_size = saved_regs_and_above + frame.bytes_below_saved_regs;
- 
-   frame.locals_offset = frame.saved_varargs_size;
- 
-@@ -8637,7 +8639,7 @@ aarch64_layout_frame (void)
-   else if (frame.wb_pop_candidate1 != INVALID_REGNUM)
-     max_push_offset = 256;
- 
--  HOST_WIDE_INT const_size, const_outgoing_args_size, const_fp_offset;
-+  HOST_WIDE_INT const_size, const_below_saved_regs, const_fp_offset;
-   HOST_WIDE_INT const_saved_regs_size;
-   if (known_eq (frame.saved_regs_size, 0))
-     frame.initial_adjust = frame.frame_size;
-@@ -8645,31 +8647,31 @@ aarch64_layout_frame (void)
- 	   && const_size < max_push_offset
- 	   && known_eq (frame.hard_fp_offset, const_size))
-     {
--      /* Simple, small frame with no outgoing arguments:
-+      /* Simple, small frame with no data below the saved registers.
- 
- 	 stp reg1, reg2, [sp, -frame_size]!
- 	 stp reg3, reg4, [sp, 16]  */
-       frame.callee_adjust = const_size;
-     }
--  else if (crtl->outgoing_args_size.is_constant (&const_outgoing_args_size)
-+  else if (frame.bytes_below_saved_regs.is_constant (&const_below_saved_regs)
- 	   && frame.saved_regs_size.is_constant (&const_saved_regs_size)
--	   && const_outgoing_args_size + const_saved_regs_size < 512
--	   /* We could handle this case even with outgoing args, provided
--	      that the number of args left us with valid offsets for all
--	      predicate and vector save slots.  It's such a rare case that
--	      it hardly seems worth the effort though.  */
--	   && (!saves_below_hard_fp_p || const_outgoing_args_size == 0)
-+	   && const_below_saved_regs + const_saved_regs_size < 512
-+	   /* We could handle this case even with data below the saved
-+	      registers, provided that that data left us with valid offsets
-+	      for all predicate and vector save slots.  It's such a rare
-+	      case that it hardly seems worth the effort though.  */
-+	   && (!saves_below_hard_fp_p || const_below_saved_regs == 0)
- 	   && !(cfun->calls_alloca
- 		&& frame.hard_fp_offset.is_constant (&const_fp_offset)
- 		&& const_fp_offset < max_push_offset))
-     {
--      /* Frame with small outgoing arguments:
-+      /* Frame with small area below the saved registers:
- 
- 	 sub sp, sp, frame_size
--	 stp reg1, reg2, [sp, outgoing_args_size]
--	 stp reg3, reg4, [sp, outgoing_args_size + 16]  */
-+	 stp reg1, reg2, [sp, bytes_below_saved_regs]
-+	 stp reg3, reg4, [sp, bytes_below_saved_regs + 16]  */
-       frame.initial_adjust = frame.frame_size;
--      frame.callee_offset = const_outgoing_args_size;
-+      frame.callee_offset = const_below_saved_regs;
-     }
-   else if (saves_below_hard_fp_p
- 	   && known_eq (frame.saved_regs_size,
-@@ -8679,30 +8681,29 @@ aarch64_layout_frame (void)
- 
- 	 sub sp, sp, hard_fp_offset + below_hard_fp_saved_regs_size
- 	 save SVE registers relative to SP
--	 sub sp, sp, outgoing_args_size  */
-+	 sub sp, sp, bytes_below_saved_regs  */
-       frame.initial_adjust = (frame.hard_fp_offset
- 			      + frame.below_hard_fp_saved_regs_size);
--      frame.final_adjust = crtl->outgoing_args_size;
-+      frame.final_adjust = frame.bytes_below_saved_regs;
-     }
-   else if (frame.hard_fp_offset.is_constant (&const_fp_offset)
- 	   && const_fp_offset < max_push_offset)
-     {
--      /* Frame with large outgoing arguments or SVE saves, but with
--	 a small local area:
-+      /* Frame with large area below the saved registers, or with SVE saves,
-+	 but with a small area above:
- 
- 	 stp reg1, reg2, [sp, -hard_fp_offset]!
- 	 stp reg3, reg4, [sp, 16]
- 	 [sub sp, sp, below_hard_fp_saved_regs_size]
- 	 [save SVE registers relative to SP]
--	 sub sp, sp, outgoing_args_size  */
-+	 sub sp, sp, bytes_below_saved_regs  */
-       frame.callee_adjust = const_fp_offset;
-       frame.sve_callee_adjust = frame.below_hard_fp_saved_regs_size;
--      frame.final_adjust = crtl->outgoing_args_size;
-+      frame.final_adjust = frame.bytes_below_saved_regs;
-     }
-   else
-     {
--      /* Frame with large local area and outgoing arguments or SVE saves,
--	 using frame pointer:
-+      /* General case:
- 
- 	 sub sp, sp, hard_fp_offset
- 	 stp x29, x30, [sp, 0]
-@@ -8710,10 +8711,10 @@ aarch64_layout_frame (void)
- 	 stp reg3, reg4, [sp, 16]
- 	 [sub sp, sp, below_hard_fp_saved_regs_size]
- 	 [save SVE registers relative to SP]
--	 sub sp, sp, outgoing_args_size  */
-+	 sub sp, sp, bytes_below_saved_regs  */
-       frame.initial_adjust = frame.hard_fp_offset;
-       frame.sve_callee_adjust = frame.below_hard_fp_saved_regs_size;
--      frame.final_adjust = crtl->outgoing_args_size;
-+      frame.final_adjust = frame.bytes_below_saved_regs;
-     }
- 
-   /* Make sure the individual adjustments add up to the full frame size.  */
-@@ -9358,7 +9359,7 @@ aarch64_get_separate_components (void)
- 	if (frame_pointer_needed)
- 	  offset -= frame.below_hard_fp_saved_regs_size;
- 	else
--	  offset += crtl->outgoing_args_size;
-+	  offset += frame.bytes_below_saved_regs;
- 
- 	/* Check that we can access the stack slot of the register with one
- 	   direct load with no adjustments needed.  */
-@@ -9507,7 +9508,7 @@ aarch64_process_components (sbitmap components, bool prologue_p)
-       if (frame_pointer_needed)
- 	offset -= frame.below_hard_fp_saved_regs_size;
-       else
--	offset += crtl->outgoing_args_size;
-+	offset += frame.bytes_below_saved_regs;
- 
-       rtx addr = plus_constant (Pmode, ptr_reg, offset);
-       rtx mem = gen_frame_mem (mode, addr);
-@@ -9561,7 +9562,7 @@ aarch64_process_components (sbitmap components, bool prologue_p)
-       if (frame_pointer_needed)
- 	offset2 -= frame.below_hard_fp_saved_regs_size;
-       else
--	offset2 += crtl->outgoing_args_size;
-+	offset2 += frame.bytes_below_saved_regs;
-       rtx addr2 = plus_constant (Pmode, ptr_reg, offset2);
-       rtx mem2 = gen_frame_mem (mode, addr2);
-       rtx set2 = prologue_p ? gen_rtx_SET (mem2, reg2)
-@@ -9635,10 +9636,10 @@ aarch64_stack_clash_protection_alloca_probe_range (void)
-    registers.  If POLY_SIZE is not large enough to require a probe this function
-    will only adjust the stack.  When allocating the stack space
-    FRAME_RELATED_P is then used to indicate if the allocation is frame related.
--   FINAL_ADJUSTMENT_P indicates whether we are allocating the outgoing
--   arguments.  If we are then we ensure that any allocation larger than the ABI
--   defined buffer needs a probe so that the invariant of having a 1KB buffer is
--   maintained.
-+   FINAL_ADJUSTMENT_P indicates whether we are allocating the area below
-+   the saved registers.  If we are then we ensure that any allocation
-+   larger than the ABI defined buffer needs a probe so that the
-+   invariant of having a 1KB buffer is maintained.
- 
-    We emit barriers after each stack adjustment to prevent optimizations from
-    breaking the invariant that we never drop the stack more than a page.  This
-@@ -9847,7 +9848,7 @@ aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
-   /* Handle any residuals.  Residuals of at least MIN_PROBE_THRESHOLD have to
-      be probed.  This maintains the requirement that each page is probed at
-      least once.  For initial probing we probe only if the allocation is
--     more than GUARD_SIZE - buffer, and for the outgoing arguments we probe
-+     more than GUARD_SIZE - buffer, and below the saved registers we probe
-      if the amount is larger than buffer.  GUARD_SIZE - buffer + buffer ==
-      GUARD_SIZE.  This works that for any allocation that is large enough to
-      trigger a probe here, we'll have at least one, and if they're not large
-diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
-index 73b09e20508..0b6faa3ddf1 100644
---- a/gcc/config/aarch64/aarch64.h
-+++ b/gcc/config/aarch64/aarch64.h
-@@ -777,6 +777,11 @@ struct GTY (()) aarch64_frame
-   /* The size of the callee-save registers with a slot in REG_OFFSET.  */
-   poly_int64 saved_regs_size;
- 
-+  /* The number of bytes between the bottom of the static frame (the bottom
-+     of the outgoing arguments) and the bottom of the register save area.
-+     This value is always a multiple of STACK_BOUNDARY.  */
-+  poly_int64 bytes_below_saved_regs;
-+
-   /* The size of the callee-save registers with a slot in REG_OFFSET that
-      are saved below the hard frame pointer.  */
-   poly_int64 below_hard_fp_saved_regs_size;
--- 
-2.39.4
-
-
-From 82f6b3e1b596ef0f4e3ac3bb9c6e88fb4458f402 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:14 +0100
-Subject: [PATCH 05/19] aarch64: Add bytes_below_hard_fp to frame info
-
-Following on from the previous bytes_below_saved_regs patch, this one
-records the number of bytes that are below the hard frame pointer.
-This eventually replaces below_hard_fp_saved_regs_size.
-
-If a frame pointer is not needed, the epilogue adds final_adjust
-to the stack pointer before restoring registers:
-
-     aarch64_add_sp (tmp1_rtx, tmp0_rtx, final_adjust, true);
-
-Therefore, if the epilogue needs to restore the stack pointer from
-the hard frame pointer, the directly corresponding offset is:
-
-     -bytes_below_hard_fp + final_adjust
-
-i.e. go from the hard frame pointer to the bottom of the frame,
-then add the same amount as if we were using the stack pointer
-from the outset.
-
-gcc/
-	* config/aarch64/aarch64.h (aarch64_frame::bytes_below_hard_fp): New
-	field.
-	* config/aarch64/aarch64.cc (aarch64_layout_frame): Initialize it.
-	(aarch64_expand_epilogue): Use it instead of
-	below_hard_fp_saved_regs_size.
----
- gcc/config/aarch64/aarch64.cc | 6 +++---
- gcc/config/aarch64/aarch64.h  | 5 +++++
- 2 files changed, 8 insertions(+), 3 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index dacc2b0e4dd..a3f7aabcc59 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8530,6 +8530,7 @@ aarch64_layout_frame (void)
-      of the callee save area.  */
-   bool saves_below_hard_fp_p = maybe_ne (offset, 0);
-   frame.below_hard_fp_saved_regs_size = offset;
-+  frame.bytes_below_hard_fp = offset + frame.bytes_below_saved_regs;
-   if (frame.emit_frame_chain)
-     {
-       /* FP and LR are placed in the linkage record.  */
-@@ -10171,8 +10172,7 @@ aarch64_expand_epilogue (bool for_sibcall)
-   poly_int64 final_adjust = frame.final_adjust;
-   poly_int64 callee_offset = frame.callee_offset;
-   poly_int64 sve_callee_adjust = frame.sve_callee_adjust;
--  poly_int64 below_hard_fp_saved_regs_size
--    = frame.below_hard_fp_saved_regs_size;
-+  poly_int64 bytes_below_hard_fp = frame.bytes_below_hard_fp;
-   unsigned reg1 = frame.wb_pop_candidate1;
-   unsigned reg2 = frame.wb_pop_candidate2;
-   unsigned int last_gpr = (frame.is_scs_enabled
-@@ -10230,7 +10230,7 @@ aarch64_expand_epilogue (bool for_sibcall)
-        is restored on the instruction doing the writeback.  */
-     aarch64_add_offset (Pmode, stack_pointer_rtx,
- 			hard_frame_pointer_rtx,
--			-callee_offset - below_hard_fp_saved_regs_size,
-+			-bytes_below_hard_fp + final_adjust,
- 			tmp1_rtx, tmp0_rtx, callee_adjust == 0);
-   else
-      /* The case where we need to re-use the register here is very rare, so
-diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
-index 0b6faa3ddf1..4263d29d29d 100644
---- a/gcc/config/aarch64/aarch64.h
-+++ b/gcc/config/aarch64/aarch64.h
-@@ -786,6 +786,11 @@ struct GTY (()) aarch64_frame
-      are saved below the hard frame pointer.  */
-   poly_int64 below_hard_fp_saved_regs_size;
- 
-+  /* The number of bytes between the bottom of the static frame (the bottom
-+     of the outgoing arguments) and the hard frame pointer.  This value is
-+     always a multiple of STACK_BOUNDARY.  */
-+  poly_int64 bytes_below_hard_fp;
-+
-   /* Offset from the base of the frame (incomming SP) to the
-      top of the locals area.  This value is always a multiple of
-      STACK_BOUNDARY.  */
--- 
-2.39.4
-
-
-From 86fa43e9fe4a8bf954f2919f07cbe3646d1d1df3 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:14 +0100
-Subject: [PATCH 06/19] aarch64: Tweak aarch64_save/restore_callee_saves
-
-aarch64_save_callee_saves and aarch64_restore_callee_saves took
-a parameter called start_offset that gives the offset of the
-bottom of the saved register area from the current stack pointer.
-However, it's more convenient for later patches if we use the
-bottom of the entire frame as the reference point, rather than
-the bottom of the saved registers.
-
-Doing that removes the need for the callee_offset field.
-Other than that, this is not a win on its own.  It only really
-makes sense in combination with the follow-on patches.
-
-gcc/
-	* config/aarch64/aarch64.h (aarch64_frame::callee_offset): Delete.
-	* config/aarch64/aarch64.cc (aarch64_layout_frame): Remove
-	callee_offset handling.
-	(aarch64_save_callee_saves): Replace the start_offset parameter
-	with a bytes_below_sp parameter.
-	(aarch64_restore_callee_saves): Likewise.
-	(aarch64_expand_prologue): Update accordingly.
-	(aarch64_expand_epilogue): Likewise.
----
- gcc/config/aarch64/aarch64.cc | 56 +++++++++++++++++------------------
- gcc/config/aarch64/aarch64.h  |  4 ---
- 2 files changed, 28 insertions(+), 32 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index a3f7aabcc59..46ae5cf7673 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8604,7 +8604,6 @@ aarch64_layout_frame (void)
-   frame.final_adjust = 0;
-   frame.callee_adjust = 0;
-   frame.sve_callee_adjust = 0;
--  frame.callee_offset = 0;
- 
-   frame.wb_pop_candidate1 = frame.wb_push_candidate1;
-   frame.wb_pop_candidate2 = frame.wb_push_candidate2;
-@@ -8672,7 +8671,6 @@ aarch64_layout_frame (void)
- 	 stp reg1, reg2, [sp, bytes_below_saved_regs]
- 	 stp reg3, reg4, [sp, bytes_below_saved_regs + 16]  */
-       frame.initial_adjust = frame.frame_size;
--      frame.callee_offset = const_below_saved_regs;
-     }
-   else if (saves_below_hard_fp_p
- 	   && known_eq (frame.saved_regs_size,
-@@ -9073,12 +9071,13 @@ aarch64_add_cfa_expression (rtx_insn *insn, rtx reg,
- }
- 
- /* Emit code to save the callee-saved registers from register number START
--   to LIMIT to the stack at the location starting at offset START_OFFSET,
--   skipping any write-back candidates if SKIP_WB is true.  HARD_FP_VALID_P
--   is true if the hard frame pointer has been set up.  */
-+   to LIMIT to the stack.  The stack pointer is currently BYTES_BELOW_SP
-+   bytes above the bottom of the static frame.  Skip any write-back
-+   candidates if SKIP_WB is true.  HARD_FP_VALID_P is true if the hard
-+   frame pointer has been set up.  */
- 
- static void
--aarch64_save_callee_saves (poly_int64 start_offset,
-+aarch64_save_callee_saves (poly_int64 bytes_below_sp,
- 			   unsigned start, unsigned limit, bool skip_wb,
- 			   bool hard_fp_valid_p)
- {
-@@ -9106,7 +9105,9 @@ aarch64_save_callee_saves (poly_int64 start_offset,
- 
-       machine_mode mode = aarch64_reg_save_mode (regno);
-       reg = gen_rtx_REG (mode, regno);
--      offset = start_offset + frame.reg_offset[regno];
-+      offset = (frame.reg_offset[regno]
-+		+ frame.bytes_below_saved_regs
-+		- bytes_below_sp);
-       rtx base_rtx = stack_pointer_rtx;
-       poly_int64 sp_offset = offset;
- 
-@@ -9117,9 +9118,7 @@ aarch64_save_callee_saves (poly_int64 start_offset,
-       else if (GP_REGNUM_P (regno)
- 	       && (!offset.is_constant (&const_offset) || const_offset >= 512))
- 	{
--	  gcc_assert (known_eq (start_offset, 0));
--	  poly_int64 fp_offset
--	    = frame.below_hard_fp_saved_regs_size;
-+	  poly_int64 fp_offset = frame.bytes_below_hard_fp - bytes_below_sp;
- 	  if (hard_fp_valid_p)
- 	    base_rtx = hard_frame_pointer_rtx;
- 	  else
-@@ -9183,12 +9182,13 @@ aarch64_save_callee_saves (poly_int64 start_offset,
- }
- 
- /* Emit code to restore the callee registers from register number START
--   up to and including LIMIT.  Restore from the stack offset START_OFFSET,
--   skipping any write-back candidates if SKIP_WB is true.  Write the
--   appropriate REG_CFA_RESTORE notes into CFI_OPS.  */
-+   up to and including LIMIT.  The stack pointer is currently BYTES_BELOW_SP
-+   bytes above the bottom of the static frame.  Skip any write-back
-+   candidates if SKIP_WB is true.  Write the appropriate REG_CFA_RESTORE
-+   notes into CFI_OPS.  */
- 
- static void
--aarch64_restore_callee_saves (poly_int64 start_offset, unsigned start,
-+aarch64_restore_callee_saves (poly_int64 bytes_below_sp, unsigned start,
- 			      unsigned limit, bool skip_wb, rtx *cfi_ops)
- {
-   aarch64_frame &frame = cfun->machine->frame;
-@@ -9214,7 +9214,9 @@ aarch64_restore_callee_saves (poly_int64 start_offset, unsigned start,
- 
-       machine_mode mode = aarch64_reg_save_mode (regno);
-       reg = gen_rtx_REG (mode, regno);
--      offset = start_offset + frame.reg_offset[regno];
-+      offset = (frame.reg_offset[regno]
-+		+ frame.bytes_below_saved_regs
-+		- bytes_below_sp);
-       rtx base_rtx = stack_pointer_rtx;
-       if (mode == VNx2DImode && BYTES_BIG_ENDIAN)
- 	aarch64_adjust_sve_callee_save_base (mode, base_rtx, anchor_reg,
-@@ -9990,8 +9992,6 @@ aarch64_expand_prologue (void)
-   HOST_WIDE_INT callee_adjust = frame.callee_adjust;
-   poly_int64 final_adjust = frame.final_adjust;
-   poly_int64 sve_callee_adjust = frame.sve_callee_adjust;
--  poly_int64 below_hard_fp_saved_regs_size
--    = frame.below_hard_fp_saved_regs_size;
-   unsigned reg1 = frame.wb_push_candidate1;
-   unsigned reg2 = frame.wb_push_candidate2;
-   bool emit_frame_chain = frame.emit_frame_chain;
-@@ -10067,8 +10067,8 @@ aarch64_expand_prologue (void)
- 			     - frame.hard_fp_offset);
-   gcc_assert (known_ge (chain_offset, 0));
- 
--  /* The offset of the bottom of the save area from the current SP.  */
--  poly_int64 saved_regs_offset = chain_offset - below_hard_fp_saved_regs_size;
-+  /* The offset of the current SP from the bottom of the static frame.  */
-+  poly_int64 bytes_below_sp = frame_size - initial_adjust - callee_adjust;
- 
-   if (emit_frame_chain)
-     {
-@@ -10076,7 +10076,7 @@ aarch64_expand_prologue (void)
- 	{
- 	  reg1 = R29_REGNUM;
- 	  reg2 = R30_REGNUM;
--	  aarch64_save_callee_saves (saved_regs_offset, reg1, reg2,
-+	  aarch64_save_callee_saves (bytes_below_sp, reg1, reg2,
- 				     false, false);
- 	}
-       else
-@@ -10116,7 +10116,7 @@ aarch64_expand_prologue (void)
-       emit_insn (gen_stack_tie (stack_pointer_rtx, hard_frame_pointer_rtx));
-     }
- 
--  aarch64_save_callee_saves (saved_regs_offset, R0_REGNUM, R30_REGNUM,
-+  aarch64_save_callee_saves (bytes_below_sp, R0_REGNUM, R30_REGNUM,
- 			     callee_adjust != 0 || emit_frame_chain,
- 			     emit_frame_chain);
-   if (maybe_ne (sve_callee_adjust, 0))
-@@ -10126,16 +10126,17 @@ aarch64_expand_prologue (void)
-       aarch64_allocate_and_probe_stack_space (tmp1_rtx, tmp0_rtx,
- 					      sve_callee_adjust,
- 					      !frame_pointer_needed, false);
--      saved_regs_offset += sve_callee_adjust;
-+      bytes_below_sp -= sve_callee_adjust;
-     }
--  aarch64_save_callee_saves (saved_regs_offset, P0_REGNUM, P15_REGNUM,
-+  aarch64_save_callee_saves (bytes_below_sp, P0_REGNUM, P15_REGNUM,
- 			     false, emit_frame_chain);
--  aarch64_save_callee_saves (saved_regs_offset, V0_REGNUM, V31_REGNUM,
-+  aarch64_save_callee_saves (bytes_below_sp, V0_REGNUM, V31_REGNUM,
- 			     callee_adjust != 0 || emit_frame_chain,
- 			     emit_frame_chain);
- 
-   /* We may need to probe the final adjustment if it is larger than the guard
-      that is assumed by the called.  */
-+  gcc_assert (known_eq (bytes_below_sp, final_adjust));
-   aarch64_allocate_and_probe_stack_space (tmp1_rtx, tmp0_rtx, final_adjust,
- 					  !frame_pointer_needed, true);
- }
-@@ -10170,7 +10171,6 @@ aarch64_expand_epilogue (bool for_sibcall)
-   poly_int64 initial_adjust = frame.initial_adjust;
-   HOST_WIDE_INT callee_adjust = frame.callee_adjust;
-   poly_int64 final_adjust = frame.final_adjust;
--  poly_int64 callee_offset = frame.callee_offset;
-   poly_int64 sve_callee_adjust = frame.sve_callee_adjust;
-   poly_int64 bytes_below_hard_fp = frame.bytes_below_hard_fp;
-   unsigned reg1 = frame.wb_pop_candidate1;
-@@ -10240,9 +10240,9 @@ aarch64_expand_epilogue (bool for_sibcall)
- 
-   /* Restore the vector registers before the predicate registers,
-      so that we can use P4 as a temporary for big-endian SVE frames.  */
--  aarch64_restore_callee_saves (callee_offset, V0_REGNUM, V31_REGNUM,
-+  aarch64_restore_callee_saves (final_adjust, V0_REGNUM, V31_REGNUM,
- 				callee_adjust != 0, &cfi_ops);
--  aarch64_restore_callee_saves (callee_offset, P0_REGNUM, P15_REGNUM,
-+  aarch64_restore_callee_saves (final_adjust, P0_REGNUM, P15_REGNUM,
- 				false, &cfi_ops);
-   if (maybe_ne (sve_callee_adjust, 0))
-     aarch64_add_sp (NULL_RTX, NULL_RTX, sve_callee_adjust, true);
-@@ -10250,7 +10250,7 @@ aarch64_expand_epilogue (bool for_sibcall)
-   /* When shadow call stack is enabled, the scs_pop in the epilogue will
-      restore x30, we don't need to restore x30 again in the traditional
-      way.  */
--  aarch64_restore_callee_saves (callee_offset - sve_callee_adjust,
-+  aarch64_restore_callee_saves (final_adjust + sve_callee_adjust,
- 				R0_REGNUM, last_gpr,
- 				callee_adjust != 0, &cfi_ops);
- 
-diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
-index 4263d29d29d..fd820b1be4e 100644
---- a/gcc/config/aarch64/aarch64.h
-+++ b/gcc/config/aarch64/aarch64.h
-@@ -813,10 +813,6 @@ struct GTY (()) aarch64_frame
-      It is zero when no push is used.  */
-   HOST_WIDE_INT callee_adjust;
- 
--  /* The offset from SP to the callee-save registers after initial_adjust.
--     It may be non-zero if no push is used (ie. callee_adjust == 0).  */
--  poly_int64 callee_offset;
--
-   /* The size of the stack adjustment before saving or after restoring
-      SVE registers.  */
-   poly_int64 sve_callee_adjust;
--- 
-2.39.4
-
-
-From 8ae9181426f2700c2e5a2909487fa630e6fa406b Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:15 +0100
-Subject: [PATCH 07/19] aarch64: Only calculate chain_offset if there is a
- chain
-
-After previous patches, it is no longer necessary to calculate
-a chain_offset in cases where there is no chain record.
-
-gcc/
-	* config/aarch64/aarch64.cc (aarch64_expand_prologue): Move the
-	calculation of chain_offset into the emit_frame_chain block.
----
- gcc/config/aarch64/aarch64.cc | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 46ae5cf7673..0e9b9717c08 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -10062,16 +10062,16 @@ aarch64_expand_prologue (void)
-   if (callee_adjust != 0)
-     aarch64_push_regs (reg1, reg2, callee_adjust);
- 
--  /* The offset of the frame chain record (if any) from the current SP.  */
--  poly_int64 chain_offset = (initial_adjust + callee_adjust
--			     - frame.hard_fp_offset);
--  gcc_assert (known_ge (chain_offset, 0));
--
-   /* The offset of the current SP from the bottom of the static frame.  */
-   poly_int64 bytes_below_sp = frame_size - initial_adjust - callee_adjust;
- 
-   if (emit_frame_chain)
-     {
-+      /* The offset of the frame chain record (if any) from the current SP.  */
-+      poly_int64 chain_offset = (initial_adjust + callee_adjust
-+				 - frame.hard_fp_offset);
-+      gcc_assert (known_ge (chain_offset, 0));
-+
-       if (callee_adjust == 0)
- 	{
- 	  reg1 = R29_REGNUM;
--- 
-2.39.4
-
-
-From 375794feb614cee1f41b710b9cc1b6f25da6c1cb Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:15 +0100
-Subject: [PATCH 08/19] aarch64: Rename locals_offset to bytes_above_locals
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-locals_offset was described as:
-
-  /* Offset from the base of the frame (incomming SP) to the
-     top of the locals area.  This value is always a multiple of
-     STACK_BOUNDARY.  */
-
-This is implicitly an “upside down” view of the frame: the incoming
-SP is at offset 0, and anything N bytes below the incoming SP is at
-offset N (rather than -N).
-
-However, reg_offset instead uses a “right way up” view; that is,
-it views offsets in address terms.  Something above X is at a
-positive offset from X and something below X is at a negative
-offset from X.
-
-Also, even on FRAME_GROWS_DOWNWARD targets like AArch64,
-target-independent code views offsets in address terms too:
-locals are allocated at negative offsets to virtual_stack_vars.
-
-It seems confusing to have *_offset fields of the same structure
-using different polarities like this.  This patch tries to avoid
-that by renaming locals_offset to bytes_above_locals.
-
-gcc/
-	* config/aarch64/aarch64.h (aarch64_frame::locals_offset): Rename to...
-	(aarch64_frame::bytes_above_locals): ...this.
-	* config/aarch64/aarch64.cc (aarch64_layout_frame)
-	(aarch64_initial_elimination_offset): Update accordingly.
----
- gcc/config/aarch64/aarch64.cc | 6 +++---
- gcc/config/aarch64/aarch64.h  | 6 +++---
- 2 files changed, 6 insertions(+), 6 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 0e9b9717c08..0a22f91520e 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8598,7 +8598,7 @@ aarch64_layout_frame (void)
- 			  STACK_BOUNDARY / BITS_PER_UNIT));
-   frame.frame_size = saved_regs_and_above + frame.bytes_below_saved_regs;
- 
--  frame.locals_offset = frame.saved_varargs_size;
-+  frame.bytes_above_locals = frame.saved_varargs_size;
- 
-   frame.initial_adjust = 0;
-   frame.final_adjust = 0;
-@@ -12754,13 +12754,13 @@ aarch64_initial_elimination_offset (unsigned from, unsigned to)
- 	return frame.hard_fp_offset;
- 
-       if (from == FRAME_POINTER_REGNUM)
--	return frame.hard_fp_offset - frame.locals_offset;
-+	return frame.hard_fp_offset - frame.bytes_above_locals;
-     }
- 
-   if (to == STACK_POINTER_REGNUM)
-     {
-       if (from == FRAME_POINTER_REGNUM)
--	return frame.frame_size - frame.locals_offset;
-+	return frame.frame_size - frame.bytes_above_locals;
-     }
- 
-   return frame.frame_size;
-diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
-index fd820b1be4e..7ae12d13e2b 100644
---- a/gcc/config/aarch64/aarch64.h
-+++ b/gcc/config/aarch64/aarch64.h
-@@ -791,10 +791,10 @@ struct GTY (()) aarch64_frame
-      always a multiple of STACK_BOUNDARY.  */
-   poly_int64 bytes_below_hard_fp;
- 
--  /* Offset from the base of the frame (incomming SP) to the
--     top of the locals area.  This value is always a multiple of
-+  /* The number of bytes between the top of the locals area and the top
-+     of the frame (the incomming SP).  This value is always a multiple of
-      STACK_BOUNDARY.  */
--  poly_int64 locals_offset;
-+  poly_int64 bytes_above_locals;
- 
-   /* Offset from the base of the frame (incomming SP) to the
-      hard_frame_pointer.  This value is always a multiple of
--- 
-2.39.4
-
-
-From 1a9ea1c45c75615ffbfabe652b3598a1d7be2168 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:16 +0100
-Subject: [PATCH 09/19] aarch64: Rename hard_fp_offset to bytes_above_hard_fp
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Similarly to the previous locals_offset patch, hard_fp_offset
-was described as:
-
-  /* Offset from the base of the frame (incomming SP) to the
-     hard_frame_pointer.  This value is always a multiple of
-     STACK_BOUNDARY.  */
-  poly_int64 hard_fp_offset;
-
-which again took an “upside-down” view: higher offsets meant lower
-addresses.  This patch renames the field to bytes_above_hard_fp instead.
-
-gcc/
-	* config/aarch64/aarch64.h (aarch64_frame::hard_fp_offset): Rename
-	to...
-	(aarch64_frame::bytes_above_hard_fp): ...this.
-	* config/aarch64/aarch64.cc (aarch64_layout_frame)
-	(aarch64_expand_prologue): Update accordingly.
-	(aarch64_initial_elimination_offset): Likewise.
----
- gcc/config/aarch64/aarch64.cc | 26 +++++++++++++-------------
- gcc/config/aarch64/aarch64.h  |  6 +++---
- 2 files changed, 16 insertions(+), 16 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 0a22f91520e..95499ae49ba 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8590,7 +8590,7 @@ aarch64_layout_frame (void)
- 			   + get_frame_size (),
- 			   STACK_BOUNDARY / BITS_PER_UNIT);
- 
--  frame.hard_fp_offset
-+  frame.bytes_above_hard_fp
-     = saved_regs_and_above - frame.below_hard_fp_saved_regs_size;
- 
-   /* Both these values are already aligned.  */
-@@ -8639,13 +8639,13 @@ aarch64_layout_frame (void)
-   else if (frame.wb_pop_candidate1 != INVALID_REGNUM)
-     max_push_offset = 256;
- 
--  HOST_WIDE_INT const_size, const_below_saved_regs, const_fp_offset;
-+  HOST_WIDE_INT const_size, const_below_saved_regs, const_above_fp;
-   HOST_WIDE_INT const_saved_regs_size;
-   if (known_eq (frame.saved_regs_size, 0))
-     frame.initial_adjust = frame.frame_size;
-   else if (frame.frame_size.is_constant (&const_size)
- 	   && const_size < max_push_offset
--	   && known_eq (frame.hard_fp_offset, const_size))
-+	   && known_eq (frame.bytes_above_hard_fp, const_size))
-     {
-       /* Simple, small frame with no data below the saved registers.
- 
-@@ -8662,8 +8662,8 @@ aarch64_layout_frame (void)
- 	      case that it hardly seems worth the effort though.  */
- 	   && (!saves_below_hard_fp_p || const_below_saved_regs == 0)
- 	   && !(cfun->calls_alloca
--		&& frame.hard_fp_offset.is_constant (&const_fp_offset)
--		&& const_fp_offset < max_push_offset))
-+		&& frame.bytes_above_hard_fp.is_constant (&const_above_fp)
-+		&& const_above_fp < max_push_offset))
-     {
-       /* Frame with small area below the saved registers:
- 
-@@ -8681,12 +8681,12 @@ aarch64_layout_frame (void)
- 	 sub sp, sp, hard_fp_offset + below_hard_fp_saved_regs_size
- 	 save SVE registers relative to SP
- 	 sub sp, sp, bytes_below_saved_regs  */
--      frame.initial_adjust = (frame.hard_fp_offset
-+      frame.initial_adjust = (frame.bytes_above_hard_fp
- 			      + frame.below_hard_fp_saved_regs_size);
-       frame.final_adjust = frame.bytes_below_saved_regs;
-     }
--  else if (frame.hard_fp_offset.is_constant (&const_fp_offset)
--	   && const_fp_offset < max_push_offset)
-+  else if (frame.bytes_above_hard_fp.is_constant (&const_above_fp)
-+	   && const_above_fp < max_push_offset)
-     {
-       /* Frame with large area below the saved registers, or with SVE saves,
- 	 but with a small area above:
-@@ -8696,7 +8696,7 @@ aarch64_layout_frame (void)
- 	 [sub sp, sp, below_hard_fp_saved_regs_size]
- 	 [save SVE registers relative to SP]
- 	 sub sp, sp, bytes_below_saved_regs  */
--      frame.callee_adjust = const_fp_offset;
-+      frame.callee_adjust = const_above_fp;
-       frame.sve_callee_adjust = frame.below_hard_fp_saved_regs_size;
-       frame.final_adjust = frame.bytes_below_saved_regs;
-     }
-@@ -8711,7 +8711,7 @@ aarch64_layout_frame (void)
- 	 [sub sp, sp, below_hard_fp_saved_regs_size]
- 	 [save SVE registers relative to SP]
- 	 sub sp, sp, bytes_below_saved_regs  */
--      frame.initial_adjust = frame.hard_fp_offset;
-+      frame.initial_adjust = frame.bytes_above_hard_fp;
-       frame.sve_callee_adjust = frame.below_hard_fp_saved_regs_size;
-       frame.final_adjust = frame.bytes_below_saved_regs;
-     }
-@@ -10069,7 +10069,7 @@ aarch64_expand_prologue (void)
-     {
-       /* The offset of the frame chain record (if any) from the current SP.  */
-       poly_int64 chain_offset = (initial_adjust + callee_adjust
--				 - frame.hard_fp_offset);
-+				 - frame.bytes_above_hard_fp);
-       gcc_assert (known_ge (chain_offset, 0));
- 
-       if (callee_adjust == 0)
-@@ -12751,10 +12751,10 @@ aarch64_initial_elimination_offset (unsigned from, unsigned to)
-   if (to == HARD_FRAME_POINTER_REGNUM)
-     {
-       if (from == ARG_POINTER_REGNUM)
--	return frame.hard_fp_offset;
-+	return frame.bytes_above_hard_fp;
- 
-       if (from == FRAME_POINTER_REGNUM)
--	return frame.hard_fp_offset - frame.bytes_above_locals;
-+	return frame.bytes_above_hard_fp - frame.bytes_above_locals;
-     }
- 
-   if (to == STACK_POINTER_REGNUM)
-diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
-index 7ae12d13e2b..3808f49e9ca 100644
---- a/gcc/config/aarch64/aarch64.h
-+++ b/gcc/config/aarch64/aarch64.h
-@@ -796,10 +796,10 @@ struct GTY (()) aarch64_frame
-      STACK_BOUNDARY.  */
-   poly_int64 bytes_above_locals;
- 
--  /* Offset from the base of the frame (incomming SP) to the
--     hard_frame_pointer.  This value is always a multiple of
-+  /* The number of bytes between the hard_frame_pointer and the top of
-+     the frame (the incomming SP).  This value is always a multiple of
-      STACK_BOUNDARY.  */
--  poly_int64 hard_fp_offset;
-+  poly_int64 bytes_above_hard_fp;
- 
-   /* The size of the frame.  This value is the offset from base of the
-      frame (incomming SP) to the stack_pointer.  This value is always
--- 
-2.39.4
-
-
-From d202ce1ecf60a36a3e1009917dd76109248ce9be Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:16 +0100
-Subject: [PATCH 10/19] aarch64: Tweak frame_size comment
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This patch fixes another case in which a value was described with
-an “upside-down” view.
-
-gcc/
-	* config/aarch64/aarch64.h (aarch64_frame::frame_size): Tweak comment.
----
- gcc/config/aarch64/aarch64.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
-index 3808f49e9ca..108a5731b0d 100644
---- a/gcc/config/aarch64/aarch64.h
-+++ b/gcc/config/aarch64/aarch64.h
-@@ -801,8 +801,8 @@ struct GTY (()) aarch64_frame
-      STACK_BOUNDARY.  */
-   poly_int64 bytes_above_hard_fp;
- 
--  /* The size of the frame.  This value is the offset from base of the
--     frame (incomming SP) to the stack_pointer.  This value is always
-+  /* The size of the frame, i.e. the number of bytes between the bottom
-+     of the outgoing arguments and the incoming SP.  This value is always
-      a multiple of STACK_BOUNDARY.  */
-   poly_int64 frame_size;
- 
--- 
-2.39.4
-
-
-From f2b585375205b0a1802d79c682ba33766ecd1f0f Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:17 +0100
-Subject: [PATCH 11/19] aarch64: Measure reg_offset from the bottom of the
- frame
-
-reg_offset was measured from the bottom of the saved register area.
-This made perfect sense with the original layout, since the bottom
-of the saved register area was also the hard frame pointer address.
-It became slightly less obvious with SVE, since we save SVE
-registers below the hard frame pointer, but it still made sense.
-
-However, if we want to allow different frame layouts, it's more
-convenient and obvious to measure reg_offset from the bottom of
-the frame.  After previous patches, it's also a slight simplification
-in its own right.
-
-gcc/
-	* config/aarch64/aarch64.h (aarch64_frame): Add comment above
-	reg_offset.
-	* config/aarch64/aarch64.cc (aarch64_layout_frame): Walk offsets
-	from the bottom of the frame, rather than the bottom of the saved
-	register area.  Measure reg_offset from the bottom of the frame
-	rather than the bottom of the saved register area.
-	(aarch64_save_callee_saves): Update accordingly.
-	(aarch64_restore_callee_saves): Likewise.
-	(aarch64_get_separate_components): Likewise.
-	(aarch64_process_components): Likewise.
----
- gcc/config/aarch64/aarch64.cc | 53 ++++++++++++++++-------------------
- gcc/config/aarch64/aarch64.h  |  3 ++
- 2 files changed, 27 insertions(+), 29 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 95499ae49ba..af99807ef8a 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8400,7 +8400,6 @@ aarch64_needs_frame_chain (void)
- static void
- aarch64_layout_frame (void)
- {
--  poly_int64 offset = 0;
-   int regno, last_fp_reg = INVALID_REGNUM;
-   machine_mode vector_save_mode = aarch64_reg_save_mode (V8_REGNUM);
-   poly_int64 vector_save_size = GET_MODE_SIZE (vector_save_mode);
-@@ -8478,7 +8477,9 @@ aarch64_layout_frame (void)
-   gcc_assert (crtl->is_leaf
- 	      || maybe_ne (frame.reg_offset[R30_REGNUM], SLOT_NOT_REQUIRED));
- 
--  frame.bytes_below_saved_regs = crtl->outgoing_args_size;
-+  poly_int64 offset = crtl->outgoing_args_size;
-+  gcc_assert (multiple_p (offset, STACK_BOUNDARY / BITS_PER_UNIT));
-+  frame.bytes_below_saved_regs = offset;
- 
-   /* Now assign stack slots for the registers.  Start with the predicate
-      registers, since predicate LDR and STR have a relatively small
-@@ -8490,7 +8491,8 @@ aarch64_layout_frame (void)
- 	offset += BYTES_PER_SVE_PRED;
-       }
- 
--  if (maybe_ne (offset, 0))
-+  poly_int64 saved_prs_size = offset - frame.bytes_below_saved_regs;
-+  if (maybe_ne (saved_prs_size, 0))
-     {
-       /* If we have any vector registers to save above the predicate registers,
- 	 the offset of the vector register save slots need to be a multiple
-@@ -8508,10 +8510,10 @@ aarch64_layout_frame (void)
- 	offset = aligned_upper_bound (offset, STACK_BOUNDARY / BITS_PER_UNIT);
-       else
- 	{
--	  if (known_le (offset, vector_save_size))
--	    offset = vector_save_size;
--	  else if (known_le (offset, vector_save_size * 2))
--	    offset = vector_save_size * 2;
-+	  if (known_le (saved_prs_size, vector_save_size))
-+	    offset = frame.bytes_below_saved_regs + vector_save_size;
-+	  else if (known_le (saved_prs_size, vector_save_size * 2))
-+	    offset = frame.bytes_below_saved_regs + vector_save_size * 2;
- 	  else
- 	    gcc_unreachable ();
- 	}
-@@ -8528,9 +8530,10 @@ aarch64_layout_frame (void)
- 
-   /* OFFSET is now the offset of the hard frame pointer from the bottom
-      of the callee save area.  */
--  bool saves_below_hard_fp_p = maybe_ne (offset, 0);
--  frame.below_hard_fp_saved_regs_size = offset;
--  frame.bytes_below_hard_fp = offset + frame.bytes_below_saved_regs;
-+  frame.below_hard_fp_saved_regs_size = offset - frame.bytes_below_saved_regs;
-+  bool saves_below_hard_fp_p
-+    = maybe_ne (frame.below_hard_fp_saved_regs_size, 0);
-+  frame.bytes_below_hard_fp = offset;
-   if (frame.emit_frame_chain)
-     {
-       /* FP and LR are placed in the linkage record.  */
-@@ -8581,9 +8584,10 @@ aarch64_layout_frame (void)
- 
-   offset = aligned_upper_bound (offset, STACK_BOUNDARY / BITS_PER_UNIT);
- 
--  frame.saved_regs_size = offset;
-+  frame.saved_regs_size = offset - frame.bytes_below_saved_regs;
- 
--  poly_int64 varargs_and_saved_regs_size = offset + frame.saved_varargs_size;
-+  poly_int64 varargs_and_saved_regs_size
-+    = frame.saved_regs_size + frame.saved_varargs_size;
- 
-   poly_int64 saved_regs_and_above
-     = aligned_upper_bound (varargs_and_saved_regs_size
-@@ -9105,9 +9109,7 @@ aarch64_save_callee_saves (poly_int64 bytes_below_sp,
- 
-       machine_mode mode = aarch64_reg_save_mode (regno);
-       reg = gen_rtx_REG (mode, regno);
--      offset = (frame.reg_offset[regno]
--		+ frame.bytes_below_saved_regs
--		- bytes_below_sp);
-+      offset = frame.reg_offset[regno] - bytes_below_sp;
-       rtx base_rtx = stack_pointer_rtx;
-       poly_int64 sp_offset = offset;
- 
-@@ -9214,9 +9216,7 @@ aarch64_restore_callee_saves (poly_int64 bytes_below_sp, unsigned start,
- 
-       machine_mode mode = aarch64_reg_save_mode (regno);
-       reg = gen_rtx_REG (mode, regno);
--      offset = (frame.reg_offset[regno]
--		+ frame.bytes_below_saved_regs
--		- bytes_below_sp);
-+      offset = frame.reg_offset[regno] - bytes_below_sp;
-       rtx base_rtx = stack_pointer_rtx;
-       if (mode == VNx2DImode && BYTES_BIG_ENDIAN)
- 	aarch64_adjust_sve_callee_save_base (mode, base_rtx, anchor_reg,
-@@ -9355,14 +9355,12 @@ aarch64_get_separate_components (void)
- 	   it as a stack probe for -fstack-clash-protection.  */
- 	if (flag_stack_clash_protection
- 	    && maybe_ne (frame.below_hard_fp_saved_regs_size, 0)
--	    && known_eq (offset, 0))
-+	    && known_eq (offset, frame.bytes_below_saved_regs))
- 	  continue;
- 
- 	/* Get the offset relative to the register we'll use.  */
- 	if (frame_pointer_needed)
--	  offset -= frame.below_hard_fp_saved_regs_size;
--	else
--	  offset += frame.bytes_below_saved_regs;
-+	  offset -= frame.bytes_below_hard_fp;
- 
- 	/* Check that we can access the stack slot of the register with one
- 	   direct load with no adjustments needed.  */
-@@ -9509,9 +9507,7 @@ aarch64_process_components (sbitmap components, bool prologue_p)
-       rtx reg = gen_rtx_REG (mode, regno);
-       poly_int64 offset = frame.reg_offset[regno];
-       if (frame_pointer_needed)
--	offset -= frame.below_hard_fp_saved_regs_size;
--      else
--	offset += frame.bytes_below_saved_regs;
-+	offset -= frame.bytes_below_hard_fp;
- 
-       rtx addr = plus_constant (Pmode, ptr_reg, offset);
-       rtx mem = gen_frame_mem (mode, addr);
-@@ -9563,9 +9559,7 @@ aarch64_process_components (sbitmap components, bool prologue_p)
-       /* REGNO2 can be saved/restored in a pair with REGNO.  */
-       rtx reg2 = gen_rtx_REG (mode, regno2);
-       if (frame_pointer_needed)
--	offset2 -= frame.below_hard_fp_saved_regs_size;
--      else
--	offset2 += frame.bytes_below_saved_regs;
-+	offset2 -= frame.bytes_below_hard_fp;
-       rtx addr2 = plus_constant (Pmode, ptr_reg, offset2);
-       rtx mem2 = gen_frame_mem (mode, addr2);
-       rtx set2 = prologue_p ? gen_rtx_SET (mem2, reg2)
-@@ -9681,7 +9675,8 @@ aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
-   if (final_adjustment_p
-       && known_eq (frame.below_hard_fp_saved_regs_size, 0))
-     {
--      poly_int64 lr_offset = frame.reg_offset[LR_REGNUM];
-+      poly_int64 lr_offset = (frame.reg_offset[LR_REGNUM]
-+			      - frame.bytes_below_saved_regs);
-       if (known_ge (lr_offset, 0))
- 	min_probe_threshold -= lr_offset.to_constant ();
-       else
-diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
-index 108a5731b0d..c8becb098c8 100644
---- a/gcc/config/aarch64/aarch64.h
-+++ b/gcc/config/aarch64/aarch64.h
-@@ -766,6 +766,9 @@ extern enum aarch64_processor aarch64_tune;
- #ifdef HAVE_POLY_INT_H
- struct GTY (()) aarch64_frame
- {
-+  /* The offset from the bottom of the static frame (the bottom of the
-+     outgoing arguments) of each register save slot, or -2 if no save is
-+     needed.  */
-   poly_int64 reg_offset[LAST_SAVED_REGNUM + 1];
- 
-   /* The number of extra stack bytes taken up by register varargs.
--- 
-2.39.4
-
-
-From 79faabda181d0d9fd29a3cf5726ba65bdee945b5 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:17 +0100
-Subject: [PATCH 12/19] aarch64: Simplify top of frame allocation
-
-After previous patches, it no longer really makes sense to allocate
-the top of the frame in terms of varargs_and_saved_regs_size and
-saved_regs_and_above.
-
-gcc/
-	* config/aarch64/aarch64.cc (aarch64_layout_frame): Simplify
-	the allocation of the top of the frame.
----
- gcc/config/aarch64/aarch64.cc | 23 ++++++++---------------
- 1 file changed, 8 insertions(+), 15 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index af99807ef8a..31b00094c2a 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8586,23 +8586,16 @@ aarch64_layout_frame (void)
- 
-   frame.saved_regs_size = offset - frame.bytes_below_saved_regs;
- 
--  poly_int64 varargs_and_saved_regs_size
--    = frame.saved_regs_size + frame.saved_varargs_size;
--
--  poly_int64 saved_regs_and_above
--    = aligned_upper_bound (varargs_and_saved_regs_size
--			   + get_frame_size (),
--			   STACK_BOUNDARY / BITS_PER_UNIT);
--
--  frame.bytes_above_hard_fp
--    = saved_regs_and_above - frame.below_hard_fp_saved_regs_size;
-+  offset += get_frame_size ();
-+  offset = aligned_upper_bound (offset, STACK_BOUNDARY / BITS_PER_UNIT);
-+  auto top_of_locals = offset;
- 
--  /* Both these values are already aligned.  */
--  gcc_assert (multiple_p (frame.bytes_below_saved_regs,
--			  STACK_BOUNDARY / BITS_PER_UNIT));
--  frame.frame_size = saved_regs_and_above + frame.bytes_below_saved_regs;
-+  offset += frame.saved_varargs_size;
-+  gcc_assert (multiple_p (offset, STACK_BOUNDARY / BITS_PER_UNIT));
-+  frame.frame_size = offset;
- 
--  frame.bytes_above_locals = frame.saved_varargs_size;
-+  frame.bytes_above_hard_fp = frame.frame_size - frame.bytes_below_hard_fp;
-+  frame.bytes_above_locals = frame.frame_size - top_of_locals;
- 
-   frame.initial_adjust = 0;
-   frame.final_adjust = 0;
--- 
-2.39.4
-
-
-From 4e62049e403b141e6f916176160dac8cbd65fe47 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:18 +0100
-Subject: [PATCH 13/19] aarch64: Minor initial adjustment tweak
-
-This patch just changes a calculation of initial_adjust
-to one that makes it slightly more obvious that the total
-adjustment is frame.frame_size.
-
-gcc/
-	* config/aarch64/aarch64.cc (aarch64_layout_frame): Tweak
-	calculation of initial_adjust for frames in which all saves
-	are SVE saves.
----
- gcc/config/aarch64/aarch64.cc | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 31b00094c2a..1aa79da0673 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8675,11 +8675,10 @@ aarch64_layout_frame (void)
-     {
-       /* Frame in which all saves are SVE saves:
- 
--	 sub sp, sp, hard_fp_offset + below_hard_fp_saved_regs_size
-+	 sub sp, sp, frame_size - bytes_below_saved_regs
- 	 save SVE registers relative to SP
- 	 sub sp, sp, bytes_below_saved_regs  */
--      frame.initial_adjust = (frame.bytes_above_hard_fp
--			      + frame.below_hard_fp_saved_regs_size);
-+      frame.initial_adjust = frame.frame_size - frame.bytes_below_saved_regs;
-       frame.final_adjust = frame.bytes_below_saved_regs;
-     }
-   else if (frame.bytes_above_hard_fp.is_constant (&const_above_fp)
--- 
-2.39.4
-
-
-From aaa1a0a5912d9e5d571e5f1c6f09ceac99544ab5 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:18 +0100
-Subject: [PATCH 14/19] aarch64: Tweak stack clash boundary condition
-
-The AArch64 ABI says that, when stack clash protection is used,
-there can be a maximum of 1KiB of unprobed space at sp on entry
-to a function.  Therefore, we need to probe when allocating
->= guard_size - 1KiB of data (>= rather than >).  This is what
-GCC does.
-
-If an allocation is exactly guard_size bytes, it is enough to allocate
-those bytes and probe once at offset 1024.  It isn't possible to use a
-single probe at any other offset: higher would conmplicate later code,
-by leaving more unprobed space than usual, while lower would risk
-leaving an entire page unprobed.  For simplicity, the code probes all
-allocations at offset 1024.
-
-Some register saves also act as probes.  If we need to allocate
-more space below the last such register save probe, we need to
-probe the allocation if it is > 1KiB.  Again, this allocation is
-then sometimes (but not always) probed at offset 1024.  This sort of
-allocation is currently only used for outgoing arguments, which are
-rarely this big.
-
-However, the code also probed if this final outgoing-arguments
-allocation was == 1KiB, rather than just > 1KiB.  This isn't
-necessary, since the register save then probes at offset 1024
-as required.  Continuing to probe allocations of exactly 1KiB
-would complicate later patches.
-
-gcc/
-	* config/aarch64/aarch64.cc (aarch64_allocate_and_probe_stack_space):
-	Don't probe final allocations that are exactly 1KiB in size (after
-	unprobed space above the final allocation has been deducted).
-
-gcc/testsuite/
-	* gcc.target/aarch64/stack-check-prologue-17.c: New test.
----
- gcc/config/aarch64/aarch64.cc                 |  4 +-
- .../aarch64/stack-check-prologue-17.c         | 55 +++++++++++++++++++
- 2 files changed, 58 insertions(+), 1 deletion(-)
- create mode 100644 gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 1aa79da0673..5cad847977a 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -9648,9 +9648,11 @@ aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
-   HOST_WIDE_INT guard_size
-     = 1 << param_stack_clash_protection_guard_size;
-   HOST_WIDE_INT guard_used_by_caller = STACK_CLASH_CALLER_GUARD;
-+  HOST_WIDE_INT byte_sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
-+  gcc_assert (multiple_p (poly_size, byte_sp_alignment));
-   HOST_WIDE_INT min_probe_threshold
-     = (final_adjustment_p
--       ? guard_used_by_caller
-+       ? guard_used_by_caller + byte_sp_alignment
-        : guard_size - guard_used_by_caller);
-   /* When doing the final adjustment for the outgoing arguments, take into
-      account any unprobed space there is above the current SP.  There are
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c
-new file mode 100644
-index 00000000000..0d8a25d73a2
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c
-@@ -0,0 +1,55 @@
-+/* { dg-options "-O2 -fstack-clash-protection -fomit-frame-pointer --param stack-clash-protection-guard-size=12" } */
-+/* { dg-final { check-function-bodies "**" "" } } */
-+
-+void f(int, ...);
-+void g();
-+
-+/*
-+** test1:
-+**	...
-+**	str	x30, \[sp\]
-+**	sub	sp, sp, #1024
-+**	cbnz	w0, .*
-+**	bl	g
-+**	...
-+*/
-+int test1(int z) {
-+  __uint128_t x = 0;
-+  int y[0x400];
-+  if (z)
-+    {
-+      f(0, 0, 0, 0, 0, 0, 0, &y,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x);
-+    }
-+  g();
-+  return 1;
-+}
-+
-+/*
-+** test2:
-+**	...
-+**	str	x30, \[sp\]
-+**	sub	sp, sp, #1040
-+**	str	xzr, \[sp\]
-+**	cbnz	w0, .*
-+**	bl	g
-+**	...
-+*/
-+int test2(int z) {
-+  __uint128_t x = 0;
-+  int y[0x400];
-+  if (z)
-+    {
-+      f(0, 0, 0, 0, 0, 0, 0, &y,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x);
-+    }
-+  g();
-+  return 1;
-+}
--- 
-2.39.4
-
-
-From 8433953434a7b58c0923140d39eb3c5988c1d097 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:19 +0100
-Subject: [PATCH 15/19] aarch64: Put LR save probe in first 16 bytes
-
--fstack-clash-protection uses the save of LR as a probe for the next
-allocation.  The next allocation could be:
-
-* another part of the static frame, e.g. when allocating SVE save slots
-  or outgoing arguments
-
-* an alloca in the same function
-
-* an allocation made by a callee function
-
-However, when -fomit-frame-pointer is used, the LR save slot is placed
-above the other GPR save slots.  It could therefore be up to 80 bytes
-above the base of the GPR save area (which is also the hard fp address).
-
-aarch64_allocate_and_probe_stack_space took this into account when
-deciding how much subsequent space could be allocated without needing
-a probe.  However, it interacted badly with:
-
-      /* If doing a small final adjustment, we always probe at offset 0.
-	 This is done to avoid issues when LR is not at position 0 or when
-	 the final adjustment is smaller than the probing offset.  */
-      else if (final_adjustment_p && rounded_size == 0)
-	residual_probe_offset = 0;
-
-which forces any allocation that is smaller than the guard page size
-to be probed at offset 0 rather than the usual offset 1024.  It was
-therefore possible to construct cases in which we had:
-
-* a probe using LR at SP + 80 bytes (or some other value >= 16)
-* an allocation of the guard page size - 16 bytes
-* a probe at SP + 0
-
-which allocates guard page size + 64 consecutive unprobed bytes.
-
-This patch requires the LR probe to be in the first 16 bytes of the
-save area when stack clash protection is active.  Doing it
-unconditionally would cause code-quality regressions.
-
-Putting LR before other registers prevents push/pop allocation
-when shadow call stacks are enabled, since LR is restored
-separately from the other callee-saved registers.
-
-The new comment doesn't say that the probe register is required
-to be LR, since a later patch removes that restriction.
-
-gcc/
-	* config/aarch64/aarch64.cc (aarch64_layout_frame): Ensure that
-	the LR save slot is in the first 16 bytes of the register save area.
-	Only form STP/LDP push/pop candidates if both registers are valid.
-	(aarch64_allocate_and_probe_stack_space): Remove workaround for
-	when LR was not in the first 16 bytes.
-
-gcc/testsuite/
-	* gcc.target/aarch64/stack-check-prologue-18.c: New test.
-	* gcc.target/aarch64/stack-check-prologue-19.c: Likewise.
-	* gcc.target/aarch64/stack-check-prologue-20.c: Likewise.
----
- gcc/config/aarch64/aarch64.cc                 |  72 ++++++-------
- .../aarch64/stack-check-prologue-18.c         | 100 ++++++++++++++++++
- .../aarch64/stack-check-prologue-19.c         | 100 ++++++++++++++++++
- .../aarch64/stack-check-prologue-20.c         |   3 +
- 4 files changed, 233 insertions(+), 42 deletions(-)
- create mode 100644 gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c
- create mode 100644 gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
- create mode 100644 gcc/testsuite/gcc.target/aarch64/stack-check-prologue-20.c
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 5cad847977a..a765f92329d 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8534,26 +8534,34 @@ aarch64_layout_frame (void)
-   bool saves_below_hard_fp_p
-     = maybe_ne (frame.below_hard_fp_saved_regs_size, 0);
-   frame.bytes_below_hard_fp = offset;
-+
-+  auto allocate_gpr_slot = [&](unsigned int regno)
-+    {
-+      frame.reg_offset[regno] = offset;
-+      if (frame.wb_push_candidate1 == INVALID_REGNUM)
-+	frame.wb_push_candidate1 = regno;
-+      else if (frame.wb_push_candidate2 == INVALID_REGNUM)
-+	frame.wb_push_candidate2 = regno;
-+      offset += UNITS_PER_WORD;
-+    };
-+
-   if (frame.emit_frame_chain)
-     {
-       /* FP and LR are placed in the linkage record.  */
--      frame.reg_offset[R29_REGNUM] = offset;
--      frame.wb_push_candidate1 = R29_REGNUM;
--      frame.reg_offset[R30_REGNUM] = offset + UNITS_PER_WORD;
--      frame.wb_push_candidate2 = R30_REGNUM;
--      offset += 2 * UNITS_PER_WORD;
-+      allocate_gpr_slot (R29_REGNUM);
-+      allocate_gpr_slot (R30_REGNUM);
-     }
-+  else if (flag_stack_clash_protection
-+	   && known_eq (frame.reg_offset[R30_REGNUM], SLOT_REQUIRED))
-+    /* Put the LR save slot first, since it makes a good choice of probe
-+       for stack clash purposes.  The idea is that the link register usually
-+       has to be saved before a call anyway, and so we lose little by
-+       stopping it from being individually shrink-wrapped.  */
-+    allocate_gpr_slot (R30_REGNUM);
- 
-   for (regno = R0_REGNUM; regno <= R30_REGNUM; regno++)
-     if (known_eq (frame.reg_offset[regno], SLOT_REQUIRED))
--      {
--	frame.reg_offset[regno] = offset;
--	if (frame.wb_push_candidate1 == INVALID_REGNUM)
--	  frame.wb_push_candidate1 = regno;
--	else if (frame.wb_push_candidate2 == INVALID_REGNUM)
--	  frame.wb_push_candidate2 = regno;
--	offset += UNITS_PER_WORD;
--      }
-+      allocate_gpr_slot (regno);
- 
-   poly_int64 max_int_offset = offset;
-   offset = aligned_upper_bound (offset, STACK_BOUNDARY / BITS_PER_UNIT);
-@@ -8631,10 +8639,13 @@ aarch64_layout_frame (void)
-      max_push_offset to 0, because no registers are popped at this time,
-      so callee_adjust cannot be adjusted.  */
-   HOST_WIDE_INT max_push_offset = 0;
--  if (frame.wb_pop_candidate2 != INVALID_REGNUM)
--    max_push_offset = 512;
--  else if (frame.wb_pop_candidate1 != INVALID_REGNUM)
--    max_push_offset = 256;
-+  if (frame.wb_pop_candidate1 != INVALID_REGNUM)
-+    {
-+      if (frame.wb_pop_candidate2 != INVALID_REGNUM)
-+	max_push_offset = 512;
-+      else
-+	max_push_offset = 256;
-+    }
- 
-   HOST_WIDE_INT const_size, const_below_saved_regs, const_above_fp;
-   HOST_WIDE_INT const_saved_regs_size;
-@@ -9654,29 +9665,6 @@ aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
-     = (final_adjustment_p
-        ? guard_used_by_caller + byte_sp_alignment
-        : guard_size - guard_used_by_caller);
--  /* When doing the final adjustment for the outgoing arguments, take into
--     account any unprobed space there is above the current SP.  There are
--     two cases:
--
--     - When saving SVE registers below the hard frame pointer, we force
--       the lowest save to take place in the prologue before doing the final
--       adjustment (i.e. we don't allow the save to be shrink-wrapped).
--       This acts as a probe at SP, so there is no unprobed space.
--
--     - When there are no SVE register saves, we use the store of the link
--       register as a probe.  We can't assume that LR was saved at position 0
--       though, so treat any space below it as unprobed.  */
--  if (final_adjustment_p
--      && known_eq (frame.below_hard_fp_saved_regs_size, 0))
--    {
--      poly_int64 lr_offset = (frame.reg_offset[LR_REGNUM]
--			      - frame.bytes_below_saved_regs);
--      if (known_ge (lr_offset, 0))
--	min_probe_threshold -= lr_offset.to_constant ();
--      else
--	gcc_assert (!flag_stack_clash_protection || known_eq (poly_size, 0));
--    }
--
-   poly_int64 frame_size = frame.frame_size;
- 
-   /* We should always have a positive probe threshold.  */
-@@ -9856,8 +9844,8 @@ aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
-       if (final_adjustment_p && rounded_size != 0)
- 	min_probe_threshold = 0;
-       /* If doing a small final adjustment, we always probe at offset 0.
--	 This is done to avoid issues when LR is not at position 0 or when
--	 the final adjustment is smaller than the probing offset.  */
-+	 This is done to avoid issues when the final adjustment is smaller
-+	 than the probing offset.  */
-       else if (final_adjustment_p && rounded_size == 0)
- 	residual_probe_offset = 0;
- 
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c
-new file mode 100644
-index 00000000000..82447d20fff
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c
-@@ -0,0 +1,100 @@
-+/* { dg-options "-O2 -fstack-clash-protection -fomit-frame-pointer --param stack-clash-protection-guard-size=12" } */
-+/* { dg-final { check-function-bodies "**" "" } } */
-+
-+void f(int, ...);
-+void g();
-+
-+/*
-+** test1:
-+**	...
-+**	str	x30, \[sp\]
-+**	sub	sp, sp, #4064
-+**	str	xzr, \[sp\]
-+**	cbnz	w0, .*
-+**	bl	g
-+**	...
-+**	str	x26, \[sp, #?4128\]
-+**	...
-+*/
-+int test1(int z) {
-+  __uint128_t x = 0;
-+  int y[0x400];
-+  if (z)
-+    {
-+      asm volatile ("" :::
-+		    "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26");
-+      f(0, 0, 0, 0, 0, 0, 0, &y,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x);
-+    }
-+  g();
-+  return 1;
-+}
-+
-+/*
-+** test2:
-+**	...
-+**	str	x30, \[sp\]
-+**	sub	sp, sp, #1040
-+**	str	xzr, \[sp\]
-+**	cbnz	w0, .*
-+**	bl	g
-+**	...
-+*/
-+int test2(int z) {
-+  __uint128_t x = 0;
-+  int y[0x400];
-+  if (z)
-+    {
-+      asm volatile ("" :::
-+		    "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26");
-+      f(0, 0, 0, 0, 0, 0, 0, &y,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x);
-+    }
-+  g();
-+  return 1;
-+}
-+
-+/*
-+** test3:
-+**	...
-+**	str	x30, \[sp\]
-+**	sub	sp, sp, #1024
-+**	cbnz	w0, .*
-+**	bl	g
-+**	...
-+*/
-+int test3(int z) {
-+  __uint128_t x = 0;
-+  int y[0x400];
-+  if (z)
-+    {
-+      asm volatile ("" :::
-+		    "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26");
-+      f(0, 0, 0, 0, 0, 0, 0, &y,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x);
-+    }
-+  g();
-+  return 1;
-+}
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
-new file mode 100644
-index 00000000000..73ac3e4e4eb
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
-@@ -0,0 +1,100 @@
-+/* { dg-options "-O2 -fstack-clash-protection -fomit-frame-pointer --param stack-clash-protection-guard-size=12 -fsanitize=shadow-call-stack -ffixed-x18" } */
-+/* { dg-final { check-function-bodies "**" "" } } */
-+
-+void f(int, ...);
-+void g();
-+
-+/*
-+** test1:
-+**	...
-+**	str	x30, \[sp\]
-+**	sub	sp, sp, #4064
-+**	str	xzr, \[sp\]
-+**	cbnz	w0, .*
-+**	bl	g
-+**	...
-+**	str	x26, \[sp, #?4128\]
-+**	...
-+*/
-+int test1(int z) {
-+  __uint128_t x = 0;
-+  int y[0x400];
-+  if (z)
-+    {
-+      asm volatile ("" :::
-+		    "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26");
-+      f(0, 0, 0, 0, 0, 0, 0, &y,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x);
-+    }
-+  g();
-+  return 1;
-+}
-+
-+/*
-+** test2:
-+**	...
-+**	str	x30, \[sp\]
-+**	sub	sp, sp, #1040
-+**	str	xzr, \[sp\]
-+**	cbnz	w0, .*
-+**	bl	g
-+**	...
-+*/
-+int test2(int z) {
-+  __uint128_t x = 0;
-+  int y[0x400];
-+  if (z)
-+    {
-+      asm volatile ("" :::
-+		    "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26");
-+      f(0, 0, 0, 0, 0, 0, 0, &y,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x);
-+    }
-+  g();
-+  return 1;
-+}
-+
-+/*
-+** test3:
-+**	...
-+**	str	x30, \[sp\]
-+**	sub	sp, sp, #1024
-+**	cbnz	w0, .*
-+**	bl	g
-+**	...
-+*/
-+int test3(int z) {
-+  __uint128_t x = 0;
-+  int y[0x400];
-+  if (z)
-+    {
-+      asm volatile ("" :::
-+		    "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26");
-+      f(0, 0, 0, 0, 0, 0, 0, &y,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,
-+	x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x);
-+    }
-+  g();
-+  return 1;
-+}
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-20.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-20.c
-new file mode 100644
-index 00000000000..690aae8dfd5
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-20.c
-@@ -0,0 +1,3 @@
-+/* { dg-options "-O2 -fstack-protector-all -fstack-clash-protection -fomit-frame-pointer --param stack-clash-protection-guard-size=12 -fsanitize=shadow-call-stack -ffixed-x18" } */
-+
-+#include "stack-check-prologue-19.c"
--- 
-2.39.4
-
-
-From eea1759073e09dd1aefbc9a881601ab1eebfdd18 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:19 +0100
-Subject: [PATCH 16/19] aarch64: Simplify probe of final frame allocation
-
-Previous patches ensured that the final frame allocation only needs
-a probe when the size is strictly greater than 1KiB.  It's therefore
-safe to use the normal 1024 probe offset in all cases.
-
-The main motivation for doing this is to simplify the code and
-remove the number of special cases.
-
-gcc/
-	* config/aarch64/aarch64.cc (aarch64_allocate_and_probe_stack_space):
-	Always probe the residual allocation at offset 1024, asserting
-	that that is in range.
-
-gcc/testsuite/
-	* gcc.target/aarch64/stack-check-prologue-17.c: Expect the probe
-	to be at offset 1024 rather than offset 0.
-	* gcc.target/aarch64/stack-check-prologue-18.c: Likewise.
-	* gcc.target/aarch64/stack-check-prologue-19.c: Likewise.
----
- gcc/config/aarch64/aarch64.cc                        | 12 ++++--------
- .../gcc.target/aarch64/stack-check-prologue-17.c     |  2 +-
- .../gcc.target/aarch64/stack-check-prologue-18.c     |  4 ++--
- .../gcc.target/aarch64/stack-check-prologue-19.c     |  4 ++--
- 4 files changed, 9 insertions(+), 13 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index a765f92329d..37809a306f7 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -9838,16 +9838,12 @@ aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
-      are still safe.  */
-   if (residual)
-     {
--      HOST_WIDE_INT residual_probe_offset = guard_used_by_caller;
-+      gcc_assert (guard_used_by_caller + byte_sp_alignment <= size);
-+
-       /* If we're doing final adjustments, and we've done any full page
- 	 allocations then any residual needs to be probed.  */
-       if (final_adjustment_p && rounded_size != 0)
- 	min_probe_threshold = 0;
--      /* If doing a small final adjustment, we always probe at offset 0.
--	 This is done to avoid issues when the final adjustment is smaller
--	 than the probing offset.  */
--      else if (final_adjustment_p && rounded_size == 0)
--	residual_probe_offset = 0;
- 
-       aarch64_sub_sp (temp1, temp2, residual, frame_related_p);
-       if (residual >= min_probe_threshold)
-@@ -9858,8 +9854,8 @@ aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
- 		     HOST_WIDE_INT_PRINT_DEC " bytes, probing will be required."
- 		     "\n", residual);
- 
--	    emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
--					     residual_probe_offset));
-+	  emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
-+					   guard_used_by_caller));
- 	  emit_insn (gen_blockage ());
- 	}
-     }
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c
-index 0d8a25d73a2..f0ec1389771 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c
-@@ -33,7 +33,7 @@ int test1(int z) {
- **	...
- **	str	x30, \[sp\]
- **	sub	sp, sp, #1040
--**	str	xzr, \[sp\]
-+**	str	xzr, \[sp, #?1024\]
- **	cbnz	w0, .*
- **	bl	g
- **	...
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c
-index 82447d20fff..6383bec5ebc 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c
-@@ -9,7 +9,7 @@ void g();
- **	...
- **	str	x30, \[sp\]
- **	sub	sp, sp, #4064
--**	str	xzr, \[sp\]
-+**	str	xzr, \[sp, #?1024\]
- **	cbnz	w0, .*
- **	bl	g
- **	...
-@@ -50,7 +50,7 @@ int test1(int z) {
- **	...
- **	str	x30, \[sp\]
- **	sub	sp, sp, #1040
--**	str	xzr, \[sp\]
-+**	str	xzr, \[sp, #?1024\]
- **	cbnz	w0, .*
- **	bl	g
- **	...
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
-index 73ac3e4e4eb..562039b5e9b 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
-@@ -9,7 +9,7 @@ void g();
- **	...
- **	str	x30, \[sp\]
- **	sub	sp, sp, #4064
--**	str	xzr, \[sp\]
-+**	str	xzr, \[sp, #?1024\]
- **	cbnz	w0, .*
- **	bl	g
- **	...
-@@ -50,7 +50,7 @@ int test1(int z) {
- **	...
- **	str	x30, \[sp\]
- **	sub	sp, sp, #1040
--**	str	xzr, \[sp\]
-+**	str	xzr, \[sp, #?1024\]
- **	cbnz	w0, .*
- **	bl	g
- **	...
--- 
-2.39.4
-
-
-From 96d85187c3b9c9a7efc2fd698c3d452e80d8aa47 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:20 +0100
-Subject: [PATCH 17/19] aarch64: Explicitly record probe registers in frame
- info
-
-The stack frame is currently divided into three areas:
-
-A: the area above the hard frame pointer
-B: the SVE saves below the hard frame pointer
-C: the outgoing arguments
-
-If the stack frame is allocated in one chunk, the allocation needs a
-probe if the frame size is >= guard_size - 1KiB.  In addition, if the
-function is not a leaf function, it must probe an address no more than
-1KiB above the outgoing SP.  We ensured the second condition by
-
-(1) using single-chunk allocations for non-leaf functions only if
-    the link register save slot is within 512 bytes of the bottom
-    of the frame; and
-
-(2) using the link register save as a probe (meaning, for instance,
-    that it can't be individually shrink wrapped)
-
-If instead the stack is allocated in multiple chunks, then:
-
-* an allocation involving only the outgoing arguments (C above) requires
-  a probe if the allocation size is > 1KiB
-
-* any other allocation requires a probe if the allocation size
-  is >= guard_size - 1KiB
-
-* second and subsequent allocations require the previous allocation
-  to probe at the bottom of the allocated area, regardless of the size
-  of that previous allocation
-
-The final point means that, unlike for single allocations,
-it can be necessary to have both a non-SVE register probe and
-an SVE register probe.  For example:
-
-* allocate A, probe using a non-SVE register save
-* allocate B, probe using an SVE register save
-* allocate C
-
-The non-SVE register used in this case was again the link register.
-It was previously used even if the link register save slot was some
-bytes above the bottom of the non-SVE register saves, but an earlier
-patch avoided that by putting the link register save slot first.
-
-As a belt-and-braces fix, this patch explicitly records which
-probe registers we're using and allows the non-SVE probe to be
-whichever register comes first (as for SVE).
-
-The patch also avoids unnecessary probes in sve/pcs/stack_clash_3.c.
-
-gcc/
-	* config/aarch64/aarch64.h (aarch64_frame::sve_save_and_probe)
-	(aarch64_frame::hard_fp_save_and_probe): New fields.
-	* config/aarch64/aarch64.cc (aarch64_layout_frame): Initialize them.
-	Rather than asserting that a leaf function saves LR, instead assert
-	that a leaf function saves something.
-	(aarch64_get_separate_components): Prevent the chosen probe
-	registers from being individually shrink-wrapped.
-	(aarch64_allocate_and_probe_stack_space): Remove workaround for
-	probe registers that aren't at the bottom of the previous allocation.
-
-gcc/testsuite/
-	* gcc.target/aarch64/sve/pcs/stack_clash_3.c: Avoid redundant probes.
----
- gcc/config/aarch64/aarch64.cc                 | 68 +++++++++++++++----
- gcc/config/aarch64/aarch64.h                  |  8 +++
- .../aarch64/sve/pcs/stack_clash_3.c           |  6 +-
- 3 files changed, 64 insertions(+), 18 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 37809a306f7..6c59c39a639 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8471,15 +8471,11 @@ aarch64_layout_frame (void)
- 	&& !crtl->abi->clobbers_full_reg_p (regno))
-       frame.reg_offset[regno] = SLOT_REQUIRED;
- 
--  /* With stack-clash, LR must be saved in non-leaf functions.  The saving of
--     LR counts as an implicit probe which allows us to maintain the invariant
--     described in the comment at expand_prologue.  */
--  gcc_assert (crtl->is_leaf
--	      || maybe_ne (frame.reg_offset[R30_REGNUM], SLOT_NOT_REQUIRED));
- 
-   poly_int64 offset = crtl->outgoing_args_size;
-   gcc_assert (multiple_p (offset, STACK_BOUNDARY / BITS_PER_UNIT));
-   frame.bytes_below_saved_regs = offset;
-+  frame.sve_save_and_probe = INVALID_REGNUM;
- 
-   /* Now assign stack slots for the registers.  Start with the predicate
-      registers, since predicate LDR and STR have a relatively small
-@@ -8487,6 +8483,8 @@ aarch64_layout_frame (void)
-   for (regno = P0_REGNUM; regno <= P15_REGNUM; regno++)
-     if (known_eq (frame.reg_offset[regno], SLOT_REQUIRED))
-       {
-+	if (frame.sve_save_and_probe == INVALID_REGNUM)
-+	  frame.sve_save_and_probe = regno;
- 	frame.reg_offset[regno] = offset;
- 	offset += BYTES_PER_SVE_PRED;
-       }
-@@ -8524,6 +8522,8 @@ aarch64_layout_frame (void)
-     for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
-       if (known_eq (frame.reg_offset[regno], SLOT_REQUIRED))
- 	{
-+	  if (frame.sve_save_and_probe == INVALID_REGNUM)
-+	    frame.sve_save_and_probe = regno;
- 	  frame.reg_offset[regno] = offset;
- 	  offset += vector_save_size;
- 	}
-@@ -8533,10 +8533,18 @@ aarch64_layout_frame (void)
-   frame.below_hard_fp_saved_regs_size = offset - frame.bytes_below_saved_regs;
-   bool saves_below_hard_fp_p
-     = maybe_ne (frame.below_hard_fp_saved_regs_size, 0);
-+  gcc_assert (!saves_below_hard_fp_p
-+	      || (frame.sve_save_and_probe != INVALID_REGNUM
-+		  && known_eq (frame.reg_offset[frame.sve_save_and_probe],
-+			       frame.bytes_below_saved_regs)));
-+
-   frame.bytes_below_hard_fp = offset;
-+  frame.hard_fp_save_and_probe = INVALID_REGNUM;
- 
-   auto allocate_gpr_slot = [&](unsigned int regno)
-     {
-+      if (frame.hard_fp_save_and_probe == INVALID_REGNUM)
-+	frame.hard_fp_save_and_probe = regno;
-       frame.reg_offset[regno] = offset;
-       if (frame.wb_push_candidate1 == INVALID_REGNUM)
- 	frame.wb_push_candidate1 = regno;
-@@ -8570,6 +8578,8 @@ aarch64_layout_frame (void)
-   for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
-     if (known_eq (frame.reg_offset[regno], SLOT_REQUIRED))
-       {
-+	if (frame.hard_fp_save_and_probe == INVALID_REGNUM)
-+	  frame.hard_fp_save_and_probe = regno;
- 	/* If there is an alignment gap between integer and fp callee-saves,
- 	   allocate the last fp register to it if possible.  */
- 	if (regno == last_fp_reg
-@@ -8593,6 +8603,17 @@ aarch64_layout_frame (void)
-   offset = aligned_upper_bound (offset, STACK_BOUNDARY / BITS_PER_UNIT);
- 
-   frame.saved_regs_size = offset - frame.bytes_below_saved_regs;
-+  gcc_assert (known_eq (frame.saved_regs_size,
-+			frame.below_hard_fp_saved_regs_size)
-+	      || (frame.hard_fp_save_and_probe != INVALID_REGNUM
-+		  && known_eq (frame.reg_offset[frame.hard_fp_save_and_probe],
-+			       frame.bytes_below_hard_fp)));
-+
-+  /* With stack-clash, a register must be saved in non-leaf functions.
-+     The saving of the bottommost register counts as an implicit probe,
-+     which allows us to maintain the invariant described in the comment
-+     at expand_prologue.  */
-+  gcc_assert (crtl->is_leaf || maybe_ne (frame.saved_regs_size, 0));
- 
-   offset += get_frame_size ();
-   offset = aligned_upper_bound (offset, STACK_BOUNDARY / BITS_PER_UNIT);
-@@ -8723,6 +8744,25 @@ aarch64_layout_frame (void)
-       frame.final_adjust = frame.bytes_below_saved_regs;
-     }
- 
-+  /* The frame is allocated in pieces, with each non-final piece
-+     including a register save at offset 0 that acts as a probe for
-+     the following piece.  In addition, the save of the bottommost register
-+     acts as a probe for callees and allocas.  Roll back any probes that
-+     aren't needed.
-+
-+     A probe isn't needed if it is associated with the final allocation
-+     (including callees and allocas) that happens before the epilogue is
-+     executed.  */
-+  if (crtl->is_leaf
-+      && !cfun->calls_alloca
-+      && known_eq (frame.final_adjust, 0))
-+    {
-+      if (maybe_ne (frame.sve_callee_adjust, 0))
-+	frame.sve_save_and_probe = INVALID_REGNUM;
-+      else
-+	frame.hard_fp_save_and_probe = INVALID_REGNUM;
-+    }
-+
-   /* Make sure the individual adjustments add up to the full frame size.  */
-   gcc_assert (known_eq (frame.initial_adjust
- 			+ frame.callee_adjust
-@@ -9354,13 +9394,6 @@ aarch64_get_separate_components (void)
- 
- 	poly_int64 offset = frame.reg_offset[regno];
- 
--	/* If the register is saved in the first SVE save slot, we use
--	   it as a stack probe for -fstack-clash-protection.  */
--	if (flag_stack_clash_protection
--	    && maybe_ne (frame.below_hard_fp_saved_regs_size, 0)
--	    && known_eq (offset, frame.bytes_below_saved_regs))
--	  continue;
--
- 	/* Get the offset relative to the register we'll use.  */
- 	if (frame_pointer_needed)
- 	  offset -= frame.bytes_below_hard_fp;
-@@ -9395,6 +9428,13 @@ aarch64_get_separate_components (void)
- 
-   bitmap_clear_bit (components, LR_REGNUM);
-   bitmap_clear_bit (components, SP_REGNUM);
-+  if (flag_stack_clash_protection)
-+    {
-+      if (frame.sve_save_and_probe != INVALID_REGNUM)
-+	bitmap_clear_bit (components, frame.sve_save_and_probe);
-+      if (frame.hard_fp_save_and_probe != INVALID_REGNUM)
-+	bitmap_clear_bit (components, frame.hard_fp_save_and_probe);
-+    }
- 
-   return components;
- }
-@@ -9931,8 +9971,8 @@ aarch64_epilogue_uses (int regno)
-    When probing is needed, we emit a probe at the start of the prologue
-    and every PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE bytes thereafter.
- 
--   We have to track how much space has been allocated and the only stores
--   to the stack we track as implicit probes are the FP/LR stores.
-+   We can also use register saves as probes.  These are stored in
-+   sve_save_and_probe and hard_fp_save_and_probe.
- 
-    For outgoing arguments we probe if the size is larger than 1KB, such that
-    the ABI specified buffer is maintained for the next callee.
-diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
-index c8becb098c8..fbfb73545ba 100644
---- a/gcc/config/aarch64/aarch64.h
-+++ b/gcc/config/aarch64/aarch64.h
-@@ -863,6 +863,14 @@ struct GTY (()) aarch64_frame
-      This is the register they should use.  */
-   unsigned spare_pred_reg;
- 
-+  /* An SVE register that is saved below the hard frame pointer and that acts
-+     as a probe for later allocations, or INVALID_REGNUM if none.  */
-+  unsigned sve_save_and_probe;
-+
-+  /* A register that is saved at the hard frame pointer and that acts
-+     as a probe for later allocations, or INVALID_REGNUM if none.  */
-+  unsigned hard_fp_save_and_probe;
-+
-   bool laid_out;
- 
-   /* True if shadow call stack should be enabled for the current function.  */
-diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/stack_clash_3.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/stack_clash_3.c
-index 3e01ec36c3a..3530a0d504b 100644
---- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/stack_clash_3.c
-+++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/stack_clash_3.c
-@@ -11,11 +11,10 @@
- **	mov	x11, sp
- **	...
- **	sub	sp, sp, x13
--**	str	p4, \[sp\]
- **	cbz	w0, [^\n]*
-+**	str	p4, \[sp\]
- **	...
- **	ptrue	p0\.b, all
--**	ldr	p4, \[sp\]
- **	addvl	sp, sp, #1
- **	ldr	x24, \[sp\], 32
- **	ret
-@@ -39,13 +38,12 @@ test_1 (int n)
- **	mov	x11, sp
- **	...
- **	sub	sp, sp, x13
--**	str	p4, \[sp\]
- **	cbz	w0, [^\n]*
-+**	str	p4, \[sp\]
- **	str	p5, \[sp, #1, mul vl\]
- **	str	p6, \[sp, #2, mul vl\]
- **	...
- **	ptrue	p0\.b, all
--**	ldr	p4, \[sp\]
- **	addvl	sp, sp, #1
- **	ldr	x24, \[sp\], 32
- **	ret
--- 
-2.39.4
-
-
-From 56df065080950bb30dda9c260f71be54269bdda5 Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:20 +0100
-Subject: [PATCH 18/19] aarch64: Remove below_hard_fp_saved_regs_size
-
-After previous patches, it's no longer necessary to store
-saved_regs_size and below_hard_fp_saved_regs_size in the frame info.
-All measurements instead use the top or bottom of the frame as
-reference points.
-
-gcc/
-	* config/aarch64/aarch64.h (aarch64_frame::saved_regs_size)
-	(aarch64_frame::below_hard_fp_saved_regs_size): Delete.
-	* config/aarch64/aarch64.cc (aarch64_layout_frame): Update accordingly.
----
- gcc/config/aarch64/aarch64.cc | 45 ++++++++++++++++-------------------
- gcc/config/aarch64/aarch64.h  |  7 ------
- 2 files changed, 21 insertions(+), 31 deletions(-)
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index 6c59c39a639..b95e805a8cc 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8530,9 +8530,8 @@ aarch64_layout_frame (void)
- 
-   /* OFFSET is now the offset of the hard frame pointer from the bottom
-      of the callee save area.  */
--  frame.below_hard_fp_saved_regs_size = offset - frame.bytes_below_saved_regs;
--  bool saves_below_hard_fp_p
--    = maybe_ne (frame.below_hard_fp_saved_regs_size, 0);
-+  auto below_hard_fp_saved_regs_size = offset - frame.bytes_below_saved_regs;
-+  bool saves_below_hard_fp_p = maybe_ne (below_hard_fp_saved_regs_size, 0);
-   gcc_assert (!saves_below_hard_fp_p
- 	      || (frame.sve_save_and_probe != INVALID_REGNUM
- 		  && known_eq (frame.reg_offset[frame.sve_save_and_probe],
-@@ -8602,9 +8601,8 @@ aarch64_layout_frame (void)
- 
-   offset = aligned_upper_bound (offset, STACK_BOUNDARY / BITS_PER_UNIT);
- 
--  frame.saved_regs_size = offset - frame.bytes_below_saved_regs;
--  gcc_assert (known_eq (frame.saved_regs_size,
--			frame.below_hard_fp_saved_regs_size)
-+  auto saved_regs_size = offset - frame.bytes_below_saved_regs;
-+  gcc_assert (known_eq (saved_regs_size, below_hard_fp_saved_regs_size)
- 	      || (frame.hard_fp_save_and_probe != INVALID_REGNUM
- 		  && known_eq (frame.reg_offset[frame.hard_fp_save_and_probe],
- 			       frame.bytes_below_hard_fp)));
-@@ -8613,7 +8611,7 @@ aarch64_layout_frame (void)
-      The saving of the bottommost register counts as an implicit probe,
-      which allows us to maintain the invariant described in the comment
-      at expand_prologue.  */
--  gcc_assert (crtl->is_leaf || maybe_ne (frame.saved_regs_size, 0));
-+  gcc_assert (crtl->is_leaf || maybe_ne (saved_regs_size, 0));
- 
-   offset += get_frame_size ();
-   offset = aligned_upper_bound (offset, STACK_BOUNDARY / BITS_PER_UNIT);
-@@ -8670,7 +8668,7 @@ aarch64_layout_frame (void)
- 
-   HOST_WIDE_INT const_size, const_below_saved_regs, const_above_fp;
-   HOST_WIDE_INT const_saved_regs_size;
--  if (known_eq (frame.saved_regs_size, 0))
-+  if (known_eq (saved_regs_size, 0))
-     frame.initial_adjust = frame.frame_size;
-   else if (frame.frame_size.is_constant (&const_size)
- 	   && const_size < max_push_offset
-@@ -8683,7 +8681,7 @@ aarch64_layout_frame (void)
-       frame.callee_adjust = const_size;
-     }
-   else if (frame.bytes_below_saved_regs.is_constant (&const_below_saved_regs)
--	   && frame.saved_regs_size.is_constant (&const_saved_regs_size)
-+	   && saved_regs_size.is_constant (&const_saved_regs_size)
- 	   && const_below_saved_regs + const_saved_regs_size < 512
- 	   /* We could handle this case even with data below the saved
- 	      registers, provided that that data left us with valid offsets
-@@ -8702,8 +8700,7 @@ aarch64_layout_frame (void)
-       frame.initial_adjust = frame.frame_size;
-     }
-   else if (saves_below_hard_fp_p
--	   && known_eq (frame.saved_regs_size,
--			frame.below_hard_fp_saved_regs_size))
-+	   && known_eq (saved_regs_size, below_hard_fp_saved_regs_size))
-     {
-       /* Frame in which all saves are SVE saves:
- 
-@@ -8725,7 +8722,7 @@ aarch64_layout_frame (void)
- 	 [save SVE registers relative to SP]
- 	 sub sp, sp, bytes_below_saved_regs  */
-       frame.callee_adjust = const_above_fp;
--      frame.sve_callee_adjust = frame.below_hard_fp_saved_regs_size;
-+      frame.sve_callee_adjust = below_hard_fp_saved_regs_size;
-       frame.final_adjust = frame.bytes_below_saved_regs;
-     }
-   else
-@@ -8740,7 +8737,7 @@ aarch64_layout_frame (void)
- 	 [save SVE registers relative to SP]
- 	 sub sp, sp, bytes_below_saved_regs  */
-       frame.initial_adjust = frame.bytes_above_hard_fp;
--      frame.sve_callee_adjust = frame.below_hard_fp_saved_regs_size;
-+      frame.sve_callee_adjust = below_hard_fp_saved_regs_size;
-       frame.final_adjust = frame.bytes_below_saved_regs;
-     }
- 
-@@ -9936,17 +9933,17 @@ aarch64_epilogue_uses (int regno)
- 	|  local variables              | <-- frame_pointer_rtx
- 	|                               |
- 	+-------------------------------+
--	|  padding                      | \
--	+-------------------------------+  |
--	|  callee-saved registers       |  | frame.saved_regs_size
--	+-------------------------------+  |
--	|  LR'                          |  |
--	+-------------------------------+  |
--	|  FP'                          |  |
--	+-------------------------------+  |<- hard_frame_pointer_rtx (aligned)
--	|  SVE vector registers         |  | \
--	+-------------------------------+  |  | below_hard_fp_saved_regs_size
--	|  SVE predicate registers      | /  /
-+	|  padding                      |
-+	+-------------------------------+
-+	|  callee-saved registers       |
-+	+-------------------------------+
-+	|  LR'                          |
-+	+-------------------------------+
-+	|  FP'                          |
-+	+-------------------------------+ <-- hard_frame_pointer_rtx (aligned)
-+	|  SVE vector registers         |
-+	+-------------------------------+
-+	|  SVE predicate registers      |
- 	+-------------------------------+
- 	|  dynamic allocation           |
- 	+-------------------------------+
-diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
-index fbfb73545ba..cfeaf4657ab 100644
---- a/gcc/config/aarch64/aarch64.h
-+++ b/gcc/config/aarch64/aarch64.h
-@@ -777,18 +777,11 @@ struct GTY (()) aarch64_frame
-      STACK_BOUNDARY.  */
-   HOST_WIDE_INT saved_varargs_size;
- 
--  /* The size of the callee-save registers with a slot in REG_OFFSET.  */
--  poly_int64 saved_regs_size;
--
-   /* The number of bytes between the bottom of the static frame (the bottom
-      of the outgoing arguments) and the bottom of the register save area.
-      This value is always a multiple of STACK_BOUNDARY.  */
-   poly_int64 bytes_below_saved_regs;
- 
--  /* The size of the callee-save registers with a slot in REG_OFFSET that
--     are saved below the hard frame pointer.  */
--  poly_int64 below_hard_fp_saved_regs_size;
--
-   /* The number of bytes between the bottom of the static frame (the bottom
-      of the outgoing arguments) and the hard frame pointer.  This value is
-      always a multiple of STACK_BOUNDARY.  */
--- 
-2.39.4
-
-
-From b96e66fd4ef3e36983969fb8cdd1956f551a074b Mon Sep 17 00:00:00 2001
-From: Richard Sandiford 
-Date: Tue, 12 Sep 2023 16:07:21 +0100
-Subject: [PATCH 19/19] aarch64: Make stack smash canary protect saved
- registers
-
-AArch64 normally puts the saved registers near the bottom of the frame,
-immediately above any dynamic allocations.  But this means that a
-stack-smash attack on those dynamic allocations could overwrite the
-saved registers without needing to reach as far as the stack smash
-canary.
-
-The same thing could also happen for variable-sized arguments that are
-passed by value, since those are allocated before a call and popped on
-return.
-
-This patch avoids that by putting the locals (and thus the canary) below
-the saved registers when stack smash protection is active.
-
-The patch fixes CVE-2023-4039.
-
-gcc/
-	* config/aarch64/aarch64.cc (aarch64_save_regs_above_locals_p):
-	New function.
-	(aarch64_layout_frame): Use it to decide whether locals should
-	go above or below the saved registers.
-	(aarch64_expand_prologue): Update stack layout comment.
-	Emit a stack tie after the final adjustment.
-
-gcc/testsuite/
-	* gcc.target/aarch64/stack-protector-8.c: New test.
-	* gcc.target/aarch64/stack-protector-9.c: Likewise.
----
- gcc/config/aarch64/aarch64.cc                 | 46 +++++++--
- .../gcc.target/aarch64/stack-protector-8.c    | 95 +++++++++++++++++++
- .../gcc.target/aarch64/stack-protector-9.c    | 33 +++++++
- 3 files changed, 168 insertions(+), 6 deletions(-)
- create mode 100644 gcc/testsuite/gcc.target/aarch64/stack-protector-8.c
- create mode 100644 gcc/testsuite/gcc.target/aarch64/stack-protector-9.c
-
-diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
-index b95e805a8cc..389c0e29353 100644
---- a/gcc/config/aarch64/aarch64.cc
-+++ b/gcc/config/aarch64/aarch64.cc
-@@ -8394,6 +8394,20 @@ aarch64_needs_frame_chain (void)
-   return aarch64_use_frame_pointer;
- }
- 
-+/* Return true if the current function should save registers above
-+   the locals area, rather than below it.  */
-+
-+static bool
-+aarch64_save_regs_above_locals_p ()
-+{
-+  /* When using stack smash protection, make sure that the canary slot
-+     comes between the locals and the saved registers.  Otherwise,
-+     it would be possible for a carefully sized smash attack to change
-+     the saved registers (particularly LR and FP) without reaching the
-+     canary.  */
-+  return crtl->stack_protect_guard;
-+}
-+
- /* Mark the registers that need to be saved by the callee and calculate
-    the size of the callee-saved registers area and frame record (both FP
-    and LR may be omitted).  */
-@@ -8405,6 +8419,7 @@ aarch64_layout_frame (void)
-   poly_int64 vector_save_size = GET_MODE_SIZE (vector_save_mode);
-   bool frame_related_fp_reg_p = false;
-   aarch64_frame &frame = cfun->machine->frame;
-+  poly_int64 top_of_locals = -1;
- 
-   frame.emit_frame_chain = aarch64_needs_frame_chain ();
- 
-@@ -8471,9 +8486,16 @@ aarch64_layout_frame (void)
- 	&& !crtl->abi->clobbers_full_reg_p (regno))
-       frame.reg_offset[regno] = SLOT_REQUIRED;
- 
-+  bool regs_at_top_p = aarch64_save_regs_above_locals_p ();
- 
-   poly_int64 offset = crtl->outgoing_args_size;
-   gcc_assert (multiple_p (offset, STACK_BOUNDARY / BITS_PER_UNIT));
-+  if (regs_at_top_p)
-+    {
-+      offset += get_frame_size ();
-+      offset = aligned_upper_bound (offset, STACK_BOUNDARY / BITS_PER_UNIT);
-+      top_of_locals = offset;
-+    }
-   frame.bytes_below_saved_regs = offset;
-   frame.sve_save_and_probe = INVALID_REGNUM;
- 
-@@ -8613,15 +8635,18 @@ aarch64_layout_frame (void)
-      at expand_prologue.  */
-   gcc_assert (crtl->is_leaf || maybe_ne (saved_regs_size, 0));
- 
--  offset += get_frame_size ();
--  offset = aligned_upper_bound (offset, STACK_BOUNDARY / BITS_PER_UNIT);
--  auto top_of_locals = offset;
--
-+  if (!regs_at_top_p)
-+    {
-+      offset += get_frame_size ();
-+      offset = aligned_upper_bound (offset, STACK_BOUNDARY / BITS_PER_UNIT);
-+      top_of_locals = offset;
-+    }
-   offset += frame.saved_varargs_size;
-   gcc_assert (multiple_p (offset, STACK_BOUNDARY / BITS_PER_UNIT));
-   frame.frame_size = offset;
- 
-   frame.bytes_above_hard_fp = frame.frame_size - frame.bytes_below_hard_fp;
-+  gcc_assert (known_ge (top_of_locals, 0));
-   frame.bytes_above_locals = frame.frame_size - top_of_locals;
- 
-   frame.initial_adjust = 0;
-@@ -9930,10 +9955,10 @@ aarch64_epilogue_uses (int regno)
- 	|  for register varargs         |
- 	|                               |
- 	+-------------------------------+
--	|  local variables              | <-- frame_pointer_rtx
-+	|  local variables (1)          | <-- frame_pointer_rtx
- 	|                               |
- 	+-------------------------------+
--	|  padding                      |
-+	|  padding (1)                  |
- 	+-------------------------------+
- 	|  callee-saved registers       |
- 	+-------------------------------+
-@@ -9945,6 +9970,10 @@ aarch64_epilogue_uses (int regno)
- 	+-------------------------------+
- 	|  SVE predicate registers      |
- 	+-------------------------------+
-+	|  local variables (2)          |
-+	+-------------------------------+
-+	|  padding (2)                  |
-+	+-------------------------------+
- 	|  dynamic allocation           |
- 	+-------------------------------+
- 	|  padding                      |
-@@ -9954,6 +9983,9 @@ aarch64_epilogue_uses (int regno)
- 	+-------------------------------+
- 	|                               | <-- stack_pointer_rtx (aligned)
- 
-+   The regions marked (1) and (2) are mutually exclusive.  (2) is used
-+   when aarch64_save_regs_above_locals_p is true.
-+
-    Dynamic stack allocations via alloca() decrease stack_pointer_rtx
-    but leave frame_pointer_rtx and hard_frame_pointer_rtx
-    unchanged.
-@@ -10149,6 +10181,8 @@ aarch64_expand_prologue (void)
-   gcc_assert (known_eq (bytes_below_sp, final_adjust));
-   aarch64_allocate_and_probe_stack_space (tmp1_rtx, tmp0_rtx, final_adjust,
- 					  !frame_pointer_needed, true);
-+  if (emit_frame_chain && maybe_ne (final_adjust, 0))
-+    emit_insn (gen_stack_tie (stack_pointer_rtx, hard_frame_pointer_rtx));
- }
- 
- /* Return TRUE if we can use a simple_return insn.
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-protector-8.c b/gcc/testsuite/gcc.target/aarch64/stack-protector-8.c
-new file mode 100644
-index 00000000000..e71d820e365
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-protector-8.c
-@@ -0,0 +1,95 @@
-+/* { dg-options " -O -fstack-protector-strong -mstack-protector-guard=sysreg -mstack-protector-guard-reg=tpidr2_el0 -mstack-protector-guard-offset=16" } */
-+/* { dg-final { check-function-bodies "**" "" } } */
-+
-+void g(void *);
-+__SVBool_t *h(void *);
-+
-+/*
-+** test1:
-+**	sub	sp, sp, #288
-+**	stp	x29, x30, \[sp, #?272\]
-+**	add	x29, sp, #?272
-+**	mrs	(x[0-9]+), tpidr2_el0
-+**	ldr	(x[0-9]+), \[\1, #?16\]
-+**	str	\2, \[sp, #?264\]
-+**	mov	\2, #?0
-+**	add	x0, sp, #?8
-+**	bl	g
-+**	...
-+**	mrs	.*
-+**	...
-+**	bne	.*
-+**	...
-+**	ldp	x29, x30, \[sp, #?272\]
-+**	add	sp, sp, #?288
-+**	ret
-+**	bl	__stack_chk_fail
-+*/
-+int test1() {
-+  int y[0x40];
-+  g(y);
-+  return 1;
-+}
-+
-+/*
-+** test2:
-+**	stp	x29, x30, \[sp, #?-16\]!
-+**	mov	x29, sp
-+**	sub	sp, sp, #1040
-+**	mrs	(x[0-9]+), tpidr2_el0
-+**	ldr	(x[0-9]+), \[\1, #?16\]
-+**	str	\2, \[sp, #?1032\]
-+**	mov	\2, #?0
-+**	add	x0, sp, #?8
-+**	bl	g
-+**	...
-+**	mrs	.*
-+**	...
-+**	bne	.*
-+**	...
-+**	add	sp, sp, #?1040
-+**	ldp	x29, x30, \[sp\], #?16
-+**	ret
-+**	bl	__stack_chk_fail
-+*/
-+int test2() {
-+  int y[0x100];
-+  g(y);
-+  return 1;
-+}
-+
-+#pragma GCC target "+sve"
-+
-+/*
-+** test3:
-+**	stp	x29, x30, \[sp, #?-16\]!
-+**	mov	x29, sp
-+**	addvl	sp, sp, #-18
-+**	...
-+**	str	p4, \[sp\]
-+**	...
-+**	sub	sp, sp, #272
-+**	mrs	(x[0-9]+), tpidr2_el0
-+**	ldr	(x[0-9]+), \[\1, #?16\]
-+**	str	\2, \[sp, #?264\]
-+**	mov	\2, #?0
-+**	add	x0, sp, #?8
-+**	bl	h
-+**	...
-+**	mrs	.*
-+**	...
-+**	bne	.*
-+**	...
-+**	add	sp, sp, #?272
-+**	...
-+**	ldr	p4, \[sp\]
-+**	...
-+**	addvl	sp, sp, #18
-+**	ldp	x29, x30, \[sp\], #?16
-+**	ret
-+**	bl	__stack_chk_fail
-+*/
-+__SVBool_t test3() {
-+  int y[0x40];
-+  return *h(y);
-+}
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-protector-9.c b/gcc/testsuite/gcc.target/aarch64/stack-protector-9.c
-new file mode 100644
-index 00000000000..58f322aa480
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-protector-9.c
-@@ -0,0 +1,33 @@
-+/* { dg-options "-O2 -mcpu=neoverse-v1 -fstack-protector-all" } */
-+/* { dg-final { check-function-bodies "**" "" } } */
-+
-+/*
-+** main:
-+**	...
-+**	stp	x29, x30, \[sp, #?-[0-9]+\]!
-+**	...
-+**	sub	sp, sp, #[0-9]+
-+**	...
-+**	str	x[0-9]+, \[x29, #?-8\]
-+**	...
-+*/
-+int f(const char *);
-+void g(void *);
-+int main(int argc, char* argv[])
-+{
-+  int a;
-+  int b;
-+  char c[2+f(argv[1])];
-+  int d[0x100];
-+  char y;
-+
-+  y=42; a=4; b=10;
-+  c[0] = 'h'; c[1] = '\0';
-+
-+  c[f(argv[2])] = '\0';
-+
-+  __builtin_printf("%d %d\n%s\n", a, b, c);
-+  g(d);
-+
-+  return 0;
-+}
--- 
-2.39.4
-
diff --git a/SPECS/gcc/gcc.signatures.json b/SPECS/gcc/gcc.signatures.json
deleted file mode 100644
index a95ce5fc15..0000000000
--- a/SPECS/gcc/gcc.signatures.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "Signatures": {
-  "gcc-13.2.0.tar.xz": "e275e76442a6067341a27f04c5c6b83d8613144004c0413528863dc6b5c743da"
- }
-}
diff --git a/SPECS/gcc/gcc.spec b/SPECS/gcc/gcc.spec
deleted file mode 100644
index fd22dbf787..0000000000
--- a/SPECS/gcc/gcc.spec
+++ /dev/null
@@ -1,679 +0,0 @@
-%global security_hardening nofortify
-%define _use_internal_dependency_generator 0
-
-# Overriding the default to call 'configure' from subdirectories.
-%global _configure ../configure
-
-# Set if we're building cross-compilation packages for a given host architecture.
-%ifarch x86_64
-    %global build_cross 1
-%else
-    %global build_cross 0
-%endif
-
-# Adds a list of excluded files related to cross-compilation.
-# This macro is used only in the files list of the default 'gcc' package,
-# so that it doesn't include the cross-compilation files meant to go to
-# the 'gcc-' and 'gcc-c++-' subpackages (see: do_files() macro).
-#
-# Arguments:
-# - %1: name of the cross-compilation target architecture.
-# - %2: boolean indicating if we're building the cross-compilation bits for the current host architecture.
-#       See: "build_" macros for each host architecture listed above.
-%global do_exclude() \
-%if %2 \
-%exclude %{_bindir}/%{1}* \
-%exclude %{_libdir}/gcc/%{1} \
-%exclude %{_libexecdir}/gcc/%{1} \
-%exclude %{_prefix}/%{1}/sys-root/ \
-%endif
-
-# Creates the files lists for the cross-compilation packages.
-#
-# Arguments:
-# - %1: name of the cross-compilation target architecture. This appears in the package and file names.
-# - %2: boolean indicating if we're building the cross-compilation bits for the current host architecture.
-#       See: "build_" macros for each host architecture listed above.
-%global do_files() \
-%if %2 \
-%files -n gcc-%1 \
-%{_bindir}/%{1}*-cpp \
-%{_bindir}/%{1}*-gcc \
-%{_bindir}/%{1}*-gcc-ar \
-%{_bindir}/%{1}*-gcc-nm \
-%{_bindir}/%{1}*-gcc-ranlib \
-%{_bindir}/%{1}*-gcov* \
-%{_bindir}/%{1}*-lto-dump \
-%{_libdir}/gcc/%{1} \
-%{_libexecdir}/gcc/%{1} \
-%{_prefix}/%{1}/sys-root/ \
-\
-%files -n gcc-c++-%1 \
-%{_bindir}/%{1}*-c++ \
-%{_bindir}/%{1}*-g++ \
-%endif
-
-Summary:        Contains the GNU compiler collection
-Name:           gcc
-Version:        13.2.0
-Release:        7%{?dist}
-License:        GPLv2+
-Vendor:         Microsoft Corporation
-Distribution:   Azure Linux
-Group:          Development/Tools
-URL:            https://gcc.gnu.org/
-Source0:        https://ftp.gnu.org/gnu/gcc/%{name}-%{version}/%{name}-%{version}.tar.xz
-Patch0:         CVE-2023-4039.patch
-Patch1:         0011-libsanitizer-Remove-crypt-and-crypt_r-interceptors.patch
-
-BuildRequires:  gmp-devel
-BuildRequires:  mpfr-devel
-BuildRequires:  libmpc-devel
-
-Requires:       gcc-c++ = %{version}-%{release}
-Requires:       gmp
-Requires:       libgcc-atomic = %{version}-%{release}
-Requires:       libgcc-devel = %{version}-%{release}
-Requires:       libgomp-devel = %{version}-%{release}
-Requires:       libmpc
-Requires:       libstdc++-devel = %{version}-%{release}
-Provides:       cpp = %{version}-%{release}
-Provides:       gcc-plugin-devel = %{version}-%{release}
-Provides:       libasan = %{version}-%{release}
-Provides:       libasan%{?_isa} = %{version}-%{release}
-Provides:       libasan-static = %{version}-%{release}
-Provides:       libasan-static%{?_isa} = %{version}-%{release}
-Provides:       liblsan = %{version}-%{release}
-Provides:       liblsan%{?_isa} = %{version}-%{release}
-Provides:       liblsan-static = %{version}-%{release}
-Provides:       liblsan-static%{?_isa} = %{version}-%{release}
-Provides:       libtsan = %{version}-%{release}
-Provides:       libtsan%{?_isa} = %{version}-%{release}
-Provides:       libtsan-static = %{version}-%{release}
-Provides:       libtsan-static%{?_isa} = %{version}-%{release}
-Provides:       libubsan = %{version}-%{release}
-Provides:       libubsan%{?_isa} = %{version}-%{release}
-Provides:       libubsan-static = %{version}-%{release}
-Provides:       libubsan-static%{?_isa} = %{version}-%{release}
-Provides:       libquadmath = %{version}-%{release}
-Provides:       libquadmath-devel = %{version}-%{release}
-Provides:       libquadmath-devel%{?_isa} = %{version}-%{release}
-
-# Moving macro before the "SourceX" tags breaks PR checks parsing the specs.
-%global do_package() \
-%if %2 \
-%package -n gcc-%1 \
-Summary: Cross-build binary utilities for %1 \
-Requires: cross-gcc-common == %{version}-%{release} \
-BuildRequires: binutils-%1 \
-Requires: binutils-%1 \
-Requires: gmp-devel \
-Requires: mpfr-devel \
-Requires: libmpc-devel \
-%description -n gcc-%1 \
-Cross-build GNU C compiler. \
-\
-Only building kernels is currently supported.  Support for cross-building \
-user space programs is not currently provided as that would massively multiply \
-the number of packages. \
-\
-%package -n gcc-c++-%1 \
-Summary: Cross-build binary utilities for %1 \
-Requires: gcc-%1 == %{version}-%{release} \
-%description -n gcc-c++-%1 \
-Cross-build GNU C++ compiler. \
-\
-Only the compiler is provided; not libstdc++.  Support for cross-building \
-user space programs is not currently provided as that would massively multiply \
-the number of packages. \
-%endif
-
-%description
-The GCC package contains the GNU compiler collection,
-which includes the C and C++ compilers.
-
-%package -n     gfortran
-Summary:        GNU Fortran compiler.
-Group:          Development/Tools
-Requires:       gcc = %{version}-%{release}
-Provides:       gcc-gfortran = %{version}-%{release}
-
-%description -n gfortran
-The gfortran package contains GNU Fortran compiler.
-
-%package -n     libgcc
-Summary:        GNU C Library
-Group:          System Environment/Libraries
-
-%description -n libgcc
-The libgcc package contains GCC shared libraries for gcc.
-
-%package -n     libgcc-atomic
-Summary:        GNU C Library for atomic counter updates
-Group:          System Environment/Libraries
-Requires:       libgcc = %{version}-%{release}
-Provides:       libatomic = %{version}-%{release}
-
-%description -n libgcc-atomic
-The libgcc package contains GCC shared libraries for atomic counter updates.
-
-%package -n     libgcc-devel
-Summary:        GNU C Library
-Group:          Development/Libraries
-Requires:       libgcc = %{version}-%{release}
-
-%description -n libgcc-devel
-The libgcc package contains GCC shared libraries for gcc .
-This package contains development headers and static library for libgcc.
-
-%package        c++
-Summary:        C++ support for GCC
-Group:          System Environment/Libraries
-Requires:       gcc = %{version}-%{release}
-Requires:       libstdc++-devel = %{version}-%{release}
-Provides:       gcc-g++ = %{version}-%{release}
-Provides:       g++ = %{version}-%{release}
-
-%description    c++
-This package adds C++ support to the GNU Compiler Collection.
-It includes support for most of the current C++ specification,
-including templates and exception handling.
-
-%package -n     libbacktrace-static
-Summary:        Static library for GCC's libbacktrace.
-Group:          System Environment/Libraries
-
-%description -n libbacktrace-static
-This package contains GCC's static libbacktrace library and its header.
-
-%package -n     libstdc++
-Summary:        GNU C Library
-Group:          System Environment/Libraries
-Requires:       libgcc = %{version}-%{release}
-
-%description -n libstdc++
-This package contains the GCC Standard C++ Library v3, an ongoing project to implement the ISO/IEC 14882:1998 Standard C++ library.
-
-%package -n     libstdc++-devel
-Summary:        GNU C Library
-Group:          Development/Libraries
-Requires:       libstdc++ = %{version}-%{release}
-Provides:       libstdc++-static = %{version}-%{release}
-
-%description -n libstdc++-devel
-This is the GNU implementation of the standard C++ libraries.
-This package includes the headers files and libraries needed for C++ development.
-
-%package -n     libgomp
-Summary:        GNU C Library
-Group:          System Environment/Libraries
-
-%description -n libgomp
-An implementation of OpenMP for the C, C++, and Fortran 95 compilers in the GNU Compiler Collection.
-
-%package -n     libgomp-devel
-Summary:        Development headers and static library for libgomp
-Group:          Development/Libraries
-Requires:       libgomp = %{version}-%{release}
-
-%description -n libgomp-devel
-An implementation of OpenMP for the C, C++, and Fortran 95 compilers in the GNU Compiler Collection.
-This package contains development headers and static library for libgomp
-
-%if %{build_cross}
-%package -n cross-gcc-common
-Summary: Cross-build GNU C compiler documentation and translation files
-BuildArch: noarch
-
-%description -n cross-gcc-common
-Documentation, manual pages and translation files for cross-build GNU C
-compiler.
-
-This is the common part of a set of cross-build GNU C compiler packages for
-building kernels for other architectures.  No support for cross-building
-user space programs is currently supplied as that would massively multiply the
-number of packages.
-%endif
-
-%do_package aarch64-linux-gnu %{build_cross}
-
-%prep
-
-%autosetup -p1
-
-function prep_target () {
-    local target=$1
-    local condition=$2
-
-    if [ $condition != 0 ]
-    then
-        echo $1 >> cross.list
-    fi
-}
-
-touch cross.list
-prep_target aarch64-linux-gnu %{build_cross}
-
-%build
-
-function config_cross_target () {
-    local target=$1
-
-    mkdir $target
-    pushd $target
-
-    CFLAGS_FOR_TARGET="-g -O2 -Wall -fexceptions" \
-    AR_FOR_TARGET=%{_bindir}/$target-ar \
-    AS_FOR_TARGET=%{_bindir}/$target-as \
-    LD_FOR_TARGET=%{_bindir}/$target-ld \
-    NM_FOR_TARGET=%{_bindir}/$target-nm \
-    OBJDUMP_FOR_TARGET=%{_bindir}/$target-objdump \
-    RANLIB_FOR_TARGET=%{_bindir}/$target-ranlib \
-    READELF_FOR_TARGET=%{_bindir}/$target-readelf \
-    STRIP_FOR_TARGET=%{_bindir}/$target-strip \
-    SED=sed %configure \
-        --disable-bootstrap \
-        --disable-decimal-float \
-        --disable-dependency-tracking \
-        --disable-gold \
-        --disable-libgcj \
-        --disable-libgomp \
-        --disable-libmpx \
-        --disable-libquadmath \
-        --disable-libssp \
-        --disable-libunwind-exceptions \
-        --disable-multilib \
-        --disable-shared \
-        --disable-silent-rules \
-        --disable-sjlj-exceptions \
-        --disable-threads \
-        --enable-plugin \
-        --enable-__cxa_atexit \
-        --enable-clocale=gnu \
-        --enable-default-pie \
-        --enable-languages=c,c++ \
-        --enable-linker-build-id \
-        --enable-targets=all \
-        --program-prefix=$target- \
-        --target=$target \
-        --with-ld=/usr/bin/$target-ld \
-        --with-newlib \
-        --with-sysroot=%{_prefix}/$target/sys-root \
-        --with-system-zlib \
-        --without-headers
-
-    popd
-}
-
-CFLAGS="`echo " %{build_cflags} " | sed 's/-Werror=format-security/-Wno-error=format-security/'`"
-CXXFLAGS="`echo " %{build_cxxflags} " | sed 's/-Werror=format-security/-Wno-error=format-security/'`"
-FCFLAGS="`echo " %{build_fflags} " | sed 's/-Werror=format-security/-Wno-error=format-security/'`"
-export CFLAGS="$CFLAGS -Wno-error=missing-include-dirs"
-export CXXFLAGS="$CXXFLAGS -Wno-error=missing-include-dirs"
-export FCFLAGS="$FCFLAGS -Wno-error=missing-include-dirs"
-
-mkdir build
-pushd build
-
-LD=ld \
-%configure \
-    --disable-bootstrap \
-    --disable-fixincludes \
-    --disable-multilib \
-    --enable-__cxa_atexit \
-    --enable-clocale=gnu \
-    --enable-default-pie \
-    --enable-default-ssp \
-    --enable-languages=c,c++,fortran \
-    --enable-linker-build-id \
-    --enable-plugin \
-    --enable-shared \
-    --enable-threads=posix \
-    --with-system-zlib
-
-popd
-
-make -C build %{?_smp_mflags}
-
-while read -r target
-do
-    echo "=== BUILD cross-compilation target $target ==="
-    config_cross_target $target
-    AR_FOR_TARGET=%{_bindir}/$target-ar \
-    AS_FOR_TARGET=%{_bindir}/$target-as \
-    LD_FOR_TARGET=%{_bindir}/$target-ld \
-    NM_FOR_TARGET=%{_bindir}/$target-nm \
-    OBJDUMP_FOR_TARGET=%{_bindir}/$target-objdump \
-    RANLIB_FOR_TARGET=%{_bindir}/$target-ranlib \
-    READELF_FOR_TARGET=%{_bindir}/$target-readelf \
-    STRIP_FOR_TARGET=%{_bindir}/$target-strip \
-    make -C $target %{_smp_mflags} tooldir=%{_prefix} all-gcc
-    make -C $target %{_smp_mflags} tooldir=%{_prefix} all-target-libgcc
-done < cross.list
-
-%install
-
-pushd build
-
-make %{?_smp_mflags} DESTDIR=%{buildroot} install
-install -vdm 755 %{buildroot}/%{_libdir}
-ln -sv %{_bindir}/cpp %{buildroot}/%{_libdir}
-ln -sv gcc %{buildroot}%{_bindir}/cc
-install -vdm 755 %{buildroot}%{_datarootdir}/gdb/auto-load%{_libdir}
-mv -v %{buildroot}%{_lib64dir}/*gdb.py %{buildroot}%{_datarootdir}/gdb/auto-load%{_libdir}
-chmod 755 %{buildroot}/%{_lib64dir}/libgcc_s.so.1
-
-# Install libbacktrace-static components
-cp %{_host}/libbacktrace/.libs/libbacktrace.a %{buildroot}%{_lib64dir}
-cp ../libbacktrace/backtrace.h %{buildroot}%{_includedir}
-
-%find_lang %{name} --all-name
-
-popd
-
-while read -r target
-do
-    echo "=== INSTALL cross-compilation target $target ==="
-
-    mkdir -p %{buildroot}%{_prefix}/$target/sys-root
-    make -C $target %{?_smp_mflags} DESTDIR=%{buildroot} install-gcc install-target-libgcc
-    rm -rf %{buildroot}%{_mandir}/man1/$target-*
-done < cross.list
-
-rm -rf %{buildroot}%{_infodir}
-
-# Workaround for cross-compilation object files stripping issue.
-# We skip stripping all object files for architectures different than %%{_target_platform}.
-# See Fedora's bug: https://bugzilla.redhat.com/show_bug.cgi?id=1863378.
-%global __ar_no_strip %{_builddir}/%{name}-%{version}/ar-no-strip
-cat >%{__ar_no_strip} < - 13.2.0-7
-- Re-enable CVE-2023-4039.patch and refresh against 13.2.0 source
-
-* Tue Apr 09 2024 Andrew Phelps  - 13.2.0-6
-- Revert change to baseline architecture for x86-64-v3
-
-* Tue Apr 09 2024 Andrew Phelps  - 13.2.0-5
-- Revert change to baseline architecture for arm64
-
-* Tue Apr 09 2024 Andrew Phelps  - 13.2.0-4
-- Set baseline architecture levels to `x86-64-v3` and `armv8.1-a`
-
-* Mon Feb 26 2024 Andrew Phelps  - 13.2.0-3
-- Re-enable libsanitizer
-
-* Mon Dec 11 2023 Pawel Winogrodzki  - 13.2.0-2
-- Added cross-compilation support for aarch64.
-- Used Fedora 36 spec (license: MIT) for guidance.
-
-* Thu Nov 02 2023 Andrew Phelps  - 13.2.0-1
-- Upgrade to version 13.2.0
-- Remove gfortran
-
-* Tue Sep 26 2023 Pawel Winogrodzki  - 11.2.0-7
-- Removing 'exit' calls from the '%%check' section.
-
-* Wed Sep 20 2023 Jon Slobodzian  - 11.2.0-6
-- Recompile with stack-protection fixed gcc version (CVE-2023-4039)
-
-* Wed Sep 13 2023 Andrew Phelps  - 11.2.0-5
-- Add CVE-2023-4039.patch
-
-* Fri Dec 16 2022 Pawel Winogrodzki  - 11.2.0-4
-- Removing libbacktrace.a from the default package.
-
-* Thu Dec 08 2022 Pawel Winogrodzki  - 11.2.0-3
-- Adding static components for "libbacktrace".
-
-* Tue Jan 25 2022 Thomas Crain  - 11.2.0-2
-- Add provides for libasan, liblsan, libtsan, and libubsan (and their static counterparts) to the main package
-- Remove CVE-2019-15847 nopatch file (not relevant to our version of GCC)
-
-* Mon Oct 18 2021 Andrew Phelps  - 11.2.0-1
-- Update to version 11.2.0
-
-* Fri Feb 05 2021 Joe Schmitt  - 9.1.0-11
-- Replace incorrect %%{_lib} usage with %%{_libdir}
-
-* Fri Jan 08 2021 Ruying Chen  - 9.1.0-10
-- Provide libquadmath and libquadmath-devel.
-
-* Tue Nov 03 2020 Joe Schmitt  - 9.1.0-9
-- Provide gcc-plugin-devel.
-
-* Mon Sep 28 2020 Ruying Chen  9.1.0-8
-- Split gcc-c++ subpackage.
-- Provide cpp, gcc-gfortran, libatomic, and listdc++-static.
-
-* Thu Sep 10 2020 Thomas Crain  - 9.1.0-7
-- Ignore CVE-2019-15847, as it applies to an unsupported ISA
-
-* Mon Jul 06 2020 Henry Beberman  - 9.1.0-6
-- Comment out with_check BuildRequires to break circular dependency in build graph.
-
-* Thu Jun 11 2020 Henry Beberman  - 9.1.0-5
-- Disable -Werror=format-security to build with hardened cflags
-
-* Sat May 09 2020 Nick Samson  - 9.1.0-4
-- Added %%license line automatically
-
-* Thu Apr 30 2020 Emre Girgin  - 9.1.0-3
-- Renaming mpc to libmpc
-
-* Thu Apr 09 2020 Emre Girgin  - 9.1.0-2
-- Add the "--enable-default-pie" flag in order to enforce ASLR-enabled binaries.
-
-* Tue Mar 17 2020 Andrew Phelps  - 9.1.0-1
-- Update to version 9.1.0. License verified. Add libstdc++fs.a
-
-* Tue Jan 21 2020 Andrew Phelps  - 7.3.0-6
-- Fixing build issues for multiple architectures
-
-* Tue Sep 03 2019 Mateusz Malisz  - 7.3.0-5
-- Initial CBL-Mariner import from Photon (license: Apache2).
-
-* Fri Nov 02 2018 Alexey Makhalov  - 7.3.0-4
-- Use nofortify security_hardening instead of sed hacking
-- Use %configure
-
-* Wed Sep 19 2018 Alexey Makhalov  - 7.3.0-3
-- Fix compilation issue for glibc-2.28
-
-* Thu Aug 30 2018 Keerthana K  - 7.3.0-2
-- Packaging .a files (libstdc++-static files).
-
-* Wed Aug 01 2018 Srivatsa S. Bhat  - 7.3.0-1
-- Update to version 7.3.0 to get retpoline support.
-
-* Tue Nov 14 2017 Alexey Makhalov  - 6.3.0-7
-- Aarch64 support
-
-* Mon Oct 02 2017 Alexey Makhalov  - 6.3.0-6
-- Added smp_mflags for parallel build
-
-* Mon Sep 25 2017 Alexey Makhalov  - 6.3.0-5
-- Enable elfdeps for libgcc_s to generate libgcc_s.so.1(*)(64bit) provides
-
-* Mon Aug 28 2017 Alexey Makhalov  - 6.3.0-4
-- Fix makecheck
-
-* Tue Aug 15 2017 Alexey Makhalov  - 6.3.0-3
-- Fix compilation issue for glibc-2.26
-
-* Tue Aug 15 2017 Alexey Makhalov  - 6.3.0-2
-- Improve make check
-
-* Thu Mar 9 2017 Alexey Makhalov  - 6.3.0-1
-- Update version to 6.3
-
-* Thu Mar 02 2017 Xiaolin Li  - 5.3.0-6
-- Enabled fortran.
-
-* Wed Feb 22 2017 Alexey Makhalov  - 5.3.0-5
-- Added new plugin entry point: PLUGIN_TYPE_CAST (.patch)
-
-* Thu Sep  8 2016 Alexey Makhalov  - 5.3.0-4
-- Enable plugins and linker build id.
-
-* Tue May 24 2016 Priyesh Padmavilasom  - 5.3.0-3
-- GA - Bump release of all rpms
-
-* Tue May 17 2016 Anish Swaminathan  - 5.3.0-2
-- Change package dependencies
-
-* Mon Mar 28 2016 Alexey Makhalov  - 5.3.0-1
-- Update version to 5.3
-
-* Tue Nov 10 2015 Xiaolin Li  - 4.8.2-6
-- Handled locale files with macro find_lang
-
-* Mon Nov 02 2015 Vinay Kulkarni  - 4.8.2-5
-- Put libatomic.so into its own package.
-
-* Wed May 20 2015 Touseef Liaqat  - 4.8.2-4
-- Updated group.
-
-* Mon May 18 2015 Touseef Liaqat  - 4.8.2-3
-- Update according to UsrMove.
-
-* Fri May 15 2015 Divya Thaluru  - 4.8.2-2
-- Packaging .la files
-
-* Tue Apr 01 2014 baho-utot  - 4.8.2-1
-- Initial build. First version
diff --git a/SPECS/gh/0001-Fix-false-negative-in-TestMigrationWriteErrors-when-.patch b/SPECS/gh/0001-Fix-false-negative-in-TestMigrationWriteErrors-when-.patch
deleted file mode 100644
index a3dc44dc3e..0000000000
--- a/SPECS/gh/0001-Fix-false-negative-in-TestMigrationWriteErrors-when-.patch
+++ /dev/null
@@ -1,88 +0,0 @@
-From 82441ca6f9736bc542e699c8cbf46f80542ed618 Mon Sep 17 00:00:00 2001
-From: Vince Perri <5596945+vinceaperri@users.noreply.github.com>
-Date: Tue, 19 Nov 2024 23:29:08 +0000
-Subject: [PATCH] Fix false-negative in TestMigrationWriteErrors when root
-
----
- internal/config/migrate_test.go | 44 ++++++++++++++++++++++++++++++++-
- 1 file changed, 43 insertions(+), 1 deletion(-)
-
-diff --git a/internal/config/migrate_test.go b/internal/config/migrate_test.go
-index 783f605..7557149 100644
---- a/internal/config/migrate_test.go
-+++ b/internal/config/migrate_test.go
-@@ -6,13 +6,20 @@ import (
- 	"io"
- 	"os"
- 	"path/filepath"
-+	"syscall"
- 	"testing"
-+	"unsafe"
- 
- 	ghmock "github.com/cli/cli/v2/internal/gh/mock"
- 	ghConfig "github.com/cli/go-gh/v2/pkg/config"
- 	"github.com/stretchr/testify/require"
- )
- 
-+const (
-+	FS_IOC_SETFLAGS = 0x40086602
-+	FS_IMMUTABLE_FL = 0x00000010
-+)
-+
- func TestMigrationAppliedSuccessfully(t *testing.T) {
- 	readConfig := StubWriteConfig(t)
- 
-@@ -215,6 +222,9 @@ func TestMigrationWriteErrors(t *testing.T) {
- 
- 			// Then the error is wrapped and bubbled
- 			require.ErrorContains(t, err, tt.wantErrContains)
-+
-+			// Make the file writeable again so we can clean up
-+			makeFileWriteable(t, filepath.Join(tempDir, tt.unwriteableFile))
- 		})
- 	}
- }
-@@ -226,7 +236,39 @@ func makeFileUnwriteable(t *testing.T, file string) {
- 	require.NoError(t, err)
- 	f.Close()
- 
--	require.NoError(t, os.Chmod(file, 0000))
-+	if os.Geteuid() == 0 {
-+		fd, err := syscall.Open(file, syscall.O_RDONLY, 0)
-+		require.NoError(t, err)
-+		defer syscall.Close(fd)
-+
-+		var flags uint
-+		_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(FS_IOC_SETFLAGS), uintptr(unsafe.Pointer(&flags)))
-+		require.Zero(t, errno)
-+
-+		flags |= FS_IMMUTABLE_FL
-+		_, _, errno = syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(FS_IOC_SETFLAGS), uintptr(unsafe.Pointer(&flags)))
-+		require.Zero(t, errno)
-+	} else {
-+		require.NoError(t, os.Chmod(file, 0000))
-+	}
-+}
-+
-+func makeFileWriteable(t *testing.T, file string) {
-+	t.Helper()
-+
-+	if os.Geteuid() == 0 {
-+		fd, err := syscall.Open(file, syscall.O_RDONLY, 0)
-+		require.NoError(t, err)
-+		defer syscall.Close(fd)
-+
-+		var flags uint
-+		_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(FS_IOC_SETFLAGS), uintptr(unsafe.Pointer(&flags)))
-+		require.Zero(t, errno)
-+
-+		flags &^= FS_IMMUTABLE_FL
-+		_, _, errno = syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(FS_IOC_SETFLAGS), uintptr(unsafe.Pointer(&flags)))
-+		require.Zero(t, errno)
-+	}
- }
- 
- func mockMigration(doFunc func(config *ghConfig.Config) error) *ghmock.MigrationMock {
--- 
-2.34.1
-
diff --git a/SPECS/gh/CVE-2024-45337.patch b/SPECS/gh/CVE-2024-45337.patch
deleted file mode 100644
index 868ef502b5..0000000000
--- a/SPECS/gh/CVE-2024-45337.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 66fd5d19c5ea8c7f4f7ff69bcc93a7c8231ce4cf Mon Sep 17 00:00:00 2001
-From: Roland Shoemaker 
-Date: Tue, 3 Dec 2024 09:03:03 -0800
-Subject: [PATCH] ssh: make the public key cache a 1-entry FIFO cache
-
-Users of the the ssh package seem to extremely commonly misuse the
-PublicKeyCallback API, assuming that the key passed in the last call
-before a connection is established is the key used for authentication.
-Some users then make authorization decisions based on this key. This
-property is not documented, and may not be correct, due to the caching
-behavior of the package, resulting in users making incorrect
-authorization decisions about the connection.
-
-This change makes the cache a one entry FIFO cache, making the assumed
-property, that the last call to PublicKeyCallback represents the key
-actually used for authentication, actually hold.
-
-Thanks to Damien Tournoud, Patrick Dawkins, Vince Parker, and
-Jules Duvivier from the Platform.sh / Upsun engineering team
-for reporting this issue.
-
-Fixes golang/go#70779
-Fixes CVE-2024-45337
-
-Change-Id: Ife7c7b4045d8b6bcd7e3a417bdfae370c709797f
-Reviewed-on: https://go-review.googlesource.com/c/crypto/+/635315
-Reviewed-by: Roland Shoemaker 
-Auto-Submit: Gopher Robot 
-Reviewed-by: Damien Neil 
-Reviewed-by: Nicola Murino 
-LUCI-TryBot-Result: Go LUCI 
-Signed-off-by: Muhammad Falak R Wani 
----
- vendor/golang.org/x/crypto/ssh/server.go | 15 +++++++++++----
- 1 file changed, 11 insertions(+), 4 deletions(-)
-
-diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go
-index c2dfe32..39dcc09 100644
---- a/vendor/golang.org/x/crypto/ssh/server.go
-+++ b/vendor/golang.org/x/crypto/ssh/server.go
-@@ -149,7 +149,7 @@ func (s *ServerConfig) AddHostKey(key Signer) {
- }
- 
- // cachedPubKey contains the results of querying whether a public key is
--// acceptable for a user.
-+// acceptable for a user. This is a FIFO cache.
- type cachedPubKey struct {
- 	user       string
- 	pubKeyData []byte
-@@ -157,7 +157,13 @@ type cachedPubKey struct {
- 	perms      *Permissions
- }
- 
--const maxCachedPubKeys = 16
-+// maxCachedPubKeys is the number of cache entries we store.
-+//
-+// Due to consistent misuse of the PublicKeyCallback API, we have reduced this
-+// to 1, such that the only key in the cache is the most recently seen one. This
-+// forces the behavior that the last call to PublicKeyCallback will always be
-+// with the key that is used for authentication.
-+const maxCachedPubKeys = 1
- 
- // pubKeyCache caches tests for public keys.  Since SSH clients
- // will query whether a public key is acceptable before attempting to
-@@ -179,9 +185,10 @@ func (c *pubKeyCache) get(user string, pubKeyData []byte) (cachedPubKey, bool) {
- 
- // add adds the given tuple to the cache.
- func (c *pubKeyCache) add(candidate cachedPubKey) {
--	if len(c.keys) < maxCachedPubKeys {
--		c.keys = append(c.keys, candidate)
-+	if len(c.keys) >= maxCachedPubKeys {
-+		c.keys = c.keys[1:]
- 	}
-+	c.keys = append(c.keys, candidate)
- }
- 
- // ServerConn is an authenticated SSH connection, as seen from the
--- 
-2.34.1
-
diff --git a/SPECS/gh/CVE-2024-45338.patch b/SPECS/gh/CVE-2024-45338.patch
deleted file mode 100644
index 7dc58f35e9..0000000000
--- a/SPECS/gh/CVE-2024-45338.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From a61bc7a45809410b36644afd5a29c14f138a1485 Mon Sep 17 00:00:00 2001
-From: Rohit Rawat 
-Date: Thu, 2 Jan 2025 10:22:12 +0000
-Subject: [PATCH] Fix CVE CVE-2024-45338 in gh
-
----
- vendor/golang.org/x/net/html/doctype.go | 2 +-
- vendor/golang.org/x/net/html/foreign.go | 3 +--
- vendor/golang.org/x/net/html/parse.go   | 4 ++--
- 3 files changed, 4 insertions(+), 5 deletions(-)
-
-diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go
-index c484e5a..bca3ae9 100644
---- a/vendor/golang.org/x/net/html/doctype.go
-+++ b/vendor/golang.org/x/net/html/doctype.go
-@@ -87,7 +87,7 @@ func parseDoctype(s string) (n *Node, quirks bool) {
- 			}
- 		}
- 		if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" &&
--			strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" {
-+			strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") {
- 			quirks = true
- 		}
- 	}
-diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go
-index 9da9e9d..e8515d8 100644
---- a/vendor/golang.org/x/net/html/foreign.go
-+++ b/vendor/golang.org/x/net/html/foreign.go
-@@ -40,8 +40,7 @@ func htmlIntegrationPoint(n *Node) bool {
- 		if n.Data == "annotation-xml" {
- 			for _, a := range n.Attr {
- 				if a.Key == "encoding" {
--					val := strings.ToLower(a.Val)
--					if val == "text/html" || val == "application/xhtml+xml" {
-+					if strings.EqualFold(a.Val, "text/html") || strings.EqualFold(a.Val, "application/xhtml+xml") {
- 						return true
- 					}
- 				}
-diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go
-index 46a89ed..5b8374b 100644
---- a/vendor/golang.org/x/net/html/parse.go
-+++ b/vendor/golang.org/x/net/html/parse.go
-@@ -1031,7 +1031,7 @@ func inBodyIM(p *parser) bool {
- 			if p.tok.DataAtom == a.Input {
- 				for _, t := range p.tok.Attr {
- 					if t.Key == "type" {
--						if strings.ToLower(t.Val) == "hidden" {
-+						if strings.EqualFold(t.Val, "hidden") {
- 							// Skip setting framesetOK = false
- 							return true
- 						}
-@@ -1459,7 +1459,7 @@ func inTableIM(p *parser) bool {
- 			return inHeadIM(p)
- 		case a.Input:
- 			for _, t := range p.tok.Attr {
--				if t.Key == "type" && strings.ToLower(t.Val) == "hidden" {
-+				if t.Key == "type" && strings.EqualFold(t.Val, "hidden") {
- 					p.addElement()
- 					p.oe.pop()
- 					return true
--- 
-2.39.4
-
diff --git a/SPECS/gh/CVE-2024-53858.nopatch b/SPECS/gh/CVE-2024-53858.nopatch
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/SPECS/gh/CVE-2024-53859.patch b/SPECS/gh/CVE-2024-53859.patch
deleted file mode 100644
index 4f4d9284ae..0000000000
--- a/SPECS/gh/CVE-2024-53859.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From 5d6079f8ad16f553cdaea1d56fedcb4a3a1db082 Mon Sep 17 00:00:00 2001
-From: William Martin 
-Date: Thu, 31 Oct 2024 14:07:48 +0100
-Subject: [PATCH] Fix token exposure for non-gh hosts in codespaces
-
-This commit introduces a fix for `GITHUB_TOKEN` being exposed to non-github hosts while in a codespace. We no longer return the `GITHUB_TOKEN` for any host except github.com and github.localhost while in a codespace (while the env var `CODESPACES` is `true`).
-
-This commit also changes how tokens are returned when no oAuth token is found in a config. Previously, an empty string and the `oauthToken` source was returned. Now, we return an empty string and the `defaultSource` source. The intention behind this change is to make more logical sense by not returning an `oauthToken` source when we didn't get any token. It's also worth mentioning that this change also improves our test coverage - all lines in `tokenForHost` are now covered by tests, and we don't have unreachable code.
-
-Co-authored-by: Kynan Ware <47394200+BagToad@users.noreply.github.com>
-
-Modified patch to apply to AzureLinux
-Modified-by: Sandeep Karambelkar 
----
- pkg/auth/auth.go      | 27 ++++++++----
- 1 file changed, 91 insertions(+), 33 deletions(-)
-
-diff --git a/vendor/github.com/cli/go-gh/v2/pkg/auth/auth.go b/vendor/github.com/cli/go-gh/v2/pkg/auth/auth.go
-index a903736..4378e75 100644
---- a/vendor/github.com/cli/go-gh/v2/pkg/auth/auth.go
-+++ b/vendor/github.com/cli/go-gh/v2/pkg/auth/auth.go
-@@ -63,6 +63,15 @@ func TokenFromEnvOrConfig(host string) (string, string) {
-
- func tokenForHost(cfg *config.Config, host string) (string, string) {
- 	host = NormalizeHostname(host)
-+
-+	if isCodespaces, _ := strconv.ParseBool(os.Getenv(codespaces)); isCodespaces {
-+		if host == github || host == localhost {
-+			if token := os.Getenv(githubToken); token != "" {
-+				return token, githubToken
-+			}
-+		}
-+	}
-+
- 	if IsEnterprise(host) {
- 		if token := os.Getenv(ghEnterpriseToken); token != "" {
- 			return token, ghEnterpriseToken
-@@ -70,25 +79,25 @@ func tokenForHost(cfg *config.Config, host string) (string, string) {
- 		if token := os.Getenv(githubEnterpriseToken); token != "" {
- 			return token, githubEnterpriseToken
- 		}
--		if isCodespaces, _ := strconv.ParseBool(os.Getenv(codespaces)); isCodespaces {
--			if token := os.Getenv(githubToken); token != "" {
--				return token, githubToken
--			}
--		}
- 		if cfg != nil {
--			token, _ := cfg.Get([]string{hostsKey, host, oauthToken})
--			return token, oauthToken
-+			if token, _ := cfg.Get([]string{hostsKey, host, oauthToken}); token != "" {
-+				return token, oauthToken
-+			}
- 		}
-+		return "", defaultSource
- 	}
-+
- 	if token := os.Getenv(ghToken); token != "" {
- 		return token, ghToken
- 	}
- 	if token := os.Getenv(githubToken); token != "" {
- 		return token, githubToken
- 	}
-+
- 	if cfg != nil {
--		token, _ := cfg.Get([]string{hostsKey, host, oauthToken})
--		return token, oauthToken
-+		if token, _ := cfg.Get([]string{hostsKey, host, oauthToken}); token != "" {
-+			return token, oauthToken
-+		}
- 	}
- 	return "", defaultSource
- }
diff --git a/SPECS/gh/CVE-2024-54132.patch b/SPECS/gh/CVE-2024-54132.patch
deleted file mode 100644
index a32a42eb48..0000000000
--- a/SPECS/gh/CVE-2024-54132.patch
+++ /dev/null
@@ -1,1349 +0,0 @@
-From 8da27d2c8ac8b781cf34a5e04ed57cfe4b68fa55 Mon Sep 17 00:00:00 2001
-From: Andy Feller 
-Date: Tue, 19 Nov 2024 17:55:18 -0500
-Subject: [PATCH 1/5] Second attempt to address exploit
-
-This builds off suggestion to reuse logic used already within `gh run download` for detecting path traversals.
-
-This largely works but runs into an issue where detection logic doesn't handle non-separated traversal.
----
- pkg/cmd/run/download/download.go      |   5 ++
- pkg/cmd/run/download/download_test.go | 102 ++++++++++++++++++++++++++
- pkg/cmd/run/download/zip.go           |   3 +
- 3 files changed, 110 insertions(+)
-
-diff --git a/pkg/cmd/run/download/download.go b/pkg/cmd/run/download/download.go
-index 99ec45bbeec..168cb6fcc8c 100644
---- a/pkg/cmd/run/download/download.go
-+++ b/pkg/cmd/run/download/download.go
-@@ -169,6 +169,11 @@ func runDownload(opts *DownloadOptions) error {
- 		if len(wantPatterns) != 0 || len(wantNames) != 1 {
- 			destDir = filepath.Join(destDir, a.Name)
- 		}
-+
-+		if !filepathDescendsFrom(destDir, opts.DestinationDir) {
-+			return fmt.Errorf("error downloading %s: would result in path traversal", a.Name)
-+		}
-+
- 		err := opts.Platform.Download(a.DownloadURL, destDir)
- 		if err != nil {
- 			return fmt.Errorf("error downloading %s: %w", a.Name, err)
-diff --git a/pkg/cmd/run/download/download_test.go b/pkg/cmd/run/download/download_test.go
-index 3c1c8f2d862..f07d661289f 100644
---- a/pkg/cmd/run/download/download_test.go
-+++ b/pkg/cmd/run/download/download_test.go
-@@ -289,6 +289,108 @@ func Test_runDownload(t *testing.T) {
- 					})
- 			},
- 		},
-+		{
-+			name: "given artifact name contains `..`, verify an error about path traversal is returned",
-+			opts: DownloadOptions{
-+				RunID:          "2345",
-+				DestinationDir: ".",
-+			},
-+			mockAPI: func(p *mockPlatform) {
-+				p.On("List", "2345").Return([]shared.Artifact{
-+					{
-+						Name:        "..",
-+						DownloadURL: "http://download.com/artifact1.zip",
-+						Expired:     false,
-+					},
-+				}, nil)
-+			},
-+			wantErr: "error downloading ..: would result in path traversal",
-+		},
-+		{
-+			name: "given artifact name contains `..`, verify an error about path traversal is returned",
-+			opts: DownloadOptions{
-+				RunID:          "2345",
-+				DestinationDir: "imaginary-dir",
-+			},
-+			mockAPI: func(p *mockPlatform) {
-+				p.On("List", "2345").Return([]shared.Artifact{
-+					{
-+						Name:        "..",
-+						DownloadURL: "http://download.com/artifact1.zip",
-+						Expired:     false,
-+					},
-+				}, nil)
-+			},
-+			wantErr: "error downloading ..: would result in path traversal",
-+		},
-+		{
-+			name: "given artifact name contains `../etc/passwd`, verify an error about path traversal is returned",
-+			opts: DownloadOptions{
-+				RunID:          "2345",
-+				DestinationDir: ".",
-+			},
-+			mockAPI: func(p *mockPlatform) {
-+				p.On("List", "2345").Return([]shared.Artifact{
-+					{
-+						Name:        "../etc/passwd",
-+						DownloadURL: "http://download.com/artifact1.zip",
-+						Expired:     false,
-+					},
-+				}, nil)
-+			},
-+			wantErr: "error downloading ../etc/passwd: would result in path traversal",
-+		},
-+		{
-+			name: "given artifact name contains `../etc/passwd`, verify an error about path traversal is returned",
-+			opts: DownloadOptions{
-+				RunID:          "2345",
-+				DestinationDir: "imaginary-dir",
-+			},
-+			mockAPI: func(p *mockPlatform) {
-+				p.On("List", "2345").Return([]shared.Artifact{
-+					{
-+						Name:        "../etc/passwd",
-+						DownloadURL: "http://download.com/artifact1.zip",
-+						Expired:     false,
-+					},
-+				}, nil)
-+			},
-+			wantErr: "error downloading ../etc/passwd: would result in path traversal",
-+		},
-+		{
-+			name: "given artifact name contains `../../etc/passwd`, verify an error about path traversal is returned",
-+			opts: DownloadOptions{
-+				RunID:          "2345",
-+				DestinationDir: ".",
-+			},
-+			mockAPI: func(p *mockPlatform) {
-+				p.On("List", "2345").Return([]shared.Artifact{
-+					{
-+						Name:        "../../etc/passwd",
-+						DownloadURL: "http://download.com/artifact1.zip",
-+						Expired:     false,
-+					},
-+				}, nil)
-+			},
-+			wantErr: "error downloading ../../etc/passwd: would result in path traversal",
-+		},
-+		{
-+			name: "given artifact name contains `../../etc/passwd`, verify an error about path traversal is returned",
-+			opts: DownloadOptions{
-+				RunID:          "2345",
-+				DestinationDir: "imaginary-dir",
-+			},
-+			mockAPI: func(p *mockPlatform) {
-+				p.On("List", "2345").Return([]shared.Artifact{
-+					{
-+						Name:        "../../etc/passwd",
-+						DownloadURL: "http://download.com/artifact1.zip",
-+						Expired:     false,
-+					},
-+				}, nil)
-+			},
-+			wantErr: "error downloading ../../etc/passwd: would result in path traversal",
-+		},
- 	}
- 	for _, tt := range tests {
- 		t.Run(tt.name, func(t *testing.T) {
-diff --git a/pkg/cmd/run/download/zip.go b/pkg/cmd/run/download/zip.go
-index ab5723e9468..f6a27afdd66 100644
---- a/pkg/cmd/run/download/zip.go
-+++ b/pkg/cmd/run/download/zip.go
-@@ -73,6 +73,9 @@ func getPerm(m os.FileMode) os.FileMode {
- func filepathDescendsFrom(p, dir string) bool {
- 	p = filepath.Clean(p)
- 	dir = filepath.Clean(dir)
-+	if dir == "." && p == ".." {
-+		return false
-+	}
- 	if dir == "." && !filepath.IsAbs(p) {
- 		return !strings.HasPrefix(p, ".."+string(filepath.Separator))
- 	}
-
-From 83cf41155646380d3df4037d3f2ac683147f194a Mon Sep 17 00:00:00 2001
-From: Tyler McGoffin 
-Date: Tue, 19 Nov 2024 16:08:31 -0800
-Subject: [PATCH 2/5] Improve test names so there is no repetition
-
----
- pkg/cmd/run/download/download_test.go | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
-
-diff --git a/pkg/cmd/run/download/download_test.go b/pkg/cmd/run/download/download_test.go
-index f07d661289f..fb445ccd4e9 100644
---- a/pkg/cmd/run/download/download_test.go
-+++ b/pkg/cmd/run/download/download_test.go
-@@ -290,7 +290,7 @@ func Test_runDownload(t *testing.T) {
- 			},
- 		},
- 		{
--			name: "given artifact name contains `..`, verify an error about path traversal is returned",
-+			name: "given artifact name contains `..` and the DestinationDir is `.`, verify an error about path traversal is returned",
- 			opts: DownloadOptions{
- 				RunID:          "2345",
- 				DestinationDir: ".",
-@@ -307,7 +307,7 @@ func Test_runDownload(t *testing.T) {
- 			wantErr: "error downloading ..: would result in path traversal",
- 		},
- 		{
--			name: "given artifact name contains `..`, verify an error about path traversal is returned",
-+			name: "given artifact name contains `..` and the DestinationDir is `imaginary-dir`, verify an error about path traversal is returned",
- 			opts: DownloadOptions{
- 				RunID:          "2345",
- 				DestinationDir: "imaginary-dir",
-@@ -324,7 +324,7 @@ func Test_runDownload(t *testing.T) {
- 			wantErr: "error downloading ..: would result in path traversal",
- 		},
- 		{
--			name: "given artifact name contains `../etc/passwd`, verify an error about path traversal is returned",
-+			name: "given artifact name contains `../etc/passwd` and the DestinationDir is `.`, verify an error about path traversal is returned",
- 			opts: DownloadOptions{
- 				RunID:          "2345",
- 				DestinationDir: ".",
-@@ -341,7 +341,7 @@ func Test_runDownload(t *testing.T) {
- 			wantErr: "error downloading ../etc/passwd: would result in path traversal",
- 		},
- 		{
--			name: "given artifact name contains `../etc/passwd`, verify an error about path traversal is returned",
-+			name: "given artifact name contains `../etc/passwd` and the DestinationDir is `imaginary-dir`, verify an error about path traversal is returned",
- 			opts: DownloadOptions{
- 				RunID:          "2345",
- 				DestinationDir: "imaginary-dir",
-@@ -358,7 +358,7 @@ func Test_runDownload(t *testing.T) {
- 			wantErr: "error downloading ../etc/passwd: would result in path traversal",
- 		},
- 		{
--			name: "given artifact name contains `../../etc/passwd`, verify an error about path traversal is returned",
-+			name: "given artifact name contains `../../etc/passwd` and the DestinationDir is `.`, verify an error about path traversal is returned",
- 			opts: DownloadOptions{
- 				RunID:          "2345",
- 				DestinationDir: ".",
-@@ -375,7 +375,7 @@ func Test_runDownload(t *testing.T) {
- 			wantErr: "error downloading ../../etc/passwd: would result in path traversal",
- 		},
- 		{
--			name: "given artifact name contains `../../etc/passwd`, verify an error about path traversal is returned",
-+			name: "given artifact name contains `../../etc/passwd` and the DestinationDir is `imaginary-dir`, verify an error about path traversal is returned",
- 			opts: DownloadOptions{
- 				RunID:          "2345",
- 				DestinationDir: "imaginary-dir",
-
-From e7c5706336d851b39930c7315132f89b25e77d4d Mon Sep 17 00:00:00 2001
-From: Andy Feller 
-Date: Thu, 21 Nov 2024 17:02:20 -0500
-Subject: [PATCH 3/5] Refactor download testing, simpler file descends
-
-This incorporates the work done by @williammartin to improve reasoning about `gh run download` behavior through testing while verifying a simpler solution to checking if a path is contained within a directory.
----
- pkg/cmd/run/download/download.go      |   1 +
- pkg/cmd/run/download/download_test.go | 524 +++++++++++++++-----------
- pkg/cmd/run/download/zip.go           |  14 +-
- 3 files changed, 309 insertions(+), 230 deletions(-)
-
-diff --git a/pkg/cmd/run/download/download.go b/pkg/cmd/run/download/download.go
-index 168cb6fcc8c..5bda2ba3da0 100644
---- a/pkg/cmd/run/download/download.go
-+++ b/pkg/cmd/run/download/download.go
-@@ -166,6 +166,7 @@ func runDownload(opts *DownloadOptions) error {
- 			}
- 		}
- 		destDir := opts.DestinationDir
-+		// Why do we only include the artifact name in the destination directory if there are multiple?
- 		if len(wantPatterns) != 0 || len(wantNames) != 1 {
- 			destDir = filepath.Join(destDir, a.Name)
- 		}
-diff --git a/pkg/cmd/run/download/download_test.go b/pkg/cmd/run/download/download_test.go
-index fb445ccd4e9..0df94ccf498 100644
---- a/pkg/cmd/run/download/download_test.go
-+++ b/pkg/cmd/run/download/download_test.go
-@@ -2,8 +2,11 @@ package download
- 
- import (
- 	"bytes"
-+	"errors"
-+	"fmt"
- 	"io"
- 	"net/http"
-+	"os"
- 	"path/filepath"
- 	"testing"
- 
-@@ -14,7 +17,6 @@ import (
- 	"github.com/cli/cli/v2/pkg/iostreams"
- 	"github.com/google/shlex"
- 	"github.com/stretchr/testify/assert"
--	"github.com/stretchr/testify/mock"
- 	"github.com/stretchr/testify/require"
- )
- 
-@@ -143,261 +145,350 @@ func Test_NewCmdDownload(t *testing.T) {
- 	}
- }
- 
-+type testArtifact struct {
-+	artifact shared.Artifact
-+	files    []string
-+}
-+
-+type fakePlatform struct {
-+	runArtifacts map[string][]testArtifact
-+}
-+
-+func (f *fakePlatform) List(runID string) ([]shared.Artifact, error) {
-+	var runIds []string
-+	if runID != "" {
-+		runIds = []string{runID}
-+	} else {
-+		for k := range f.runArtifacts {
-+			runIds = append(runIds, k)
-+		}
-+	}
-+
-+	var artifacts []shared.Artifact
-+	for _, id := range runIds {
-+		for _, a := range f.runArtifacts[id] {
-+			artifacts = append(artifacts, a.artifact)
-+		}
-+	}
-+
-+	return artifacts, nil
-+}
-+
-+func (f *fakePlatform) Download(url string, dir string) error {
-+	if err := os.MkdirAll(dir, 0755); err != nil {
-+		return err
-+	}
-+	// Now to be consistent, we find the artifact with the provided URL.
-+	// It's a bit janky to iterate the runs, to find the right artifact
-+	// rather than keying directly to it, but it allows the setup of the
-+	// fake platform to be declarative rather than imperative.
-+	// Think fakePlatform { artifacts: ... } rather than fakePlatform.makeArtifactAvailable()
-+	for _, testArtifacts := range f.runArtifacts {
-+		for _, testArtifact := range testArtifacts {
-+			if testArtifact.artifact.DownloadURL == url {
-+				for _, file := range testArtifact.files {
-+					path := filepath.Join(dir, file)
-+					return os.WriteFile(path, []byte{}, 0600)
-+				}
-+			}
-+		}
-+	}
-+
-+	return errors.New("no artifact matches the provided URL")
-+}
-+
- func Test_runDownload(t *testing.T) {
- 	tests := []struct {
--		name        string
--		opts        DownloadOptions
--		mockAPI     func(*mockPlatform)
--		promptStubs func(*prompter.MockPrompter)
--		wantErr     string
-+		name          string
-+		opts          DownloadOptions
-+		platform      *fakePlatform
-+		promptStubs   func(*prompter.MockPrompter)
-+		expectedFiles []string
-+		wantErr       string
- 	}{
- 		{
- 			name: "download non-expired",
- 			opts: DownloadOptions{
- 				RunID:          "2345",
- 				DestinationDir: "./tmp",
--				Names:          []string(nil),
- 			},
--			mockAPI: func(p *mockPlatform) {
--				p.On("List", "2345").Return([]shared.Artifact{
--					{
--						Name:        "artifact-1",
--						DownloadURL: "http://download.com/artifact1.zip",
--						Expired:     false,
--					},
--					{
--						Name:        "expired-artifact",
--						DownloadURL: "http://download.com/expired.zip",
--						Expired:     true,
-+			platform: &fakePlatform{
-+				runArtifacts: map[string][]testArtifact{
-+					"2345": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-1",
-+								DownloadURL: "http://download.com/artifact1.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-1-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "expired-artifact",
-+								DownloadURL: "http://download.com/expired.zip",
-+								Expired:     true,
-+							},
-+							files: []string{
-+								"expired",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-2",
-+								DownloadURL: "http://download.com/artifact2.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-2-file",
-+							},
-+						},
- 					},
--					{
--						Name:        "artifact-2",
--						DownloadURL: "http://download.com/artifact2.zip",
--						Expired:     false,
--					},
--				}, nil)
--				p.On("Download", "http://download.com/artifact1.zip", filepath.FromSlash("tmp/artifact-1")).Return(nil)
--				p.On("Download", "http://download.com/artifact2.zip", filepath.FromSlash("tmp/artifact-2")).Return(nil)
-+				},
-+			},
-+			expectedFiles: []string{
-+				filepath.Join("artifact-1", "artifact-1-file"),
-+				filepath.Join("artifact-2", "artifact-2-file"),
- 			},
- 		},
- 		{
--			name: "no valid artifacts",
-+			name: "all artifacts are expired",
- 			opts: DownloadOptions{
--				RunID:          "2345",
--				DestinationDir: ".",
--				Names:          []string(nil),
-+				RunID: "2345",
- 			},
--			mockAPI: func(p *mockPlatform) {
--				p.On("List", "2345").Return([]shared.Artifact{
--					{
--						Name:        "artifact-1",
--						DownloadURL: "http://download.com/artifact1.zip",
--						Expired:     true,
-+			platform: &fakePlatform{
-+				runArtifacts: map[string][]testArtifact{
-+					"2345": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-1",
-+								DownloadURL: "http://download.com/artifact1.zip",
-+								Expired:     true,
-+							},
-+							files: []string{
-+								"artifact-1-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-2",
-+								DownloadURL: "http://download.com/artifact2.zip",
-+								Expired:     true,
-+							},
-+							files: []string{
-+								"artifact-2-file",
-+							},
-+						},
- 					},
--					{
--						Name:        "artifact-2",
--						DownloadURL: "http://download.com/artifact2.zip",
--						Expired:     true,
--					},
--				}, nil)
-+				},
- 			},
--			wantErr: "no valid artifacts found to download",
-+			expectedFiles: []string{},
-+			wantErr:       "no valid artifacts found to download",
- 		},
- 		{
- 			name: "no name matches",
- 			opts: DownloadOptions{
--				RunID:          "2345",
--				DestinationDir: ".",
--				Names:          []string{"artifact-3"},
-+				RunID: "2345",
-+				Names: []string{"artifact-3"},
- 			},
--			mockAPI: func(p *mockPlatform) {
--				p.On("List", "2345").Return([]shared.Artifact{
--					{
--						Name:        "artifact-1",
--						DownloadURL: "http://download.com/artifact1.zip",
--						Expired:     false,
--					},
--					{
--						Name:        "artifact-2",
--						DownloadURL: "http://download.com/artifact2.zip",
--						Expired:     false,
-+			platform: &fakePlatform{
-+				runArtifacts: map[string][]testArtifact{
-+					"2345": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-1",
-+								DownloadURL: "http://download.com/artifact1.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-1-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-2",
-+								DownloadURL: "http://download.com/artifact2.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-2-file",
-+							},
-+						},
- 					},
--				}, nil)
-+				},
- 			},
--			wantErr: "no artifact matches any of the names or patterns provided",
-+			expectedFiles: []string{},
-+			wantErr:       "no artifact matches any of the names or patterns provided",
- 		},
- 		{
- 			name: "no pattern matches",
- 			opts: DownloadOptions{
--				RunID:          "2345",
--				DestinationDir: ".",
--				FilePatterns:   []string{"artifiction-*"},
--			},
--			mockAPI: func(p *mockPlatform) {
--				p.On("List", "2345").Return([]shared.Artifact{
--					{
--						Name:        "artifact-1",
--						DownloadURL: "http://download.com/artifact1.zip",
--						Expired:     false,
--					},
--					{
--						Name:        "artifact-2",
--						DownloadURL: "http://download.com/artifact2.zip",
--						Expired:     false,
--					},
--				}, nil)
--			},
--			wantErr: "no artifact matches any of the names or patterns provided",
--		},
--		{
--			name: "prompt to select artifact",
--			opts: DownloadOptions{
--				RunID:          "",
--				DoPrompt:       true,
--				DestinationDir: ".",
--				Names:          []string(nil),
-+				RunID:        "2345",
-+				FilePatterns: []string{"artifiction-*"},
- 			},
--			mockAPI: func(p *mockPlatform) {
--				p.On("List", "").Return([]shared.Artifact{
--					{
--						Name:        "artifact-1",
--						DownloadURL: "http://download.com/artifact1.zip",
--						Expired:     false,
--					},
--					{
--						Name:        "expired-artifact",
--						DownloadURL: "http://download.com/expired.zip",
--						Expired:     true,
-+			platform: &fakePlatform{
-+				runArtifacts: map[string][]testArtifact{
-+					"2345": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-1",
-+								DownloadURL: "http://download.com/artifact1.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-1-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-2",
-+								DownloadURL: "http://download.com/artifact2.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-2-file",
-+							},
-+						},
- 					},
--					{
--						Name:        "artifact-2",
--						DownloadURL: "http://download.com/artifact2.zip",
--						Expired:     false,
--					},
--					{
--						Name:        "artifact-2",
--						DownloadURL: "http://download.com/artifact2.also.zip",
--						Expired:     false,
--					},
--				}, nil)
--				p.On("Download", "http://download.com/artifact2.zip", ".").Return(nil)
--			},
--			promptStubs: func(pm *prompter.MockPrompter) {
--				pm.RegisterMultiSelect("Select artifacts to download:", nil, []string{"artifact-1", "artifact-2"},
--					func(_ string, _, opts []string) ([]int, error) {
--						return []int{1}, nil
--					})
-+				},
- 			},
-+			expectedFiles: []string{},
-+			wantErr:       "no artifact matches any of the names or patterns provided",
- 		},
- 		{
--			name: "given artifact name contains `..` and the DestinationDir is `.`, verify an error about path traversal is returned",
-+			name: "avoid redownloading files of the same name",
- 			opts: DownloadOptions{
--				RunID:          "2345",
--				DestinationDir: ".",
-+				RunID: "2345",
- 			},
--			mockAPI: func(p *mockPlatform) {
--				p.On("List", "2345").Return([]shared.Artifact{
--					{
--						Name:        "..",
--						DownloadURL: "http://download.com/artifact1.zip",
--						Expired:     false,
-+			platform: &fakePlatform{
-+				runArtifacts: map[string][]testArtifact{
-+					"2345": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-1",
-+								DownloadURL: "http://download.com/artifact1.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-1-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-1",
-+								DownloadURL: "http://download.com/artifact2.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-2-file",
-+							},
-+						},
- 					},
--				}, nil)
--			},
--			wantErr: "error downloading ..: would result in path traversal",
--		},
--		{
--			name: "given artifact name contains `..` and the DestinationDir is `imaginary-dir`, verify an error about path traversal is returned",
--			opts: DownloadOptions{
--				RunID:          "2345",
--				DestinationDir: "imaginary-dir",
-+				},
- 			},
--			mockAPI: func(p *mockPlatform) {
--				p.On("List", "2345").Return([]shared.Artifact{
--					{
--						Name:        "..",
--						DownloadURL: "http://download.com/artifact1.zip",
--						Expired:     false,
--					},
--				}, nil)
-+			expectedFiles: []string{
-+				filepath.Join("artifact-1", "artifact-1-file"),
- 			},
--			wantErr: "error downloading ..: would result in path traversal",
- 		},
- 		{
--			name: "given artifact name contains `../etc/passwd` and the DestinationDir is `.`, verify an error about path traversal is returned",
-+			name: "prompt to select artifact",
- 			opts: DownloadOptions{
--				RunID:          "2345",
--				DestinationDir: ".",
-+				RunID:    "",
-+				DoPrompt: true,
-+				Names:    []string(nil),
- 			},
--			mockAPI: func(p *mockPlatform) {
--				p.On("List", "2345").Return([]shared.Artifact{
--					{
--						Name:        "../etc/passwd",
--						DownloadURL: "http://download.com/artifact1.zip",
--						Expired:     false,
-+			platform: &fakePlatform{
-+				runArtifacts: map[string][]testArtifact{
-+					"2345": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-1",
-+								DownloadURL: "http://download.com/artifact1.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-1-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "expired-artifact",
-+								DownloadURL: "http://download.com/expired.zip",
-+								Expired:     true,
-+							},
-+							files: []string{
-+								"expired",
-+							},
-+						},
- 					},
--				}, nil)
--			},
--			wantErr: "error downloading ../etc/passwd: would result in path traversal",
--		},
--		{
--			name: "given artifact name contains `../etc/passwd` and the DestinationDir is `imaginary-dir`, verify an error about path traversal is returned",
--			opts: DownloadOptions{
--				RunID:          "2345",
--				DestinationDir: "imaginary-dir",
--			},
--			mockAPI: func(p *mockPlatform) {
--				p.On("List", "2345").Return([]shared.Artifact{
--					{
--						Name:        "../etc/passwd",
--						DownloadURL: "http://download.com/artifact1.zip",
--						Expired:     false,
-+					"6789": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-2",
-+								DownloadURL: "http://download.com/artifact2.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-2-file",
-+							},
-+						},
- 					},
--				}, nil)
-+				},
- 			},
--			wantErr: "error downloading ../etc/passwd: would result in path traversal",
--		},
--		{
--			name: "given artifact name contains `../../etc/passwd` and the DestinationDir is `.`, verify an error about path traversal is returned",
--			opts: DownloadOptions{
--				RunID:          "2345",
--				DestinationDir: ".",
-+			promptStubs: func(pm *prompter.MockPrompter) {
-+				pm.RegisterMultiSelect("Select artifacts to download:", nil, []string{"artifact-1", "artifact-2"},
-+					func(_ string, _, opts []string) ([]int, error) {
-+						for i, o := range opts {
-+							if o == "artifact-2" {
-+								return []int{i}, nil
-+							}
-+						}
-+						return nil, fmt.Errorf("no artifact-2 found in %v", opts)
-+					})
- 			},
--			mockAPI: func(p *mockPlatform) {
--				p.On("List", "2345").Return([]shared.Artifact{
--					{
--						Name:        "../../etc/passwd",
--						DownloadURL: "http://download.com/artifact1.zip",
--						Expired:     false,
--					},
--				}, nil)
-+			expectedFiles: []string{
-+				filepath.Join("artifact-2-file"),
- 			},
--			wantErr: "error downloading ../../etc/passwd: would result in path traversal",
- 		},
- 		{
--			name: "given artifact name contains `../../etc/passwd` and the DestinationDir is `imaginary-dir`, verify an error about path traversal is returned",
-+			name: "handling artifact name with path traversal exploit",
- 			opts: DownloadOptions{
--				RunID:          "2345",
--				DestinationDir: "imaginary-dir",
-+				RunID: "2345",
- 			},
--			mockAPI: func(p *mockPlatform) {
--				p.On("List", "2345").Return([]shared.Artifact{
--					{
--						Name:        "../../etc/passwd",
--						DownloadURL: "http://download.com/artifact1.zip",
--						Expired:     false,
-+			platform: &fakePlatform{
-+				runArtifacts: map[string][]testArtifact{
-+					"2345": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "..",
-+								DownloadURL: "http://download.com/artifact1.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"etc/passwd",
-+							},
-+						},
- 					},
--				}, nil)
-+				},
- 			},
--			wantErr: "error downloading ../../etc/passwd: would result in path traversal",
-+			expectedFiles: []string{},
-+			wantErr:       "error downloading ..: would result in path traversal",
- 		},
- 	}
- 	for _, tt := range tests {
- 		t.Run(tt.name, func(t *testing.T) {
- 			opts := &tt.opts
-+			if opts.DestinationDir == "" {
-+				opts.DestinationDir = t.TempDir()
-+			} else {
-+				opts.DestinationDir = filepath.Join(t.TempDir(), opts.DestinationDir)
-+			}
-+
- 			ios, _, stdout, stderr := iostreams.Test()
- 			opts.IO = ios
--			opts.Platform = newMockPlatform(t, tt.mockAPI)
-+			opts.Platform = tt.platform
- 
- 			pm := prompter.NewMockPrompter(t)
- 			opts.Prompter = pm
-@@ -412,34 +503,31 @@ func Test_runDownload(t *testing.T) {
- 				require.NoError(t, err)
- 			}
- 
-+			// Check that the exact number of files exist
-+			require.Equal(t, len(tt.expectedFiles), countFilesInDirRecursively(t, opts.DestinationDir))
-+
-+			// Then check that the exact files are correct
-+			for _, name := range tt.expectedFiles {
-+				require.FileExists(t, filepath.Join(opts.DestinationDir, name))
-+			}
-+
- 			assert.Equal(t, "", stdout.String())
- 			assert.Equal(t, "", stderr.String())
- 		})
- 	}
- }
- 
--type mockPlatform struct {
--	mock.Mock
--}
-+func countFilesInDirRecursively(t *testing.T, dir string) int {
-+	t.Helper()
- 
--func newMockPlatform(t *testing.T, config func(*mockPlatform)) *mockPlatform {
--	m := &mockPlatform{}
--	m.Test(t)
--	t.Cleanup(func() {
--		m.AssertExpectations(t)
--	})
--	if config != nil {
--		config(m)
--	}
--	return m
--}
--
--func (p *mockPlatform) List(runID string) ([]shared.Artifact, error) {
--	args := p.Called(runID)
--	return args.Get(0).([]shared.Artifact), args.Error(1)
--}
-+	count := 0
-+	require.NoError(t, filepath.Walk(dir, func(_ string, info os.FileInfo, err error) error {
-+		require.NoError(t, err)
-+		if !info.IsDir() {
-+			count++
-+		}
-+		return nil
-+	}))
- 
--func (p *mockPlatform) Download(url string, dir string) error {
--	args := p.Called(url, dir)
--	return args.Error(0)
-+	return count
- }
-diff --git a/pkg/cmd/run/download/zip.go b/pkg/cmd/run/download/zip.go
-index f6a27afdd66..52994199a9b 100644
---- a/pkg/cmd/run/download/zip.go
-+++ b/pkg/cmd/run/download/zip.go
-@@ -71,16 +71,6 @@ func getPerm(m os.FileMode) os.FileMode {
- }
- 
- func filepathDescendsFrom(p, dir string) bool {
--	p = filepath.Clean(p)
--	dir = filepath.Clean(dir)
--	if dir == "." && p == ".." {
--		return false
--	}
--	if dir == "." && !filepath.IsAbs(p) {
--		return !strings.HasPrefix(p, ".."+string(filepath.Separator))
--	}
--	if !strings.HasSuffix(dir, string(filepath.Separator)) {
--		dir += string(filepath.Separator)
--	}
--	return strings.HasPrefix(p, dir)
-+	relativePath, _ := filepath.Rel(dir, p)
-+	return !strings.HasPrefix(relativePath, "..")
- }
-
-From cdfc12caf52754ea4026d5338a56ad4e6f822105 Mon Sep 17 00:00:00 2001
-From: Andy Feller 
-Date: Fri, 22 Nov 2024 15:26:11 -0500
-Subject: [PATCH 4/5] Expand logic and tests to handle edge cases
-
-This commit expands filepathDescendsFrom(string, string) to handle edge cases such as mixing absolute and relative paths or artifact name edge cases.
-
-Additionally, tests for filepathDescendsFrom() and downloadrun() have been expanded to verify additional use cases.
----
- pkg/cmd/run/download/download.go      |  11 +-
- pkg/cmd/run/download/download_test.go | 189 +++++++++++++++++++++++++-
- pkg/cmd/run/download/zip.go           |  21 ++-
- pkg/cmd/run/download/zip_test.go      |  80 +++++++++++
- 4 files changed, 297 insertions(+), 4 deletions(-)
-
-diff --git a/pkg/cmd/run/download/download.go b/pkg/cmd/run/download/download.go
-index 5bda2ba3da0..04ce7434051 100644
---- a/pkg/cmd/run/download/download.go
-+++ b/pkg/cmd/run/download/download.go
-@@ -166,8 +166,15 @@ func runDownload(opts *DownloadOptions) error {
- 			}
- 		}
- 		destDir := opts.DestinationDir
--		// Why do we only include the artifact name in the destination directory if there are multiple?
--		if len(wantPatterns) != 0 || len(wantNames) != 1 {
-+
-+		// Isolate the downloaded artifact file to avoid potential conflicts from other downloaded artifacts when:
-+		//
-+		// 1. len(wantPatterns) > 0: Any pattern can result in 2+ artifacts
-+		// 2. len(wantNames) == 0: User wants all artifacts regardless what they are named
-+		// 3. len(wantNames) > 1: User wants multiple, specific artifacts
-+		//
-+		// Otherwise if a single artifact is wanted, then the protective subdirectory is an unnecessary inconvenience.
-+		if len(wantPatterns) > 0 || len(wantNames) != 1 {
- 			destDir = filepath.Join(destDir, a.Name)
- 		}
- 
-diff --git a/pkg/cmd/run/download/download_test.go b/pkg/cmd/run/download/download_test.go
-index 0df94ccf498..aeab2027893 100644
---- a/pkg/cmd/run/download/download_test.go
-+++ b/pkg/cmd/run/download/download_test.go
-@@ -207,7 +207,7 @@ func Test_runDownload(t *testing.T) {
- 		wantErr       string
- 	}{
- 		{
--			name: "download non-expired",
-+			name: "download non-expired to relative directory",
- 			opts: DownloadOptions{
- 				RunID:          "2345",
- 				DestinationDir: "./tmp",
-@@ -253,6 +253,53 @@ func Test_runDownload(t *testing.T) {
- 				filepath.Join("artifact-2", "artifact-2-file"),
- 			},
- 		},
-+		{
-+			name: "download non-expired to absolute directory",
-+			opts: DownloadOptions{
-+				RunID:          "2345",
-+				DestinationDir: "/tmp",
-+			},
-+			platform: &fakePlatform{
-+				runArtifacts: map[string][]testArtifact{
-+					"2345": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-1",
-+								DownloadURL: "http://download.com/artifact1.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-1-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "expired-artifact",
-+								DownloadURL: "http://download.com/expired.zip",
-+								Expired:     true,
-+							},
-+							files: []string{
-+								"expired",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-2",
-+								DownloadURL: "http://download.com/artifact2.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-2-file",
-+							},
-+						},
-+					},
-+				},
-+			},
-+			expectedFiles: []string{
-+				filepath.Join("artifact-1", "artifact-1-file"),
-+				filepath.Join("artifact-2", "artifact-2-file"),
-+			},
-+		},
- 		{
- 			name: "all artifacts are expired",
- 			opts: DownloadOptions{
-@@ -322,6 +369,53 @@ func Test_runDownload(t *testing.T) {
- 			expectedFiles: []string{},
- 			wantErr:       "no artifact matches any of the names or patterns provided",
- 		},
-+		{
-+			name: "pattern matches",
-+			opts: DownloadOptions{
-+				RunID:        "2345",
-+				FilePatterns: []string{"artifact-*"},
-+			},
-+			platform: &fakePlatform{
-+				runArtifacts: map[string][]testArtifact{
-+					"2345": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-1",
-+								DownloadURL: "http://download.com/artifact1.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-1-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "non-artifact-2",
-+								DownloadURL: "http://download.com/non-artifact-2.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"non-artifact-2-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-3",
-+								DownloadURL: "http://download.com/artifact3.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-3-file",
-+							},
-+						},
-+					},
-+				},
-+			},
-+			expectedFiles: []string{
-+				filepath.Join("artifact-1", "artifact-1-file"),
-+				filepath.Join("artifact-3", "artifact-3-file"),
-+			},
-+		},
- 		{
- 			name: "no pattern matches",
- 			opts: DownloadOptions{
-@@ -357,6 +451,99 @@ func Test_runDownload(t *testing.T) {
- 			expectedFiles: []string{},
- 			wantErr:       "no artifact matches any of the names or patterns provided",
- 		},
-+		{
-+			name: "want specific single artifact",
-+			opts: DownloadOptions{
-+				RunID: "2345",
-+				Names: []string{"non-artifact-2"},
-+			},
-+			platform: &fakePlatform{
-+				runArtifacts: map[string][]testArtifact{
-+					"2345": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-1",
-+								DownloadURL: "http://download.com/artifact1.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-1-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "non-artifact-2",
-+								DownloadURL: "http://download.com/non-artifact-2.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"non-artifact-2-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-3",
-+								DownloadURL: "http://download.com/artifact3.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-3-file",
-+							},
-+						},
-+					},
-+				},
-+			},
-+			expectedFiles: []string{
-+				filepath.Join("non-artifact-2-file"),
-+			},
-+		},
-+		{
-+			name: "want specific multiple artifacts",
-+			opts: DownloadOptions{
-+				RunID: "2345",
-+				Names: []string{"artifact-1", "artifact-3"},
-+			},
-+			platform: &fakePlatform{
-+				runArtifacts: map[string][]testArtifact{
-+					"2345": {
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-1",
-+								DownloadURL: "http://download.com/artifact1.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-1-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "non-artifact-2",
-+								DownloadURL: "http://download.com/non-artifact-2.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"non-artifact-2-file",
-+							},
-+						},
-+						{
-+							artifact: shared.Artifact{
-+								Name:        "artifact-3",
-+								DownloadURL: "http://download.com/artifact3.zip",
-+								Expired:     false,
-+							},
-+							files: []string{
-+								"artifact-3-file",
-+							},
-+						},
-+					},
-+				},
-+			},
-+			expectedFiles: []string{
-+				filepath.Join("artifact-1", "artifact-1-file"),
-+				filepath.Join("artifact-3", "artifact-3-file"),
-+			},
-+		},
- 		{
- 			name: "avoid redownloading files of the same name",
- 			opts: DownloadOptions{
-diff --git a/pkg/cmd/run/download/zip.go b/pkg/cmd/run/download/zip.go
-index 52994199a9b..a68b75fd6b7 100644
---- a/pkg/cmd/run/download/zip.go
-+++ b/pkg/cmd/run/download/zip.go
-@@ -71,6 +71,25 @@ func getPerm(m os.FileMode) os.FileMode {
- }
- 
- func filepathDescendsFrom(p, dir string) bool {
--	relativePath, _ := filepath.Rel(dir, p)
-+	// Regardless of the logic below, `p` is never allowed to be current directory `.` or parent directory `..`
-+	// however we check explicitly here before filepath.Rel() which doesn't cover all cases.
-+	p = filepath.Clean(p)
-+
-+	if p == "." || p == ".." {
-+		return false
-+	}
-+
-+	// filepathDescendsFrom() takes advantage of filepath.Rel() to determine if `p` is descended from `dir`:
-+	//
-+	// 1. filepath.Rel() calculates a path to traversal from fictious `dir` to `p`.
-+	// 2. filepath.Rel() errors in a handful of cases where absolute and relative paths are compared as well as certain traversal edge cases
-+	//    For more information, https://github.com/golang/go/blob/00709919d09904b17cfe3bfeb35521cbd3fb04f8/src/path/filepath/path_test.go#L1510-L1515
-+	// 3. If the path to traverse `dir` to `p` requires `..`, then we know it is not descend from / contained in `dir`
-+	//
-+	// As-is, this function requires the caller to ensure `p` and `dir` are either 1) both relative or 2) both absolute.
-+	relativePath, err := filepath.Rel(dir, p)
-+	if err != nil {
-+		return false
-+	}
- 	return !strings.HasPrefix(relativePath, "..")
- }
-diff --git a/pkg/cmd/run/download/zip_test.go b/pkg/cmd/run/download/zip_test.go
-index ca401cdb9ed..b85122ec57a 100644
---- a/pkg/cmd/run/download/zip_test.go
-+++ b/pkg/cmd/run/download/zip_test.go
-@@ -130,6 +130,86 @@ func Test_filepathDescendsFrom(t *testing.T) {
- 			},
- 			want: false,
- 		},
-+		{
-+			name: "deny parent directory filename (`..`) escaping absolute directory",
-+			args: args{
-+				p:   filepath.FromSlash(".."),
-+				dir: filepath.FromSlash("/var/logs/"),
-+			},
-+			want: false,
-+		},
-+		{
-+			name: "deny parent directory filename (`..`) escaping current directory",
-+			args: args{
-+				p:   filepath.FromSlash(".."),
-+				dir: filepath.FromSlash("."),
-+			},
-+			want: false,
-+		},
-+		{
-+			name: "deny parent directory filename (`..`) escaping parent directory",
-+			args: args{
-+				p:   filepath.FromSlash(".."),
-+				dir: filepath.FromSlash(".."),
-+			},
-+			want: false,
-+		},
-+		{
-+			name: "deny parent directory filename (`..`) escaping relative directory",
-+			args: args{
-+				p:   filepath.FromSlash(".."),
-+				dir: filepath.FromSlash("relative-dir"),
-+			},
-+			want: false,
-+		},
-+		{
-+			name: "deny current directory filename (`.`) in absolute directory",
-+			args: args{
-+				p:   filepath.FromSlash("."),
-+				dir: filepath.FromSlash("/var/logs/"),
-+			},
-+			want: false,
-+		},
-+		{
-+			name: "deny current directory filename (`.`) in current directory",
-+			args: args{
-+				p:   filepath.FromSlash("."),
-+				dir: filepath.FromSlash("."),
-+			},
-+			want: false,
-+		},
-+		{
-+			name: "deny current directory filename (`.`) in parent directory",
-+			args: args{
-+				p:   filepath.FromSlash("."),
-+				dir: filepath.FromSlash(".."),
-+			},
-+			want: false,
-+		},
-+		{
-+			name: "deny current directory filename (`.`) in relative directory",
-+			args: args{
-+				p:   filepath.FromSlash("."),
-+				dir: filepath.FromSlash("relative-dir"),
-+			},
-+			want: false,
-+		},
-+		{
-+			name: "relative path, absolute dir",
-+			args: args{
-+				p:   filepath.FromSlash("whatever"),
-+				dir: filepath.FromSlash("/a/b/c"),
-+			},
-+			want: false,
-+		},
-+		{
-+			name: "absolute path, relative dir",
-+			args: args{
-+				p:   filepath.FromSlash("/a/b/c"),
-+				dir: filepath.FromSlash("whatever"),
-+			},
-+			want: false,
-+		},
- 	}
- 	for _, tt := range tests {
- 		t.Run(tt.name, func(t *testing.T) {
-
-From 8720479b0bfc95450abb2ba88489f2893e4838a9 Mon Sep 17 00:00:00 2001
-From: Andy Feller 
-Date: Tue, 3 Dec 2024 13:33:00 -0500
-Subject: [PATCH 5/5] Consolidate logic for isolating artifacts
-
----
- pkg/cmd/run/download/download.go | 34 ++++++++++++++++++++++----------
- 1 file changed, 24 insertions(+), 10 deletions(-)
-
-diff --git a/pkg/cmd/run/download/download.go b/pkg/cmd/run/download/download.go
-index 04ce7434051..8f25e84a228 100644
---- a/pkg/cmd/run/download/download.go
-+++ b/pkg/cmd/run/download/download.go
-@@ -151,8 +151,10 @@ func runDownload(opts *DownloadOptions) error {
- 	opts.IO.StartProgressIndicator()
- 	defer opts.IO.StopProgressIndicator()
- 
--	// track downloaded artifacts and avoid re-downloading any of the same name
-+	// track downloaded artifacts and avoid re-downloading any of the same name, isolate if multiple artifacts
- 	downloaded := set.NewStringSet()
-+	isolateArtifacts := isolateArtifacts(wantNames, wantPatterns)
-+
- 	for _, a := range artifacts {
- 		if a.Expired {
- 			continue
-@@ -165,16 +167,9 @@ func runDownload(opts *DownloadOptions) error {
- 				continue
- 			}
- 		}
--		destDir := opts.DestinationDir
- 
--		// Isolate the downloaded artifact file to avoid potential conflicts from other downloaded artifacts when:
--		//
--		// 1. len(wantPatterns) > 0: Any pattern can result in 2+ artifacts
--		// 2. len(wantNames) == 0: User wants all artifacts regardless what they are named
--		// 3. len(wantNames) > 1: User wants multiple, specific artifacts
--		//
--		// Otherwise if a single artifact is wanted, then the protective subdirectory is an unnecessary inconvenience.
--		if len(wantPatterns) > 0 || len(wantNames) != 1 {
-+		destDir := opts.DestinationDir
-+		if isolateArtifacts {
- 			destDir = filepath.Join(destDir, a.Name)
- 		}
- 
-@@ -196,6 +191,25 @@ func runDownload(opts *DownloadOptions) error {
- 	return nil
- }
- 
-+func isolateArtifacts(wantNames []string, wantPatterns []string) bool {
-+	if len(wantPatterns) > 0 {
-+		// Patterns can match multiple artifacts
-+		return true
-+	}
-+
-+	if len(wantNames) == 0 {
-+		// All artifacts wanted regardless what they are named
-+		return true
-+	}
-+
-+	if len(wantNames) > 1 {
-+		// Multiple, specific artifacts wanted
-+		return true
-+	}
-+
-+	return false
-+}
-+
- func matchAnyName(names []string, name string) bool {
- 	for _, n := range names {
- 		if name == n {
diff --git a/SPECS/gh/CVE-2025-22869.patch b/SPECS/gh/CVE-2025-22869.patch
deleted file mode 100644
index c0415fddb0..0000000000
--- a/SPECS/gh/CVE-2025-22869.patch
+++ /dev/null
@@ -1,140 +0,0 @@
-From 041b89a18f81265899e42e6801f830c101a96120 Mon Sep 17 00:00:00 2001
-From: Kanishk-Bansal 
-Date: Sun, 2 Mar 2025 13:46:00 +0000
-Subject: [PATCH] CVE-2025-22869
-
-Upstream Reference : https://github.com/golang/crypto/commit/7292932d45d55c7199324ab0027cc86e8198aa22
-
-ssh: limit the size of the internal packet queue while waiting for KEX
-
-In the SSH protocol, clients and servers execute the key exchange to
-generate one-time session keys used for encryption and authentication.
-The key exchange is performed initially after the connection is
-established and then periodically after a configurable amount of data.
-While a key exchange is in progress, we add the received packets to an
-internal queue until we receive SSH_MSG_KEXINIT from the other side.
-This can result in high memory usage if the other party is slow to
-respond to the SSH_MSG_KEXINIT packet, or memory exhaustion if a
-malicious client never responds to an SSH_MSG_KEXINIT packet during a
-large file transfer.
-We now limit the internal queue to 64 packets: this means 2MB with the
-typical 32KB packet size.
-When the internal queue is full we block further writes until the
-pending key exchange is completed or there is a read or write error.
-
-Thanks to Yuichi Watanabe for reporting this issue.
-
-Change-Id: I1ce2214cc16e08b838d4bc346c74c72addafaeec
-Reviewed-on: https://go-review.googlesource.com/c/crypto/+/652135
-Reviewed-by: Neal Patel 
-Auto-Submit: Gopher Robot 
-Reviewed-by: Roland Shoemaker 
-LUCI-TryBot-Result: Go LUCI 
-
----
- vendor/golang.org/x/crypto/ssh/handshake.go | 47 ++++++++++++++++-----
- 1 file changed, 37 insertions(+), 10 deletions(-)
-
-diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go
-index 70a7369..e14eb6c 100644
---- a/vendor/golang.org/x/crypto/ssh/handshake.go
-+++ b/vendor/golang.org/x/crypto/ssh/handshake.go
-@@ -24,6 +24,11 @@ const debugHandshake = false
- // quickly.
- const chanSize = 16
- 
-+// maxPendingPackets sets the maximum number of packets to queue while waiting
-+// for KEX to complete. This limits the total pending data to maxPendingPackets
-+// * maxPacket bytes, which is ~16.8MB.
-+const maxPendingPackets = 64
-+
- // keyingTransport is a packet based transport that supports key
- // changes. It need not be thread-safe. It should pass through
- // msgNewKeys in both directions.
-@@ -58,11 +63,19 @@ type handshakeTransport struct {
- 	incoming  chan []byte
- 	readError error
- 
--	mu               sync.Mutex
--	writeError       error
--	sentInitPacket   []byte
--	sentInitMsg      *kexInitMsg
--	pendingPackets   [][]byte // Used when a key exchange is in progress.
-+	mu sync.Mutex
-+	// Condition for the above mutex. It is used to notify a completed key
-+	// exchange or a write failure. Writes can wait for this condition while a
-+	// key exchange is in progress.
-+	writeCond      *sync.Cond
-+	writeError     error
-+	sentInitPacket []byte
-+	sentInitMsg    *kexInitMsg
-+	// Used to queue writes when a key exchange is in progress. The length is
-+	// limited by pendingPacketsSize. Once full, writes will block until the key
-+	// exchange is completed or an error occurs. If not empty, it is emptied
-+	// all at once when the key exchange is completed in kexLoop.
-+	pendingPackets   [][]byte
- 	writePacketsLeft uint32
- 	writeBytesLeft   int64
- 
-@@ -114,6 +127,7 @@ func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion,
- 
- 		config: config,
- 	}
-+	t.writeCond = sync.NewCond(&t.mu)
- 	t.resetReadThresholds()
- 	t.resetWriteThresholds()
- 
-@@ -236,6 +250,7 @@ func (t *handshakeTransport) recordWriteError(err error) {
- 	defer t.mu.Unlock()
- 	if t.writeError == nil && err != nil {
- 		t.writeError = err
-+		t.writeCond.Broadcast()
- 	}
- }
- 
-@@ -339,6 +354,8 @@ write:
- 			}
- 		}
- 		t.pendingPackets = t.pendingPackets[:0]
-+		// Unblock writePacket if waiting for KEX.
-+		t.writeCond.Broadcast()
- 		t.mu.Unlock()
- 	}
- 
-@@ -526,11 +543,20 @@ func (t *handshakeTransport) writePacket(p []byte) error {
- 	}
- 
- 	if t.sentInitMsg != nil {
--		// Copy the packet so the writer can reuse the buffer.
--		cp := make([]byte, len(p))
--		copy(cp, p)
--		t.pendingPackets = append(t.pendingPackets, cp)
--		return nil
-+		if len(t.pendingPackets) < maxPendingPackets {
-+			// Copy the packet so the writer can reuse the buffer.
-+			cp := make([]byte, len(p))
-+			copy(cp, p)
-+			t.pendingPackets = append(t.pendingPackets, cp)
-+			return nil
-+		}
-+		for t.sentInitMsg != nil {
-+			// Block and wait for KEX to complete or an error.
-+			t.writeCond.Wait()
-+			if t.writeError != nil {
-+				return t.writeError
-+			}
-+		}
- 	}
- 
- 	if t.writeBytesLeft > 0 {
-@@ -547,6 +573,7 @@ func (t *handshakeTransport) writePacket(p []byte) error {
- 
- 	if err := t.pushPacket(p); err != nil {
- 		t.writeError = err
-+		t.writeCond.Broadcast()
- 	}
- 
- 	return nil
--- 
-2.45.2
-
diff --git a/SPECS/gh/CVE-2025-22872.patch b/SPECS/gh/CVE-2025-22872.patch
deleted file mode 100644
index a9203f2a9a..0000000000
--- a/SPECS/gh/CVE-2025-22872.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 01035da6c5be2080f75765d9ebbb462614d7e81a Mon Sep 17 00:00:00 2001
-From: jykanase 
-Date: Tue, 22 Apr 2025 08:15:38 +0000
-Subject: [PATCH] CVE-2025-22872
-
-Upstream patch reference: https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9
----
- vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++--
- 1 file changed, 16 insertions(+), 2 deletions(-)
-
-diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go
-index 3c57880..6598c1f 100644
---- a/vendor/golang.org/x/net/html/token.go
-+++ b/vendor/golang.org/x/net/html/token.go
-@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType {
- 	if raw {
- 		z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end]))
- 	}
--	// Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken --- -2.45.2 - diff --git a/SPECS/gh/CVE-2025-25204.patch b/SPECS/gh/CVE-2025-25204.patch deleted file mode 100644 index 809efc1f95..0000000000 --- a/SPECS/gh/CVE-2025-25204.patch +++ /dev/null @@ -1,47 +0,0 @@ -From bf3a40aef3af6919bba73bfeaadac2d0c169628d Mon Sep 17 00:00:00 2001 -From: Fredrik Skogman -Date: Tue, 11 Feb 2025 09:07:51 +0100 -Subject: [PATCH] Exit with error if no matching predicate type exists - -Signed-off-by: Fredrik Skogman ---- - pkg/cmd/attestation/verify/verify.go | 2 +- - pkg/cmd/attestation/verify/verify_test.go | 12 ++++++++++++ - 2 files changed, 13 insertions(+), 1 deletion(-) - -diff --git a/pkg/cmd/attestation/verify/verify.go b/pkg/cmd/attestation/verify/verify.go -index 90242a9fed2..0a8de8b4599 100644 ---- a/pkg/cmd/attestation/verify/verify.go -+++ b/pkg/cmd/attestation/verify/verify.go -@@ -236,7 +236,7 @@ func runVerify(opts *Options) error { - filteredAttestations := verification.FilterAttestations(ec.PredicateType, attestations) - if len(filteredAttestations) == 0 { - opts.Logger.Printf(opts.Logger.ColorScheme.Red("✗ No attestations found with predicate type: %s\n"), opts.PredicateType) -- return err -+ return fmt.Errorf("no matching predicate found") - } - attestations = filteredAttestations - -diff --git a/pkg/cmd/attestation/verify/verify_test.go b/pkg/cmd/attestation/verify/verify_test.go -index 87ffa96f090..092a009d81e 100644 ---- a/pkg/cmd/attestation/verify/verify_test.go -+++ b/pkg/cmd/attestation/verify/verify_test.go -@@ -501,6 +501,18 @@ func TestRunVerify(t *testing.T) { - require.Nil(t, runVerify(&customOpts)) - }) - -+ t.Run("with valid OCI artifact with UseBundleFromRegistry flag and unknown predicate type", func(t *testing.T) { -+ customOpts := publicGoodOpts -+ customOpts.ArtifactPath = "oci://ghcr.io/github/test" -+ customOpts.BundlePath = "" -+ customOpts.UseBundleFromRegistry = true -+ customOpts.PredicateType = "https://predicate.type" -+ -+ err := runVerify(&customOpts) -+ require.Error(t, err) -+ require.ErrorContains(t, err, "no matching predicate found") -+ }) -+ - t.Run("with valid OCI artifact with UseBundleFromRegistry flag but no bundle return from registry", func(t *testing.T) { - customOpts := publicGoodOpts - customOpts.ArtifactPath = "oci://ghcr.io/github/test" diff --git a/SPECS/gh/CVE-2025-27144.patch b/SPECS/gh/CVE-2025-27144.patch deleted file mode 100644 index 818881b1a8..0000000000 --- a/SPECS/gh/CVE-2025-27144.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 72e5dc031b9ecdc0ba2db04b715bb43b8eefcf59 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Fri, 28 Feb 2025 09:57:57 +0000 -Subject: [PATCH] CVE-2025-27144 -Upstream Reference : https://github.com/go-jose/go-jose/commit/99b346cec4e86d102284642c5dcbe9bb0cacfc22 ---- - vendor/github.com/go-jose/go-jose/v4/jwe.go | 5 +++-- - vendor/github.com/go-jose/go-jose/v4/jws.go | 5 +++-- - 2 files changed, 6 insertions(+), 4 deletions(-) - -diff --git a/vendor/github.com/go-jose/go-jose/v4/jwe.go b/vendor/github.com/go-jose/go-jose/v4/jwe.go -index 89f03ee3..9f1322dc 100644 ---- a/vendor/github.com/go-jose/go-jose/v4/jwe.go -+++ b/vendor/github.com/go-jose/go-jose/v4/jwe.go -@@ -288,10 +288,11 @@ func ParseEncryptedCompact( - keyAlgorithms []KeyAlgorithm, - contentEncryption []ContentEncryption, - ) (*JSONWebEncryption, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 5 { -+ // Five parts is four separators -+ if strings.Count(input, ".") != 4 { - return nil, fmt.Errorf("go-jose/go-jose: compact JWE format must have five parts") - } -+ parts := strings.SplitN(input, ".", 5) - - rawProtected, err := base64.RawURLEncoding.DecodeString(parts[0]) - if err != nil { -diff --git a/vendor/github.com/go-jose/go-jose/v4/jws.go b/vendor/github.com/go-jose/go-jose/v4/jws.go -index 3a912301..d09d8ba5 100644 ---- a/vendor/github.com/go-jose/go-jose/v4/jws.go -+++ b/vendor/github.com/go-jose/go-jose/v4/jws.go -@@ -327,10 +327,11 @@ func parseSignedCompact( - payload []byte, - signatureAlgorithms []SignatureAlgorithm, - ) (*JSONWebSignature, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 3 { -+ // Three parts is two separators -+ if strings.Count(input, ".") != 2 { - return nil, fmt.Errorf("go-jose/go-jose: compact JWS format must have three parts") - } -+ parts := strings.SplitN(input, ".", 3) - - if parts[1] != "" && payload != nil { - return nil, fmt.Errorf("go-jose/go-jose: payload is not detached") --- -2.45.2 - diff --git a/SPECS/gh/CVE-2025-48938.patch b/SPECS/gh/CVE-2025-48938.patch deleted file mode 100644 index 34f673b2c3..0000000000 --- a/SPECS/gh/CVE-2025-48938.patch +++ /dev/null @@ -1,98 +0,0 @@ -From f30373d5ac9c1af048f352ce32eaddc7c83a9156 Mon Sep 17 00:00:00 2001 -From: Sreenivasulu Malavathula -Date: Mon, 16 Jun 2025 16:28:52 -0500 -Subject: [PATCH] Address CVE-2025-48938 -Upstream Patch Reference: https://github.com/cli/go-gh/commit/a08820a.diff - ---- - .../cli/go-gh/v2/pkg/browser/browser.go | 59 +++++++++++++++++++ - 1 file changed, 59 insertions(+) - -diff --git a/vendor/github.com/cli/go-gh/v2/pkg/browser/browser.go b/vendor/github.com/cli/go-gh/v2/pkg/browser/browser.go -index 4d56710..d17951a 100644 ---- a/vendor/github.com/cli/go-gh/v2/pkg/browser/browser.go -+++ b/vendor/github.com/cli/go-gh/v2/pkg/browser/browser.go -@@ -2,7 +2,9 @@ - package browser - - import ( -+ "fmt" - "io" -+ "net/url" - "os" - "os/exec" - -@@ -45,9 +47,20 @@ func (b *Browser) Browse(url string) error { - } - - func (b *Browser) browse(url string, env []string) error { -+ // Ensure the URL is supported including the scheme, -+ // overwrite `url` for use within the function. -+ urlParsed, err := isPossibleProtocol(url) -+ if err != nil { -+ return err -+ } -+ -+ url = urlParsed.String() -+ -+ // Use default `gh` browsing module for opening URL if not customized. - if b.launcher == "" { - return cliBrowser.OpenURL(url) - } -+ - launcherArgs, err := shlex.Split(b.launcher) - if err != nil { - return err -@@ -78,3 +91,49 @@ func resolveLauncher() string { - } - return os.Getenv("BROWSER") - } -+ -+func isSupportedScheme(scheme string) bool { -+ switch scheme { -+ case "http", "https", "vscode", "vscode-insiders": -+ return true -+ default: -+ return false -+ } -+} -+ -+func isPossibleProtocol(u string) (*url.URL, error) { -+ // Parse URL for known supported schemes before handling unknown cases. -+ urlParsed, err := url.Parse(u) -+ if err != nil { -+ return nil, fmt.Errorf("opening unparsable URL is unsupported: %s", u) -+ } -+ -+ if isSupportedScheme(urlParsed.Scheme) { -+ return urlParsed, nil -+ } -+ -+ // Disallow any unrecognized URL schemes if explicitly present. -+ if urlParsed.Scheme != "" { -+ return nil, fmt.Errorf("opening unsupport URL scheme: %s", u) -+ } -+ -+ // Disallow URLs that match existing files or directories on the filesystem -+ // as these could be executables or executed by the launcher browser due to -+ // the file extension and/or associated application. -+ // -+ // Symlinks should not be resolved in order to avoid broken links or other -+ // vulnerabilities trying to resolve them. -+ if fileInfo, _ := os.Lstat(u); fileInfo != nil { -+ return nil, fmt.Errorf("opening files or directories is unsupported: %s", u) -+ } -+ -+ // Disallow URLs that match executables found in the user path. -+ exec, _ := safeexec.LookPath(u) -+ if exec != "" { -+ return nil, fmt.Errorf("opening executables is unsupported: %s", u) -+ } -+ -+ // Otherwise, assume HTTP URL using `https` to ensure secure browsing. -+ urlParsed.Scheme = "https" -+ return urlParsed, nil -+} --- -2.45.2 - diff --git a/SPECS/gh/generate_source_tarball.sh b/SPECS/gh/generate_source_tarball.sh deleted file mode 100755 index cc04d4b518..0000000000 --- a/SPECS/gh/generate_source_tarball.sh +++ /dev/null @@ -1,168 +0,0 @@ -#!/bin/bash -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. -# -# This script downloads the source tarball and uses it to generate the -# vendor tarball for the gh package. It also updates the package's -# signatures.json file for both tarballs, although it doesn't account for -# version changes. -# -# Notes: -# - You require GNU tar version 1.28+. -# - The additional options passed to tar enable generation of a tarball -# with the same hash every time regardless of the environment. See: -# https://reproducible-builds.org/docs/archives/ -# - For the value of "--mtime" we use the date "2021-04-26 00:00Z" to -# simplify future updates. -set -eu - -# get_spec_value extracts the parsed value of a tag from a spec file. -# - spec: The path to the spec file. -# - tag: The tag whose value is extracted. -# The extracted value is returned via stdout. -get_spec_value() { - local spec="$1" - local tag="$2" - local tmp=$(mktemp) - rpmspec -P "$spec" > "$tmp" - grep -E "^${tag}:" "$tmp" | sed -E "s/^$tag:\s*//" - rm "$tmp" -} - -# set_signature_value adds or updates the value of a signature in the -# signatures.json file. -# - signatures_json: The path to the signatures.json file. -# - path: The path to the file whose signature is updated. -set_signature_value() { - local signatures_json="$1" - local path="$2" - local name=$(basename "$path") - local sum=$(sha256sum "$path" | cut -d' ' -f1) - signatures_tmp=$(mktemp) - jq --indent 1 ".Signatures.\"$name\" = \"$sum\"" "$signatures_json" > "$signatures_tmp" - mv "$signatures_tmp" "$signatures_json" -} - -exit_usage() { - echo "Usage: $0 [flags]" - echo "" - echo "Flags:" - echo " --srcTarball src tarball file. If not provided, it will be downloaded according to the spec file." - echo " --outFolder folder where to copy the new tarball(s). If not provided, the tarballs will be copied to the same folder as the script." - echo " --pkgVersion package version. If not provided, it will be extracted from the spec file." - echo " --setSignature set the signature of the tarball(s) in the signatures.json file." - exit 2 -} - -arg_out_folder="" -arg_src_tarball="" -arg_pkg_version="" -arg_set_signatures=0 -while [[ $# -gt 0 ]]; do - case $1 in - -h|--help) - exit_usage - ;; - --outFolder) - # Convert to absolute path - arg_out_folder=$(readlink -f "$2") - shift - ;; - --srcTarball) - arg_src_tarball="$2" - shift - ;; - --pkgVersion) - arg_pkg_version="$2" - shift - ;; - --setSignature) - arg_set_signatures=1 - ;; - -*) - echo "Error: Unknown option: $1" - exit_usage - ;; - *) - echo "Error: Unknown argument: $1" - exit_usage - ;; - esac - - shift -done - -script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) - -out_folder="$arg_out_folder" -if [[ -z "$out_folder" ]]; then - out_folder="$script_dir" -elif [[ ! -d "$out_folder" ]]; then - echo "Error: The output folder does not exist." - exit 1 -fi - -spec_file=$(ls "$script_dir"/*.spec) - -src_tarball="$arg_src_tarball" -if [[ -z "$src_tarball" ]]; then - src_url=$(get_spec_value "$spec_file" "Source0") - if [[ -z "$src_url" ]]; then - echo "Error: Unable to determine the source0 URL from the spec file." - exit 1 - fi - - src_tarball_name=$(echo "$src_url" | grep -oP '(?<=#/)[^/]+') - if [[ -z "$src_tarball_name" ]]; then - echo "Error: Unable to determine the source0 tarball name from the source URL." - exit 1 - fi - - src_tarball="$script_dir/$src_tarball_name" - if [[ ! -f "$src_tarball" ]]; then - wget -O "$src_tarball" "$src_url" - fi -elif [[ ! -f "$src_tarball" ]]; then - echo "Error: The source tarball file does not exist." - exit 1 -fi - -pkg_name=$(get_spec_value "$spec_file" "Name") -if [[ -z "$pkg_name" ]]; then - echo "Error: Unable to determine the package name from the spec file." - exit 1 -fi - -pkg_version="$arg_pkg_version" -if [[ -z "$pkg_version" ]]; then - pkg_version=$(get_spec_value "$spec_file" "Version") - if [[ -z "$pkg_version" ]]; then - echo "Error: Unable to determine the package version from the spec file." - exit 1 - fi -fi - -# Extract the source tarball and generate the vendor tarball. -source_dir=$(mktemp -d) -trap "rm -rf '$source_dir'" EXIT -tar -C "$source_dir" -xf "$src_tarball" -cd "$source_dir"/* -go mod vendor -vendor_tarball="$out_folder/$pkg_name-$pkg_version-vendor.tar.gz" -tar --sort=name \ - --mtime="2021-04-26 00:00Z" \ - --owner=0 \ - --group=0 \ - --numeric-owner \ - --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ - -c \ - -f "$vendor_tarball" \ - vendor - -if [[ $arg_set_signatures -eq 1 ]]; then - signatures_file=$(ls "$script_dir"/*.signatures.json) - set_signature_value "$signatures_file" "$src_tarball" - set_signature_value "$signatures_file" "$vendor_tarball" -fi - -echo "Vendor tarball generated: $vendor_tarball" diff --git a/SPECS/gh/gh.signatures.json b/SPECS/gh/gh.signatures.json deleted file mode 100644 index b5ec83df14..0000000000 --- a/SPECS/gh/gh.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "gh-2.62.0.tar.gz": "8b0d44a7fccd0c768d5ef7c3fbd274851b5752084e47761f146852de6539193e", - "gh-2.62.0-vendor.tar.gz": "2b39f75a9a45aa5e7b8d95e6b5fd7a11a7504e6cd7c92e904027f129abe48599" - } -} diff --git a/SPECS/gh/gh.spec b/SPECS/gh/gh.spec deleted file mode 100644 index ec7367feb2..0000000000 --- a/SPECS/gh/gh.spec +++ /dev/null @@ -1,153 +0,0 @@ -Summary: GitHub official command line tool -Name: gh -Version: 2.62.0 -Release: 10%{?dist} -License: MIT -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Applications/Tools -URL: https://github.com/cli/cli -Source0: https://github.com/cli/cli/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz - -# Below is a manually created tarball, no download link. It is generated by running ./generate_source_tarball.sh. -# We're using pre-populated Go modules from this tarball, since network is disabled during build time. -Source1: %{name}-%{version}-vendor.tar.gz - -Patch0: 0001-Fix-false-negative-in-TestMigrationWriteErrors-when-.patch -Patch1: CVE-2024-54132.patch -Patch2: CVE-2024-45337.patch -Patch3: CVE-2024-45338.patch -Patch5: CVE-2024-53859.patch -Patch6: CVE-2025-25204.patch -Patch7: CVE-2025-27144.patch -Patch8: CVE-2025-22869.patch -Patch9: CVE-2025-22872.patch -Patch10: CVE-2025-48938.patch - -BuildRequires: golang < 1.23 -BuildRequires: git -Requires: git -%global debug_package %{nil} -%define our_gopath %{_topdir}/.gopath - -%description -GitHub official command line tool. - -%prep -%autosetup -p1 -n cli-%{version} -a1 - -%build -export GOPATH=%{our_gopath} -# No mod download use vednor cache locally -export GOFLAGS="-buildmode=pie -trimpath -mod=vendor -modcacherw -ldflags=-linkmode=external" -make GH_VERSION="v%{version}" bin/gh manpages - -%install -./bin/gh completion -s bash | install -Dm644 /dev/stdin %{buildroot}%{_datadir}/bash-completion/completions/gh -./bin/gh completion -s fish | install -Dm644 /dev/stdin %{buildroot}%{_datadir}/fish/vendor_completions.d/gh.fish -./bin/gh completion -s zsh | install -Dm644 /dev/stdin %{buildroot}%{_datadir}/zsh/site-functions/_gh - -install -Dm755 bin/gh %{buildroot}%{_bindir}/gh -install -d %{buildroot}%{_mandir}/man1/ -cp share/man/man1/* %{buildroot}%{_mandir}/man1 - -%check -make test - -%files -%defattr(-,root,root) -%license LICENSE -%doc README.md -%{_bindir}/gh -%{_mandir}/man1/* -%{_datadir}/bash-completion/completions/gh -%{_datadir}/fish/vendor_completions.d/gh.fish -%{_datadir}/zsh/site-functions/_gh - -%changelog -* Mon Sep 8 2025 Lee Chee Yang - 2.62.0-10 -- merge from Azure Linux 3.0.20250910-3.0. -- Patch CVE-2025-48938 - -* Fri May 30 2025 Ranjan Dutta - 2.62.0-9 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22872 - -* Fri Mar 21 2025 Anuj Mittal - 2.62.0-8 -- Bump Release to rebuild - -* Fri Feb 28 2025 Kanishk Bansal - 2.62.0-7 -- Fix CVE-2025-27144, CVE-2025-22869 with an upstream patch - -* Fri Feb 21 2025 Kshitiz Godara - 2.62.0-6 -- Patch CVE-2025-25204 - -* Wed Jan 21 2025 Sandeep Karambelkar - 2.62.0-5 -- Patch CVE-2024-53859, CVE-2024-53858 - -* Tue Dec 31 2024 Rohit Rawat - 2.62.0-4 -- Add patch for CVE-2024-45338 - -* Wed Jan 08 2025 Muhammad Falak - 2.62.0-3 -- Patch CVE-2024-45337 - -* Fri Dec 13 2024 Sandeep Karambelkar - 2.62.0-2 -- Patch CVE-2024-54132 - -* Mon Nov 18 2024 Vince Perri - 2.62.0-1 -- Update to v2.62.0 - -* Tue Oct 15 2024 Muhammad Falak - 2.43.1-2 -- Pin golang version to <= 1.22 - -* Mon Feb 26 2024 Neha Agarwal - 2.43.1-1 -- Update to v2.43.1 - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 2.13.0-16 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 2.13.0-15 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 2.13.0-14 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 2.13.0-13 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 2.13.0-12 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 26 2023 Olivia Crain - 2.13.0-11 -- Add upstream patch to fix search tests involving relative time - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 2.13.0-10 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 2.13.0-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 2.13.0-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 2.13.0-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 2.13.0-6 -- Clean up dependencies (remove fish, bash-completion and zsh and add git) - -* Fri Dec 16 2022 Daniel McIlvaney - 2.13.0-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 2.13.0-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 2.13.0-3 -- Bump release to rebuild against Go 1.18.5 - -* Mon Jul 04 2022 Daniel McIlvaney - 2.13.0-2 -- Bump release due to bump in fish to 3.5.0. - -* Thu Jun 30 2022 Suresh Babu Chalamalasetty - 2.13.0-1 -- Original version for CBL-Mariner. -- License verified. diff --git a/SPECS/git-lfs/CVE-2025-22870.patch b/SPECS/git-lfs/CVE-2025-22870.patch deleted file mode 100644 index 8e6d46ea47..0000000000 --- a/SPECS/git-lfs/CVE-2025-22870.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 89bbe84381a4856d9bc1e8eaacf71bc52bfc2cf9 Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Tue, 8 Apr 2025 15:28:42 +0000 -Subject: [PATCH] Fix CVE CVE-2025-22870 in git-lfs -Upstream Patch Reference: https://github.com/golang/go/commit/334de7982f8ec959c74470dd709ceedfd6dbd50a.patch ---- - vendor/golang.org/x/net/http/httpproxy/proxy.go | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/http/httpproxy/proxy.go b/vendor/golang.org/x/net/http/httpproxy/proxy.go -index 6404aaf..d89c257 100644 ---- a/vendor/golang.org/x/net/http/httpproxy/proxy.go -+++ b/vendor/golang.org/x/net/http/httpproxy/proxy.go -@@ -14,6 +14,7 @@ import ( - "errors" - "fmt" - "net" -+ "net/netip" - "net/url" - "os" - "strings" -@@ -177,8 +178,10 @@ func (cfg *config) useProxy(addr string) bool { - if host == "localhost" { - return false - } -- ip := net.ParseIP(host) -- if ip != nil { -+ nip, err := netip.ParseAddr(host) -+ var ip net.IP -+ if err == nil { -+ ip = net.IP(nip.AsSlice()) - if ip.IsLoopback() { - return false - } -@@ -360,6 +363,9 @@ type domainMatch struct { - } - - func (m domainMatch) match(host, port string, ip net.IP) bool { -+ if ip != nil { -+ return false -+ } - if strings.HasSuffix(host, m.host) || (m.matchHost && host == m.host[1:]) { - return m.port == "" || m.port == port - } --- -2.40.4 - diff --git a/SPECS/git-lfs/git-lfs.signatures.json b/SPECS/git-lfs/git-lfs.signatures.json deleted file mode 100644 index d1aa98a544..0000000000 --- a/SPECS/git-lfs/git-lfs.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "git-lfs-3.6.1-vendor.tar.gz": "6cb4c1deda8ef0b2014c559e06808b58a4fd04f2b487ad30566e0d683889cd65", - "git-lfs-3.6.1.tar.gz": "062603dbef8f221d867e542314e9a6ea1970cae536b4495de2e915529b0fef8e" - } -} diff --git a/SPECS/git-lfs/git-lfs.spec b/SPECS/git-lfs/git-lfs.spec deleted file mode 100644 index fd143ce5ab..0000000000 --- a/SPECS/git-lfs/git-lfs.spec +++ /dev/null @@ -1,154 +0,0 @@ -%global debug_package %{nil} -Summary: Git extension for versioning large files -Name: git-lfs -Version: 3.6.1 -Release: 3%{?dist} -Group: System Environment/Programming -Vendor: Microsoft Corporation -Distribution: Azure Linux -License: MIT -URL: https://github.com/git-lfs/git-lfs -Source0: https://github.com/git-lfs/git-lfs/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -# Below is a manually created tarball, no download link. -# We're using pre-populated Go modules from this tarball, since network is disabled during build time. -# How to re-build this file: -# 1. wget https://github.com/git-lfs/git-lfs/archive/v%{version}.tar.gz -O git-lfs-%%{version}.tar.gz -# 2. tar -xf git-lfs-%%{version}.tar.gz -# 3. cd git-lfs-%%{version} -# 4. go mod vendor -# 5. tar --sort=name \ -# --mtime="2021-04-26 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cf %%{name}-%%{version}-vendor.tar.gz vendor -# -# NOTES: -# - You require GNU tar version 1.28+. -# - The additional options enable generation of a tarball with the same hash every time regardless of the environment. -# See: https://reproducible-builds.org/docs/archives/ -# - For the value of "--mtime" use the date "2021-04-26 00:00Z" to simplify future updates. -Source1: %{name}-%{version}-vendor.tar.gz -Patch0: CVE-2025-22870.patch - -BuildRequires: golang -BuildRequires: which -BuildRequires: tar -BuildRequires: git -BuildRequires: rubygem-asciidoctor -Requires: git -%define our_gopath %{_topdir}/.gopath - -%description -Git LFS is a command line extension and specification for managing large files with Git - -%prep -%autosetup -p1 -a1 - -%build -export GOPATH=%{our_gopath} -export GOFLAGS="-buildmode=pie -trimpath -mod=vendor -modcacherw -ldflags=-linkmode=external" -go generate ./commands -go build . -export PATH=$PATH:%{gem_dir}/bin -make man GIT_LFS_SHA=unused VERSION=unused PREFIX=unused - -%install -rm -rf %{buildroot} -install -D git-lfs %{buildroot}%{_bindir}/git-lfs -mkdir -p %{buildroot}%{_mandir}/man1 -mkdir -p %{buildroot}%{_mandir}/man5 -install -D man/man1/*.1 %{buildroot}%{_mandir}/man1 -install -D man/man5/*.5 %{buildroot}%{_mandir}/man5 - -%check -go test -mod=vendor ./... - -%post -git lfs install --system - -%preun -git lfs uninstall - -%files -%defattr(-,root,root,-) -%doc LICENSE.md README.md -%{_bindir}/git-lfs -%{_mandir}/man1/* -%{_mandir}/man5/* - -%changelog -* Fri May 30 2025 Ranjan Dutta - 3.6.1-3 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22870 - -* Fri Mar 21 2025 Anuj Mittal - 3.6.1-2 -- Bump Release to rebuild - -* Thu Jan 23 2025 Rohit Rawat - 3.6.1-1 -- Bump version to 3.6.1 to fix CVE-2024-53263 - -* Fri Jan 05 2024 Muhammad Falak - 3.4.1-1 -- Bump version to 3.4.1 -- Add BR on asciidoctor & drop un-needed BR - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 3.1.4-15 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 3.1.4-14 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 3.1.4-13 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 3.1.4-12 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 3.1.4-11 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 3.1.4-10 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 3.1.4-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 3.1.4-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 3.1.4-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 3.1.4-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 3.1.4-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717. - -* Tue Nov 01 2022 Olivia Crain - 3.1.4-4 -- Bump release to rebuild with go 1.18.8 - -* Wed Sep 28 2022 Suresh Babu Chalamalasetty 3.1.4-3 -- Initial CBL-Mariner import from Photon (license: Apache2) -- License verified -- Add git-lfs vendor cache check setion and update build section commands as needed. - -* Fri Jun 17 2022 Piyush Gupta 3.1.4-2 -- Bump up version to compile with new go - -* Mon Apr 18 2022 Gerrit Photon 3.1.4-1 -- Automatic Version Bump - -* Fri Jun 11 2021 Piyush Gupta 2.13.3-2 -- Bump up version to compile with new go - -* Thu Apr 29 2021 Gerrit Photon 2.13.3-1 -- Automatic Version Bump - -* Fri Feb 05 2021 Harinadh D 2.12.0-3 -- Bump up version to compile with new go - -* Fri Jan 15 2021 Piyush Gupta 2.12.0-2 -- Bump up version to compile with new go - -* Fri Sep 18 2020 Him Kalyan Bordoloi 2.12.0-1 -- Initial release. diff --git a/SPECS/glibc/0001-Remove-Wno-format-cflag-from-tests.patch b/SPECS/glibc/0001-Remove-Wno-format-cflag-from-tests.patch deleted file mode 100644 index fe35461507..0000000000 --- a/SPECS/glibc/0001-Remove-Wno-format-cflag-from-tests.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 8768893dbd2b055f71c719e5135d9b8720731d81 Mon Sep 17 00:00:00 2001 -From: Rachel Menge -Date: Fri, 7 Jun 2024 21:17:37 +0000 -Subject: [PATCH] Remove -Wno-format cflag from tests - -This flag prevents the error -"c1: error: '-Wformat-security' ignored without '-Wformat' [-Werror=format-security]" -The error occurs when glibc is compiled with -Wformat-security which -requires -Wformat and thus conflicts with tests which use -Wno-format ---- - debug/Makefile | 4 ++-- - time/Makefile | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/debug/Makefile b/debug/Makefile -index 434e52f7..05363c26 100644 ---- a/debug/Makefile -+++ b/debug/Makefile -@@ -192,7 +192,7 @@ tests-cc-def-chk = - tests-c-time64-chk = - tests-cc-time64-chk = - --CFLAGS-tst-fortify.c += -Wno-format -Wno-deprecated-declarations -Wno-error -+CFLAGS-tst-fortify.c += -Wno-deprecated-declarations - - # No additional flags for the default tests. - define cflags-default -@@ -215,7 +215,7 @@ src-chk-nongnu = \#undef _GNU_SOURCE - # cannot be disabled via pragmas, so require -Wno-error to be used. - define gen-chk-test - tests-$(1)-$(4)-chk += tst-fortify-$(1)-$(2)-$(3)-$(4) --CFLAGS-tst-fortify-$(1)-$(2)-$(3)-$(4).$(1) += $(no-fortify-source),-D_FORTIFY_SOURCE=$(3) -Wno-format \ -+CFLAGS-tst-fortify-$(1)-$(2)-$(3)-$(4).$(1) += $(no-fortify-source),-D_FORTIFY_SOURCE=$(3) \ - -Wno-deprecated-declarations \ - -Wno-error - $(eval $(call cflags-$(2),$(1),$(3),$(4))) -diff --git a/time/Makefile b/time/Makefile -index 1d2e667c..8b878bcc 100644 ---- a/time/Makefile -+++ b/time/Makefile -@@ -102,7 +102,7 @@ CFLAGS-nanosleep.c += -fexceptions -fasynchronous-unwind-tables - CFLAGS-mktime.c += $(config-cflags-wno-ignored-attributes) - - # Don't warn about Y2k problem in strftime format string. --CFLAGS-test_time.c += -Wno-format -+CFLAGS-test_time.c += -Wformat - - test_time-ARGS= EST5EDT CST - --- -2.34.1 - diff --git a/SPECS/glibc/CVE-2018-20796.nopatch b/SPECS/glibc/CVE-2018-20796.nopatch deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/SPECS/glibc/CVE-2019-6488.nopatch b/SPECS/glibc/CVE-2019-6488.nopatch deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/SPECS/glibc/CVE-2020-1751.nopatch b/SPECS/glibc/CVE-2020-1751.nopatch deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/SPECS/glibc/CVE-2020-6096.nopatch b/SPECS/glibc/CVE-2020-6096.nopatch deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/SPECS/glibc/CVE-2023-4527.patch b/SPECS/glibc/CVE-2023-4527.patch deleted file mode 100644 index de489ab9d4..0000000000 --- a/SPECS/glibc/CVE-2023-4527.patch +++ /dev/null @@ -1,188 +0,0 @@ -From 6562a534ff741667d0725729ebc521bb0dac0e73 Mon Sep 17 00:00:00 2001 -From: Kanishk Bansal -Date: Thu, 22 May 2025 08:46:55 +0000 -Subject: [PATCH] CVE-2023-4527 - -Upstream Patch Reference : https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=b25508dd774b617f99419bdc3cf2ace4560cd2d6 - -https://sourceware.org/cgit/glibc/tree/advisories/GLIBC-SA-2023-0002 - -Signed-off-by: Kanishk Bansal ---- - resolv/Makefile | 2 + - resolv/nss_dns/dns-host.c | 2 +- - resolv/tst-resolv-noaaaa-vc.c | 129 ++++++++++++++++++++++++++++++++++ - 3 files changed, 132 insertions(+), 1 deletion(-) - create mode 100644 resolv/tst-resolv-noaaaa-vc.c - -diff --git a/resolv/Makefile b/resolv/Makefile -index 054b1fa3..2f99eb38 100644 ---- a/resolv/Makefile -+++ b/resolv/Makefile -@@ -102,6 +102,7 @@ tests += \ - tst-resolv-invalid-cname \ - tst-resolv-network \ - tst-resolv-noaaaa \ -+ tst-resolv-noaaaa-vc \ - tst-resolv-nondecimal \ - tst-resolv-res_init-multi \ - tst-resolv-search \ -@@ -293,6 +294,7 @@ $(objpfx)tst-resolv-res_init-thread: $(objpfx)libresolv.so \ - $(objpfx)tst-resolv-invalid-cname: $(objpfx)libresolv.so \ - $(shared-thread-library) - $(objpfx)tst-resolv-noaaaa: $(objpfx)libresolv.so $(shared-thread-library) -+$(objpfx)tst-resolv-noaaaa-vc: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-nondecimal: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-qtypes: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-rotate: $(objpfx)libresolv.so $(shared-thread-library) -diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c -index 1d60c51f..5d0ab30d 100644 ---- a/resolv/nss_dns/dns-host.c -+++ b/resolv/nss_dns/dns-host.c -@@ -427,7 +427,7 @@ _nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat, - { - n = __res_context_search (ctx, name, C_IN, T_A, - dns_packet_buffer, sizeof (dns_packet_buffer), -- NULL, NULL, NULL, NULL, NULL); -+ &alt_dns_packet_buffer, NULL, NULL, NULL, NULL); - if (n >= 0) - status = gaih_getanswer_noaaaa (alt_dns_packet_buffer, n, - &abuf, pat, errnop, herrnop, ttlp); -diff --git a/resolv/tst-resolv-noaaaa-vc.c b/resolv/tst-resolv-noaaaa-vc.c -new file mode 100644 -index 00000000..9f5aebd9 ---- /dev/null -+++ b/resolv/tst-resolv-noaaaa-vc.c -@@ -0,0 +1,129 @@ -+/* Test the RES_NOAAAA resolver option with a large response. -+ Copyright (C) 2022-2023 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Used to keep track of the number of queries. */ -+static volatile unsigned int queries; -+ -+/* If true, add a large TXT record at the start of the answer section. */ -+static volatile bool stuff_txt; -+ -+static void -+response (const struct resolv_response_context *ctx, -+ struct resolv_response_builder *b, -+ const char *qname, uint16_t qclass, uint16_t qtype) -+{ -+ /* If not using TCP, just force its use. */ -+ if (!ctx->tcp) -+ { -+ struct resolv_response_flags flags = {.tc = true}; -+ resolv_response_init (b, flags); -+ resolv_response_add_question (b, qname, qclass, qtype); -+ return; -+ } -+ -+ /* The test needs to send four queries, the first three are used to -+ grow the NSS buffer via the ERANGE handshake. */ -+ ++queries; -+ TEST_VERIFY (queries <= 4); -+ -+ /* AAAA queries are supposed to be disabled. */ -+ TEST_COMPARE (qtype, T_A); -+ TEST_COMPARE (qclass, C_IN); -+ TEST_COMPARE_STRING (qname, "example.com"); -+ -+ struct resolv_response_flags flags = {}; -+ resolv_response_init (b, flags); -+ resolv_response_add_question (b, qname, qclass, qtype); -+ -+ resolv_response_section (b, ns_s_an); -+ -+ if (stuff_txt) -+ { -+ resolv_response_open_record (b, qname, qclass, T_TXT, 60); -+ int zero = 0; -+ for (int i = 0; i <= 15000; ++i) -+ resolv_response_add_data (b, &zero, sizeof (zero)); -+ resolv_response_close_record (b); -+ } -+ -+ for (int i = 0; i < 200; ++i) -+ { -+ resolv_response_open_record (b, qname, qclass, qtype, 60); -+ char ipv4[4] = {192, 0, 2, i + 1}; -+ resolv_response_add_data (b, &ipv4, sizeof (ipv4)); -+ resolv_response_close_record (b); -+ } -+} -+ -+static int -+do_test (void) -+{ -+ struct resolv_test *obj = resolv_test_start -+ ((struct resolv_redirect_config) -+ { -+ .response_callback = response -+ }); -+ -+ _res.options |= RES_NOAAAA; -+ -+ for (int do_stuff_txt = 0; do_stuff_txt < 2; ++do_stuff_txt) -+ { -+ queries = 0; -+ stuff_txt = do_stuff_txt; -+ -+ struct addrinfo *ai = NULL; -+ int ret; -+ ret = getaddrinfo ("example.com", "80", -+ &(struct addrinfo) -+ { -+ .ai_family = AF_UNSPEC, -+ .ai_socktype = SOCK_STREAM, -+ }, &ai); -+ -+ char *expected_result; -+ { -+ struct xmemstream mem; -+ xopen_memstream (&mem); -+ for (int i = 0; i < 200; ++i) -+ fprintf (mem.out, "address: STREAM/TCP 192.0.2.%d 80\n", i + 1); -+ xfclose_memstream (&mem); -+ expected_result = mem.buffer; -+ } -+ -+ check_addrinfo ("example.com", ai, ret, expected_result); -+ -+ free (expected_result); -+ freeaddrinfo (ai); -+ } -+ -+ resolv_test_end (obj); -+ return 0; -+} -+ -+#include --- -2.45.3 - diff --git a/SPECS/glibc/CVE-2023-4806.patch b/SPECS/glibc/CVE-2023-4806.patch deleted file mode 100644 index c8973010fe..0000000000 --- a/SPECS/glibc/CVE-2023-4806.patch +++ /dev/null @@ -1,338 +0,0 @@ -From 00ae4f10b504bc4564e9f22f00907093f1ab9338 Mon Sep 17 00:00:00 2001 -From: Siddhesh Poyarekar -Date: Fri, 15 Sep 2023 13:51:12 -0400 -Subject: [PATCH] getaddrinfo: Fix use after free in getcanonname - (CVE-2023-4806) - -When an NSS plugin only implements the _gethostbyname2_r and -_getcanonname_r callbacks, getaddrinfo could use memory that was freed -during tmpbuf resizing, through h_name in a previous query response. - -The backing store for res->at->name when doing a query with -gethostbyname3_r or gethostbyname2_r is tmpbuf, which is reallocated in -gethosts during the query. For AF_INET6 lookup with AI_ALL | -AI_V4MAPPED, gethosts gets called twice, once for a v6 lookup and second -for a v4 lookup. In this case, if the first call reallocates tmpbuf -enough number of times, resulting in a malloc, th->h_name (that -res->at->name refers to) ends up on a heap allocated storage in tmpbuf. -Now if the second call to gethosts also causes the plugin callback to -return NSS_STATUS_TRYAGAIN, tmpbuf will get freed, resulting in a UAF -reference in res->at->name. This then gets dereferenced in the -getcanonname_r plugin call, resulting in the use after free. - -Fix this by copying h_name over and freeing it at the end. This -resolves BZ #30843, which is assigned CVE-2023-4806. - -Signed-off-by: Siddhesh Poyarekar -(cherry picked from commit 973fe93a5675c42798b2161c6f29c01b0e243994) - -Signed-off-by: Kanishk Bansal - ---- - nss/Makefile | 15 ++++- - nss/nss_test_gai_hv2_canonname.c | 56 +++++++++++++++++ - nss/tst-nss-gai-hv2-canonname.c | 63 +++++++++++++++++++ - nss/tst-nss-gai-hv2-canonname.h | 1 + - .../postclean.req | 0 - .../tst-nss-gai-hv2-canonname.script | 2 + - sysdeps/posix/getaddrinfo.c | 25 +++++--- - 7 files changed, 152 insertions(+), 10 deletions(-) - create mode 100644 nss/nss_test_gai_hv2_canonname.c - create mode 100644 nss/tst-nss-gai-hv2-canonname.c - create mode 100644 nss/tst-nss-gai-hv2-canonname.h - create mode 100644 nss/tst-nss-gai-hv2-canonname.root/postclean.req - create mode 100644 nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script - -diff --git a/nss/Makefile b/nss/Makefile -index 06fcdc450f1..8a5126ecf34 100644 ---- a/nss/Makefile -+++ b/nss/Makefile -@@ -82,6 +82,7 @@ tests-container := \ - tst-nss-test3 \ - tst-reload1 \ - tst-reload2 \ -+ tst-nss-gai-hv2-canonname \ - # tests-container - - # Tests which need libdl -@@ -145,7 +146,8 @@ libnss_compat-inhibit-o = $(filter-out .os,$(object-suffixes)) - ifeq ($(build-static-nss),yes) - tests-static += tst-nss-static - endif --extra-test-objs += nss_test1.os nss_test2.os nss_test_errno.os -+extra-test-objs += nss_test1.os nss_test2.os nss_test_errno.os \ -+ nss_test_gai_hv2_canonname.os - - include ../Rules - -@@ -180,12 +182,16 @@ rtld-tests-LDFLAGS += -Wl,--dynamic-list=nss_test.ver - libof-nss_test1 = extramodules - libof-nss_test2 = extramodules - libof-nss_test_errno = extramodules -+libof-nss_test_gai_hv2_canonname = extramodules - $(objpfx)/libnss_test1.so: $(objpfx)nss_test1.os $(link-libc-deps) - $(build-module) - $(objpfx)/libnss_test2.so: $(objpfx)nss_test2.os $(link-libc-deps) - $(build-module) - $(objpfx)/libnss_test_errno.so: $(objpfx)nss_test_errno.os $(link-libc-deps) - $(build-module) -+$(objpfx)/libnss_test_gai_hv2_canonname.so: \ -+ $(objpfx)nss_test_gai_hv2_canonname.os $(link-libc-deps) -+ $(build-module) - $(objpfx)nss_test2.os : nss_test1.c - # Use the nss_files suffix for these objects as well. - $(objpfx)/libnss_test1.so$(libnss_files.so-version): $(objpfx)/libnss_test1.so -@@ -195,10 +201,14 @@ $(objpfx)/libnss_test2.so$(libnss_files.so-version): $(objpfx)/libnss_test2.so - $(objpfx)/libnss_test_errno.so$(libnss_files.so-version): \ - $(objpfx)/libnss_test_errno.so - $(make-link) -+$(objpfx)/libnss_test_gai_hv2_canonname.so$(libnss_files.so-version): \ -+ $(objpfx)/libnss_test_gai_hv2_canonname.so -+ $(make-link) - $(patsubst %,$(objpfx)%.out,$(tests) $(tests-container)) : \ - $(objpfx)/libnss_test1.so$(libnss_files.so-version) \ - $(objpfx)/libnss_test2.so$(libnss_files.so-version) \ -- $(objpfx)/libnss_test_errno.so$(libnss_files.so-version) -+ $(objpfx)/libnss_test_errno.so$(libnss_files.so-version) \ -+ $(objpfx)/libnss_test_gai_hv2_canonname.so$(libnss_files.so-version) - - ifeq (yes,$(have-thread-library)) - $(objpfx)tst-cancel-getpwuid_r: $(shared-thread-library) -@@ -215,3 +225,4 @@ LDFLAGS-tst-nss-test3 = -Wl,--disable-new-dtags - LDFLAGS-tst-nss-test4 = -Wl,--disable-new-dtags - LDFLAGS-tst-nss-test5 = -Wl,--disable-new-dtags - LDFLAGS-tst-nss-test_errno = -Wl,--disable-new-dtags -+LDFLAGS-tst-nss-test_gai_hv2_canonname = -Wl,--disable-new-dtags -diff --git a/nss/nss_test_gai_hv2_canonname.c b/nss/nss_test_gai_hv2_canonname.c -new file mode 100644 -index 00000000000..4439c83c9f4 ---- /dev/null -+++ b/nss/nss_test_gai_hv2_canonname.c -@@ -0,0 +1,56 @@ -+/* NSS service provider that only provides gethostbyname2_r. -+ Copyright The GNU Toolchain Authors. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include "nss/tst-nss-gai-hv2-canonname.h" -+ -+/* Catch misnamed and functions. */ -+#pragma GCC diagnostic error "-Wmissing-prototypes" -+NSS_DECLARE_MODULE_FUNCTIONS (test_gai_hv2_canonname) -+ -+extern enum nss_status _nss_files_gethostbyname2_r (const char *, int, -+ struct hostent *, char *, -+ size_t, int *, int *); -+ -+enum nss_status -+_nss_test_gai_hv2_canonname_gethostbyname2_r (const char *name, int af, -+ struct hostent *result, -+ char *buffer, size_t buflen, -+ int *errnop, int *herrnop) -+{ -+ return _nss_files_gethostbyname2_r (name, af, result, buffer, buflen, errnop, -+ herrnop); -+} -+ -+enum nss_status -+_nss_test_gai_hv2_canonname_getcanonname_r (const char *name, char *buffer, -+ size_t buflen, char **result, -+ int *errnop, int *h_errnop) -+{ -+ /* We expect QUERYNAME, which is a small enough string that it shouldn't fail -+ the test. */ -+ if (memcmp (QUERYNAME, name, sizeof (QUERYNAME)) -+ || buflen < sizeof (QUERYNAME)) -+ abort (); -+ -+ strncpy (buffer, name, buflen); -+ *result = buffer; -+ return NSS_STATUS_SUCCESS; -+} -diff --git a/nss/tst-nss-gai-hv2-canonname.c b/nss/tst-nss-gai-hv2-canonname.c -new file mode 100644 -index 00000000000..d5f10c07d6a ---- /dev/null -+++ b/nss/tst-nss-gai-hv2-canonname.c -@@ -0,0 +1,63 @@ -+/* Test NSS query path for plugins that only implement gethostbyname2 -+ (#30843). -+ Copyright The GNU Toolchain Authors. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include "nss/tst-nss-gai-hv2-canonname.h" -+ -+#define PREPARE do_prepare -+ -+static void do_prepare (int a, char **av) -+{ -+ FILE *hosts = xfopen ("/etc/hosts", "w"); -+ for (unsigned i = 2; i < 255; i++) -+ { -+ fprintf (hosts, "ff01::ff02:ff03:%u:2\ttest.example.com\n", i); -+ fprintf (hosts, "192.168.0.%u\ttest.example.com\n", i); -+ } -+ xfclose (hosts); -+} -+ -+static int -+do_test (void) -+{ -+ __nss_configure_lookup ("hosts", "test_gai_hv2_canonname"); -+ -+ struct addrinfo hints = {}; -+ struct addrinfo *result = NULL; -+ -+ hints.ai_family = AF_INET6; -+ hints.ai_flags = AI_ALL | AI_V4MAPPED | AI_CANONNAME; -+ -+ int ret = getaddrinfo (QUERYNAME, NULL, &hints, &result); -+ -+ if (ret != 0) -+ FAIL_EXIT1 ("getaddrinfo failed: %s\n", gai_strerror (ret)); -+ -+ TEST_COMPARE_STRING (result->ai_canonname, QUERYNAME); -+ -+ freeaddrinfo(result); -+ return 0; -+} -+ -+#include -diff --git a/nss/tst-nss-gai-hv2-canonname.h b/nss/tst-nss-gai-hv2-canonname.h -new file mode 100644 -index 00000000000..14f2a9cb086 ---- /dev/null -+++ b/nss/tst-nss-gai-hv2-canonname.h -@@ -0,0 +1 @@ -+#define QUERYNAME "test.example.com" -diff --git a/nss/tst-nss-gai-hv2-canonname.root/postclean.req b/nss/tst-nss-gai-hv2-canonname.root/postclean.req -new file mode 100644 -index 00000000000..e69de29bb2d -diff --git a/nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script b/nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script -new file mode 100644 -index 00000000000..31848b4a285 ---- /dev/null -+++ b/nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script -@@ -0,0 +1,2 @@ -+cp $B/nss/libnss_test_gai_hv2_canonname.so $L/libnss_test_gai_hv2_canonname.so.2 -+su -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 0356b622be6..b2236b105c1 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -120,6 +120,7 @@ struct gaih_result - { - struct gaih_addrtuple *at; - char *canon; -+ char *h_name; - bool free_at; - bool got_ipv6; - }; -@@ -165,6 +166,7 @@ gaih_result_reset (struct gaih_result *res) - if (res->free_at) - free (res->at); - free (res->canon); -+ free (res->h_name); - memset (res, 0, sizeof (*res)); - } - -@@ -203,9 +205,8 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp, - return 0; - } - --/* Convert struct hostent to a list of struct gaih_addrtuple objects. h_name -- is not copied, and the struct hostent object must not be deallocated -- prematurely. The new addresses are appended to the tuple array in RES. */ -+/* Convert struct hostent to a list of struct gaih_addrtuple objects. The new -+ addresses are appended to the tuple array in RES. */ - static bool - convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, int family, - struct hostent *h, struct gaih_result *res) -@@ -238,6 +239,15 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, int family, - res->at = array; - res->free_at = true; - -+ /* Duplicate h_name because it may get reclaimed when the underlying storage -+ is freed. */ -+ if (res->h_name == NULL) -+ { -+ res->h_name = __strdup (h->h_name); -+ if (res->h_name == NULL) -+ return false; -+ } -+ - /* Update the next pointers on reallocation. */ - for (size_t i = 0; i < old; i++) - array[i].next = array + i + 1; -@@ -262,7 +272,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, int family, - } - array[i].next = array + i + 1; - } -- array[0].name = h->h_name; - array[count - 1].next = NULL; - - return true; -@@ -324,15 +333,15 @@ gethosts (nss_gethostbyname3_r fct, int family, const char *name, - memory allocation failure. The returned string is allocated on the - heap; the caller has to free it. */ - static char * --getcanonname (nss_action_list nip, struct gaih_addrtuple *at, const char *name) -+getcanonname (nss_action_list nip, const char *hname, const char *name) - { - nss_getcanonname_r *cfct = __nss_lookup_function (nip, "getcanonname_r"); - char *s = (char *) name; - if (cfct != NULL) - { - char buf[256]; -- if (DL_CALL_FCT (cfct, (at->name ?: name, buf, sizeof (buf), -- &s, &errno, &h_errno)) != NSS_STATUS_SUCCESS) -+ if (DL_CALL_FCT (cfct, (hname ?: name, buf, sizeof (buf), &s, &errno, -+ &h_errno)) != NSS_STATUS_SUCCESS) - /* If the canonical name cannot be determined, use the passed - string. */ - s = (char *) name; -@@ -771,7 +780,7 @@ get_nss_addresses (const char *name, const struct addrinfo *req, - if ((req->ai_flags & AI_CANONNAME) != 0 - && res->canon == NULL) - { -- char *canonbuf = getcanonname (nip, res->at, name); -+ char *canonbuf = getcanonname (nip, res->h_name, name); - if (canonbuf == NULL) - { - __resolv_context_put (res_ctx); diff --git a/SPECS/glibc/CVE-2023-4911.patch b/SPECS/glibc/CVE-2023-4911.patch deleted file mode 100644 index 98da4526b6..0000000000 --- a/SPECS/glibc/CVE-2023-4911.patch +++ /dev/null @@ -1,126 +0,0 @@ -backport of https://sourceware.org/git/?p=glibc.git;a=patch;h=1056e5b4c3f2d90ed2b4a55f96add28da2f4c8fa - -diff -ru glibc-2.38-orig/elf/dl-tunables.c glibc-2.38/elf/dl-tunables.c ---- glibc-2.38-orig/elf/dl-tunables.c 2024-06-17 21:53:23.756408666 +0000 -+++ glibc-2.38/elf/dl-tunables.c 2024-06-17 23:01:00.207961672 +0000 -@@ -180,11 +180,7 @@ - /* If we reach the end of the string before getting a valid name-value - pair, bail out. */ - if (p[len] == '\0') -- { -- if (__libc_enable_secure) -- tunestr[off] = '\0'; -- return; -- } -+ break; - - /* We did not find a valid name-value pair before encountering the - colon. */ -@@ -244,9 +240,16 @@ - } - } - -- if (p[len] != '\0') -- p += len + 1; -+ /* We reached the end while processing the tunable string. */ -+ if (p[len] == '\0') -+ break; -+ -+ p += len + 1; - } -+ -+ /* Terminate tunestr before we leave. */ -+ if (__libc_enable_secure) -+ tunestr[off] = '\0'; - } - - /* Enable the glibc.malloc.check tunable in SETUID/SETGID programs only when -diff -ru glibc-2.38-orig/elf/tst-env-setuid-tunables.c glibc-2.38/elf/tst-env-setuid-tunables.c ---- glibc-2.38-orig/elf/tst-env-setuid-tunables.c 2024-06-17 21:53:23.808408845 +0000 -+++ glibc-2.38/elf/tst-env-setuid-tunables.c 2024-06-17 23:26:01.648142768 +0000 -@@ -50,6 +50,8 @@ - "glibc.malloc.perturb=0x800:not_valid.malloc.check=2:glibc.malloc.mmap_threshold=4096", - "glibc.not_valid.check=2:glibc.malloc.mmap_threshold=4096", - "not_valid.malloc.check=2:glibc.malloc.mmap_threshold=4096", -+ "glibc.malloc.mmap_threshold=glibc.malloc.mmap_threshold=4096", -+ "glibc.malloc.check=2", - "glibc.malloc.garbage=2:glibc.maoc.mmap_threshold=4096:glibc.malloc.check=2", - "glibc.malloc.check=4:glibc.malloc.garbage=2:glibc.maoc.mmap_threshold=4096", - ":glibc.malloc.garbage=2:glibc.malloc.check=1", -@@ -68,6 +70,8 @@ - "glibc.malloc.perturb=0x800:glibc.malloc.mmap_threshold=4096", - "glibc.malloc.mmap_threshold=4096", - "glibc.malloc.mmap_threshold=4096", -+ "glibc.malloc.mmap_threshold=glibc.malloc.mmap_threshold=4096", -+ "", - "", - "", - "", -@@ -81,11 +85,18 @@ - { - const char *val = getenv ("GLIBC_TUNABLES"); - -+ printf (" [%d] GLIBC_TUNABLES is %s\n", off, val); -+ fflush (stdout); - if (val != NULL && strcmp (val, resultstrings[off]) == 0) - return 0; - - if (val != NULL) -- printf ("[%d] Unexpected GLIBC_TUNABLES VALUE %s\n", off, val); -+ printf (" [%d] Unexpected GLIBC_TUNABLES VALUE %s, expected %s\n", -+ off, val, resultstrings[off]); -+ else -+ printf (" [%d] GLIBC_TUNABLES environment variable absent\n", off); -+ -+ fflush (stdout); - - return 1; - } -@@ -106,7 +117,9 @@ - if (ret != 0) - exit (1); - -- exit (EXIT_SUCCESS); -+ /* Special return code to make sure that the child executed all the way -+ through. */ -+ exit (42); - } - else - { -@@ -117,10 +130,15 @@ - { - char buf[INT_BUFSIZE_BOUND (int)]; - -- printf ("Spawned test for %s (%d)\n", teststrings[i], i); -- snprintf (buf, sizeof (buf), "%d\n", i); -- if (setenv ("GLIBC_TUNABLES", teststrings[i], 1) != 0) -- exit (1); -+ printf ("[%d] Spawned test for %s\n", i, teststrings[i]); -+ snprintf (buf, sizeof (buf), "%d\n", i); -+ fflush (stdout); -+ if (setenv ("GLIBC_TUNABLES", teststrings[i], 1) != 0) -+ { -+ printf (" [%d] Failed to set GLIBC_TUNABLES: %m", i); -+ support_record_failure (); -+ continue; -+ } - - int status = support_capture_subprogram_self_sgid (buf); - -@@ -128,9 +146,14 @@ - if (WEXITSTATUS (status) == EXIT_UNSUPPORTED) - return EXIT_UNSUPPORTED; - -- ret |= status; -+ if (WEXITSTATUS (status) != 42) -+ { -+ printf (" [%d] child failed with status %d\n", i, -+ WEXITSTATUS (status)); -+ support_record_failure (); -+ } - } -- return ret; -+ return 0; - } - } - diff --git a/SPECS/glibc/CVE-2023-5156.patch b/SPECS/glibc/CVE-2023-5156.patch deleted file mode 100644 index 562e11bb29..0000000000 --- a/SPECS/glibc/CVE-2023-5156.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 5ee59ca371b99984232d7584fe2b1a758b4421d3 Mon Sep 17 00:00:00 2001 -From: Romain Geissler -Date: Mon, 25 Sep 2023 01:21:51 +0100 -Subject: [PATCH] Fix leak in getaddrinfo introduced by the fix for - CVE-2023-4806 [BZ #30843] - -This patch fixes a very recently added leak in getaddrinfo. - -This was assigned CVE-2023-5156. - -Resolves: BZ #30884 -Related: BZ #30842 - -Reviewed-by: Siddhesh Poyarekar -(cherry picked from commit ec6b95c3303c700eb89eebeda2d7264cc184a796) - -Signed-off-by: Kanishk Bansal - ---- - nss/Makefile | 20 ++++++++++++++++++++ - nss/tst-nss-gai-hv2-canonname.c | 3 +++ - sysdeps/posix/getaddrinfo.c | 4 +--- - 3 files changed, 24 insertions(+), 3 deletions(-) - -diff --git a/nss/Makefile b/nss/Makefile -index 8a5126ecf34..668ba34b187 100644 ---- a/nss/Makefile -+++ b/nss/Makefile -@@ -149,6 +149,15 @@ endif - extra-test-objs += nss_test1.os nss_test2.os nss_test_errno.os \ - nss_test_gai_hv2_canonname.os - -+ifeq ($(run-built-tests),yes) -+ifneq (no,$(PERL)) -+tests-special += $(objpfx)mtrace-tst-nss-gai-hv2-canonname.out -+endif -+endif -+ -+generated += mtrace-tst-nss-gai-hv2-canonname.out \ -+ tst-nss-gai-hv2-canonname.mtrace -+ - include ../Rules - - ifeq (yes,$(have-selinux)) -@@ -217,6 +226,17 @@ endif - $(objpfx)tst-nss-files-alias-leak.out: $(objpfx)/libnss_files.so - $(objpfx)tst-nss-files-alias-truncated.out: $(objpfx)/libnss_files.so - -+tst-nss-gai-hv2-canonname-ENV = \ -+ MALLOC_TRACE=$(objpfx)tst-nss-gai-hv2-canonname.mtrace \ -+ LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so -+$(objpfx)mtrace-tst-nss-gai-hv2-canonname.out: \ -+ $(objpfx)tst-nss-gai-hv2-canonname.out -+ { test -r $(objpfx)tst-nss-gai-hv2-canonname.mtrace \ -+ || ( echo "tst-nss-gai-hv2-canonname.mtrace does not exist"; exit 77; ) \ -+ && $(common-objpfx)malloc/mtrace \ -+ $(objpfx)tst-nss-gai-hv2-canonname.mtrace; } > $@; \ -+ $(evaluate-test) -+ - # Disable DT_RUNPATH on NSS tests so that the glibc internal NSS - # functions can load testing NSS modules via DT_RPATH. - LDFLAGS-tst-nss-test1 = -Wl,--disable-new-dtags -diff --git a/nss/tst-nss-gai-hv2-canonname.c b/nss/tst-nss-gai-hv2-canonname.c -index d5f10c07d6a..7db53cf09da 100644 ---- a/nss/tst-nss-gai-hv2-canonname.c -+++ b/nss/tst-nss-gai-hv2-canonname.c -@@ -21,6 +21,7 @@ - #include - #include - #include -+#include - #include - #include - #include "nss/tst-nss-gai-hv2-canonname.h" -@@ -41,6 +42,8 @@ static void do_prepare (int a, char **av) - static int - do_test (void) - { -+ mtrace (); -+ - __nss_configure_lookup ("hosts", "test_gai_hv2_canonname"); - - struct addrinfo hints = {}; -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index b2236b105c1..13082305d3f 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -1196,9 +1196,7 @@ gaih_inet (const char *name, const struct gaih_service *service, - if (malloc_name) - free ((char *) name); - free (addrmem); -- if (res.free_at) -- free (res.at); -- free (res.canon); -+ gaih_result_reset (&res); - - return result; - } diff --git a/SPECS/glibc/CVE-2023-6246.patch b/SPECS/glibc/CVE-2023-6246.patch deleted file mode 100644 index 45c76b29a1..0000000000 --- a/SPECS/glibc/CVE-2023-6246.patch +++ /dev/null @@ -1,181 +0,0 @@ -From 23514c72b780f3da097ecf33a793b7ba9c2070d2 Mon Sep 17 00:00:00 2001 -From: Arjun Shankar -Date: Mon, 15 Jan 2024 17:44:43 +0100 -Subject: [PATCH] syslog: Fix heap buffer overflow in __vsyslog_internal - (CVE-2023-6246) - -__vsyslog_internal did not handle a case where printing a SYSLOG_HEADER -containing a long program name failed to update the required buffer -size, leading to the allocation and overflow of a too-small buffer on -the heap. This commit fixes that. It also adds a new regression test -that uses glibc.malloc.check. - -Reviewed-by: Adhemerval Zanella -Reviewed-by: Carlos O'Donell -Tested-by: Carlos O'Donell -(cherry picked from commit 6bd0e4efcc78f3c0115e5ea9739a1642807450da) ---- - misc/Makefile | 8 ++- - misc/syslog.c | 50 +++++++++++++------ - misc/tst-syslog-long-progname.c | 39 +++++++++++++++ - .../postclean.req | 0 - 4 files changed, 82 insertions(+), 15 deletions(-) - create mode 100644 misc/tst-syslog-long-progname.c - create mode 100644 misc/tst-syslog-long-progname.root/postclean.req - -diff --git a/misc/Makefile b/misc/Makefile -index fe0d49c1de..90b31952c5 100644 ---- a/misc/Makefile -+++ b/misc/Makefile -@@ -289,7 +289,10 @@ tests-special += $(objpfx)tst-error1-mem.out \ - $(objpfx)tst-allocate_once-mem.out - endif - --tests-container := tst-syslog -+tests-container := \ -+ tst-syslog \ -+ tst-syslog-long-progname \ -+ # tests-container - - CFLAGS-select.c += -fexceptions -fasynchronous-unwind-tables - CFLAGS-tsearch.c += $(uses-callbacks) -@@ -351,6 +354,9 @@ $(objpfx)tst-allocate_once-mem.out: $(objpfx)tst-allocate_once.out - $(common-objpfx)malloc/mtrace $(objpfx)tst-allocate_once.mtrace > $@; \ - $(evaluate-test) - -+tst-syslog-long-progname-ENV = GLIBC_TUNABLES=glibc.malloc.check=3 \ -+ LD_PRELOAD=libc_malloc_debug.so.0 -+ - $(objpfx)tst-select: $(librt) - $(objpfx)tst-select-time64: $(librt) - $(objpfx)tst-pselect: $(librt) -diff --git a/misc/syslog.c b/misc/syslog.c -index 1b8cb722c5..814d224a1e 100644 ---- a/misc/syslog.c -+++ b/misc/syslog.c -@@ -124,8 +124,9 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap, - { - /* Try to use a static buffer as an optimization. */ - char bufs[1024]; -- char *buf = NULL; -- size_t bufsize = 0; -+ char *buf = bufs; -+ size_t bufsize; -+ - int msgoff; - int saved_errno = errno; - -@@ -177,29 +178,50 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap, - #define SYSLOG_HEADER_WITHOUT_TS(__pri, __msgoff) \ - "<%d>: %n", __pri, __msgoff - -- int l; -+ int l, vl; - if (has_ts) - l = __snprintf (bufs, sizeof bufs, - SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); - else - l = __snprintf (bufs, sizeof bufs, - SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff)); -+ -+ char *pos; -+ size_t len; -+ - if (0 <= l && l < sizeof bufs) - { -- va_list apc; -- va_copy (apc, ap); -+ /* At this point, there is still a chance that we can print the -+ remaining part of the log into bufs and use that. */ -+ pos = bufs + l; -+ len = sizeof (bufs) - l; -+ } -+ else -+ { -+ buf = NULL; -+ /* We already know that bufs is too small to use for this log message. -+ The next vsnprintf into bufs is used only to calculate the total -+ required buffer length. We will discard bufs contents and allocate -+ an appropriately sized buffer later instead. */ -+ pos = bufs; -+ len = sizeof (bufs); -+ } - -- /* Restore errno for %m format. */ -- __set_errno (saved_errno); -+ { -+ va_list apc; -+ va_copy (apc, ap); - -- int vl = __vsnprintf_internal (bufs + l, sizeof bufs - l, fmt, apc, -- mode_flags); -- if (0 <= vl && vl < sizeof bufs - l) -- buf = bufs; -- bufsize = l + vl; -+ /* Restore errno for %m format. */ -+ __set_errno (saved_errno); - -- va_end (apc); -- } -+ vl = __vsnprintf_internal (pos, len, fmt, apc, mode_flags); -+ -+ if (!(0 <= vl && vl < len)) -+ buf = NULL; -+ -+ bufsize = l + vl; -+ va_end (apc); -+ } - - if (buf == NULL) - { -diff --git a/misc/tst-syslog-long-progname.c b/misc/tst-syslog-long-progname.c -new file mode 100644 -index 0000000000..88f37a8a00 ---- /dev/null -+++ b/misc/tst-syslog-long-progname.c -@@ -0,0 +1,39 @@ -+/* Test heap buffer overflow in syslog with long __progname (CVE-2023-6246) -+ Copyright (C) 2023 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+ -+extern char * __progname; -+ -+static int -+do_test (void) -+{ -+ char long_progname[2048]; -+ -+ memset (long_progname, 'X', sizeof (long_progname) - 1); -+ long_progname[sizeof (long_progname) - 1] = '\0'; -+ -+ __progname = long_progname; -+ -+ syslog (LOG_INFO, "Hello, World!"); -+ -+ return 0; -+} -+ -+#include -diff --git a/misc/tst-syslog-long-progname.root/postclean.req b/misc/tst-syslog-long-progname.root/postclean.req -new file mode 100644 -index 0000000000..e69de29bb2 --- -2.43.5 - diff --git a/SPECS/glibc/CVE-2023-6779.patch b/SPECS/glibc/CVE-2023-6779.patch deleted file mode 100644 index 3690e606f2..0000000000 --- a/SPECS/glibc/CVE-2023-6779.patch +++ /dev/null @@ -1,106 +0,0 @@ -From d0338312aace5bbfef85e03055e1212dd0e49578 Mon Sep 17 00:00:00 2001 -From: Arjun Shankar -Date: Mon, 15 Jan 2024 17:44:44 +0100 -Subject: [PATCH] syslog: Fix heap buffer overflow in __vsyslog_internal - (CVE-2023-6779) - -__vsyslog_internal used the return value of snprintf/vsnprintf to -calculate buffer sizes for memory allocation. If these functions (for -any reason) failed and returned -1, the resulting buffer would be too -small to hold output. This commit fixes that. - -All snprintf/vsnprintf calls are checked for negative return values and -the function silently returns upon encountering them. - -Reviewed-by: Carlos O'Donell -(cherry picked from commit 7e5a0c286da33159d47d0122007aac016f3e02cd) ---- - misc/syslog.c | 39 ++++++++++++++++++++++++++++----------- - 1 file changed, 28 insertions(+), 11 deletions(-) - -diff --git a/misc/syslog.c b/misc/syslog.c -index 814d224a1e..53440e47ad 100644 ---- a/misc/syslog.c -+++ b/misc/syslog.c -@@ -185,11 +185,13 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap, - else - l = __snprintf (bufs, sizeof bufs, - SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff)); -+ if (l < 0) -+ goto out; - - char *pos; - size_t len; - -- if (0 <= l && l < sizeof bufs) -+ if (l < sizeof bufs) - { - /* At this point, there is still a chance that we can print the - remaining part of the log into bufs and use that. */ -@@ -215,12 +217,15 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap, - __set_errno (saved_errno); - - vl = __vsnprintf_internal (pos, len, fmt, apc, mode_flags); -+ va_end (apc); -+ -+ if (vl < 0) -+ goto out; - -- if (!(0 <= vl && vl < len)) -+ if (vl >= len) - buf = NULL; - - bufsize = l + vl; -- va_end (apc); - } - - if (buf == NULL) -@@ -231,25 +236,37 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap, - /* Tell the cancellation handler to free this buffer. */ - clarg.buf = buf; - -+ int cl; - if (has_ts) -- __snprintf (buf, l + 1, -- SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); -+ cl = __snprintf (buf, l + 1, -+ SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); - else -- __snprintf (buf, l + 1, -- SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff)); -+ cl = __snprintf (buf, l + 1, -+ SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff)); -+ if (cl != l) -+ goto out; - - va_list apc; - va_copy (apc, ap); -- __vsnprintf_internal (buf + l, bufsize - l + 1, fmt, apc, -- mode_flags); -+ cl = __vsnprintf_internal (buf + l, bufsize - l + 1, fmt, apc, -+ mode_flags); - va_end (apc); -+ -+ if (cl != vl) -+ goto out; - } - else - { -+ int bl; - /* Nothing much to do but emit an error message. */ -- bufsize = __snprintf (bufs, sizeof bufs, -- "out of memory[%d]", __getpid ()); -+ bl = __snprintf (bufs, sizeof bufs, -+ "out of memory[%d]", __getpid ()); -+ if (bl < 0 || bl >= sizeof bufs) -+ goto out; -+ -+ bufsize = bl; - buf = bufs; -+ msgoff = 0; - } - } - --- -2.43.5 - diff --git a/SPECS/glibc/CVE-2023-6780.patch b/SPECS/glibc/CVE-2023-6780.patch deleted file mode 100644 index 209368253a..0000000000 --- a/SPECS/glibc/CVE-2023-6780.patch +++ /dev/null @@ -1,41 +0,0 @@ -From d37c2b20a4787463d192b32041c3406c2bd91de0 Mon Sep 17 00:00:00 2001 -From: Arjun Shankar -Date: Mon, 15 Jan 2024 17:44:45 +0100 -Subject: [PATCH] syslog: Fix integer overflow in __vsyslog_internal - (CVE-2023-6780) - -__vsyslog_internal calculated a buffer size by adding two integers, but -did not first check if the addition would overflow. This commit fixes -that. - -Reviewed-by: Carlos O'Donell -Tested-by: Carlos O'Donell -(cherry picked from commit ddf542da94caf97ff43cc2875c88749880b7259b) ---- - misc/syslog.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/misc/syslog.c b/misc/syslog.c -index 53440e47ad..4af87f54fd 100644 ---- a/misc/syslog.c -+++ b/misc/syslog.c -@@ -41,6 +41,7 @@ static char sccsid[] = "@(#)syslog.c 8.4 (Berkeley) 3/18/94"; - #include - #include - #include -+#include - - static int LogType = SOCK_DGRAM; /* type of socket connection */ - static int LogFile = -1; /* fd for log */ -@@ -219,7 +220,7 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap, - vl = __vsnprintf_internal (pos, len, fmt, apc, mode_flags); - va_end (apc); - -- if (vl < 0) -+ if (vl < 0 || vl >= INT_MAX - l) - goto out; - - if (vl >= len) --- -2.43.5 - diff --git a/SPECS/glibc/CVE-2024-33599.patch b/SPECS/glibc/CVE-2024-33599.patch deleted file mode 100644 index 2d5610b282..0000000000 --- a/SPECS/glibc/CVE-2024-33599.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 5968aebb86164034b8f8421b4abab2f837a5bdaf Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Thu, 25 Apr 2024 15:00:45 +0200 -Subject: [PATCH] CVE-2024-33599: nscd: Stack-based buffer overflow in netgroup - cache (bug 31677) - -Using alloca matches what other caches do. The request length is -bounded by MAXKEYLEN. - -Reviewed-by: Carlos O'Donell -(cherry picked from commit 87801a8fd06db1d654eea3e4f7626ff476a9bdaa) - -Signed-off-by: Kanishk Bansal - ---- - nscd/netgroupcache.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c -index 06b7d7b6ca8..31b721bbee2 100644 ---- a/nscd/netgroupcache.c -+++ b/nscd/netgroupcache.c -@@ -502,12 +502,13 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, - = (struct indataset *) mempool_alloc (db, - sizeof (*dataset) + req->key_len, - 1); -- struct indataset dataset_mem; - bool cacheable = true; - if (__glibc_unlikely (dataset == NULL)) - { - cacheable = false; -- dataset = &dataset_mem; -+ /* The alloca is safe because nscd_run_worker verfies that -+ key_len is not larger than MAXKEYLEN. */ -+ dataset = alloca (sizeof (*dataset) + req->key_len); - } - - datahead_init_pos (&dataset->head, sizeof (*dataset) + req->key_len, diff --git a/SPECS/glibc/CVE-2024-33600.patch b/SPECS/glibc/CVE-2024-33600.patch deleted file mode 100644 index cf1c0687f0..0000000000 --- a/SPECS/glibc/CVE-2024-33600.patch +++ /dev/null @@ -1,86 +0,0 @@ -From e4cb5367b33c57ae078da755c7432cf33681defa Mon Sep 17 00:00:00 2001 -From: Kanishk Bansal -Date: Thu, 22 May 2025 09:27:05 +0000 -Subject: [PATCH] CVE-2024-33600 - -Upstream Patch Reference : https://github.com/bminor/glibc/commit/541ea5172aa658c4bd5c6c6d6fd13903c3d5bb0a, https://github.com/bminor/glibc/commit/2ae9446c1b7a3064743b4a51c0bbae668ee43e4c - -Signed-off-by: Kanishk Bansal ---- - nscd/netgroupcache.c | 25 +++++++++++++------------ - 1 file changed, 13 insertions(+), 12 deletions(-) - -diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c -index 31b721bb..c3cd79de 100644 ---- a/nscd/netgroupcache.c -+++ b/nscd/netgroupcache.c -@@ -147,7 +147,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - /* No such service. */ - cacheable = do_notfound (db, fd, req, key, &dataset, &total, &timeout, - &key_copy); -- goto writeout; -+ goto maybe_cache_add; - } - - memset (&data, '\0', sizeof (data)); -@@ -348,7 +348,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - { - cacheable = do_notfound (db, fd, req, key, &dataset, &total, &timeout, - &key_copy); -- goto writeout; -+ goto maybe_cache_add; - } - - total = buffilled; -@@ -410,14 +410,12 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - } - - if (he == NULL && fd != -1) -- { -- /* We write the dataset before inserting it to the database -- since while inserting this thread might block and so would -- unnecessarily let the receiver wait. */ -- writeout: -+ /* We write the dataset before inserting it to the database since -+ while inserting this thread might block and so would -+ unnecessarily let the receiver wait. */ - writeall (fd, &dataset->resp, dataset->head.recsize); -- } - -+ maybe_cache_add: - if (cacheable) - { - /* If necessary, we also propagate the data to disk. */ -@@ -513,14 +511,15 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, - - datahead_init_pos (&dataset->head, sizeof (*dataset) + req->key_len, - sizeof (innetgroup_response_header), -- he == NULL ? 0 : dh->nreloads + 1, result->head.ttl); -+ he == NULL ? 0 : dh->nreloads + 1, -+ result == NULL ? db->negtimeout : result->head.ttl); - /* Set the notfound status and timeout based on the result from - getnetgrent. */ -- dataset->head.notfound = result->head.notfound; -+ dataset->head.notfound = result == NULL || result->head.notfound; - dataset->head.timeout = timeout; - - dataset->resp.version = NSCD_VERSION; -- dataset->resp.found = result->resp.found; -+ dataset->resp.found = result != NULL && result->resp.found; - /* Until we find a matching entry the result is 0. */ - dataset->resp.result = 0; - -@@ -568,7 +567,9 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, - goto out; - } - -- if (he == NULL) -+ /* addgetnetgrentX may have already sent a notfound response. Do -+ not send another one. */ -+ if (he == NULL && dataset->resp.found) - { - /* We write the dataset before inserting it to the database - since while inserting this thread might block and so would --- -2.45.3 - diff --git a/SPECS/glibc/CVE-2024-33601.patch b/SPECS/glibc/CVE-2024-33601.patch deleted file mode 100644 index 4829bfc0b9..0000000000 --- a/SPECS/glibc/CVE-2024-33601.patch +++ /dev/null @@ -1,390 +0,0 @@ -From 71af8ca864345d39b746d5cee84b94b430fad5db Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Thu, 25 Apr 2024 15:01:07 +0200 -Subject: [PATCH] CVE-2024-33601, CVE-2024-33602: nscd: netgroup: Use two - buffers in addgetnetgrentX (bug 31680) - -This avoids potential memory corruption when the underlying NSS -callback function does not use the buffer space to store all strings -(e.g., for constant strings). - -Instead of custom buffer management, two scratch buffers are used. -This increases stack usage somewhat. - -Scratch buffer allocation failure is handled by return -1 -(an invalid timeout value) instead of terminating the process. -This fixes bug 31679. - -Reviewed-by: Siddhesh Poyarekar -(cherry picked from commit c04a21e050d64a1193a6daab872bca2528bda44b) - -Signed-off-by: Kanishk Bansal - ---- - nscd/netgroupcache.c | 219 ++++++++++++++++++++++++------------------- - 1 file changed, 121 insertions(+), 98 deletions(-) - -diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c -index c3cd79dec59..cc4e270c1f0 100644 ---- a/nscd/netgroupcache.c -+++ b/nscd/netgroupcache.c -@@ -23,6 +23,7 @@ - #include - #include - #include -+#include - - #include "../inet/netgroup.h" - #include "nscd.h" -@@ -65,6 +66,16 @@ struct dataset - char strdata[0]; - }; - -+/* Send a notfound response to FD. Always returns -1 to indicate an -+ ephemeral error. */ -+static time_t -+send_notfound (int fd) -+{ -+ if (fd != -1) -+ TEMP_FAILURE_RETRY (send (fd, ¬found, sizeof (notfound), MSG_NOSIGNAL)); -+ return -1; -+} -+ - /* Sends a notfound message and prepares a notfound dataset to write to the - cache. Returns true if there was enough memory to allocate the dataset and - returns the dataset in DATASETP, total bytes to write in TOTALP and the -@@ -83,8 +94,7 @@ do_notfound (struct database_dyn *db, int fd, request_header *req, - total = sizeof (notfound); - timeout = time (NULL) + db->negtimeout; - -- if (fd != -1) -- TEMP_FAILURE_RETRY (send (fd, ¬found, total, MSG_NOSIGNAL)); -+ send_notfound (fd); - - dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, 1); - /* If we cannot permanently store the result, so be it. */ -@@ -109,11 +119,78 @@ do_notfound (struct database_dyn *db, int fd, request_header *req, - return cacheable; - } - -+struct addgetnetgrentX_scratch -+{ -+ /* This is the result that the caller should use. It can be NULL, -+ point into buffer, or it can be in the cache. */ -+ struct dataset *dataset; -+ -+ struct scratch_buffer buffer; -+ -+ /* Used internally in addgetnetgrentX as a staging area. */ -+ struct scratch_buffer tmp; -+ -+ /* Number of bytes in buffer that are actually used. */ -+ size_t buffer_used; -+}; -+ -+static void -+addgetnetgrentX_scratch_init (struct addgetnetgrentX_scratch *scratch) -+{ -+ scratch->dataset = NULL; -+ scratch_buffer_init (&scratch->buffer); -+ scratch_buffer_init (&scratch->tmp); -+ -+ /* Reserve space for the header. */ -+ scratch->buffer_used = sizeof (struct dataset); -+ static_assert (sizeof (struct dataset) < sizeof (scratch->tmp.__space), -+ "initial buffer space"); -+ memset (scratch->tmp.data, 0, sizeof (struct dataset)); -+} -+ -+static void -+addgetnetgrentX_scratch_free (struct addgetnetgrentX_scratch *scratch) -+{ -+ scratch_buffer_free (&scratch->buffer); -+ scratch_buffer_free (&scratch->tmp); -+} -+ -+/* Copy LENGTH bytes from S into SCRATCH. Returns NULL if SCRATCH -+ could not be resized, otherwise a pointer to the copy. */ -+static char * -+addgetnetgrentX_append_n (struct addgetnetgrentX_scratch *scratch, -+ const char *s, size_t length) -+{ -+ while (true) -+ { -+ size_t remaining = scratch->buffer.length - scratch->buffer_used; -+ if (remaining >= length) -+ break; -+ if (!scratch_buffer_grow_preserve (&scratch->buffer)) -+ return NULL; -+ } -+ char *copy = scratch->buffer.data + scratch->buffer_used; -+ memcpy (copy, s, length); -+ scratch->buffer_used += length; -+ return copy; -+} -+ -+/* Copy S into SCRATCH, including its null terminator. Returns false -+ if SCRATCH could not be resized. */ -+static bool -+addgetnetgrentX_append (struct addgetnetgrentX_scratch *scratch, const char *s) -+{ -+ if (s == NULL) -+ s = ""; -+ return addgetnetgrentX_append_n (scratch, s, strlen (s) + 1) != NULL; -+} -+ -+/* Caller must initialize and free *SCRATCH. If the return value is -+ negative, this function has sent a notfound response. */ - static time_t - addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - const char *key, uid_t uid, struct hashentry *he, -- struct datahead *dh, struct dataset **resultp, -- void **tofreep) -+ struct datahead *dh, struct addgetnetgrentX_scratch *scratch) - { - if (__glibc_unlikely (debug_level > 0)) - { -@@ -132,14 +209,10 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - - char *key_copy = NULL; - struct __netgrent data; -- size_t buflen = MAX (1024, sizeof (*dataset) + req->key_len); -- size_t buffilled = sizeof (*dataset); -- char *buffer = NULL; - size_t nentries = 0; - size_t group_len = strlen (key) + 1; - struct name_list *first_needed - = alloca (sizeof (struct name_list) + group_len); -- *tofreep = NULL; - - if (netgroup_database == NULL - && !__nss_database_get (nss_database_netgroup, &netgroup_database)) -@@ -151,8 +224,6 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - } - - memset (&data, '\0', sizeof (data)); -- buffer = xmalloc (buflen); -- *tofreep = buffer; - first_needed->next = first_needed; - memcpy (first_needed->name, key, group_len); - data.needed_groups = first_needed; -@@ -195,8 +266,8 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - while (1) - { - int e; -- status = getfct.f (&data, buffer + buffilled, -- buflen - buffilled - req->key_len, &e); -+ status = getfct.f (&data, scratch->tmp.data, -+ scratch->tmp.length, &e); - if (status == NSS_STATUS_SUCCESS) - { - if (data.type == triple_val) -@@ -204,68 +275,10 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - const char *nhost = data.val.triple.host; - const char *nuser = data.val.triple.user; - const char *ndomain = data.val.triple.domain; -- -- size_t hostlen = strlen (nhost ?: "") + 1; -- size_t userlen = strlen (nuser ?: "") + 1; -- size_t domainlen = strlen (ndomain ?: "") + 1; -- -- if (nhost == NULL || nuser == NULL || ndomain == NULL -- || nhost > nuser || nuser > ndomain) -- { -- const char *last = nhost; -- if (last == NULL -- || (nuser != NULL && nuser > last)) -- last = nuser; -- if (last == NULL -- || (ndomain != NULL && ndomain > last)) -- last = ndomain; -- -- size_t bufused -- = (last == NULL -- ? buffilled -- : last + strlen (last) + 1 - buffer); -- -- /* We have to make temporary copies. */ -- size_t needed = hostlen + userlen + domainlen; -- -- if (buflen - req->key_len - bufused < needed) -- { -- buflen += MAX (buflen, 2 * needed); -- /* Save offset in the old buffer. We don't -- bother with the NULL check here since -- we'll do that later anyway. */ -- size_t nhostdiff = nhost - buffer; -- size_t nuserdiff = nuser - buffer; -- size_t ndomaindiff = ndomain - buffer; -- -- char *newbuf = xrealloc (buffer, buflen); -- /* Fix up the triplet pointers into the new -- buffer. */ -- nhost = (nhost ? newbuf + nhostdiff -- : NULL); -- nuser = (nuser ? newbuf + nuserdiff -- : NULL); -- ndomain = (ndomain ? newbuf + ndomaindiff -- : NULL); -- *tofreep = buffer = newbuf; -- } -- -- nhost = memcpy (buffer + bufused, -- nhost ?: "", hostlen); -- nuser = memcpy ((char *) nhost + hostlen, -- nuser ?: "", userlen); -- ndomain = memcpy ((char *) nuser + userlen, -- ndomain ?: "", domainlen); -- } -- -- char *wp = buffer + buffilled; -- wp = memmove (wp, nhost ?: "", hostlen); -- wp += hostlen; -- wp = memmove (wp, nuser ?: "", userlen); -- wp += userlen; -- wp = memmove (wp, ndomain ?: "", domainlen); -- wp += domainlen; -- buffilled = wp - buffer; -+ if (!(addgetnetgrentX_append (scratch, nhost) -+ && addgetnetgrentX_append (scratch, nuser) -+ && addgetnetgrentX_append (scratch, ndomain))) -+ return send_notfound (fd); - ++nentries; - } - else -@@ -317,8 +330,8 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - } - else if (status == NSS_STATUS_TRYAGAIN && e == ERANGE) - { -- buflen *= 2; -- *tofreep = buffer = xrealloc (buffer, buflen); -+ if (!scratch_buffer_grow (&scratch->tmp)) -+ return send_notfound (fd); - } - else if (status == NSS_STATUS_RETURN - || status == NSS_STATUS_NOTFOUND -@@ -351,10 +364,17 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - goto maybe_cache_add; - } - -- total = buffilled; -+ /* Capture the result size without the key appended. */ -+ total = scratch->buffer_used; -+ -+ /* Make a copy of the key. The scratch buffer must not move after -+ this point. */ -+ key_copy = addgetnetgrentX_append_n (scratch, key, req->key_len); -+ if (key_copy == NULL) -+ return send_notfound (fd); - - /* Fill in the dataset. */ -- dataset = (struct dataset *) buffer; -+ dataset = scratch->buffer.data; - timeout = datahead_init_pos (&dataset->head, total + req->key_len, - total - offsetof (struct dataset, resp), - he == NULL ? 0 : dh->nreloads + 1, -@@ -363,11 +383,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - dataset->resp.version = NSCD_VERSION; - dataset->resp.found = 1; - dataset->resp.nresults = nentries; -- dataset->resp.result_len = buffilled - sizeof (*dataset); -- -- assert (buflen - buffilled >= req->key_len); -- key_copy = memcpy (buffer + buffilled, key, req->key_len); -- buffilled += req->key_len; -+ dataset->resp.result_len = total - sizeof (*dataset); - - /* Now we can determine whether on refill we have to create a new - record or not. */ -@@ -398,7 +414,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - if (__glibc_likely (newp != NULL)) - { - /* Adjust pointer into the memory block. */ -- key_copy = (char *) newp + (key_copy - buffer); -+ key_copy = (char *) newp + (key_copy - (char *) dataset); - - dataset = memcpy (newp, dataset, total + req->key_len); - cacheable = true; -@@ -439,7 +455,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, - } - - out: -- *resultp = dataset; -+ scratch->dataset = dataset; - - return timeout; - } -@@ -460,6 +476,9 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, - if (user != NULL) - key = strchr (key, '\0') + 1; - const char *domain = *key++ ? key : NULL; -+ struct addgetnetgrentX_scratch scratch; -+ -+ addgetnetgrentX_scratch_init (&scratch); - - if (__glibc_unlikely (debug_level > 0)) - { -@@ -475,12 +494,8 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, - group, group_len, - db, uid); - time_t timeout; -- void *tofree; - if (result != NULL) -- { -- timeout = result->head.timeout; -- tofree = NULL; -- } -+ timeout = result->head.timeout; - else - { - request_header req_get = -@@ -489,7 +504,10 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, - .key_len = group_len - }; - timeout = addgetnetgrentX (db, -1, &req_get, group, uid, NULL, NULL, -- &result, &tofree); -+ &scratch); -+ result = scratch.dataset; -+ if (timeout < 0) -+ goto out; - } - - struct indataset -@@ -603,7 +621,7 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, - } - - out: -- free (tofree); -+ addgetnetgrentX_scratch_free (&scratch); - return timeout; - } - -@@ -613,11 +631,12 @@ addgetnetgrentX_ignore (struct database_dyn *db, int fd, request_header *req, - const char *key, uid_t uid, struct hashentry *he, - struct datahead *dh) - { -- struct dataset *ignore; -- void *tofree; -- time_t timeout = addgetnetgrentX (db, fd, req, key, uid, he, dh, -- &ignore, &tofree); -- free (tofree); -+ struct addgetnetgrentX_scratch scratch; -+ addgetnetgrentX_scratch_init (&scratch); -+ time_t timeout = addgetnetgrentX (db, fd, req, key, uid, he, dh, &scratch); -+ addgetnetgrentX_scratch_free (&scratch); -+ if (timeout < 0) -+ timeout = 0; - return timeout; - } - -@@ -661,5 +680,9 @@ readdinnetgr (struct database_dyn *db, struct hashentry *he, - .key_len = he->len - }; - -- return addinnetgrX (db, -1, &req, db->data + he->key, he->owner, he, dh); -+ int timeout = addinnetgrX (db, -1, &req, db->data + he->key, he->owner, -+ he, dh); -+ if (timeout < 0) -+ timeout = 0; -+ return timeout; - } diff --git a/SPECS/glibc/CVE-2025-0395.patch b/SPECS/glibc/CVE-2025-0395.patch deleted file mode 100644 index 0def90aa7c..0000000000 --- a/SPECS/glibc/CVE-2025-0395.patch +++ /dev/null @@ -1,173 +0,0 @@ -From e4b60c61eba1812eeaeaea5d1520ba86ead98607 Mon Sep 17 00:00:00 2001 -From: Kanishk Bansal -Date: Thu, 22 May 2025 09:35:53 +0000 -Subject: [PATCH] CVE-2025-0395 - -Upstream Patch Reference : https://github.com/bminor/glibc/commit/c32fd59314c343db88c3ea4a203870481d33c3d2, https://github.com/bminor/glibc/commit/f984e2d7e8299726891a1a497a3c36cd5542a0bf - -Signed-off-by: Kanishk Bansal ---- - assert/Makefile | 1 + - assert/assert.c | 4 +- - assert/tst-assert-sa-2025-0001.c | 92 ++++++++++++++++++++++++++++++++ - sysdeps/posix/libc_fatal.c | 4 +- - 4 files changed, 99 insertions(+), 2 deletions(-) - create mode 100644 assert/tst-assert-sa-2025-0001.c - -diff --git a/assert/Makefile b/assert/Makefile -index 67f4e6a5..b0fc9fc4 100644 ---- a/assert/Makefile -+++ b/assert/Makefile -@@ -38,6 +38,7 @@ tests := \ - test-assert-perr \ - tst-assert-c++ \ - tst-assert-g++ \ -+ tst-assert-sa-2025-0001 \ - # tests - - ifeq ($(have-cxx-thread_local),yes) -diff --git a/assert/assert.c b/assert/assert.c -index b7c7a4a1..65a9fedf 100644 ---- a/assert/assert.c -+++ b/assert/assert.c -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -64,7 +65,8 @@ __assert_fail_base (const char *fmt, const char *assertion, const char *file, - (void) __fxprintf (NULL, "%s", str); - (void) fflush (stderr); - -- total = (total + 1 + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1); -+ total = ALIGN_UP (total + sizeof (struct abort_msg_s) + 1, -+ GLRO(dl_pagesize)); - struct abort_msg_s *buf = __mmap (NULL, total, PROT_READ | PROT_WRITE, - MAP_ANON | MAP_PRIVATE, -1, 0); - if (__glibc_likely (buf != MAP_FAILED)) -diff --git a/assert/tst-assert-sa-2025-0001.c b/assert/tst-assert-sa-2025-0001.c -new file mode 100644 -index 00000000..102cb007 ---- /dev/null -+++ b/assert/tst-assert-sa-2025-0001.c -@@ -0,0 +1,92 @@ -+/* Test for CVE-2025-0395. -+ Copyright The GNU Toolchain Authors. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* Test that a large enough __progname does not result in a buffer overflow -+ when printing an assertion failure. This was CVE-2025-0395. */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+extern const char *__progname; -+ -+int -+do_test (int argc, char **argv) -+{ -+ -+ support_need_proc ("Reads /proc/self/maps to add guards to writable maps."); -+ ignore_stderr (); -+ -+ /* XXX assumes that the assert is on a 2 digit line number. */ -+ const char *prompt = ": %s:99: do_test: Assertion `argc < 1' failed.\n"; -+ -+ int ret = fprintf (stderr, prompt, __FILE__); -+ if (ret < 0) -+ FAIL_EXIT1 ("fprintf failed: %m\n"); -+ -+ size_t pagesize = getpagesize (); -+ size_t namesize = pagesize - 1 - ret; -+ -+ /* Alter the progname so that the assert message fills the entire page. */ -+ char progname[namesize]; -+ memset (progname, 'A', namesize - 1); -+ progname[namesize - 1] = '\0'; -+ __progname = progname; -+ -+ FILE *f = xfopen ("/proc/self/maps", "r"); -+ char *line = NULL; -+ size_t len = 0; -+ uintptr_t prev_to = 0; -+ -+ /* Pad the beginning of every writable mapping with a PROT_NONE map. This -+ ensures that the mmap in the assert_fail path never ends up below a -+ writable map and will terminate immediately in case of a buffer -+ overflow. */ -+ while (xgetline (&line, &len, f)) -+ { -+ uintptr_t from, to; -+ char perm[4]; -+ -+ sscanf (line, "%" SCNxPTR "-%" SCNxPTR " %c%c%c%c ", -+ &from, &to, -+ &perm[0], &perm[1], &perm[2], &perm[3]); -+ -+ bool writable = (memchr (perm, 'w', 4) != NULL); -+ -+ if (prev_to != 0 && from - prev_to > pagesize && writable) -+ xmmap ((void *) from - pagesize, pagesize, PROT_NONE, -+ MAP_ANONYMOUS | MAP_PRIVATE, 0); -+ -+ prev_to = to; -+ } -+ -+ xfclose (f); -+ -+ assert (argc < 1); -+ return 0; -+} -+ -+#define EXPECTED_SIGNAL SIGABRT -+#define TEST_FUNCTION_ARGV do_test -+#include -diff --git a/sysdeps/posix/libc_fatal.c b/sysdeps/posix/libc_fatal.c -index 70edcc10..5b9e4b79 100644 ---- a/sysdeps/posix/libc_fatal.c -+++ b/sysdeps/posix/libc_fatal.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -123,7 +124,8 @@ __libc_message (const char *fmt, ...) - - WRITEV_FOR_FATAL (fd, iov, nlist, total); - -- total = (total + 1 + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1); -+ total = ALIGN_UP (total + sizeof (struct abort_msg_s) + 1, -+ GLRO(dl_pagesize)); - struct abort_msg_s *buf = __mmap (NULL, total, - PROT_READ | PROT_WRITE, - MAP_ANON | MAP_PRIVATE, -1, 0); --- -2.45.3 - diff --git a/SPECS/glibc/CVE-2025-4802.patch b/SPECS/glibc/CVE-2025-4802.patch deleted file mode 100644 index b766e5da8d..0000000000 --- a/SPECS/glibc/CVE-2025-4802.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 3be3728df2f1912c80abd3288bc6e3a25ad679e4 Mon Sep 17 00:00:00 2001 -From: Adhemerval Zanella -Date: Mon, 6 Nov 2023 17:25:49 -0300 -Subject: [PATCH] elf: Ignore LD_LIBRARY_PATH and debug env var for setuid for - static - -It mimics the ld.so behavior. - -Checked on x86_64-linux-gnu. -Reviewed-by: Siddhesh Poyarekar - -(cherry picked from commit 5451fa962cd0a90a0e2ec1d8910a559ace02bba0) - -Changes: - - git/elf/dl-support.c - (missing commit 55f41ef8de4a4d0c5762d78659e11202d3c765d4 - ("elf: Remove LD_PROFILE for static binaries")) ---- - elf/dl-support.c | 32 ++++++++++++++++---------------- - 1 file changed, 16 insertions(+), 16 deletions(-) - -diff --git a/elf/dl-support.c b/elf/dl-support.c -index 44a54dea074..d57e6505835 100644 ---- a/elf/dl-support.c -+++ b/elf/dl-support.c -@@ -276,8 +276,6 @@ _dl_non_dynamic_init (void) - _dl_main_map.l_phdr = GL(dl_phdr); - _dl_main_map.l_phnum = GL(dl_phnum); - -- _dl_verbose = *(getenv ("LD_WARN") ?: "") == '\0' ? 0 : 1; -- - /* Set up the data structures for the system-supplied DSO early, - so they can influence _dl_init_paths. */ - setup_vdso (NULL, NULL); -@@ -285,6 +283,22 @@ _dl_non_dynamic_init (void) - /* With vDSO setup we can initialize the function pointers. */ - setup_vdso_pointers (); - -+ if (__libc_enable_secure) -+ { -+ static const char unsecure_envvars[] = -+ UNSECURE_ENVVARS -+ ; -+ const char *cp = unsecure_envvars; -+ -+ while (cp < unsecure_envvars + sizeof (unsecure_envvars)) -+ { -+ __unsetenv (cp); -+ cp = strchr (cp, '\0') + 1; -+ } -+ } -+ -+ _dl_verbose = *(getenv ("LD_WARN") ?: "") == '\0' ? 0 : 1; -+ - /* Initialize the data structures for the search paths for shared - objects. */ - _dl_init_paths (getenv ("LD_LIBRARY_PATH"), "LD_LIBRARY_PATH", -@@ -306,20 +320,6 @@ _dl_non_dynamic_init (void) - _dl_profile_output - = &"/var/tmp\0/var/profile"[__libc_enable_secure ? 9 : 0]; - -- if (__libc_enable_secure) -- { -- static const char unsecure_envvars[] = -- UNSECURE_ENVVARS -- ; -- const char *cp = unsecure_envvars; -- -- while (cp < unsecure_envvars + sizeof (unsecure_envvars)) -- { -- __unsetenv (cp); -- cp = strchr (cp, '\0') + 1; -- } -- } -- - #ifdef DL_PLATFORM_INIT - DL_PLATFORM_INIT; - #endif diff --git a/SPECS/glibc/glibc-2.34_pthread_cond_wait.patch b/SPECS/glibc/glibc-2.34_pthread_cond_wait.patch deleted file mode 100644 index bf04421f81..0000000000 --- a/SPECS/glibc/glibc-2.34_pthread_cond_wait.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff -ruN a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c ---- a/nptl/pthread_cond_wait.c 2021-11-05 15:04:17.337600296 -0700 -+++ b/nptl/pthread_cond_wait.c 2021-11-05 15:05:23.813388264 -0700 -@@ -589,6 +589,15 @@ - the signal from, which cause it to block using the - futex). */ - futex_wake (cond->__data.__g_signals + g, 1, private); -+ -+ /* We might be wrong about stealing, we got the signal -+ from the an old g1, but ended up returning it to -+ a different g1. We can't tell whether it is the case. -+ If it is, we now caused another issue: -+ now g_refs[g1] is one less than g_size[g1]. -+ The mitigation step is to broadcast g1 and g2, let every -+ waiter wake up spuriosly. */ -+ __pthread_cond_broadcast(cond); - break; - } - /* TODO Back off. */ diff --git a/SPECS/glibc/glibc-2.35-fhs-1.patch b/SPECS/glibc/glibc-2.35-fhs-1.patch deleted file mode 100644 index 4ac8d106bb..0000000000 --- a/SPECS/glibc/glibc-2.35-fhs-1.patch +++ /dev/null @@ -1,72 +0,0 @@ -Submitted By: Armin K. -Date: 2013-02-11 -Initial Package Version: 2.17 -Upstream Status: Not Applicable -Origin: Self -Description: This patch removes references to /var/db directory which is not part - of FHS and replaces them with more suitable directories in /var - hierarchy - /var/cache/nscd for nscd and /var/lib/nss_db for nss_db. - ---- a/Makeconfig 2012-12-25 04:02:13.000000000 +0100 -+++ b/Makeconfig 2013-02-11 01:32:32.500667439 +0100 -@@ -250,7 +250,7 @@ - - # Directory for the database files and Makefile for nss_db. - ifndef vardbdir --vardbdir = $(localstatedir)/db -+vardbdir = $(localstatedir)/lib/nss_db - endif - inst_vardbdir = $(install_root)$(vardbdir) - ---- a/nscd/nscd.h 2012-12-25 04:02:13.000000000 +0100 -+++ b/nscd/nscd.h 2013-02-11 01:32:32.500667439 +0100 -@@ -112,11 +112,11 @@ - - - /* Paths of the file for the persistent storage. */ --#define _PATH_NSCD_PASSWD_DB "/var/db/nscd/passwd" --#define _PATH_NSCD_GROUP_DB "/var/db/nscd/group" --#define _PATH_NSCD_HOSTS_DB "/var/db/nscd/hosts" --#define _PATH_NSCD_SERVICES_DB "/var/db/nscd/services" --#define _PATH_NSCD_NETGROUP_DB "/var/db/nscd/netgroup" -+#define _PATH_NSCD_PASSWD_DB "/var/cache/nscd/passwd" -+#define _PATH_NSCD_GROUP_DB "/var/cache/nscd/group" -+#define _PATH_NSCD_HOSTS_DB "/var/cache/nscd/hosts" -+#define _PATH_NSCD_SERVICES_DB "/var/cache/nscd/services" -+#define _PATH_NSCD_NETGROUP_DB "/var/cache/nscd/netgroup" - - /* Path used when not using persistent storage. */ - #define _PATH_NSCD_XYZ_DB_TMP "/var/run/nscd/dbXXXXXX" ---- a/nss/db-Makefile 2012-12-25 04:02:13.000000000 +0100 -+++ b/nss/db-Makefile 2013-02-11 01:32:32.500667439 +0100 -@@ -22,7 +22,7 @@ - /etc/rpc /etc/services /etc/shadow /etc/gshadow \ - /etc/netgroup) - --VAR_DB = /var/db -+VAR_DB = /var/lib/nss_db - - AWK = awk - MAKEDB = makedb --quiet ---- a/sysdeps/generic/paths.h 2012-12-25 04:02:13.000000000 +0100 -+++ b/sysdeps/generic/paths.h 2013-02-11 01:32:32.500667439 +0100 -@@ -68,7 +68,7 @@ - /* Provide trailing slash, since mostly used for building pathnames. */ - #define _PATH_DEV "/dev/" - #define _PATH_TMP "/tmp/" --#define _PATH_VARDB "/var/db/" -+#define _PATH_VARDB "/var/lib/nss_db/" - #define _PATH_VARRUN "/var/run/" - #define _PATH_VARTMP "/var/tmp/" - ---- a/sysdeps/unix/sysv/linux/paths.h 2012-12-25 04:02:13.000000000 +0100 -+++ b/sysdeps/unix/sysv/linux/paths.h 2013-02-11 01:32:32.504000831 +0100 -@@ -68,7 +68,7 @@ - /* Provide trailing slash, since mostly used for building pathnames. */ - #define _PATH_DEV "/dev/" - #define _PATH_TMP "/tmp/" --#define _PATH_VARDB "/var/db/" -+#define _PATH_VARDB "/var/lib/nss_db/" - #define _PATH_VARRUN "/var/run/" - #define _PATH_VARTMP "/var/tmp/" - diff --git a/SPECS/glibc/glibc-2.38-fhs-1.patch b/SPECS/glibc/glibc-2.38-fhs-1.patch deleted file mode 100644 index 4ac8d106bb..0000000000 --- a/SPECS/glibc/glibc-2.38-fhs-1.patch +++ /dev/null @@ -1,72 +0,0 @@ -Submitted By: Armin K. -Date: 2013-02-11 -Initial Package Version: 2.17 -Upstream Status: Not Applicable -Origin: Self -Description: This patch removes references to /var/db directory which is not part - of FHS and replaces them with more suitable directories in /var - hierarchy - /var/cache/nscd for nscd and /var/lib/nss_db for nss_db. - ---- a/Makeconfig 2012-12-25 04:02:13.000000000 +0100 -+++ b/Makeconfig 2013-02-11 01:32:32.500667439 +0100 -@@ -250,7 +250,7 @@ - - # Directory for the database files and Makefile for nss_db. - ifndef vardbdir --vardbdir = $(localstatedir)/db -+vardbdir = $(localstatedir)/lib/nss_db - endif - inst_vardbdir = $(install_root)$(vardbdir) - ---- a/nscd/nscd.h 2012-12-25 04:02:13.000000000 +0100 -+++ b/nscd/nscd.h 2013-02-11 01:32:32.500667439 +0100 -@@ -112,11 +112,11 @@ - - - /* Paths of the file for the persistent storage. */ --#define _PATH_NSCD_PASSWD_DB "/var/db/nscd/passwd" --#define _PATH_NSCD_GROUP_DB "/var/db/nscd/group" --#define _PATH_NSCD_HOSTS_DB "/var/db/nscd/hosts" --#define _PATH_NSCD_SERVICES_DB "/var/db/nscd/services" --#define _PATH_NSCD_NETGROUP_DB "/var/db/nscd/netgroup" -+#define _PATH_NSCD_PASSWD_DB "/var/cache/nscd/passwd" -+#define _PATH_NSCD_GROUP_DB "/var/cache/nscd/group" -+#define _PATH_NSCD_HOSTS_DB "/var/cache/nscd/hosts" -+#define _PATH_NSCD_SERVICES_DB "/var/cache/nscd/services" -+#define _PATH_NSCD_NETGROUP_DB "/var/cache/nscd/netgroup" - - /* Path used when not using persistent storage. */ - #define _PATH_NSCD_XYZ_DB_TMP "/var/run/nscd/dbXXXXXX" ---- a/nss/db-Makefile 2012-12-25 04:02:13.000000000 +0100 -+++ b/nss/db-Makefile 2013-02-11 01:32:32.500667439 +0100 -@@ -22,7 +22,7 @@ - /etc/rpc /etc/services /etc/shadow /etc/gshadow \ - /etc/netgroup) - --VAR_DB = /var/db -+VAR_DB = /var/lib/nss_db - - AWK = awk - MAKEDB = makedb --quiet ---- a/sysdeps/generic/paths.h 2012-12-25 04:02:13.000000000 +0100 -+++ b/sysdeps/generic/paths.h 2013-02-11 01:32:32.500667439 +0100 -@@ -68,7 +68,7 @@ - /* Provide trailing slash, since mostly used for building pathnames. */ - #define _PATH_DEV "/dev/" - #define _PATH_TMP "/tmp/" --#define _PATH_VARDB "/var/db/" -+#define _PATH_VARDB "/var/lib/nss_db/" - #define _PATH_VARRUN "/var/run/" - #define _PATH_VARTMP "/var/tmp/" - ---- a/sysdeps/unix/sysv/linux/paths.h 2012-12-25 04:02:13.000000000 +0100 -+++ b/sysdeps/unix/sysv/linux/paths.h 2013-02-11 01:32:32.504000831 +0100 -@@ -68,7 +68,7 @@ - /* Provide trailing slash, since mostly used for building pathnames. */ - #define _PATH_DEV "/dev/" - #define _PATH_TMP "/tmp/" --#define _PATH_VARDB "/var/db/" -+#define _PATH_VARDB "/var/lib/nss_db/" - #define _PATH_VARRUN "/var/run/" - #define _PATH_VARTMP "/var/tmp/" - diff --git a/SPECS/glibc/glibc-2.38-memalign_fix-1.patch b/SPECS/glibc/glibc-2.38-memalign_fix-1.patch deleted file mode 100644 index b04c21f3de..0000000000 --- a/SPECS/glibc/glibc-2.38-memalign_fix-1.patch +++ /dev/null @@ -1,585 +0,0 @@ -Submitted By: Xi Ruoyao -Date: 2023-08-13 -Initial Package Version: 2.38 -Upstream Status: Under review -Origin: Upstream & Self - - 1/3: https://sourceware.org/git/?p=glibc.git;a=patch;h=542b11058525 - - 2/3: https://sourceware.org/pipermail/libc-alpha/2023-August/150857.html - - 3/3: Trivial unused code removal -Description: Fixes a regression causing posix_memalign() - very slow in certain conditions to avoid - breaking ffmpeg-based applications. - -From fc01478d06658ace8d57e5328c1e717275acfe84 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Fri, 11 Aug 2023 11:18:17 +0200 -Subject: [PATCH 1/3] malloc: Enable merging of remainders in memalign (bug - 30723) - -Previously, calling _int_free from _int_memalign could put remainders -into the tcache or into fastbins, where they are invisible to the -low-level allocator. This results in missed merge opportunities -because once these freed chunks become available to the low-level -allocator, further memalign allocations (even of the same size are) -likely obstructing merges. - -Furthermore, during forwards merging in _int_memalign, do not -completely give up when the remainder is too small to serve as a -chunk on its own. We can still give it back if it can be merged -with the following unused chunk. This makes it more likely that -memalign calls in a loop achieve a compact memory layout, -independently of initial heap layout. - -Drop some useless (unsigned long) casts along the way, and tweak -the style to more closely match GNU on changed lines. - -Reviewed-by: DJ Delorie -(cherry picked from commit 542b1105852568c3ebc712225ae78b8c8ba31a78) ---- - malloc/malloc.c | 197 +++++++++++++++++++++++++++++------------------- - 1 file changed, 121 insertions(+), 76 deletions(-) - -diff --git a/malloc/malloc.c b/malloc/malloc.c -index e2f1a615a4..948f9759af 100644 ---- a/malloc/malloc.c -+++ b/malloc/malloc.c -@@ -1086,6 +1086,11 @@ typedef struct malloc_chunk* mchunkptr; - - static void* _int_malloc(mstate, size_t); - static void _int_free(mstate, mchunkptr, int); -+static void _int_free_merge_chunk (mstate, mchunkptr, INTERNAL_SIZE_T); -+static INTERNAL_SIZE_T _int_free_create_chunk (mstate, -+ mchunkptr, INTERNAL_SIZE_T, -+ mchunkptr, INTERNAL_SIZE_T); -+static void _int_free_maybe_consolidate (mstate, INTERNAL_SIZE_T); - static void* _int_realloc(mstate, mchunkptr, INTERNAL_SIZE_T, - INTERNAL_SIZE_T); - static void* _int_memalign(mstate, size_t, size_t); -@@ -4637,31 +4642,52 @@ _int_free (mstate av, mchunkptr p, int have_lock) - if (!have_lock) - __libc_lock_lock (av->mutex); - -- nextchunk = chunk_at_offset(p, size); -- -- /* Lightweight tests: check whether the block is already the -- top block. */ -- if (__glibc_unlikely (p == av->top)) -- malloc_printerr ("double free or corruption (top)"); -- /* Or whether the next chunk is beyond the boundaries of the arena. */ -- if (__builtin_expect (contiguous (av) -- && (char *) nextchunk -- >= ((char *) av->top + chunksize(av->top)), 0)) -- malloc_printerr ("double free or corruption (out)"); -- /* Or whether the block is actually not marked used. */ -- if (__glibc_unlikely (!prev_inuse(nextchunk))) -- malloc_printerr ("double free or corruption (!prev)"); -- -- nextsize = chunksize(nextchunk); -- if (__builtin_expect (chunksize_nomask (nextchunk) <= CHUNK_HDR_SZ, 0) -- || __builtin_expect (nextsize >= av->system_mem, 0)) -- malloc_printerr ("free(): invalid next size (normal)"); -+ _int_free_merge_chunk (av, p, size); - -- free_perturb (chunk2mem(p), size - CHUNK_HDR_SZ); -+ if (!have_lock) -+ __libc_lock_unlock (av->mutex); -+ } -+ /* -+ If the chunk was allocated via mmap, release via munmap(). -+ */ -+ -+ else { -+ munmap_chunk (p); -+ } -+} -+ -+/* Try to merge chunk P of SIZE bytes with its neighbors. Put the -+ resulting chunk on the appropriate bin list. P must not be on a -+ bin list yet, and it can be in use. */ -+static void -+_int_free_merge_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T size) -+{ -+ mchunkptr nextchunk = chunk_at_offset(p, size); -+ -+ /* Lightweight tests: check whether the block is already the -+ top block. */ -+ if (__glibc_unlikely (p == av->top)) -+ malloc_printerr ("double free or corruption (top)"); -+ /* Or whether the next chunk is beyond the boundaries of the arena. */ -+ if (__builtin_expect (contiguous (av) -+ && (char *) nextchunk -+ >= ((char *) av->top + chunksize(av->top)), 0)) -+ malloc_printerr ("double free or corruption (out)"); -+ /* Or whether the block is actually not marked used. */ -+ if (__glibc_unlikely (!prev_inuse(nextchunk))) -+ malloc_printerr ("double free or corruption (!prev)"); -+ -+ INTERNAL_SIZE_T nextsize = chunksize(nextchunk); -+ if (__builtin_expect (chunksize_nomask (nextchunk) <= CHUNK_HDR_SZ, 0) -+ || __builtin_expect (nextsize >= av->system_mem, 0)) -+ malloc_printerr ("free(): invalid next size (normal)"); -+ -+ free_perturb (chunk2mem(p), size - CHUNK_HDR_SZ); - -- /* consolidate backward */ -- if (!prev_inuse(p)) { -- prevsize = prev_size (p); -+ /* Consolidate backward. */ -+ if (!prev_inuse(p)) -+ { -+ INTERNAL_SIZE_T prevsize = prev_size (p); - size += prevsize; - p = chunk_at_offset(p, -((long) prevsize)); - if (__glibc_unlikely (chunksize(p) != prevsize)) -@@ -4669,9 +4695,25 @@ _int_free (mstate av, mchunkptr p, int have_lock) - unlink_chunk (av, p); - } - -- if (nextchunk != av->top) { -+ /* Write the chunk header, maybe after merging with the following chunk. */ -+ size = _int_free_create_chunk (av, p, size, nextchunk, nextsize); -+ _int_free_maybe_consolidate (av, size); -+} -+ -+/* Create a chunk at P of SIZE bytes, with SIZE potentially increased -+ to cover the immediately following chunk NEXTCHUNK of NEXTSIZE -+ bytes (if NEXTCHUNK is unused). The chunk at P is not actually -+ read and does not have to be initialized. After creation, it is -+ placed on the appropriate bin list. The function returns the size -+ of the new chunk. */ -+static INTERNAL_SIZE_T -+_int_free_create_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T size, -+ mchunkptr nextchunk, INTERNAL_SIZE_T nextsize) -+{ -+ if (nextchunk != av->top) -+ { - /* get and clear inuse bit */ -- nextinuse = inuse_bit_at_offset(nextchunk, nextsize); -+ bool nextinuse = inuse_bit_at_offset (nextchunk, nextsize); - - /* consolidate forward */ - if (!nextinuse) { -@@ -4686,8 +4728,8 @@ _int_free (mstate av, mchunkptr p, int have_lock) - been given one chance to be used in malloc. - */ - -- bck = unsorted_chunks(av); -- fwd = bck->fd; -+ mchunkptr bck = unsorted_chunks (av); -+ mchunkptr fwd = bck->fd; - if (__glibc_unlikely (fwd->bk != bck)) - malloc_printerr ("free(): corrupted unsorted chunks"); - p->fd = fwd; -@@ -4706,61 +4748,52 @@ _int_free (mstate av, mchunkptr p, int have_lock) - check_free_chunk(av, p); - } - -- /* -- If the chunk borders the current high end of memory, -- consolidate into top -- */ -- -- else { -+ else -+ { -+ /* If the chunk borders the current high end of memory, -+ consolidate into top. */ - size += nextsize; - set_head(p, size | PREV_INUSE); - av->top = p; - check_chunk(av, p); - } - -- /* -- If freeing a large space, consolidate possibly-surrounding -- chunks. Then, if the total unused topmost memory exceeds trim -- threshold, ask malloc_trim to reduce top. -- -- Unless max_fast is 0, we don't know if there are fastbins -- bordering top, so we cannot tell for sure whether threshold -- has been reached unless fastbins are consolidated. But we -- don't want to consolidate on each free. As a compromise, -- consolidation is performed if FASTBIN_CONSOLIDATION_THRESHOLD -- is reached. -- */ -+ return size; -+} - -- if ((unsigned long)(size) >= FASTBIN_CONSOLIDATION_THRESHOLD) { -+/* If freeing a large space, consolidate possibly-surrounding -+ chunks. Then, if the total unused topmost memory exceeds trim -+ threshold, ask malloc_trim to reduce top. */ -+static void -+_int_free_maybe_consolidate (mstate av, INTERNAL_SIZE_T size) -+{ -+ /* Unless max_fast is 0, we don't know if there are fastbins -+ bordering top, so we cannot tell for sure whether threshold has -+ been reached unless fastbins are consolidated. But we don't want -+ to consolidate on each free. As a compromise, consolidation is -+ performed if FASTBIN_CONSOLIDATION_THRESHOLD is reached. */ -+ if (size >= FASTBIN_CONSOLIDATION_THRESHOLD) -+ { - if (atomic_load_relaxed (&av->have_fastchunks)) - malloc_consolidate(av); - -- if (av == &main_arena) { -+ if (av == &main_arena) -+ { - #ifndef MORECORE_CANNOT_TRIM -- if ((unsigned long)(chunksize(av->top)) >= -- (unsigned long)(mp_.trim_threshold)) -- systrim(mp_.top_pad, av); -+ if (chunksize (av->top) >= mp_.trim_threshold) -+ systrim (mp_.top_pad, av); - #endif -- } else { -- /* Always try heap_trim(), even if the top chunk is not -- large, because the corresponding heap might go away. */ -- heap_info *heap = heap_for_ptr(top(av)); -+ } -+ else -+ { -+ /* Always try heap_trim, even if the top chunk is not large, -+ because the corresponding heap might go away. */ -+ heap_info *heap = heap_for_ptr (top (av)); - -- assert(heap->ar_ptr == av); -- heap_trim(heap, mp_.top_pad); -- } -+ assert (heap->ar_ptr == av); -+ heap_trim (heap, mp_.top_pad); -+ } - } -- -- if (!have_lock) -- __libc_lock_unlock (av->mutex); -- } -- /* -- If the chunk was allocated via mmap, release via munmap(). -- */ -- -- else { -- munmap_chunk (p); -- } - } - - /* -@@ -5221,7 +5254,7 @@ _int_memalign (mstate av, size_t alignment, size_t bytes) - (av != &main_arena ? NON_MAIN_ARENA : 0)); - set_inuse_bit_at_offset (newp, newsize); - set_head_size (p, leadsize | (av != &main_arena ? NON_MAIN_ARENA : 0)); -- _int_free (av, p, 1); -+ _int_free_merge_chunk (av, p, leadsize); - p = newp; - - assert (newsize >= nb && -@@ -5232,15 +5265,27 @@ _int_memalign (mstate av, size_t alignment, size_t bytes) - if (!chunk_is_mmapped (p)) - { - size = chunksize (p); -- if ((unsigned long) (size) > (unsigned long) (nb + MINSIZE)) -+ mchunkptr nextchunk = chunk_at_offset(p, size); -+ INTERNAL_SIZE_T nextsize = chunksize(nextchunk); -+ if (size > nb) - { - remainder_size = size - nb; -- remainder = chunk_at_offset (p, nb); -- set_head (remainder, remainder_size | PREV_INUSE | -- (av != &main_arena ? NON_MAIN_ARENA : 0)); -- set_head_size (p, nb); -- _int_free (av, remainder, 1); -- } -+ if (remainder_size >= MINSIZE -+ || nextchunk == av->top -+ || !inuse_bit_at_offset (nextchunk, nextsize)) -+ { -+ /* We can only give back the tail if it is larger than -+ MINSIZE, or if the following chunk is unused (top -+ chunk or unused in-heap chunk). Otherwise we would -+ create a chunk that is smaller than MINSIZE. */ -+ remainder = chunk_at_offset (p, nb); -+ set_head_size (p, nb); -+ remainder_size = _int_free_create_chunk (av, remainder, -+ remainder_size, -+ nextchunk, nextsize); -+ _int_free_maybe_consolidate (av, remainder_size); -+ } -+ } - } - - check_inuse_chunk (av, p); --- -2.41.0 - -From b37e836b7cc2dba672e1de1cc7e076ba1c712614 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Fri, 11 Aug 2023 17:48:13 +0200 -Subject: [PATCH 2/3] malloc: Remove bin scanning from memalign (bug 30723) - -On the test workload (mpv --cache=yes with VP9 video decoding), the -bin scanning has a very poor success rate (less than 2%). The tcache -scanning has about 50% success rate, so keep that. - -Update comments in malloc/tst-memalign-2 to indicate the purpose -of the tests. Even with the scanning removed, the additional -merging opportunities since commit 542b1105852568c3ebc712225ae78b -("malloc: Enable merging of remainders in memalign (bug 30723)") -are sufficient to pass the existing large bins test. - -Link: https://sourceware.org/pipermail/libc-alpha/2023-August/150857.html ---- - malloc/malloc.c | 127 ++-------------------------------------- - malloc/tst-memalign-2.c | 7 ++- - 2 files changed, 10 insertions(+), 124 deletions(-) - -diff --git a/malloc/malloc.c b/malloc/malloc.c -index 948f9759af..9c2cab7a59 100644 ---- a/malloc/malloc.c -+++ b/malloc/malloc.c -@@ -5082,7 +5082,6 @@ _int_memalign (mstate av, size_t alignment, size_t bytes) - mchunkptr remainder; /* spare room at end to split off */ - unsigned long remainder_size; /* its size */ - INTERNAL_SIZE_T size; -- mchunkptr victim; - - nb = checked_request2size (bytes); - if (nb == 0) -@@ -5101,129 +5100,13 @@ _int_memalign (mstate av, size_t alignment, size_t bytes) - we don't find anything in those bins, the common malloc code will - scan starting at 2x. */ - -- /* This will be set if we found a candidate chunk. */ -- victim = NULL; -+ /* Call malloc with worst case padding to hit alignment. */ -+ m = (char *) (_int_malloc (av, nb + alignment + MINSIZE)); - -- /* Fast bins are singly-linked, hard to remove a chunk from the middle -- and unlikely to meet our alignment requirements. We have not done -- any experimentation with searching for aligned fastbins. */ -+ if (m == 0) -+ return 0; /* propagate failure */ - -- if (av != NULL) -- { -- int first_bin_index; -- int first_largebin_index; -- int last_bin_index; -- -- if (in_smallbin_range (nb)) -- first_bin_index = smallbin_index (nb); -- else -- first_bin_index = largebin_index (nb); -- -- if (in_smallbin_range (nb * 2)) -- last_bin_index = smallbin_index (nb * 2); -- else -- last_bin_index = largebin_index (nb * 2); -- -- first_largebin_index = largebin_index (MIN_LARGE_SIZE); -- -- int victim_index; /* its bin index */ -- -- for (victim_index = first_bin_index; -- victim_index < last_bin_index; -- victim_index ++) -- { -- victim = NULL; -- -- if (victim_index < first_largebin_index) -- { -- /* Check small bins. Small bin chunks are doubly-linked despite -- being the same size. */ -- -- mchunkptr fwd; /* misc temp for linking */ -- mchunkptr bck; /* misc temp for linking */ -- -- bck = bin_at (av, victim_index); -- fwd = bck->fd; -- while (fwd != bck) -- { -- if (chunk_ok_for_memalign (fwd, alignment, nb) > 0) -- { -- victim = fwd; -- -- /* Unlink it */ -- victim->fd->bk = victim->bk; -- victim->bk->fd = victim->fd; -- break; -- } -- -- fwd = fwd->fd; -- } -- } -- else -- { -- /* Check large bins. */ -- mchunkptr fwd; /* misc temp for linking */ -- mchunkptr bck; /* misc temp for linking */ -- mchunkptr best = NULL; -- size_t best_size = 0; -- -- bck = bin_at (av, victim_index); -- fwd = bck->fd; -- -- while (fwd != bck) -- { -- int extra; -- -- if (chunksize (fwd) < nb) -- break; -- extra = chunk_ok_for_memalign (fwd, alignment, nb); -- if (extra > 0 -- && (extra <= best_size || best == NULL)) -- { -- best = fwd; -- best_size = extra; -- } -- -- fwd = fwd->fd; -- } -- victim = best; -- -- if (victim != NULL) -- { -- unlink_chunk (av, victim); -- break; -- } -- } -- -- if (victim != NULL) -- break; -- } -- } -- -- /* Strategy: find a spot within that chunk that meets the alignment -- request, and then possibly free the leading and trailing space. -- This strategy is incredibly costly and can lead to external -- fragmentation if header and footer chunks are unused. */ -- -- if (victim != NULL) -- { -- p = victim; -- m = chunk2mem (p); -- set_inuse (p); -- if (av != &main_arena) -- set_non_main_arena (p); -- } -- else -- { -- /* Call malloc with worst case padding to hit alignment. */ -- -- m = (char *) (_int_malloc (av, nb + alignment + MINSIZE)); -- -- if (m == 0) -- return 0; /* propagate failure */ -- -- p = mem2chunk (m); -- } -+ p = mem2chunk (m); - - if ((((unsigned long) (m)) % alignment) != 0) /* misaligned */ - { -diff --git a/malloc/tst-memalign-2.c b/malloc/tst-memalign-2.c -index f229283dbf..ecd6fa249e 100644 ---- a/malloc/tst-memalign-2.c -+++ b/malloc/tst-memalign-2.c -@@ -86,7 +86,8 @@ do_test (void) - TEST_VERIFY (tcache_allocs[i].ptr1 == tcache_allocs[i].ptr2); - } - -- /* Test for non-head tcache hits. */ -+ /* Test for non-head tcache hits. This exercises the memalign -+ scanning code to find matching allocations. */ - for (i = 0; i < array_length (ptr); ++ i) - { - if (i == 4) -@@ -113,7 +114,9 @@ do_test (void) - free (p); - TEST_VERIFY (count > 0); - -- /* Large bins test. */ -+ /* Large bins test. This verifies that the over-allocated parts -+ that memalign releases for future allocations can be reused by -+ memalign itself at least in some cases. */ - - for (i = 0; i < LN; ++ i) - { --- -2.41.0 - -From 26973f7b09c33e67f6bcbc79371796c8dd334528 Mon Sep 17 00:00:00 2001 -From: Xi Ruoyao -Date: Mon, 14 Aug 2023 11:05:18 +0800 -Subject: [PATCH 3/3] malloc: Remove unused functions and variables - -Remove unused chunk_ok_for_memalign function and unused local variables -in _int_free. - -Signed-off-by: Xi Ruoyao ---- - malloc/malloc.c | 42 ------------------------------------------ - 1 file changed, 42 deletions(-) - -diff --git a/malloc/malloc.c b/malloc/malloc.c -index 9c2cab7a59..d0bbbf3710 100644 ---- a/malloc/malloc.c -+++ b/malloc/malloc.c -@@ -4488,12 +4488,6 @@ _int_free (mstate av, mchunkptr p, int have_lock) - { - INTERNAL_SIZE_T size; /* its size */ - mfastbinptr *fb; /* associated fastbin */ -- mchunkptr nextchunk; /* next contiguous chunk */ -- INTERNAL_SIZE_T nextsize; /* its size */ -- int nextinuse; /* true if nextchunk is used */ -- INTERNAL_SIZE_T prevsize; /* size of previous contiguous chunk */ -- mchunkptr bck; /* misc temp for linking */ -- mchunkptr fwd; /* misc temp for linking */ - - size = chunksize (p); - -@@ -5032,42 +5026,6 @@ _int_realloc (mstate av, mchunkptr oldp, INTERNAL_SIZE_T oldsize, - ------------------------------ memalign ------------------------------ - */ - --/* Returns 0 if the chunk is not and does not contain the requested -- aligned sub-chunk, else returns the amount of "waste" from -- trimming. NB is the *chunk* byte size, not the user byte -- size. */ --static size_t --chunk_ok_for_memalign (mchunkptr p, size_t alignment, size_t nb) --{ -- void *m = chunk2mem (p); -- INTERNAL_SIZE_T size = chunksize (p); -- void *aligned_m = m; -- -- if (__glibc_unlikely (misaligned_chunk (p))) -- malloc_printerr ("_int_memalign(): unaligned chunk detected"); -- -- aligned_m = PTR_ALIGN_UP (m, alignment); -- -- INTERNAL_SIZE_T front_extra = (intptr_t) aligned_m - (intptr_t) m; -- -- /* We can't trim off the front as it's too small. */ -- if (front_extra > 0 && front_extra < MINSIZE) -- return 0; -- -- /* If it's a perfect fit, it's an exception to the return value rule -- (we would return zero waste, which looks like "not usable"), so -- handle it here by returning a small non-zero value instead. */ -- if (size == nb && front_extra == 0) -- return 1; -- -- /* If the block we need fits in the chunk, calculate total waste. */ -- if (size > nb + front_extra) -- return size - nb; -- -- /* Can't use this chunk. */ -- return 0; --} -- - /* BYTES is user requested bytes, not requested chunksize bytes. */ - static void * - _int_memalign (mstate av, size_t alignment, size_t bytes) --- -2.41.0 - diff --git a/SPECS/glibc/glibc.signatures.json b/SPECS/glibc/glibc.signatures.json deleted file mode 100644 index e6dc92731d..0000000000 --- a/SPECS/glibc/glibc.signatures.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Signatures": { - "glibc-2.38.tar.xz": "fb82998998b2b29965467bc1b69d152e9c307d2cf301c9eafb4555b770ef3fd2", - "locale-gen.conf": "94182ce116a42e38ce783d2a867dca1eaf4d6a347d4bff9aac4d6e61cbbfc8f4", - "locale-gen.sh": "df7169cb9f126875e0a57a4700261e16e6eba2a98312d739f972377150ba9964" - } -} diff --git a/SPECS/glibc/glibc.spec b/SPECS/glibc/glibc.spec deleted file mode 100644 index 7a72b87d9f..0000000000 --- a/SPECS/glibc/glibc.spec +++ /dev/null @@ -1,613 +0,0 @@ -%global security_hardening nonow -%define glibc_target_cpu %{_build} - -# Don't depend on bash by default -%define __requires_exclude ^/(bin|usr/bin).*$ - -# Enable frame pointers for package -%define _include_frame_pointers 1 - -Summary: Main C library -Name: glibc -Version: 2.38 -Release: 12%{?dist} -License: BSD AND GPLv2+ AND Inner-Net AND ISC AND LGPLv2+ AND MIT -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Applications/System -URL: https://www.gnu.org/software/libc -Source0: https://ftp.gnu.org/gnu/glibc/%{name}-%{version}.tar.xz -Source1: locale-gen.sh -Source2: locale-gen.conf -Patch0: https://www.linuxfromscratch.org/patches/downloads/glibc/glibc-2.38-fhs-1.patch -# Only applicable on ARMv7 targets. -Patch1: CVE-2020-6096.nopatch -# Only applicable on x32 targets. -Patch2: CVE-2019-6488.nopatch -# Only applicable on PowerPC targets. -Patch3: CVE-2020-1751.nopatch -# Marked by upstream/Ubuntu/Red Hat as not a security bug, no fix available -# Rationale: Exploit requires crafted pattern in regex compiler meant only for trusted content -Patch4: CVE-2018-20796.nopatch -Patch5: https://www.linuxfromscratch.org/patches/downloads/glibc/glibc-2.38-memalign_fix-1.patch -Patch6: CVE-2023-4911.patch -Patch7: CVE-2023-6246.patch -Patch8: CVE-2023-6779.patch -Patch9: CVE-2023-6780.patch -# Upstream backport for fixing: nscd fails to build with cleanup handler if built with -fexceptions -Patch10: nscd-Do-not-rebuild-getaddrinfo-bug-30709.patch -Patch11: glibc-2.34_pthread_cond_wait.patch -Patch12: CVE-2023-4527.patch -Patch13: CVE-2023-4806.patch -Patch14: CVE-2023-5156.patch -Patch15: CVE-2024-33599.patch -Patch16: CVE-2024-33600.patch -# Patch of CVE-2024-33601 fixes CVE-2024-33602 also -Patch17: CVE-2024-33601.patch -Patch18: CVE-2025-0395.patch - -# Patches for testing -Patch100: 0001-Remove-Wno-format-cflag-from-tests.patch - -BuildRequires: bison -BuildRequires: gawk -BuildRequires: gettext -BuildRequires: kernel-headers -BuildRequires: texinfo -Requires: filesystem -Provides: %{name}-common = %{version}-%{release} -Provides: /sbin/ldconfig -Provides: nss_db = %{version}-%{release} -Provides: rtld(GNU_HASH) -ExcludeArch: armv7 ppc i386 i686 - -%description -This library provides the basic routines for allocating memory, -searching directories, opening and closing files, reading and -writing files, string handling, pattern matching, arithmetic, -and so on. - -%package devel -Summary: Header files for glibc -Group: Applications/System -Requires: %{name} = %{version}-%{release} -Provides: %{name}-headers = %{version}-%{release} - -%description devel -These are the header files of glibc. - -%package static -Summary: Static glibc library and runtimes -Group: Applications/System -Requires: %{name}-devel = %{version}-%{release} -Provides: %{name}-static%{?_isa} = %{version}-%{release} - -%description static -These are the static artefacts for glibc. - -%package lang -Summary: Additional language files for glibc -Group: Applications/System -Requires: %{name} = %{version}-%{release} - -%description lang -These are the additional language files of glibc. - -%package i18n -Summary: Additional internationalization files for glibc -Group: Applications/System -Requires: %{name} = %{version}-%{release} -Provides: %{name}-locale-source = %{version}-%{release} - -%description i18n -These are the additional internationalization files of glibc. - -%package iconv -Summary: gconv modules for glibc -Group: Applications/System -Requires: %{name} = %{version}-%{release} - -%description iconv -These are gconv modules for iconv(). - -%package tools -Summary: tools for glibc -Group: Applications/System -Requires: %{name} = %{version}-%{release} - -%description tools -Extra tools for glibc. - -%package nscd -Summary: Name Service Cache Daemon -Group: Applications/System -Requires: %{name} = %{version}-%{release} - -%description nscd -Name Service Cache Daemon - -%package locales-all -Summary: Locale Data for Localized Programs -Group: Applications/System -Requires: %{name} = %{version}-%{release} -Requires: %{name}-i18n = %{version}-%{release} -Requires: %{name}-lang = %{version}-%{release} - -%description locales-all -Locale data for the internationalization features of glibc - -%prep -%autosetup -p1 -sed -i 's/\\$$(pwd)/`pwd`/' timezone/Makefile -install -vdm 755 %{_builddir}/%{name}-build -# do not try to explicitly provide GLIBC_PRIVATE versioned libraries -%define __find_provides %{_builddir}/%{name}-%{version}/find_provides.sh -%define __find_requires %{_builddir}/%{name}-%{version}/find_requires.sh - -# create find-provides and find-requires script in order to ignore GLIBC_PRIVATE errors -cat > find_provides.sh << _EOF -#! /bin/sh -if [ -d /tools ]; then -/tools/lib/rpm/find-provides | grep -v GLIBC_PRIVATE -else -%{_libdir}/rpm/find-provides | grep -v GLIBC_PRIVATE -fi -exit 0 -_EOF -chmod +x find_provides.sh - -cat > find_requires.sh << _EOF -#! /bin/sh -if [ -d /tools ]; then -/tools/lib/rpm/find-requires %{buildroot} %{glibc_target_cpu} | grep -v GLIBC_PRIVATE -else -%{_libdir}/rpm/find-requires %{buildroot} %{glibc_target_cpu} | grep -v GLIBC_PRIVATE -fi -_EOF -chmod +x find_requires.sh -#___EOF - -%build -CFLAGS="`echo " %{build_cflags} " | sed 's/-Wp,-D_FORTIFY_SOURCE=2//'`" -CXXFLAGS="`echo " %{build_cxxflags} " | sed 's/-Wp,-D_FORTIFY_SOURCE=2//'`" -export CFLAGS -export CXXFLAGS - -cd %{_builddir}/%{name}-build -echo "rootsbindir=/usr/sbin" > configparms -../%{name}-%{version}/configure \ - --prefix=%{_prefix} \ - --disable-profile \ - --disable-werror \ - --enable-kernel=4.14 \ - --enable-bind-now \ - --enable-static-pie \ -%ifarch x86_64 - --enable-cet \ -%endif - --disable-silent-rules \ - libc_cv_slibdir=/usr/lib - -make %{?_smp_mflags} - -%install -# Do not remove static libs -pushd %{_builddir}/glibc-build -# Create directories -make install_root=%{buildroot} install -install -vdm 755 %{buildroot}%{_sysconfdir}/ld.so.conf.d -install -vdm 755 %{buildroot}%{_var}/cache/nscd -install -vdm 755 %{buildroot}%{_libdir}/locale -cp -v ../%{name}-%{version}/nscd/nscd.conf %{buildroot}%{_sysconfdir}/nscd.conf -# Install locale generation script and config file -cp -v %{SOURCE2} %{buildroot}%{_sysconfdir} -cp -v %{SOURCE1} %{buildroot}%{_sbindir} -# Remove unwanted cruft -rm -rf %{buildroot}%{_infodir} -# Install configuration files - -# Spaces should not be used in nsswitch.conf in the begining of new line -# Only tab should be used as it expects the same in source code. -# Otherwise "altfiles" will not be added. which may cause dbus.service failure -cat > %{buildroot}%{_sysconfdir}/nsswitch.conf <<- "EOF" -# Begin /etc/nsswitch.conf - - passwd: files - group: files - shadow: files - - hosts: files dns - networks: files - - protocols: files - services: files - ethers: files - rpc: files -# End /etc/nsswitch.conf -EOF -cat > %{buildroot}%{_sysconfdir}/ld.so.conf <<- "EOF" -# Begin /etc/ld.so.conf - %{_prefix}/local/lib - /opt/lib - include %{_sysconfdir}/ld.so.conf.d/*.conf -EOF -popd -%find_lang %{name} --all-name - -# Generate all locales -pushd %{_builddir}/%{name}-build -# Install locales -make %{?_smp_mflags} install_root=%{buildroot} localedata/install-locale-files - -# To reduce footprint of localedata -# hardlink identical locale files together -hardlink -vc %{buildroot}%{_libdir}/locale -popd - -# to do not depend on /bin/bash -sed -i 's@#! /bin/bash@#! /bin/sh@' %{buildroot}%{_bindir}/ldd -# Fix a hard coded path to the executable loader in the ldd script -sed '/RTLDLIST=/s@/usr@@g' -i %{buildroot}%{_bindir}/ldd -sed -i 's@#!/bin/bash@#!/bin/sh@' %{buildroot}%{_bindir}/tzselect - -# Determine which static libs are needed in `glibc-devel` - the rest will be put -# into `glibc-static`. We need to keep the static shims for function that's now -# in `libc.so` (since 2.34 - see https://developers.redhat.com/articles/2021/12/17/why-glibc-234-removed-libpthread) -# and the "statically linked bit" of `libc.so` (called `libc_nonshared.a`) -static_libs_in_devel_pattern="lib\(c_nonshared\|pthread\|dl\|rt\|g\|util\|mcheck\).a" -ls -1 %{buildroot}%{_libdir}/*.a | grep -e "$static_libs_in_devel_pattern" | sed "s:^%{buildroot}::g" > devel.filelist -ls -1 %{buildroot}%{_libdir}/*.a | grep -v -e "$static_libs_in_devel_pattern" | sed "s:^%{buildroot}::g" > static.filelist - -%check -cd %{_builddir}/glibc-build - -# Results have varied based on the environment the tests are being built -# Summary of test results in local VM: -# 3 FAIL : nptl/tst-cancel1, io/tst-lchmod, nptl/tst-mutex10 -# 5040 PASS -# 152 UNSUPPORTED -# 12 XFAIL -# 8 XPASS -# Summary of test results in pipeline (this has shown varying results): -# 7 FAIL -# 5110 PASS -# 79 UNSUPPORTED -# 12 XFAIL -# 8 XPASS -make %{?_smp_mflags} check ||: -n=0 -# expected failures in local VM -grep "^FAIL: nptl/tst-cancel1" tests.sum >/dev/null && n=$((n+1)) ||: -grep "^FAIL: io/tst-lchmod" tests.sum >/dev/null && n=$((n+1)) ||: -grep "^FAIL: nptl/tst-mutex10" tests.sum >/dev/null && n=$((n+1)) ||: -[ `grep ^FAIL tests.sum | wc -l` -eq $n ] - -%post -p /sbin/ldconfig -%postun -p /sbin/ldconfig - -%files -%defattr(-,root,root) -%license COPYING COPYING.LIB LICENSES -%{_libdir}/locale/en_US.utf8 -%{_libdir}/locale/C.utf8 -%dir %{_sysconfdir}/ld.so.conf.d -%config(noreplace) %{_sysconfdir}/nsswitch.conf -%config(noreplace) %{_sysconfdir}/ld.so.conf -%config(noreplace) %{_sysconfdir}/rpc -%config(missingok,noreplace) %{_sysconfdir}/ld.so.cache -%config %{_sysconfdir}/locale-gen.conf -%ifarch aarch64 -/usr/lib/ld-linux-aarch64.so.1 -%endif -#%%exclude /lib64/libpcprofile.so -%{_libdir}/*.so* -%{_sbindir}/ldconfig -%{_sbindir}/locale-gen.sh - -#%%{_sbindir}/zdump -%{_sbindir}/zic -%{_sbindir}/iconvconfig -%{_bindir}/* -%{_libexecdir}/* -%{_datadir}/i18n/charmaps/UTF-8.gz -%{_datadir}/i18n/charmaps/ISO-8859-1.gz -%{_datadir}/i18n/locales/en_US -%{_datarootdir}/locale/locale.alias -%exclude %{_localstatedir}/lib/nss_db/Makefile -%exclude %{_bindir}/mtrace -%exclude %{_bindir}/pcprofiledump -%exclude %{_bindir}/xtrace - -%files iconv -%defattr(-,root,root) -%{_libdir}/gconv/* - -%files tools -%defattr(-,root,root) -%{_bindir}/mtrace -%{_bindir}/pcprofiledump -%{_bindir}/xtrace -%{_sbindir}/sln -%{_libdir}/audit/* -#/lib64/libpcprofile.so - -%files nscd -%defattr(-,root,root) -%config(noreplace) %{_sysconfdir}/nscd.conf -%{_sbindir}/nscd -%dir %{_localstatedir}/cache/nscd - -%files i18n -%defattr(-,root,root) -%{_datadir}/i18n/charmaps/*.gz -%{_datadir}/i18n/locales/* - -%files devel -f devel.filelist -%defattr(-,root,root) -# TODO: Excluding for now to remove dependency on PERL -# /usr/bin/mtrace -# C Runtime files for `-pie`, `-no-pie` and profiled executables as well as for shared libs -%{_libdir}/{,g,M,S}crt1.o -# C Runtime files needed for all targets -%{_libdir}/crt{i,n}.o -%{_includedir}/* - -%files static -f static.filelist -%defattr(-,root,root) -# C Runtime files for `-static-pie` and profiled `-static-pie` -%{_libdir}/{r,gr}crt1.o - -%files -f %{name}.lang lang -%defattr(-,root,root) - -%files locales-all -%defattr(-,root,root) -%{_libdir}/locale/* -%exclude %{_libdir}/locale/en_US.utf8 -%exclude %{_libdir}/locale/C.utf8 - -%changelog -* Mon Aug 25 2025 Andrew Phelps - 2.38-12 -- Bump to rebuild with build-id fix from toolchain gcc - -* Thu May 22 2025 Kanishk Bansal - 2.38-11 -- Patch CVE-2023-4527, CVE-2023-4806, CVE-2024-33599, CVE-2024-33600, CVE-2024-33601, CVE-2025-0395, CVE-2025-4802 -- Fix CVE-2023-5156 - -* Mon May 12 2025 Andrew Phelps - 2.38-10 -- Add glibc-2.34_pthread_cond_wait.patch - -* Wed Feb 19 2025 Chris Co - 2.38-9 -- Re-enable nscd build and packaging - -* Mon Aug 26 2024 Rachel Menge - 2.38-8 -- Enable check section for glibc - -* Wed Aug 21 2024 Chris Co - 2.38-7 -- Fix syslog failing to print issue - -* Mon Jun 17 2024 Nicolas Guibourge - 2.38-6 -- Address CVE-2023-4911, CVE-2023-5156, CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 - -* Wed May 22 2024 Suresh Babu Chalamalasetty - 2.38-5 -- Generate and provide glibc all locales in a sub-package - -* Fri May 10 2024 Chris Co - 2.38-4 -- Enable frame pointers compiler flag - -* Mon Mar 11 2024 Dan Streetman - 2.38-3 -- provide C.utf8 locale - -* Tue Feb 27 2024 Dan Streetman - 2.38-2 -- Do NOT rename en_US.utf8 to en_US.UTF-8 (glibc will reduce UTF-8 to utf8, but NOT utf8 to UTF-8) - -* Thu Nov 02 2023 Andrew Phelps - 2.38-1 -- Upgrade to version 2.38 - -* Wed Oct 04 2023 Minghe Ren - 2.35-6 -- Add patches for CVE-2023-4806 and CVE-2023-5156 - -* Tue Oct 03 2023 Mandeep Plaha - 2.35-5 -- Patch CVE-2023-4911 - -* Fri Jun 30 2023 Andrew Phelps - 2.35-4 -- Restore glibc-debuginfo package - -* Fri Sep 30 2022 Andy Caldwell - 2.35-3 -- Split `glibc-static` into an actual package containing static libraries and runtime - -* Mon May 02 2022 Sriram Nambakam - 2.35-2 -- To remove leading spaces in /etc/nsswitch.conf, use tabs instead of spaces - -* Tue Apr 12 2022 Andrew Phelps - 2.35-1 -- Upgrade to version 2.35 -- Cleanup old patch files - -* Wed Mar 02 2022 Andy Caldwell - 2.34-3 -- Add support for building `-static-pie` binaries against `glibc` -- Add additional BuildRequires - -* Thu Nov 04 2021 Pawel Winogrodzki - 2.34-2 -- Adding missing BR on "perl(File::Find)". -- Fixing licensing information. -- Removing redundant 'Provides'. - -* Thu Oct 14 2021 Andrew Phelps - 2.34-1 -- Upgrade to version 2.34 -- License verified - -* Fri Sep 24 2021 Pawel Winogrodzki - 2.28-19 -- Adding 'Provides' for 'nss_db'. - -* Thu Jul 29 2021 Jon Slobodzian 2.28-18 -- Dash Rolled for Merge from 1.0 branch - -* Fri Apr 02 2021 Thomas Crain - 2.28-17 -- Merge the following releases from 1.0 to dev branch -- lihl@microsoft.com, 2.28-13: Added patch to resolve CVE-2019-7309, Used autosteup -- thcrain@microsoft.com, 2.28-14: Patch CVE-2019-19126 -- mamalisz@microsoft.com, 2.28-15: Exclude binaries(such as bash) from requires list. -- nicolasg@microsoft.com, 2.28-16: Patch CVE-2019-25013 -- thcrain@microsoft.com, 2.28-17: Patch CVE-2021-3326 -- nisamson@microsoft.com, 2.28-18: Patch CVE-2021-27618 - -* Thu Mar 25 2021 Henry Li - 2.28-16 -- Provides glibc-locale-source from glibc-i18n -- Add back exluded files to glibc-i18n - -* Fri Feb 05 2021 Joe Schmitt - 2.28-15 -- Replace incorrect %%{_lib} usage with %%{_libdir} - -* Thu Dec 10 2020 Joe Schmitt - 2.28-14 -- Provide isa version of glibc-static. - -* Mon Sep 28 2020 Ruying Chen - 2.28-13 -- Move some tools from glibc-tools and glibc-iconv to glibc and provide glibc-common -- Provide glibc-static and glibc-headers under glibc-devel - -* Wed Jul 29 2020 Thomas Crain - 2.28-12 -- Ignore CVE-2018-20796, as it is not a security issue - -* Wed Jul 29 2020 Emre Girgin - 2.28-11 -- Disable the debuginfo package for glibc, and use unstripped binaries instead. - -* Fri Jun 26 2020 Ruying Chen - 2.28-10 -- Added provides for binary capability. - -* Thu Jun 11 2020 Henry Beberman - 2.28-9 -- Disable -Wp,-D_FORTIFY_SOURCE=2 to build with hardened cflags. - -* Tue May 19 2020 Emre Girgin - 2.28-8 -- Ignore CVE-2019-6488, CVE-2020-1751, CVE-2020-6096 as they don't apply to aarch64 or x86_64. - -* Sat May 09 2020 Nick Samson - 2.28-7 -- Added %%license line automatically - -* Fri Mar 20 2020 Andrew Phelps - 2.28-6 -- Configure with --disable-werror. - -* Mon Dec 02 2019 Saravanan Somasundaram - 2.28-5 -- Initial CBL-Mariner import from Photon (license: Apache2). - -* Fri Jul 12 2019 Ankit Jain - 2.28-4 -- Replaced spaces with tab in nsswitch.conf file - -* Fri Mar 08 2019 Alexey Makhalov - 2.28-3 -- Fix CVE-2019-9169 - -* Tue Jan 22 2019 Anish Swaminathan - 2.28-2 -- Fix CVE-2018-19591 - -* Tue Aug 28 2018 Alexey Makhalov - 2.28-1 -- Version update. Disable obsolete rpc (use libtirpc) and nsl. - -* Tue Jan 23 2018 Xiaolin Li - 2.26-10 -- Fix CVE-2018-1000001 and CVE-2018-6485 - -* Mon Jan 08 2018 Xiaolin Li - 2.26-9 -- Fix CVE-2017-16997 - -* Thu Dec 21 2017 Xiaolin Li - 2.26-8 -- Fix CVE-2017-17426 - -* Tue Nov 14 2017 Alexey Makhalov - 2.26-7 -- Aarch64 support - -* Wed Oct 25 2017 Xiaolin Li - 2.26-6 -- Fix CVE-2017-15670 and CVE-2017-15804 - -* Tue Oct 10 2017 Alexey Makhalov - 2.26-5 -- Compile out tcache. - -* Fri Sep 15 2017 Bo Gan - 2.26-4 -- exclude tst-eintr1 per official wiki recommendation. - -* Tue Sep 12 2017 Alexey Makhalov - 2.26-3 -- Fix makecheck for run in docker. - -* Tue Aug 29 2017 Alexey Makhalov - 2.26-2 -- Fix tunables setter. -- Add malloc arena fix. -- Fix makecheck. - -* Tue Aug 15 2017 Alexey Makhalov - 2.26-1 -- Version update - -* Tue Aug 08 2017 Anish Swaminathan - 2.25-4 -- Apply fix for CVE-2017-1000366 - -* Thu May 4 2017 Bo Gan - 2.25-3 -- Remove bash dependency in post/postun script - -* Fri Apr 21 2017 Alexey Makhalov - 2.25-2 -- Added -iconv -tools and -nscd subpackages - -* Wed Mar 22 2017 Alexey Makhalov - 2.25-1 -- Version update - -* Wed Dec 14 2016 Alexey Makhalov - 2.24-1 -- Version update - -* Wed Nov 23 2016 Alexey Makhalov - 2.22-13 -- Install en_US.UTF-8 locale by default - -* Wed Nov 16 2016 Alexey Makhalov - 2.22-12 -- Added i18n subpackage - -* Tue Oct 25 2016 Alexey Makhalov - 2.22-11 -- Workaround for build failure with "out of memory" message - -* Wed Sep 28 2016 Alexey Makhalov - 2.22-10 -- Added pthread_create-fix-use-after-free.patch - -* Tue Jun 14 2016 Divya Thaluru - 2.22-9 -- Enabling rpm debug package and stripping the libraries - -* Tue May 24 2016 Priyesh Padmavilasom - 2.22-8 -- GA - Bump release of all rpms - -* Mon May 23 2016 Divya Thaluru - 2.22-7 -- Added patch for CVE-2014-9761 - -* Mon Mar 21 2016 Alexey Makhalov - 2.22-6 -- Security hardening: nonow - -* Fri Mar 18 2016 Anish Swaminathan - 2.22-5 -- Change conf file qualifiers - -* Fri Mar 11 2016 Priyesh Padmavilasom - 2.22-4 -- Added patch for res_qeury assertion with bad dns config -- Details: https://sourceware.org/bugzilla/show_bug.cgi?id=19791 - -* Tue Feb 16 2016 Anish Swaminathan - 2.22-3 -- Added patch for CVE-2015-7547 - -* Mon Feb 08 2016 Anish Swaminathan - 2.22-2 -- Added patch for bindresvport blacklist - -* Tue Jan 12 2016 Xiaolin Li - 2.22-1 -- Updated to version 2.22 - -* Tue Dec 1 2015 Divya Thaluru - 2.19-8 -- Disabling rpm debug package and stripping the libraries - -* Wed Nov 18 2015 Divya Thaluru - 2.19-7 -- Adding patch to close nss files database - -* Tue Nov 10 2015 Xiaolin Li - 2.19-6 -- Handled locale files with macro find_lang - -* Wed Aug 05 2015 Kumar Kaushik - 2.19-5 -- Adding postun section for ldconfig. - -* Tue Jul 28 2015 Alexey Makhalov - 2.19-4 -- Support glibc building against current rpm version. - -* Thu Jul 23 2015 Divya Thaluru - 2.19-3 -- Packing locale-gen scripts - -* Mon May 18 2015 Touseef Liaqat - 2.19-2 -- Update according to UsrMove. - -* Wed Nov 5 2014 Divya Thaluru - 2.19-1 -- Initial build. First version diff --git a/SPECS/glibc/locale-gen.conf b/SPECS/glibc/locale-gen.conf deleted file mode 100644 index 04ed0bbca8..0000000000 --- a/SPECS/glibc/locale-gen.conf +++ /dev/null @@ -1,26 +0,0 @@ - -# Configuration file for locale-gen -# -# lists of locales that are to be generated by the locale-gen command. -# -# Each line is of the form: -# -# -# -# where is one of the locales given in /usr/share/i18n/locales -# and is one of the character sets listed in /usr/share/i18n/charmaps -# -# Examples: -# en_US ISO-8859-1 -# en_US.UTF-8 UTF-8 -# de_DE ISO-8859-1 -# de_DE@euro ISO-8859-15 -# -# The locale-gen command will generate all the locales, -# placing them in /usr/lib/locale. -# -# A list of supported locales is included in this file. -# Uncomment the ones you need. -# -en_US ISO-8859-1 -en_US.UTF-8 UTF-8 diff --git a/SPECS/glibc/locale-gen.sh b/SPECS/glibc/locale-gen.sh deleted file mode 100755 index a134aba6b7..0000000000 --- a/SPECS/glibc/locale-gen.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh -set -e -LOCALEGEN=/etc/locale-gen.conf -LOCALES=/usr/share/i18n/locales -if [ -n "$POSIXLY_CORRECT" ]; then - unset POSIXLY_CORRECT -fi -[ -f $LOCALEGEN -a -s $LOCALEGEN ] || exit 0; -# Remove all old locale dir and locale-archive before generating new -# locale data. -rm -rf /usr/lib/locale/* || true -umask 022 -is_entry_ok() { - if [ -n "$locale" -a -n "$charset" ] ; then - true - else - echo "error: Bad entry '$locale $charset'" - false - fi -} -echo "Generating locales..." -while read locale charset; do \ - case $locale in \#*) continue;; "") continue;; esac; \ - is_entry_ok || continue - echo -n " `echo $locale | sed 's/\([^.\@]*\).*/\1/'`"; \ - echo -n ".$charset"; \ - echo -n `echo $locale | sed 's/\([^\@]*\)\(\@.*\)*/\2/'`; \ - echo -n '...'; \ - if [ -f $LOCALES/$locale ]; then input=$locale; else \ - input=`echo $locale | sed 's/\([^.]*\)[^@]*\(.*\)/\1\2/'`; fi; \ - localedef -i $input -c -f $charset -A /usr/share/locale/locale.alias $locale; \ - echo ' done'; \ -done < $LOCALEGEN -echo "Generation complete." \ No newline at end of file diff --git a/SPECS/glibc/nscd-Do-not-rebuild-getaddrinfo-bug-30709.patch b/SPECS/glibc/nscd-Do-not-rebuild-getaddrinfo-bug-30709.patch deleted file mode 100644 index f13968cd77..0000000000 --- a/SPECS/glibc/nscd-Do-not-rebuild-getaddrinfo-bug-30709.patch +++ /dev/null @@ -1,184 +0,0 @@ -From 039ff51ac7e02db1cfc0c23e38ac7bfbb00221d1 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Fri, 11 Aug 2023 10:10:16 +0200 -Subject: [PATCH] nscd: Do not rebuild getaddrinfo (bug 30709) - -The nscd daemon caches hosts data from NSS modules verbatim, without -filtering protocol families or sorting them (otherwise separate caches -would be needed for certain ai_flags combinations). The cache -implementation is complete separate from the getaddrinfo code. This -means that rebuilding getaddrinfo is not needed. The only function -actually used is __bump_nl_timestamp from check_pf.c, and this change -moves it into nscd/connections.c. - -Tested on x86_64-linux-gnu with -fexceptions, built with -build-many-glibcs.py. I also backported this patch into a distribution -that still supports nscd and verified manually that caching still works. - -Reviewed-by: Siddhesh Poyarekar ---- - include/ifaddrs.h | 4 --- - inet/check_pf.c | 9 ------ - nscd/Makefile | 2 +- - nscd/connections.c | 11 +++++++ - nscd/gai.c | 50 ------------------------------ - sysdeps/unix/sysv/linux/check_pf.c | 17 +--------- - 6 files changed, 13 insertions(+), 80 deletions(-) - delete mode 100644 nscd/gai.c - -diff --git a/include/ifaddrs.h b/include/ifaddrs.h -index 416118f1b3..19a3afb19f 100644 ---- a/include/ifaddrs.h -+++ b/include/ifaddrs.h -@@ -34,9 +34,5 @@ extern void __check_native (uint32_t a1_index, int *a1_native, - uint32_t a2_index, int *a2_native) - attribute_hidden; - --#if IS_IN (nscd) --extern uint32_t __bump_nl_timestamp (void) attribute_hidden; --#endif -- - # endif /* !_ISOMAC */ - #endif /* ifaddrs.h */ -diff --git a/inet/check_pf.c b/inet/check_pf.c -index 5310c99121..6d1475920f 100644 ---- a/inet/check_pf.c -+++ b/inet/check_pf.c -@@ -60,12 +60,3 @@ __free_in6ai (struct in6addrinfo *in6ai) - { - /* Nothing to do. */ - } -- -- --#if IS_IN (nscd) --uint32_t --__bump_nl_timestamp (void) --{ -- return 0; --} --#endif -diff --git a/nscd/Makefile b/nscd/Makefile -index 2a0489f4cf..16b6460ee9 100644 ---- a/nscd/Makefile -+++ b/nscd/Makefile -@@ -35,7 +35,7 @@ nscd-modules := nscd connections pwdcache getpwnam_r getpwuid_r grpcache \ - getgrnam_r getgrgid_r hstcache gethstbyad_r gethstbynm3_r \ - getsrvbynm_r getsrvbypt_r servicescache \ - dbg_log nscd_conf nscd_stat cache mem nscd_setup_thread \ -- xmalloc xstrdup aicache initgrcache gai res_hconf \ -+ xmalloc xstrdup aicache initgrcache res_hconf \ - netgroupcache cachedumper - - ifeq ($(build-nscd)$(have-thread-library),yesyes) -diff --git a/nscd/connections.c b/nscd/connections.c -index a405a44a9b..15693e5090 100644 ---- a/nscd/connections.c -+++ b/nscd/connections.c -@@ -256,6 +256,17 @@ int inotify_fd = -1; - #ifdef HAVE_NETLINK - /* Descriptor for netlink status updates. */ - static int nl_status_fd = -1; -+ -+static uint32_t -+__bump_nl_timestamp (void) -+{ -+ static uint32_t nl_timestamp; -+ -+ if (atomic_fetch_add_relaxed (&nl_timestamp, 1) + 1 == 0) -+ atomic_fetch_add_relaxed (&nl_timestamp, 1); -+ -+ return nl_timestamp; -+} - #endif - - /* Number of times clients had to wait. */ -diff --git a/nscd/gai.c b/nscd/gai.c -deleted file mode 100644 -index e29f3fe583..0000000000 ---- a/nscd/gai.c -+++ /dev/null -@@ -1,50 +0,0 @@ --/* Copyright (C) 2004-2023 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published -- by the Free Software Foundation; version 2 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, see . */ -- --#include --#include -- --/* This file uses the getaddrinfo code but it compiles it without NSCD -- support. We just need a few symbol renames. */ --#define __ioctl ioctl --#define __getsockname getsockname --#define __socket socket --#define __recvmsg recvmsg --#define __bind bind --#define __sendto sendto --#define __strchrnul strchrnul --#define __getline getline --#define __qsort_r qsort_r --/* nscd uses 1MB or 2MB thread stacks. */ --#define __libc_use_alloca(size) (size <= __MAX_ALLOCA_CUTOFF) --#define __getifaddrs getifaddrs --#define __freeifaddrs freeifaddrs --#undef __fstat64 --#define __fstat64 fstat64 --#undef __stat64 --#define __stat64 stat64 -- --/* We are nscd, so we don't want to be talking to ourselves. */ --#undef USE_NSCD -- --#include -- --/* Support code. */ --#include --#include -- --/* Some variables normally defined in libc. */ --nss_action_list __nss_hosts_database attribute_hidden; -diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c -index 2b0b8b6368..3aa6a00348 100644 ---- a/sysdeps/unix/sysv/linux/check_pf.c -+++ b/sysdeps/unix/sysv/linux/check_pf.c -@@ -66,25 +66,10 @@ static struct cached_data *cache; - __libc_lock_define_initialized (static, lock); - - --#if IS_IN (nscd) --static uint32_t nl_timestamp; -- --uint32_t --__bump_nl_timestamp (void) --{ -- if (atomic_fetch_add_relaxed (&nl_timestamp, 1) + 1 == 0) -- atomic_fetch_add_relaxed (&nl_timestamp, 1); -- -- return nl_timestamp; --} --#endif -- - static inline uint32_t - get_nl_timestamp (void) - { --#if IS_IN (nscd) -- return nl_timestamp; --#elif defined USE_NSCD -+#if defined USE_NSCD - return __nscd_get_nl_timestamp (); - #else - return 0; --- -2.45.2 - diff --git a/SPECS/go-md2man/go-md2man.signatures.json b/SPECS/go-md2man/go-md2man.signatures.json deleted file mode 100644 index 61919718dc..0000000000 --- a/SPECS/go-md2man/go-md2man.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "go-md2man-2.0.2.tar.gz": "2f52e37101ea2734b02f2b54a53c74305b95b3a9a27792fdac962b5354aa3e4a" - } -} diff --git a/SPECS/go-md2man/go-md2man.spec b/SPECS/go-md2man/go-md2man.spec deleted file mode 100644 index 513988e71a..0000000000 --- a/SPECS/go-md2man/go-md2man.spec +++ /dev/null @@ -1,122 +0,0 @@ -Summary: Converts markdown into roff (man pages) -Name: go-md2man -Version: 2.0.2 -Release: 2%{?dist} -License: MIT -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Tools/Container -URL: https://github.com/cpuguy83/go-md2man -Source0: https://github.com/cpuguy83/go-md2man/archive/v%{version}.tar.gz#/go-md2man-%{version}.tar.gz -BuildRequires: golang -BuildRequires: which -# required packages on install -Requires: /bin/sh -Provides: golang-github-cpuguy83-md2man -Provides: go-go-md2man = %{version}-%{release} - -%description -Converts markdown into roff (man pages) - -%define OUR_GOPATH %{_topdir}/.gopath -Vendor: Microsoft Corporation -Distribution: Azure Linux - -%prep -%setup -q -n %{name}-%{version} -c - -%build -export GOPATH=%{OUR_GOPATH} -export GOCACHE=%{OUR_GOPATH}/.cache -export CGO_ENABLED=0 -export GO111MODULE=on - -cd %{_topdir}/BUILD/%{name}-%{version}/go-md2man-%{version} -go build -mod vendor -o go-md2man - -%install -mkdir -p "%{buildroot}%{_bindir}" -cp -aT go-md2man-%{version}/go-md2man %{buildroot}%{_bindir}/go-md2man - -# copy legal files -mkdir -p %{buildroot}%{_docdir}/%{name}-%{version} -cp go-md2man-%{version}/LICENSE.md %{buildroot}%{_docdir}/%{name}-%{version}/LICENSE.md - -%files -%license %{_docdir}/%{name}-%{version}/LICENSE.md -%{_bindir}/go-md2man - -%changelog -* Fri Mar 21 2025 Anuj Mittal - 2.0.2-2 -- Bump Release to rebuild - -* Fri Oct 27 2023 CBL-Mariner Servicing Account - 2.0.2-1 -- Auto-upgrade to 2.0.2 - Azure Linux 3.0 - package upgrades - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 2.0.1-21 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 2.0.1-20 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 2.0.1-19 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 2.0.1-18 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 2.0.1-17 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 2.0.1-16 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 2.0.1-15 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 2.0.1-14 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 2.0.1-13 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 2.0.1-12 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 2.0.1-11 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 2.0.1-10 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 2.0.1-9 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 2.0.1-8 -- Bump release to rebuild with golang 1.18.3 - -* Fri Mar 04 2022 Andrew Phelps 2.0.1-1 -- Update to version 2.0.1 -- License verified - -* Fri Jun 18 2021 Henry Li 2.0.0-7 -- Provides go-go-md2man. -- Fix linting errors. - -* Tue Jun 08 2021 Henry Beberman 2.0.0-6 -- Increment release to force republishing using golang 1.15.13. - -* Thu Dec 10 2020 Andrew Phelps 2.0.0-5 -- Increment release to force republishing using golang 1.15. - -* Wed May 20 2020 Joe Schmitt 2.0.0-4 -- Remove reliance on existing GOPATH environment variable. - -* Sat May 09 2020 Nick Samson 2.0.0-3 -- Added %%license line automatically - -* Fri May 01 2020 Emre Girgin 2.0.0-2 -- Renaming go to golang - -* Fri Apr 03 2020 Mohan Datla 2.0.0-1 -- Original version for CBL-Mariner. diff --git a/SPECS/gobject-introspection/disableFaultyTest.patch b/SPECS/gobject-introspection/disableFaultyTest.patch deleted file mode 100644 index 6d5c3ddb04..0000000000 --- a/SPECS/gobject-introspection/disableFaultyTest.patch +++ /dev/null @@ -1,141 +0,0 @@ -diff -ru gobject-introspection-1.52.1/tests/repository/gitypelibtest.c gobject-introspection-1.52.1-modified/tests/repository/gitypelibtest.c ---- gobject-introspection-1.52.1/tests/repository/gitypelibtest.c 2014-08-13 06:30:30.000000000 -0700 -+++ gobject-introspection-1.52.1-modified/tests/repository/gitypelibtest.c 2017-08-28 16:43:19.957766015 -0700 -@@ -157,17 +157,6 @@ - } - - static void --test_fundamental_get_ref_function_pointer (GIRepository * repo) --{ -- GIObjectInfo *info; -- -- g_assert (g_irepository_require (repo, "Regress", NULL, 0, NULL)); -- info = g_irepository_find_by_name (repo, "Regress", "TestFundamentalObject"); -- g_object_info_get_ref_function_pointer (info); -- g_base_info_unref (info); --} -- --static void - test_hash_with_cairo_typelib (GIRepository * repo) - { - GIBaseInfo *info; -@@ -232,77 +221,6 @@ - g_base_info_unref (prop_obj); - } - --static void --test_signal_array_len (GIRepository * repo) --{ -- GIObjectInfo *testobj_info; -- GISignalInfo *sig_info; -- GIArgInfo arg_info; -- GITypeInfo type_info; -- int i; -- -- g_assert (g_irepository_require (repo, "Regress", NULL, 0, NULL)); -- testobj_info = g_irepository_find_by_name (repo, "Regress", "TestObj"); -- g_assert (testobj_info != NULL); -- -- /* find sig-with-array-len-prop signal */ -- for (i = g_object_info_get_n_signals (testobj_info) - 1; i >= 0; --i) -- { -- sig_info = g_object_info_get_signal (testobj_info, i); -- g_assert (sig_info != NULL); -- if (strcmp (g_base_info_get_name (sig_info), "sig-with-array-len-prop") == 0) -- break; -- g_base_info_unref (sig_info); -- } -- g_assert (i >= 0); -- -- g_assert_cmpint (g_callable_info_get_n_args (sig_info), ==, 2); -- -- /* verify array argument */ -- g_callable_info_load_arg (sig_info, 0, &arg_info); -- g_assert_cmpstr (g_base_info_get_name (&arg_info), ==, "arr"); -- g_arg_info_load_type (&arg_info, &type_info); -- g_assert_cmpint (g_type_info_get_tag (&type_info), ==, GI_TYPE_TAG_ARRAY); -- g_assert_cmpint (g_type_info_get_array_type (&type_info), ==, GI_ARRAY_TYPE_C); -- g_assert (!g_type_info_is_zero_terminated (&type_info)); -- g_assert_cmpint (g_type_info_get_array_length (&type_info), ==, 1); -- -- /* verify array length argument */ -- g_callable_info_load_arg (sig_info, 1, &arg_info); -- g_assert_cmpstr (g_base_info_get_name (&arg_info), ==, "len"); -- -- g_base_info_unref (sig_info); -- g_base_info_unref (testobj_info); --} -- --static void --test_instance_transfer_ownership (GIRepository * repo) --{ -- GIObjectInfo *testobj_info; -- GIFunctionInfo *func_info; -- GITransfer transfer; -- -- g_assert (g_irepository_require (repo, "Regress", NULL, 0, NULL)); -- testobj_info = g_irepository_find_by_name (repo, "Regress", "TestObj"); -- g_assert (testobj_info != NULL); -- -- func_info = g_object_info_find_method (testobj_info, "instance_method"); -- g_assert (func_info != NULL); -- transfer = g_callable_info_get_instance_ownership_transfer ((GICallableInfo*) func_info); -- g_assert_cmpint (GI_TRANSFER_NOTHING, ==, transfer); -- -- g_base_info_unref (func_info); -- -- func_info = g_object_info_find_method (testobj_info, "instance_method_full"); -- g_assert (func_info != NULL); -- transfer = g_callable_info_get_instance_ownership_transfer ((GICallableInfo*) func_info); -- g_assert_cmpint (GI_TRANSFER_EVERYTHING, ==, transfer); -- -- g_base_info_unref (func_info); -- -- g_base_info_unref (testobj_info); --} -- - int - main (int argc, char **argv) - { -@@ -315,11 +233,8 @@ - test_enum_and_flags_static_methods (repo); - test_size_of_gvalue (repo); - test_is_pointer_for_struct_arg (repo); -- test_fundamental_get_ref_function_pointer (repo); - test_hash_with_cairo_typelib (repo); - test_char_types (repo); -- test_signal_array_len (repo); -- test_instance_transfer_ownership (repo); - - exit (0); - } -diff -ru gobject-introspection-1.52.1/tests/scanner/Makefile.am gobject-introspection-1.52.1-modified/tests/scanner/Makefile.am ---- gobject-introspection-1.52.1/tests/scanner/Makefile.am 2015-07-01 00:23:55.000000000 -0700 -+++ gobject-introspection-1.52.1-modified/tests/scanner/Makefile.am 2017-08-24 16:18:57.714105073 -0700 -@@ -89,16 +89,16 @@ - SLetter_1_0_gir_SCANNERFLAGS = $(INTROSPECTION_SCANNER_ARGS) --identifier-prefix=S --c-include="sletter.h" --warn-error - GIRS += SLetter-1.0.gir - --Regress-1.0.gir: $(top_builddir)/Gio-2.0.gir Utility-1.0.gir libregress.la --Regress_1_0_gir_LIBS = libregress.la --Regress_1_0_gir_CFLAGS = $(libregress_la_CPPFLAGS) $(libregress_la_CFLAGS) -include "glib.h" --Regress_1_0_gir_INCLUDES = Gio-2.0 Utility-1.0 --if HAVE_CAIRO --Regress_1_0_gir_INCLUDES += cairo-1.0 --endif --Regress_1_0_gir_FILES = $(libregress_la_SOURCES) --Regress_1_0_gir_SCANNERFLAGS = $(INTROSPECTION_SCANNER_ARGS) --c-include="regress.h" --warn-error --GIRS += Regress-1.0.gir -+#Regress-1.0.gir: $(top_builddir)/Gio-2.0.gir Utility-1.0.gir libregress.la -+#Regress_1_0_gir_LIBS = libregress.la -+#Regress_1_0_gir_CFLAGS = $(libregress_la_CPPFLAGS) $(libregress_la_CFLAGS) -include "glib.h" -+#Regress_1_0_gir_INCLUDES = Gio-2.0 Utility-1.0 -+#if HAVE_CAIRO -+#Regress_1_0_gir_INCLUDES += cairo-1.0 -+#endif -+#Regress_1_0_gir_FILES = $(libregress_la_SOURCES) -+#Regress_1_0_gir_SCANNERFLAGS = $(INTROSPECTION_SCANNER_ARGS) --c-include="regress.h" --warn-error -+#GIRS += Regress-1.0.gir - - WarnLib-1.0.gir: $(top_builddir)/Gio-2.0.gir libwarnlib.la - WarnLib_1_0_gir_LIBS = libwarnlib.la diff --git a/SPECS/gobject-introspection/gobject-introspection.signatures.json b/SPECS/gobject-introspection/gobject-introspection.signatures.json deleted file mode 100644 index da6f2550fe..0000000000 --- a/SPECS/gobject-introspection/gobject-introspection.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "gobject-introspection-1.78.1.tar.xz": "bd7babd99af7258e76819e45ba4a6bc399608fe762d83fde3cac033c50841bb4" - } -} diff --git a/SPECS/gobject-introspection/gobject-introspection.spec b/SPECS/gobject-introspection/gobject-introspection.spec deleted file mode 100644 index 92cb78096a..0000000000 --- a/SPECS/gobject-introspection/gobject-introspection.spec +++ /dev/null @@ -1,236 +0,0 @@ -%define BaseVersion 1.78 -Summary: Introspection system for GObject-based libraries -Name: gobject-introspection -Version: %{BaseVersion}.1 -Release: 2%{?dist} -License: GPLv2+ AND LGPLv2+ AND MIT -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Development/Libraries -URL: https://github.com/GNOME/gobject-introspection -Source0: https://ftp.gnome.org/pub/GNOME/sources/gobject-introspection/%{BaseVersion}/%{name}-%{version}.tar.xz -Patch0: testWorkaround.patch -BuildRequires: autoconf-archive -BuildRequires: bison -BuildRequires: cairo-gobject-devel -BuildRequires: flex -BuildRequires: gcc -BuildRequires: gettext -BuildRequires: glib-devel >= 2.58.0 -BuildRequires: golang -BuildRequires: intltool -BuildRequires: libffi-devel -BuildRequires: meson -BuildRequires: python3-devel -BuildRequires: python3-xml -BuildRequires: which -BuildRequires: python3-mako -BuildRequires: python3-markdown -BuildRequires: pkgconfig(gio-2.0) >= %{glib2_version} -Requires: glib >= 2.58.0 -Requires: libffi - -%description -GObject Introspection can scan C header and source files in order to -generate introspection "typelib" files. It also provides an API to examine -typelib files, useful for creating language bindings among other -things. - -%package -n python3-gobject-introspection -Summary: Python3 package for handling GObject introspection data -Group: Development/Languages -Requires: %{name} = %{version}-%{release} -Requires: python3 -Requires: python3-xml - -%description -n python3-gobject-introspection -This package contains a Python package for handling the introspection -data from Python. - -%package devel -Summary: Libraries and headers for gobject-introspection -Group: Development/Libraries -Requires: %{name} = %{version}-%{release} -Requires: glib-devel -Requires: libffi-devel -Requires: python3-%{name} = %{version}-%{release} - -%description devel -Libraries and headers for gobject-introspection. - -%prep -%autosetup -p 1 -%autosetup -p1 -mv giscanner/ast.py giscanner/gio_ast.py - -%build -%meson -Ddoctool=enabled -Dgtk_doc=true -Dpython=%{__python3} -%meson_build - -%install -%meson_install -# Move the python3 modules to the correct location -mkdir -p %{buildroot}/%{python3_sitelib} -mv %{buildroot}/%{_libdir}/gobject-introspection/giscanner %{buildroot}/%{python3_sitelib} - -rm -rf %{buildroot}/%{_datarootdir}/gtk-doc/html -find %{buildroot} -type f -name "*.la" -delete -print - -%check -%meson_test - -%ldconfig_scriptlets - -%files -%defattr(-,root,root,-) -%license COPYING -%{_libdir}/lib*.so.* -%dir %{_libdir}/girepository-1.0 -%{_libdir}/girepository-1.0/*.typelib - -%files -n python3-gobject-introspection -%defattr(-,root,root,-) -%{python3_sitelib}/giscanner - -%files devel -%defattr(-,root,root,-) -%{_libdir}/lib*.so -%{_libdir}/pkgconfig/* -%{_includedir}/* -%{_bindir}/g-ir-* -%{_datadir}/gir-1.0 -%{_datadir}/aclocal/introspection.m4 -%{_datadir}/gobject-introspection-1.0 -%{_mandir}/man1/*.gz -%{_libdir}/libgirepository-1.0.so -%{_libdir}/gobject-introspection/ -%{_libdir}/pkgconfig/gobject-introspection-1.0.pc -%{_libdir}/pkgconfig/gobject-introspection-no-export-1.0.pc -%{_datadir}/gir-1.0/gir-1.2.rnc - -%changelog -* Fri Mar 21 2025 Anuj Mittal - 1.78.1-2 -- Bump Release to rebuild - -* Thu Feb 29 2024 Betty Lakes - 1.78.1-1 -- Update version to 1.78.1 -- Apply testWorkaround patch - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 1.71.0-16 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 1.71.0-15 -- Bump release to rebuild with updated version of Go. - -* Wed Sep 20 2023 Jon Slobodzian - 1.71.0-14 -- Recompile with stack-protection fixed gcc version (CVE-2023-4039) - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.71.0-13 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 1.71.0-12 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 1.71.0-11 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.71.0-10 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 1.71.0-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 1.71.0-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 1.71.0-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 1.71.0-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 1.71.0-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 1.71.0-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 1.71.0-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 1.71.0-2 -- Bump release to rebuild with golang 1.18.3 - -* Wed Feb 16 2022 Cameron Baird - 1.71.0-1 -- Update source to v1.71.0 -- Switch to meson build - -* Fri Dec 03 2021 Thomas Crain - 1.58.0-12 -- Fix Python 3.9 compatibility issue - -* Wed Oct 20 2021 Thomas Crain - 1.58.0-11 -- Remove python2 package -- Lint spec - -* Tue Jun 08 2021 Henry Beberman - 1.58.0-10 -- Increment release to force republishing using golang 1.15.13. - -* Mon Apr 26 2021 Nicolas Guibourge - 1.58.0-9 -- Increment release to force republishing using golang 1.15.11. - -* Thu Dec 10 2020 Andrew Phelps - 1.58.0-8 -- Increment release to force republishing using golang 1.15. - -* Wed Jul 01 2020 Pawel Winogrodzki - 1.58.0-7 -- Forcing single job 'make' build to avoid intermittent build errors. - -* Sat May 09 2020 Nick Samson - 1.58.0-6 -- Added %%license line automatically - -* Thu Apr 30 2020 Emre Girgin - 1.58.0-5 -- Renaming go to golang - -* Tue Apr 21 2020 Eric Li - 1.58.0-4 -- Fix Source0: and delete sha1. Verified License. Fixed URL. - -* Tue Sep 03 2019 Mateusz Malisz - 1.58.0-3 -- Initial CBL-Mariner import from Photon (license: Apache2). - -* Mon Dec 10 2018 Alexey Makhalov - 1.58.0-2 -- -devel requires -python. - -* Thu Sep 06 2018 Anish Swaminathan - 1.58.0-1 -- Update version to 1.58.0 - -* Tue Jan 02 2018 Alexey Makhalov - 1.52.1-5 -- Add autoreconf to support automake-1.15.1 - -* Mon Aug 28 2017 Kumar Kaushik - 1.52.1-4 -- Disabling make check for Regress-1.0.gir test, bug#1635886 - -* Wed Jun 07 2017 Xiaolin Li - 1.52.1-3 -- Add python3-xml to python3 sub package Buildrequires. - -* Tue May 23 2017 Xiaolin Li - 1.52.1-2 -- Added python3 subpackage. - -* Wed Apr 12 2017 Danut Moraru - 1.52.1-1 -- Updated to version 1.52.1 - -* Thu Oct 06 2016 ChangLee - 1.46.0-3 -- Modified %check - -* Tue May 24 2016 Priyesh Padmavilasom - 1.46.0-2 -- GA - Bump release of all rpms - -* Thu Feb 25 2016 Kumar Kaushik - 1.46.0-1 -- Updated version. - -* Mon Oct 12 2015 Xiaolin Li - 1.43.3-4 -- Moving static lib files to devel package. - -* Fri Oct 9 2015 Xiaolin Li - 1.43.3-3 -- Removing la files from packages. - -* Mon Jul 6 2015 Alexey Makhalov - 1.43.3-2 -- Added more requirements for devel subpackage. diff --git a/SPECS/gobject-introspection/testWorkaround.patch b/SPECS/gobject-introspection/testWorkaround.patch deleted file mode 100644 index 5bb9896cfb..0000000000 --- a/SPECS/gobject-introspection/testWorkaround.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff -rU3 gobject-introspection-1.76.1-orig/giscanner/__init__.py gobject-introspection-1.76.1/giscanner/__init__.py ---- gobject-introspection-1.76.1-orig/giscanner/__init__.py 2023-03-22 23:43:34.000000000 +0100 -+++ gobject-introspection-1.76.1/giscanner/__init__.py 2023-06-07 11:50:00.217226422 +0200 -@@ -25,3 +25,8 @@ - from ._version import __version__ - except ImportError: - __version__ = '0.0.0' -+ -+from . import gio_ast as ast -+ -+import sys -+sys.modules['giscanner.ast'] = ast -diff -rU3 gobject-introspection-1.76.1-orig/giscanner/meson.build gobject-introspection-1.76.1/giscanner/meson.build ---- gobject-introspection-1.76.1-orig/giscanner/meson.build 2023-03-22 23:43:34.000000000 +0100 -+++ gobject-introspection-1.76.1/giscanner/meson.build 2023-06-07 11:48:32.922732028 +0200 -@@ -2,7 +2,7 @@ - '__init__.py', - 'annotationmain.py', - 'annotationparser.py', -- 'ast.py', -+ 'gio_ast.py', - 'cachestore.py', - 'ccompiler.py', - 'codegen.py', diff --git a/SPECS/golang-packaging/golang-packaging.signatures.json b/SPECS/golang-packaging/golang-packaging.signatures.json deleted file mode 100644 index adbdd60279..0000000000 --- a/SPECS/golang-packaging/golang-packaging.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "golang-packaging-15.0.17.tar.gz": "706cee8b2971cb6e317201d7eb779c5c90303f6ce5a1faac2bb47661e0335460" - } -} diff --git a/SPECS/golang-packaging/golang-packaging.spec b/SPECS/golang-packaging/golang-packaging.spec deleted file mode 100644 index 0f145d5674..0000000000 --- a/SPECS/golang-packaging/golang-packaging.spec +++ /dev/null @@ -1,394 +0,0 @@ -# -# spec file for package golang-packaging -# -# Copyright (c) 2020 SUSE LLC -# -# All modifications and additions to the file contributed by third parties -# remain the property of their copyright owners, unless otherwise agreed -# upon. The license for this file, and modifications and additions to the -# file, is the same license as for the pristine package itself (unless the -# license for the pristine package is not an Open Source License, in which -# case the license is the MIT License). An "Open Source License" is a -# license that conforms to the Open Source Definition (Version 1.9) -# published by the Open Source Initiative. - -# Please submit bugfixes or comments via https://bugs.opensuse.org/ -# - - -Name: golang-packaging -Version: 15.0.17 -Release: 3%{?dist} -Summary: A toolchain to help packaging golang -License: GPLv3 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Development/Languages/Golang -URL: https://github.com/openSUSE/%{name} -#Source0: https://github.com/openSUSE/%{name}/archive/refs/tags/v%{version}.tar.gz -Source0: %{name}-%{version}.tar.gz -BuildRequires: rpm -BuildRequires: xz -Recommends: go -BuildArch: noarch - -%description -A toolchain to help packaging golang, written in bash. - -%prep -%setup -q - -%build - -%install -mkdir -p %{buildroot}%{_sysconfdir}/rpm/ -mkdir -p %{buildroot}%{_libdir}/rpm/ - -install -m0755 golang.prov %{buildroot}%{_libdir}/rpm/ -install -m0755 golang.req %{buildroot}%{_libdir}/rpm/ -install -m0755 golang.sh %{buildroot}%{_libdir}/rpm/ -install -m0644 macros.go %{buildroot}%{_sysconfdir}/rpm/ - -%files -%defattr(-,root,root) -%doc README.md CHANGELOG -%license COPYING -%{_libdir}/rpm/golang.prov -%{_libdir}/rpm/golang.req -%{_libdir}/rpm/golang.sh -%config %{_sysconfdir}/rpm/macros.go - -%changelog -* Fri Oct 3 2025 Lee Chee Yang - 15.0.17-3 -- merge from Azure Linux 3.0.20250910-3.0 -- Change to "Recommends: go" to resolve build conflict with golang 1.24 and 1.25 - -* Fri Mar 21 2025 Anuj Mittal - 15.0.17-2 -- Bump Release to rebuild - -* Fri Oct 27 2023 CBL-Mariner Servicing Account - 15.0.17-1 -- Auto-upgrade to 15.0.17 - Azure Linux 3.0 - package upgrades - -* Tue Oct 12 2021 Pawel Winogrodzki - 15.0.15-2 -- Switching to using a single digit for the 'Release' tag. - -* Thu Jun 10 2021 Henry Li 15.0.15-1.4 -- Initial CBL-Mariner import from openSUSE Tumbleweed (license: same as "License" tag). -- License Verified -- Remove distro condition checks that do not apply for CBL-Mariner -- Fix Source0 URL - -* Fri Nov 13 2020 jkowalczyk@suse.com -- Update to version 15.0.15: - * Only create directories that do not yet exist - * filelelist can try to access source_dir independently - -* Wed Nov 11 2020 jkowalczyk@suse.com -- Update to version 15.0.14: - * Ensure to touch $RPM_BUILD_ROOT only in the various install phases - * Add support for riscv64 - -* Fri May 29 2020 jkowalczyk@suse.com -- Update to version 15.0.13: - * Preserve modification time of source files -- Mark COPYING as %%license on suse_version > 1500 - -* Sat Nov 16 2019 jkowalczyk@suse.com -- Update to version 15.0.12: - * Drop ppc64-nopie.patch - * golang.sh: integrate ppc64-nopie.patch -buildmode=pie only on ppc64 - * golang.sh: avoid excessive "rpm --eval..." calls - * Install Bazel files in src directory - * Replace rpmdev-vercmp by "sort -V" to remove rpmdev-vercmp dependency - * Remove s build flag no longer supported in go 1.10 boo#776058 - * Packaging: improve _service tar_scm declarations add _servicedata - -* Wed Jun 13 2018 jmassaguerpla@suse.com -- We don't need to require rpmdev, because we updated to 15.0.11 - to remove that requirement. I missed to remove the req from - the spec file. - -* Tue Jun 12 2018 msuchanek@suse.com -- fix ppc64 (be) build. No pie baking support there. - + ppc64-nopie.patch - -* Mon Jun 11 2018 opensuse-packaging@opensuse.org -- Update to version 15.0.11: - * Replace rpmdev-vercmp by "sort -V" to remove rpmdev-vercmp dependency - -* Thu May 31 2018 opensuse-packaging@opensuse.org -- Update to version 15.0.10: - * update changelog to v15.0.10 - * This flag does not exist for go 1.10 because this is an extra flag that openSUSE was adding into the go packages in order to fix - * Revert "only add the s flag if go is less than 1.10" - * only add the s flag if go is less than 1.10 - * Revert "Pass linker flag via ldflags" - * update changelog: add 15.0.9 version - * Pass linker flag via ldflags - * Bump version 15.0.8 - * Fix the handling of quoted extra args - * bump version to v15.0.7 -- Add Requires rpmdev-tools as this is used to compare versions in the - golang.sh script - -* Tue May 29 2018 opensuse-packaging@opensuse.org -- Update to version 15.0.9: - * Pass linker flag via ldflags - -* Mon Feb 12 2018 opensuse-packaging@opensuse.org -- Update to version 15.0.8: - * Fix Requires/Provides issue with split packages - * Remove unused variables - * Bump version to v15.0.5 - * *: always use -buildmode=pie - * bump version to v15.0.6 - * fix changelog - * golang.sh: Fix arch for aarch64 - * bump version to v15.0.7 - * Fix the handling of quoted extra args - * Bump version 15.0.8 - -* Wed Aug 30 2017 thipp@suse.de -- Update to version 15.0.7: - * *: always use -buildmode=pie - * fix changelog - * golang.sh: Fix arch for aarch64 - -* Wed Jun 28 2017 thipp@suse.de -- Update to version 15.0.5: - * set correct modifier if no arguments are provided - * Remove duplicates when finding Requires - * fix GOPATH and macros - * Fix Provides and Requires for some builds - * Fix Requires/Provides issue with split packages - * Remove unused variables - -* Wed Jun 7 2017 thipp@suse.de -- Update to version 15.0.4: - * Handle extra_flags for build/test correctly - * set correct modifier if no arguments are provided - * Remove duplicates when finding Requires - * fix GOPATH and macros - * Fix Provides and Requires for some builds - -* Thu Jun 1 2017 thipp@suse.de -- fix GOPATH for Provides and Requires - -* Wed May 24 2017 thipp@suse.de -- Fix all %%go_*dir macros - -* Tue May 23 2017 thipp@suse.de -- fix GOPATH issue - -* Sun May 21 2017 jmassaguerpla@suse.com -- fix gopath after updating go to 1.8. With go 1.8, there is no more - /usr/share/go/contrib but /usr/share/go/1.8/contrib - gopath.patch: contains the fix - -* Wed Mar 29 2017 thipp@suse.de -- Update to version 15.0.3: - * Remove duplicates when finding Requires - * bump version to v15.0.3 - -* Wed Mar 22 2017 thipp@suse.de -- Update to version 15.0.2: - * set correct modifier if no arguments are provided - * bump version to v15.0.2 - -* Tue Mar 14 2017 thipp@suse.de -- Update to version 15.0.1: - * Handle extra_flags for build/test correctly - * bump version to v15.0.1 - -* Wed Feb 15 2017 thipp@suse.de -- Update to version 15.0.0: - * [SLE11]some commands need time to finish, immediate close will get wrong status, so use timeout 30s - * [SLE]ditch named group in regexp in golang.req, the oniguruma in ruby 1.8.7 doesn't support named group - * fix a typo in cli.rb - * increate timeout to 300s or go install can't finish - * Remove runtime dependency for Go API - * simplify rpmsysinfo.rb - * release 14.9.1 - * Added go_nostrip macro - * Refactor using plain bash - * small fixes - -* Fri Jul 22 2016 tboerger@suse.com -- Added refactoring.patch while trying new code base -- Dropped the sed for static architecture detection -- Updated files list to reflect new file structure - -* Fri Jul 8 2016 i@marguerite.su -- can't be noarch. we detected %%%%go_arch at build time. it has to be - architecture-dependent, or it'll be published randomly with one - from i586/x86_64, whose content (/etc/rpm/macros.go) is unique. - -* Tue Jun 21 2016 tboerger@suse.com -- Update to version 14.9.2: - + [SLE11]some commands need time to finish, immediate close will get wrong status, so use timeout 30s - + [SLE]ditch named group in regexp in golang.req, the oniguruma in ruby 1.8.7 doesn't support named group - + fix a typo in cli.rb - + increate timeout to 300s or go install can't finish - + Remove runtime dependency for Go API - + simplify rpmsysinfo.rb - + release 14.9.1 - + Added go_nostrip macro - -* Wed Jun 8 2016 i@marguerite.su -- Update to version 14.9.1: - * simplify rpmsysinfo.rb: don't guess variables' - values can be passed in by RPM environment - variables. use RbConfig to get libdir. - * support s390x architecture - -* Sun Apr 17 2016 mpluskal@suse.com -- Update service - * use xz for compression - * change from disabled to localonly -- Update spec file to actually use tarball generated by _service -- Drop useless _servicedata - -* Fri Apr 15 2016 tboerger@suse.com -- Switched to service based package updates -- Update to version 14.9.0: - * do not hardcode go version - * fix encoding problem in rpmsysinfo.rb - * [SLE11]some commands need time to finish, immediate close will get wrong status, so use timeout 30s - * [SLE]ditch named group in regexp in golang.req, the oniguruma in ruby 1.8.7 doesn't support named group - * fix a typo in cli.rb - * increate timeout to 300s or go install can't finish - * Remove runtime dependency for Go API - -* Tue Apr 5 2016 i@marguerite.su -- update version 14.8.1 - * bugfix release - * fix a typo in cli.rb - * increate timeout to 300s, or go install can't - finish itself sometimes - -* Sun Apr 3 2016 i@marguerite.su -- update version 14.8 - * rpmsysinfo.rb: fix encoding problem in open() - * cli.rb: ruby 1.8.7 doesn't support passing environment - variables in popen(), some commands/tests need time to - finish, an immediate io.close() will get us wrong - exitstatus (broken pipe, code 13). so use 'timeout' - module with a 30s and process.wait for them to quit - successfully. - * golang.req: the oniguruma in ruby 1.8.7 doesn't support - named group in regexp. so ditch the named group used in - go_get_version() - -* Wed Feb 24 2016 i@marguerite.su -- update version 14.7 - * do not hardcode go version - -* Fri Feb 12 2016 i@marguerite.su -- update version 14.6 - * Fix rbarch for Power architectures - -* Fri Jan 22 2016 i@marguerite.su -- update version 14.5 - * fix a typo that prevent golang.req from running (fix #10) - -* Fri Jan 22 2016 i@marguerite.su -- update version 14.4 - * fix #5 on golang.req - -* Tue Jan 19 2016 i@marguerite.su -- update version 14.3 - * fix: command not found error for go test on SLE - * fix #5 again: gsub importpath itself is not enough - -* Mon Jan 11 2016 i@marguerite.su -- update version 14.2 - * golang.req: fix ' // indirect' comment in import - -* Mon Jan 11 2016 i@marguerite.su -- update version 14.1 - * golang.prov fix: uniq! returns nil if everything is unique - -* Tue Jan 5 2016 i@marguerite.su -- update version 14 - * if importpath has "test/example", it should survive (github#5) - * merge macros.go from openSUSE's go here - * add golang-macros.rb, replacement for the complicated - macros in shell in macros.go - * golang-macros.rb: - + support build with fake build id - + support build with custom tags (github#7) - + support pass any -="a b c" or -= - to go install, shared build is possible now - (not fully support, other macros need to be adapted) - + --filelist, to generate filelist used in %%files - section with excluding support - + use IO.popen to break the build at the exact place - it fails (github#6) - -* Mon Jan 4 2016 i@marguerite.su -- update version 13 - * provides the importpath itself - * fix regex not to check files like .golden in -source - * filter "test/example" from Provides - * split common stuff to a module golang/rpmsysinfo.rb - * rewrite golang.req, now read from stdin RPM feeds, - and check __.PKGDEF from .a files for "import"s. (github#3, github#4) - -* Sun Jan 3 2016 i@marguerite.su -- update version 12 - * don't find provides/requires on -source, -debuginfo, -debugsource - subpackages - * add scripts to generate file lists. - -* Sat Jan 2 2016 i@marguerite.su -- update version 11 - * fix for sles and openSUSE < 13.2 - -* Fri Sep 4 2015 i@marguerite.su -- update version 10 - * support all archtectures like ppc/arm - -* Fri Aug 28 2015 i@marguerite.su -- update version 9 - * update golang(API) to 1.5 - -* Sun Aug 2 2015 i@marguerite.su -- update version 8 - * skip the last "/" in golang.prov, thanks to matwey - -* Fri Jul 31 2015 i@marguerite.su -- udpate version 7 - * handle gopkg.in/* requirements - -* Fri Jul 24 2015 i@marguerite.su -- update version 6 - * fix golang.req to not treat a sentence as importpath - * fix golang.attr to correctly detect /usr/bin/* - -* Wed Jul 22 2015 i@marguerite.su -- update version 5 - * if a sub-directory doesn't contain any *.go file, do not - treat it as a Provides candidate. - * add /usr/bin to golang.attr for go executes to be handled - by golang-packaging - -* Sun Jul 12 2015 i@marguerite.su -- update version 4 - * fix encoding error in golang-strip-builddep - * add macros.go-extra, extra golang macros for packaging - -* Sat Jul 11 2015 i@marguerite.su -- update version 3 - * skip *example*.go/*test*.go for Requires finding - * support alias format (import xx "xxx") for importpath - * add golang-strip-builddep, a tool to strip unneeded importpath - from source codes - -* Fri Jul 10 2015 i@marguerite.su -- update version 2 - * fix pkgname detection - -* Sun Jul 5 2015 i@marguerite.su -- initial version 1 - * implemented provides - * implemented requires diff --git a/SPECS/golang/golang-1.25.signatures.json b/SPECS/golang/golang-1.25.signatures.json new file mode 100644 index 0000000000..c7a8882674 --- /dev/null +++ b/SPECS/golang/golang-1.25.signatures.json @@ -0,0 +1,9 @@ +{ + "Signatures": { + "go.20230802.5.src.tar.gz": "56b9e0e0c3c13ca95d5efa6de4e7d49a9d190eca77919beff99d33cd3fa74e95", + "go.20240206.2.src.tar.gz": "7982e0011aa9ab95fd0530404060410af4ba57326d26818690f334fdcb6451cd", + "go1.22.12-20250211.4.src.tar.gz": "e1cc3bff8fdf1f24843ffc9f0eaddfd344eb40fd9ca0d9ba2965165be519eeb7", + "go1.25.7-20260204.4.src.tar.gz": "8c51515b2ee63464b62681373d5342ff148491bbbcc0b5bd892d9fafc3b40145", + "go1.4-bootstrap-20171003.tar.gz": "f4ff5b5eb3a3cae1c993723f3eab519c5bae18866b5e5f96fe1102f0cb5c3e52" + } +} diff --git a/SPECS/golang/golang-1.25.spec b/SPECS/golang/golang-1.25.spec new file mode 100644 index 0000000000..93480f710c --- /dev/null +++ b/SPECS/golang/golang-1.25.spec @@ -0,0 +1,407 @@ +%global goroot %{_libdir}/golang +%global gopath %{_datadir}/gocode +%global ms_go_filename go1.25.7-20260204.4.src.tar.gz +%global ms_go_revision 1 +%ifarch aarch64 +%global gohostarch arm64 +%else +%global gohostarch amd64 +%endif +%define debug_package %{nil} +%define __strip /bin/true +# rpmbuild magic to keep from having meta dependency on libc.so.6 +%define _use_internal_dependency_generator 0 +%define __find_requires %{nil} +Summary: Go +Name: golang +Version: 1.25.7 +Release: 1%{?dist} +License: BSD-3-Clause +Vendor: Microsoft Corporation +Distribution: Azure Linux +Group: System Environment/Security +URL: https://github.com/microsoft/go +Source0: https://github.com/microsoft/go/releases/download/v%{version}-%{ms_go_revision}/%{ms_go_filename} + +# bootstrap 00, same content as https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz +Source1: https://github.com/microsoft/go/releases/download/v1.4.0-1/go1.4-bootstrap-20171003.tar.gz +Patch0: go14_bootstrap_aarch64.patch +# bootstrap 01 +Source2: https://github.com/microsoft/go/releases/download/v1.19.12-1/go.20230802.5.src.tar.gz +# bootstrap 02 +Source3: https://github.com/microsoft/go/releases/download/v1.20.14-1/go.20240206.2.src.tar.gz +# bootstrap 03 +Source4: https://github.com/microsoft/go/releases/download/v1.22.12-2/go1.22.12-20250211.4.src.tar.gz + +Provides: %{name} = %{version} +Provides: go = %{version}-%{release} +Provides: golang = %{version}-%{release} +Provides: msft-golang = %{version}-%{release} + +%description +Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. + +%prep +# Setup bootstrap source +tar xf %{SOURCE1} --no-same-owner +patch -Np1 --ignore-whitespace < %{PATCH0} +mv -v go go-bootstrap-00 + +tar xf %{SOURCE2} --no-same-owner +mv -v go go-bootstrap-01 + +tar xf %{SOURCE3} --no-same-owner +mv -v go go-bootstrap-02 + +tar xf %{SOURCE4} --no-same-owner +mv -v go go-bootstrap-03 + +%setup -q -n go + +%build +# go 1.4 bootstraps with C. +# go 1.20 bootstraps with go >= 1.17.13 +# go >= 1.22 bootstraps with go >= 1.20.14 +# +# These conditions make building the current go compiler from C a multistep +# process. Approximately once a year, the bootstrap requirement is moved +# forward, adding another step. +# +# PS: Since go compiles fairly quickly, the extra overhead is around 2-3 minutes +# on a reasonable machine. + +# Use prev bootstrap to compile next bootstrap. +function go_bootstrap() { + local bootstrap=$1 + local new_root=%{_topdir}/BUILD/go-bootstrap-${bootstrap} + ( + cd ${new_root}/src + CGO_ENABLED=0 ./make.bash + ) + # Nuke the older bootstrapper + rm -rf %{_libdir}/golang + # Install the new bootstrapper + mv -v $new_root %{_libdir}/golang + export GOROOT=%{_libdir}/golang + export GOROOT_BOOTSTRAP=%{_libdir}/golang +} + +go_bootstrap 00 +go_bootstrap 01 +go_bootstrap 02 +go_bootstrap 03 + +# Build current go version +export GOHOSTOS=linux +export GOHOSTARCH=%{gohostarch} +export GOROOT_BOOTSTRAP=%{goroot} + +export GOROOT="`pwd`" +export GOPATH=%{gopath} +export GOROOT_FINAL=%{_bindir}/go +rm -f %{gopath}/src/runtime/*.c +( + cd src + ./make.bash --no-clean +) + +%install + +mkdir -p %{buildroot}%{_bindir} +mkdir -p %{buildroot}%{goroot} + +cp -R api bin doc lib pkg src misc VERSION go.env %{buildroot}%{goroot} + +# remove the unnecessary zoneinfo file (Go will always use the system one first) +rm -rfv %{buildroot}%{goroot}/lib/time + +# remove the doc Makefile +rm -rfv %{buildroot}%{goroot}/doc/Makefile + +# put binaries to bindir, linked to the arch we're building, +# leave the arch independent pieces in %{goroot} +mkdir -p %{buildroot}%{goroot}/bin/linux_%{gohostarch} +ln -sfv ../go %{buildroot}%{goroot}/bin/linux_%{gohostarch}/go +ln -sfv ../gofmt %{buildroot}%{goroot}/bin/linux_%{gohostarch}/gofmt +ln -sfv %{goroot}/bin/gofmt %{buildroot}%{_bindir}/gofmt +ln -sfv %{goroot}/bin/go %{buildroot}%{_bindir}/go + +# ensure these exist and are owned +mkdir -p %{buildroot}%{gopath}/src/github.com/ +mkdir -p %{buildroot}%{gopath}/src/bitbucket.org/ +mkdir -p %{buildroot}%{gopath}/src/code.google.com/p/ + +# This file is not necessary: recent Go toolsets have good defaults. +# Keep the file, but leave it blank. This makes the upgrade path very simple. +install -vdm755 %{buildroot}%{_sysconfdir}/profile.d +cat >> %{buildroot}%{_sysconfdir}/profile.d/go-exports.sh <<- "EOF" +EOF + +%post -p /sbin/ldconfig + +%postun +/sbin/ldconfig +if [ $1 -eq 0 ]; then + # This is uninstall + rm -rf /opt/go + exit 0 +fi + +%files +%defattr(-,root,root) +%license LICENSE +%exclude %{goroot}/src/*.rc +%exclude %{goroot}/include/plan9 +%{_sysconfdir}/profile.d/go-exports.sh +%{goroot}/* +%{gopath}/src +%exclude %{goroot}/src/pkg/debug/dwarf/testdata +%exclude %{goroot}/src/pkg/debug/elf/testdata +%{_bindir}/* + +%changelog +* Thu Feb 05 2026 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.25.7-1 +- Bump version to 1.25.7-1 + +* Tue Jan 20 2026 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.25.6-1 +- Bump version to 1.25.6-1 + +* Tue Dec 02 2025 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.25.5-1 +- Bump version to 1.25.5-1 + +* Tue Oct 14 2025 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.25.3-1 +- Bump version to 1.25.3-1 + +* Thu Sep 04 2025 Davis Goodin - 1.25.1-1 +- Bump version to 1.25.1-1 + +* Wed Aug 13 2025 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.25.0-1 +- Bump version to 1.25.0-1 + +* Wed Aug 06 2025 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.24.6-1 +- Bump version to 1.24.6-1 + +* Tue Jul 08 2025 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.24.5-1 +- Bump version to 1.24.5-1 + +* Fri Jun 06 2025 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.24.4-1 +- Bump version to 1.24.4-1 + +* Wed May 07 2025 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.24.3-1 +- Bump version to 1.24.3-1 + +* Tue Apr 01 2025 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.24.2-1 +- Bump version to 1.24.2-1 + +* Wed Mar 05 2025 Microsoft Golang Bot - 1.24.1-1 +- Bump version to 1.24.1-1 + +* Fri Feb 14 2025 Microsoft Golang Bot - 1.24.0-1 +- Bump version to 1.24.0-1 + +* Tue Feb 04 2025 Tobias Brick - 1.23.3-3 +- Fix post scriptlet +- Remove calls to alternatives +- Don't manually delete go-exports.sh + +* Tue Dec 03 2024 Microsoft Golang Bot - 1.23.3-2 +- Bump version to 1.23.3-2 + +* Fri Nov 08 2024 Microsoft Golang Bot - 1.23.3-1 +- Bump version to 1.23.3-1 + +* Tue Oct 08 2024 Muhammad Falak - 1.23.1-1 +- Upgrade to 1.23.1 + +* Thu Sep 26 2024 Microsoft Golang Bot - 1.22.7-2 +- Bump version to 1.22.7-3 + +* Fri Sep 06 2024 Microsoft Golang Bot - 1.22.7-1 +- Bump version to 1.22.7-1 + +* Wed Aug 07 2024 Davis Goodin - 1.22.6-1 +- Bump version to 1.22.6-1 + +* Tue Jul 02 2024 Davis Goodin - 1.22.5-1 +- Bump version to 1.22.5-1 + +* Tue Jun 04 2024 Davis Goodin - 1.22.4-1 +- Bump version to 1.22.4-1 + +* Mon May 27 2024 Davis Goodin - 1.22.3-1 +- Bump version to 1.22.3-1 + +* Wed May 08 2024 Davis Goodin - 1.21.9-2 +- Remove explicit Go env variable defaults + +* Wed Apr 03 2024 Davis Goodin - 1.21.9-1 +- Bump version to 1.21.9-1 + +* Thu Mar 21 2024 Davis Goodin - 1.21.8-1 +- Bump version to 1.21.8-1, build version to 1.21.8-2 + +* Thu Feb 22 2024 Muhammad Falak - 1.21.6-2 +- Include go.env file in GOROOT + +* Wed Jan 24 2024 Davis Goodin - 1.21.6-1 +- Bump version to 1.21.6-1 +- Switch from upstream Go to the Microsoft build of Go + +* Mon Oct 16 2023 Nan Liu - 1.20.10-1 +- Bump version to 1.20.10 to address CVE-2023-29409, CVE-2023-39318, CVE-2023-39319, CVE-2023-39323, CVE-2023-39533, CVE-2023-29406, CVE-2023-39325, CVE-2023-44487 +- Remove patches that no longer apply + +* Tue Oct 10 2023 Dan Streetman - 1.20.7-2 +- Patch CVE-2023-44487 + +* Tue Aug 15 2023 Muhammad Falak - 1.20.7-1 +- Bump version to 1.20.7 +- Introduce patch to permit requests with invalid host header + +* Tue Aug 15 2023 Muhammad Falak - 1.19.12-1 +- Auto-upgrade to 1.19.12 to address CVE-2023-29409 +- Introduce patch to permit requests with invalid header + +* Thu Jul 13 2023 CBL-Mariner Servicing Account - 1.19.11-1 +- Auto-upgrade to 1.19.11 - Fix CVE-2023-29406 + +* Thu Jun 15 2023 CBL-Mariner Servicing Account - 1.19.10-1 +- Auto-upgrade to 1.19.10 - address CVE-2023-24540, CVE-2023-29402, CVE-2023-29403, CVE-2023-29404, CVE-2023-29405 + +* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.19.8-1 +- Auto-upgrade to 1.19.8 - address CVE-2023-24534, CVE-2023-24536, CVE-2023-24537, CVE-2023-24538 + +* Tue Mar 28 2023 CBL-Mariner Servicing Account - 1.19.7-1 +- Auto-upgrade to 1.19.7 - address CVE-2023-24532 + +* Wed Mar 15 2023 CBL-Mariner Servicing Account - 1.19.6-1 +- Auto-upgrade to 1.19.6 - Address CVE-2022-41722, CVE-2022-41724, CVE-2022-41725, CVE-2022-41723 + +* Fri Feb 03 2023 CBL-Mariner Servicing Account - 1.19.5-1 +- Auto-upgrade to 1.19.5 - upgrade to latest + +* Wed Jan 18 2023 CBL-Mariner Servicing Account - 1.19.4-1 +- Auto-upgrade to 1.19.4 + +* Thu Dec 15 2022 Daniel McIlvaney - 1.18.8-2 +- Patch CVE-2022-41717 + +* Tue Nov 01 2022 Olivia Crain - 1.18.8-1 +- Upgrade to version 1.18.8 (fixes CVE-2022-41716, which only applies to Windows environments) +- Also fixes CVE-2022-2879, CVE-2022-2880, CVE-2022-41715 (fixed in 1.18.7) +- Also fixes CVE-2022-27664, CVE-2022-32190 (fixed in 1.18.6) +- Use SPDX short identifier for license tag + +* Fri Aug 19 2022 Olivia Crain - 1.18.5-1 +- Upgrade to version to fix CVE-2022-1705, CVE-2022-1962, CVE-2022-28131, + CVE-2022-30630, CVE-2022-30631, CVE-2022-30632, CVE-2022-30633, CVE-2022-30635, + CVE-2022-32148, and CVE-2022-32189 + +* Tue Jun 14 2022 Muhammad Falak - 1.18.3-1 +- Bump version to 1.18.3 to address CVE-2022-24675 & CVE-2022-28327 + +* Tue Apr 12 2022 Muhammad Falak - 1.17.8-1 +- Bump version to 1.17.8 to address CVE-2021-44716 + +* Thu Feb 17 2022 Andrew Phelps - 1.17.1-2 +- Use _topdir instead of hard-coded value /usr/src/mariner +- License verified + +* Wed Sep 15 2021 Andrew Phelps - 1.17.1-1 +- Updated to version 1.17.1 + +* Tue Jun 08 2021 Henry Beberman - 1.15.13-1 +- Updated to version 1.15.13 to fix CVE-2021-33194 and CVE-2021-31525 + +* Mon Apr 26 2021 Nicolas Guibourge - 1.15.11-1 +- Updated to version 1.15.11 to fix CVE-2021-27918 + +* Wed Feb 03 2021 Andrew Phelps - 1.15.7-1 +- Updated to version 1.15.7 to fix CVE-2021-3114 + +* Mon Nov 23 2020 Henry Beberman - 1.15.5-1 +- Updated to version 1.15.5 + +* Fri Oct 30 2020 Thomas Crain - 1.13.15-2 +- Patch CVE-2020-24553 + +* Tue Sep 08 2020 Nicolas Ontiveros - 1.13.15-1 +- Updated to version 1.13.15, which fixes CVE-2020-14039 and CVE-2020-16845. + +* Sun May 24 2020 Mateusz Malisz - 1.13.11-1 +- Updated to version 1.13.11 + +* Sat May 09 2020 Nick Samson - 1.12.5-7 +- Added %%license line automatically + +* Thu Apr 30 2020 Emre Girgin - 1.12.5-6 +- Renaming go to golang + +* Thu Apr 23 2020 Nicolas Ontiveros - 1.12.5-5 +- Fix CVE-2019-14809. + +* Fri Mar 27 2020 Andrew Phelps - 1.12.5-4 +- Support building standalone by adding go 1.4 bootstrap. + +* Thu Feb 27 2020 Henry Beberman - 1.12.5-3 +- Remove meta dependency on libc.so.6 + +* Thu Feb 6 2020 Andrew Phelps - 1.12.5-2 +- Remove ExtraBuildRequires + +* Tue Sep 03 2019 Mateusz Malisz - 1.12.5-1 +- Initial CBL-Mariner import from Photon (license: Apache2). + +* Mon Jan 21 2019 Bo Gan - 1.9.7-1 +- Update to 1.9.7 + +* Wed Oct 24 2018 Alexey Makhalov - 1.9.4-3 +- Use extra build requires + +* Mon Apr 02 2018 Dheeraj Shetty - 1.9.4-2 +- Fix for CVE-2018-7187 + +* Thu Mar 15 2018 Xiaolin Li - 1.9.4-1 +- Update to golang release v1.9.4 + +* Tue Nov 14 2017 Alexey Makhalov - 1.9.1-2 +- Aarch64 support + +* Wed Nov 01 2017 Vinay Kulkarni - 1.9.1-1 +- Update to golang release v1.9.1 + +* Wed May 31 2017 Xiaolin Li - 1.8.1-2 +- Remove mercurial from buildrequires and requires. + +* Tue Apr 11 2017 Danut Moraru - 1.8.1-1 +- Update Golang to version 1.8.1, updated patch0 + +* Wed Dec 28 2016 Xiaolin Li - 1.7.4-1 +- Updated Golang to 1.7.4. + +* Thu Oct 06 2016 ChangLee - 1.6.3-2 +- Modified %check + +* Wed Jul 27 2016 Anish Swaminathan - 1.6.3-1 +- Update Golang to version 1.6.3 - fixes CVE 2016-5386 + +* Fri Jul 8 2016 Harish Udaiya Kumar - 1.6.2-1 +- Updated the Golang to version 1.6.2 + +* Thu Jun 2 2016 Priyesh Padmavilasom - 1.4.2-5 +- Fix script syntax + +* Tue May 24 2016 Priyesh Padmavilasom - 1.4.2-4 +- GA - Bump release of all rpms + +* Thu May 05 2016 Kumar Kaushik - 1.4.2-3 +- Handling upgrade scenario pre/post/un scripts. + +* Wed Dec 09 2015 Anish Swaminathan - 1.4.2-2 +- Edit post script. + +* Mon Aug 03 2015 Vinay Kulkarni - 1.4.2-1 +- Update to golang release version 1.4.2 + +* Fri Oct 17 2014 Divya Thaluru - 1.3.3-1 +- Initial build. First version diff --git a/SPECS/golang/golang.signatures.json b/SPECS/golang/golang.signatures.json index c7a8882674..6a96029ef9 100644 --- a/SPECS/golang/golang.signatures.json +++ b/SPECS/golang/golang.signatures.json @@ -3,7 +3,8 @@ "go.20230802.5.src.tar.gz": "56b9e0e0c3c13ca95d5efa6de4e7d49a9d190eca77919beff99d33cd3fa74e95", "go.20240206.2.src.tar.gz": "7982e0011aa9ab95fd0530404060410af4ba57326d26818690f334fdcb6451cd", "go1.22.12-20250211.4.src.tar.gz": "e1cc3bff8fdf1f24843ffc9f0eaddfd344eb40fd9ca0d9ba2965165be519eeb7", - "go1.25.7-20260204.4.src.tar.gz": "8c51515b2ee63464b62681373d5342ff148491bbbcc0b5bd892d9fafc3b40145", + "go1.24.13-20260204.5.src.tar.gz": "fdf4ec44d7191e59890e988ffba8ab3fd133ec6bd3757955223712f369e2328b", + "go1.26.0-20260210.6.src.tar.gz": "3e28c191afb47e93210b8188fabb784828954c641a42ec4fe87dc1e5b0032a8f", "go1.4-bootstrap-20171003.tar.gz": "f4ff5b5eb3a3cae1c993723f3eab519c5bae18866b5e5f96fe1102f0cb5c3e52" } } diff --git a/SPECS/golang/golang.spec b/SPECS/golang/golang.spec index 3e1c85712e..81bdf596b0 100644 --- a/SPECS/golang/golang.spec +++ b/SPECS/golang/golang.spec @@ -1,6 +1,6 @@ %global goroot %{_libdir}/golang %global gopath %{_datadir}/gocode -%global ms_go_filename go1.25.7-20260204.4.src.tar.gz +%global ms_go_filename go1.26.0-20260210.6.src.tar.gz %global ms_go_revision 1 %ifarch aarch64 %global gohostarch arm64 @@ -14,11 +14,11 @@ %define __find_requires %{nil} Summary: Go Name: golang -Version: 1.25.7 +Version: 1.26.0 Release: 1%{?dist} License: BSD-3-Clause -Distribution: Edge Microvisor Toolkit -Vendor: Intel Corporation +Vendor: Microsoft Corporation +Distribution: Azure Linux Group: System Environment/Security URL: https://github.com/microsoft/go Source0: https://github.com/microsoft/go/releases/download/v%{version}-%{ms_go_revision}/%{ms_go_filename} @@ -32,6 +32,8 @@ Source2: https://github.com/microsoft/go/releases/download/v1.19.12-1/go. Source3: https://github.com/microsoft/go/releases/download/v1.20.14-1/go.20240206.2.src.tar.gz # bootstrap 03 Source4: https://github.com/microsoft/go/releases/download/v1.22.12-2/go1.22.12-20250211.4.src.tar.gz +# bootstrap 04 +Source5: https://github.com/microsoft/go/releases/download/v1.24.13-1/go1.24.13-20260204.5.src.tar.gz Provides: %{name} = %{version} Provides: go = %{version}-%{release} @@ -56,6 +58,9 @@ mv -v go go-bootstrap-02 tar xf %{SOURCE4} --no-same-owner mv -v go go-bootstrap-03 +tar xf %{SOURCE5} --no-same-owner +mv -v go go-bootstrap-04 + %setup -q -n go %build @@ -90,6 +95,7 @@ go_bootstrap 00 go_bootstrap 01 go_bootstrap 02 go_bootstrap 03 +go_bootstrap 04 # Build current go version export GOHOSTOS=linux @@ -160,9 +166,15 @@ fi %{_bindir}/* %changelog -* Thu Feb 05 2026 andy - 1.25.7-1 +* Wed Feb 11 2026 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.26.0-1 +- Bump version to 1.26.0-1 + +* Thu Feb 05 2026 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.25.7-1 - Bump version to 1.25.7-1 +* Tue Jan 20 2026 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.25.6-1 +- Bump version to 1.25.6-1 + * Tue Dec 02 2025 bot-for-go[bot] <199222863+bot-for-go[bot]@users.noreply.github.com> - 1.25.5-1 - Bump version to 1.25.5-1 diff --git a/SPECS/grub2/CVE-2014-3591.patch b/SPECS/grub2/CVE-2014-3591.patch new file mode 100644 index 0000000000..197cb29499 --- /dev/null +++ b/SPECS/grub2/CVE-2014-3591.patch @@ -0,0 +1,79 @@ +From 25e4ae28da960baec315e0c10e9f70cd46a89a2e Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 13:30:22 +0000 +Subject: [PATCH] Fix for CVE-2014-3591 + +Upstream reference: +https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=patch;h=ff53cf06e966dce0daba5f2c84e03ab9db2c3c8b +--- + grub-core/lib/libgcrypt/cipher/elgamal.c | 45 +++++++++++++++++++++--- + 1 file changed, 41 insertions(+), 4 deletions(-) + +diff --git a/grub-core/lib/libgcrypt/cipher/elgamal.c b/grub-core/lib/libgcrypt/cipher/elgamal.c +index ce4be85..47ba882 100644 +--- a/grub-core/lib/libgcrypt/cipher/elgamal.c ++++ b/grub-core/lib/libgcrypt/cipher/elgamal.c +@@ -29,6 +29,11 @@ + #include "g10lib.h" + #include "mpi.h" + #include "cipher.h" ++/* Blinding is used to mitigate side-channel attacks. You may undef ++ this to speed up the operation in case the system is secured ++ against physical and network mounted side-channel attacks. */ ++#define USE_BLINDING 1 ++ + + typedef struct + { +@@ -486,12 +491,44 @@ do_encrypt(gcry_mpi_t a, gcry_mpi_t b, gcry_mpi_t input, ELG_public_key *pkey ) + static void + decrypt(gcry_mpi_t output, gcry_mpi_t a, gcry_mpi_t b, ELG_secret_key *skey ) + { +- gcry_mpi_t t1 = mpi_alloc_secure( mpi_get_nlimbs( skey->p ) ); ++ MPI t1, t2, r; ++ unsigned int nbits = mpi_get_nbits (skey->p); ++ ++ mpi_normalize (a); ++ mpi_normalize (b); ++ ++ t1 = mpi_alloc_secure (mpi_nlimb_hint_from_nbits (nbits)); ++#ifdef USE_BLINDING ++ ++ t2 = mpi_alloc_secure (mpi_nlimb_hint_from_nbits (nbits)); ++ r = mpi_alloc (mpi_nlimb_hint_from_nbits (nbits)); ++ ++ /* We need a random number of about the prime size. The random ++ number merely needs to be unpredictable; thus we use level 0. */ ++ randomize_mpi (r, nbits, 0); ++ ++ /* t1 = r^x mod p */ ++ mpi_powm (t1, r, skey->x, skey->p); ++ /* t2 = (a * r)^-x mod p */ ++ mpi_mulm (t2, a, r, skey->p); ++ mpi_powm (t2, t2, skey->x, skey->p); ++ mpi_invm (t2, t2, skey->p); ++ /* t1 = (t1 * t2) mod p*/ ++ mpi_mulm (t1, t1, t2, skey->p); ++ ++ mpi_free (r); ++ mpi_free (t2); ++ ++#else /*!USE_BLINDING*/ + + /* output = b/(a^x) mod p */ +- gcry_mpi_powm( t1, a, skey->x, skey->p ); +- mpi_invm( t1, t1, skey->p ); +- mpi_mulm( output, b, t1, skey->p ); ++ mpi_powm (t1, a, skey->x, skey->p); ++ mpi_invm (t1, t1, skey->p); ++ ++#endif /*!USE_BLINDING*/ ++ ++ mpi_mulm (output, b, t1, skey->p); ++ + #if 0 + if( DBG_CIPHER ) + { +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2017-7526.patch b/SPECS/grub2/CVE-2017-7526.patch new file mode 100644 index 0000000000..c24d93c4c6 --- /dev/null +++ b/SPECS/grub2/CVE-2017-7526.patch @@ -0,0 +1,133 @@ +From 352e78a73c6b92155038f341095ab06753f965ea Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 14:38:07 +0000 +Subject: [PATCH] Fix for CVE-2017-7526 + +Upstream reference: +https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=patch;h=e6a3dc9900433bbc8ad362a595a3837318c28fa9 +--- + grub-core/lib/libgcrypt/cipher/rsa.c | 85 ++++++++++++++++++---------- + 1 file changed, 54 insertions(+), 31 deletions(-) + +diff --git a/grub-core/lib/libgcrypt/cipher/rsa.c b/grub-core/lib/libgcrypt/cipher/rsa.c +index ccc9f96..43309f4 100644 +--- a/grub-core/lib/libgcrypt/cipher/rsa.c ++++ b/grub-core/lib/libgcrypt/cipher/rsa.c +@@ -685,53 +685,75 @@ stronger_key_check ( RSA_secret_key *skey ) + + + +-/**************** +- * Secret key operation. Encrypt INPUT with SKEY and put result into OUTPUT. ++/* Secret key operation - standard version. + * + * m = c^d mod n +- * +- * Or faster: ++ */ ++static void ++secret_core_std (gcry_mpi_t M, gcry_mpi_t C, ++ gcry_mpi_t D, gcry_mpi_t N) ++{ ++ mpi_powm (M, C, D, N); ++} ++ ++ ++/* Secret key operation - using the CRT. + * + * m1 = c ^ (d mod (p-1)) mod p + * m2 = c ^ (d mod (q-1)) mod q + * h = u * (m2 - m1) mod q + * m = m1 + h * p +- * +- * Where m is OUTPUT, c is INPUT and d,n,p,q,u are elements of SKEY. ++ */ ++static void ++secret_core_crt (gcry_mpi_t M, gcry_mpi_t C, ++ gcry_mpi_t D, unsigned int Nlimbs, ++ gcry_mpi_t P, gcry_mpi_t Q, gcry_mpi_t U) ++{ ++ gcry_mpi_t m1 = mpi_alloc_secure ( Nlimbs + 1 ); ++ gcry_mpi_t m2 = mpi_alloc_secure ( Nlimbs + 1 ); ++ gcry_mpi_t h = mpi_alloc_secure ( Nlimbs + 1 ); ++ ++ /* m1 = c ^ (d mod (p-1)) mod p */ ++ mpi_sub_ui ( h, P, 1 ); ++ mpi_fdiv_r ( h, D, h ); ++ mpi_powm ( m1, C, h, P ); ++ ++ /* m2 = c ^ (d mod (q-1)) mod q */ ++ mpi_sub_ui ( h, Q, 1 ); ++ mpi_fdiv_r ( h, D, h ); ++ mpi_powm ( m2, C, h, Q ); ++ ++ /* h = u * ( m2 - m1 ) mod q */ ++ mpi_sub ( h, m2, m1 ); ++ if ( mpi_has_sign ( h ) ) ++ mpi_add ( h, h, Q ); ++ mpi_mulm ( h, U, h, Q ); ++ ++ /* m = m1 + h * p */ ++ mpi_mul ( h, h, P ); ++ mpi_add ( M, m1, h ); ++ ++ mpi_free ( h ); ++ mpi_free ( m1 ); ++ mpi_free ( m2 ); ++} ++ ++ ++/* Secret key operation. ++ * Encrypt INPUT with SKEY and put result into ++ * OUTPUT. SKEY has the secret key parameters. + */ + static void + secret(gcry_mpi_t output, gcry_mpi_t input, RSA_secret_key *skey ) + { + if (!skey->p || !skey->q || !skey->u) + { +- mpi_powm (output, input, skey->d, skey->n); ++ secret_core_std (output, input, skey->d, skey->n); + } + else + { +- gcry_mpi_t m1 = mpi_alloc_secure( mpi_get_nlimbs(skey->n)+1 ); +- gcry_mpi_t m2 = mpi_alloc_secure( mpi_get_nlimbs(skey->n)+1 ); +- gcry_mpi_t h = mpi_alloc_secure( mpi_get_nlimbs(skey->n)+1 ); +- +- /* m1 = c ^ (d mod (p-1)) mod p */ +- mpi_sub_ui( h, skey->p, 1 ); +- mpi_fdiv_r( h, skey->d, h ); +- mpi_powm( m1, input, h, skey->p ); +- /* m2 = c ^ (d mod (q-1)) mod q */ +- mpi_sub_ui( h, skey->q, 1 ); +- mpi_fdiv_r( h, skey->d, h ); +- mpi_powm( m2, input, h, skey->q ); +- /* h = u * ( m2 - m1 ) mod q */ +- mpi_sub( h, m2, m1 ); +- if ( mpi_is_neg( h ) ) +- mpi_add ( h, h, skey->q ); +- mpi_mulm( h, skey->u, h, skey->q ); +- /* m = m2 + h * p */ +- mpi_mul ( h, h, skey->p ); +- mpi_add ( output, m1, h ); +- +- mpi_free ( h ); +- mpi_free ( m1 ); +- mpi_free ( m2 ); ++ secret_core_crt (output, input, skey->d, mpi_get_nlimbs (skey->n), ++ skey->p, skey->q, skey->u); + } + } + +@@ -778,6 +800,7 @@ rsa_unblind (gcry_mpi_t x, gcry_mpi_t ri, gcry_mpi_t n) + return y; + } + ++ + /********************************************* + ************** interface ****************** + *********************************************/ +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2019-13627.patch b/SPECS/grub2/CVE-2019-13627.patch new file mode 100644 index 0000000000..b2ece15524 --- /dev/null +++ b/SPECS/grub2/CVE-2019-13627.patch @@ -0,0 +1,68 @@ +From ec78ea01c197d46ed44c226613536490a6b0c87f Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 14:01:28 +0000 +Subject: [PATCH] Fix for CVE-2019-13627 + +Upstream reference: +https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=db4e9976cc31b314aafad6626b2894e86ee44d60 +--- + grub-core/lib/libgcrypt/cipher/dsa.c | 14 ++++++++++++-- + grub-core/lib/libgcrypt/mpi/ec.c | 6 +++++- + 2 files changed, 17 insertions(+), 3 deletions(-) + +diff --git a/grub-core/lib/libgcrypt/cipher/dsa.c b/grub-core/lib/libgcrypt/cipher/dsa.c +index 883a815..1d77305 100644 +--- a/grub-core/lib/libgcrypt/cipher/dsa.c ++++ b/grub-core/lib/libgcrypt/cipher/dsa.c +@@ -600,8 +600,6 @@ check_secret_key( DSA_secret_key *sk ) + return rc; + } + +- +- + /* + Make a DSA signature from HASH and put it into r and s. + */ +@@ -611,10 +609,22 @@ sign(gcry_mpi_t r, gcry_mpi_t s, gcry_mpi_t hash, DSA_secret_key *skey ) + gcry_mpi_t k; + gcry_mpi_t kinv; + gcry_mpi_t tmp; ++ unsigned int qbits = mpi_get_nbits (skey->q); + + /* Select a random k with 0 < k < q */ + k = gen_k( skey->q ); + ++ /* Originally, ECDSA computation requires k where 0 < k < n. ++ * Here, we add n (the order of curve), to keep k in a ++ * range: n < k < 2*n, or, addming more n, keep k in a range: ++ * 2*n < k < 3*n, so that timing difference of the EC ++ * multiply operation can be small. The result is same. ++ */ ++ mpi_add (k, k, skey->E.n); ++ if (!mpi_test_bit (k, qbits)) ++ mpi_add (k, k, skey->E.n); ++ ++ + /* r = (a^k mod p) mod q */ + gcry_mpi_powm( r, skey->g, k, skey->p ); + mpi_fdiv_r( r, r, skey->q ); +diff --git a/grub-core/lib/libgcrypt/mpi/ec.c b/grub-core/lib/libgcrypt/mpi/ec.c +index fa00818..0089347 100644 +--- a/grub-core/lib/libgcrypt/mpi/ec.c ++++ b/grub-core/lib/libgcrypt/mpi/ec.c +@@ -617,7 +617,11 @@ _gcry_mpi_ec_mul_point (mpi_point_t *result, + unsigned int nbits; + int i; + +- nbits = mpi_get_nbits (scalar); ++ if (mpi_cmp (scalar, ctx->p) >= 0) ++ nbits = mpi_get_nbits (scalar); ++ else ++ nbits = mpi_get_nbits (ctx->p); ++ + mpi_set_ui (result->x, 1); + mpi_set_ui (result->y, 1); + mpi_set_ui (result->z, 0); +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2024-45774.patch b/SPECS/grub2/CVE-2024-45774.patch new file mode 100644 index 0000000000..efcc95fa9a --- /dev/null +++ b/SPECS/grub2/CVE-2024-45774.patch @@ -0,0 +1,29 @@ +From 78297135895384a0653a6748f1af4b9f50609fec Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 14:53:20 +0000 +Subject: [PATCH] Fix for CVE-2024-45774 + +Upstream reference: +https://cgit.git.savannah.gnu.org/cgit/grub.git/patch/?id=2c34af908ebf4856051ed29e46d88abd2b20387f +--- + grub-core/video/readers/jpeg.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/grub-core/video/readers/jpeg.c b/grub-core/video/readers/jpeg.c +index 97a533b..80c5bd7 100644 +--- a/grub-core/video/readers/jpeg.c ++++ b/grub-core/video/readers/jpeg.c +@@ -333,6 +333,10 @@ grub_jpeg_decode_sof (struct grub_jpeg_data *data) + if (grub_errno != GRUB_ERR_NONE) + return grub_errno; + ++ if (data->image_height != 0 || data->image_width != 0) ++ return grub_error (GRUB_ERR_BAD_FILE_TYPE, ++ "jpeg: cannot have duplicate SOF0 markers"); ++ + if (grub_jpeg_get_byte (data) != 8) + return grub_error (GRUB_ERR_BAD_FILE_TYPE, + "jpeg: only 8-bit precision is supported"); +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2024-45775.patch b/SPECS/grub2/CVE-2024-45775.patch new file mode 100644 index 0000000000..a63ebe5bb6 --- /dev/null +++ b/SPECS/grub2/CVE-2024-45775.patch @@ -0,0 +1,28 @@ +From 3451d40564b03136222abd225d2408794c98e57a Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 15:51:34 +0000 +Subject: [PATCH] Fix for CVE-2024-45775 + +Upstream reference: +https://cgit.git.savannah.gnu.org/cgit/grub.git/patch/?id=05be856a8c3aae41f5df90cab7796ab7ee34b872 +--- + grub-core/commands/extcmd.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/grub-core/commands/extcmd.c b/grub-core/commands/extcmd.c +index 90a5ca2..c236be1 100644 +--- a/grub-core/commands/extcmd.c ++++ b/grub-core/commands/extcmd.c +@@ -49,6 +49,9 @@ grub_extcmd_dispatcher (struct grub_command *cmd, int argc, char **args, + } + + state = grub_arg_list_alloc (ext, argc, args); ++ if (state == NULL) ++ return grub_errno; ++ + if (grub_arg_parse (ext, argc, args, state, &new_args, &new_argc)) + { + context.state = state; +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2024-45776.patch b/SPECS/grub2/CVE-2024-45776.patch new file mode 100644 index 0000000000..9738ec7729 --- /dev/null +++ b/SPECS/grub2/CVE-2024-45776.patch @@ -0,0 +1,29 @@ +From cba3d3966de27f3de803205de897df407603441a Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 16:43:45 +0000 +Subject: [PATCH] Fix for CVE-2024-45776 + +Upstream reference: +https://cgit.git.savannah.gnu.org/cgit/grub.git/patch/?id=09bd6eb58b0f71ec273916070fa1e2de16897a91 +--- + grub-core/gettext/gettext.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/grub-core/gettext/gettext.c b/grub-core/gettext/gettext.c +index 16ebc20..85ea44a 100644 +--- a/grub-core/gettext/gettext.c ++++ b/grub-core/gettext/gettext.c +@@ -328,8 +328,8 @@ grub_mofile_open (struct grub_gettext_context *ctx, + for (ctx->grub_gettext_max_log = 0; ctx->grub_gettext_max >> ctx->grub_gettext_max_log; + ctx->grub_gettext_max_log++); + +- ctx->grub_gettext_msg_list = grub_zalloc (ctx->grub_gettext_max +- * sizeof (ctx->grub_gettext_msg_list[0])); ++ ctx->grub_gettext_msg_list = grub_calloc (ctx->grub_gettext_max, ++ sizeof (ctx->grub_gettext_msg_list[0])); + if (!ctx->grub_gettext_msg_list) + { + grub_file_close (fd); +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2024-45777.patch b/SPECS/grub2/CVE-2024-45777.patch new file mode 100644 index 0000000000..14af18d0d1 --- /dev/null +++ b/SPECS/grub2/CVE-2024-45777.patch @@ -0,0 +1,46 @@ +From 17009606a2a666352f157955d7a0e983a240c222 Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 16:39:55 +0000 +Subject: [PATCH] Fix for CVE-2024-45777 + +Upstream reference: +https://cgit.git.savannah.gnu.org/cgit/grub.git/patch/?id=b970a5ed967816bbca8225994cd0ee2557bad515 +--- + grub-core/gettext/gettext.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/grub-core/gettext/gettext.c b/grub-core/gettext/gettext.c +index 4d02e62..16ebc20 100644 +--- a/grub-core/gettext/gettext.c ++++ b/grub-core/gettext/gettext.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -99,6 +100,7 @@ grub_gettext_getstr_from_position (struct grub_gettext_context *ctx, + char *translation; + struct string_descriptor desc; + grub_err_t err; ++ grub_size_t alloc_sz; + + internal_position = (off + position * sizeof (desc)); + +@@ -109,7 +111,10 @@ grub_gettext_getstr_from_position (struct grub_gettext_context *ctx, + length = grub_cpu_to_le32 (desc.length); + offset = grub_cpu_to_le32 (desc.offset); + +- translation = grub_malloc (length + 1); ++ if (grub_add (length, 1, &alloc_sz)) ++ return NULL; ++ ++ translation = grub_malloc (alloc_sz); + if (!translation) + return NULL; + +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2024-45778.patch b/SPECS/grub2/CVE-2024-45778.patch new file mode 100644 index 0000000000..3f55b9c0f2 --- /dev/null +++ b/SPECS/grub2/CVE-2024-45778.patch @@ -0,0 +1,46 @@ +From 3d13b94d7a0417c40d78f0c336c21163ed4dfeba Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Tue, 17 Jun 2025 02:58:39 +0000 +Subject: [PATCH] Fix for CVE-2024-45778 CVE-2024-45779 + +Upstream reference: +https://cgit.git.savannah.gnu.org/cgit/grub.git/patch/?id=26db6605036bd9e5b16d9068a8cc75be63b8b630 +--- + grub-core/fs/bfs.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/grub-core/fs/bfs.c b/grub-core/fs/bfs.c +index 47dbe20..8d704e2 100644 +--- a/grub-core/fs/bfs.c ++++ b/grub-core/fs/bfs.c +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -1104,7 +1105,10 @@ GRUB_MOD_INIT (bfs) + { + COMPILE_TIME_ASSERT (1 << LOG_EXTENT_SIZE == + sizeof (struct grub_bfs_extent)); +- grub_fs_register (&grub_bfs_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_bfs_fs); ++ } + } + + #ifdef MODE_AFS +@@ -1113,5 +1117,6 @@ GRUB_MOD_FINI (afs) + GRUB_MOD_FINI (bfs) + #endif + { +- grub_fs_unregister (&grub_bfs_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_bfs_fs); + } +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2024-45779.nopatch b/SPECS/grub2/CVE-2024-45779.nopatch new file mode 100644 index 0000000000..d12aa534e7 --- /dev/null +++ b/SPECS/grub2/CVE-2024-45779.nopatch @@ -0,0 +1 @@ +# The CVE-2024-45779 is fixed as part of patch CVE-2024-45778.patch diff --git a/SPECS/grub2/CVE-2024-45780.patch b/SPECS/grub2/CVE-2024-45780.patch new file mode 100644 index 0000000000..cfc5d052ee --- /dev/null +++ b/SPECS/grub2/CVE-2024-45780.patch @@ -0,0 +1,82 @@ +From e38852e0aeee802b86507a4e95b016d3add6dd94 Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Tue, 17 Jun 2025 03:26:37 +0000 +Subject: [PATCH] Fix for CVE-2024-45780 + +Upstream reference: +https://gitweb.git.savannah.gnu.org/gitweb/?p=grub.git;a=patch;h=0087bc6902182fe5cedce2d034c75a79cf6dd4f3 +--- + grub-core/fs/tar.c | 23 ++++++++++++++++++----- + 1 file changed, 18 insertions(+), 5 deletions(-) + +diff --git a/grub-core/fs/tar.c b/grub-core/fs/tar.c +index c551ed6..a9e39b0 100644 +--- a/grub-core/fs/tar.c ++++ b/grub-core/fs/tar.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -76,6 +77,7 @@ grub_cpio_find_file (struct grub_archelp_data *data, char **name, + { + struct head hd; + int reread = 0, have_longname = 0, have_longlink = 0; ++ grub_size_t sz; + + data->hofs = data->next_hofs; + +@@ -97,7 +99,11 @@ grub_cpio_find_file (struct grub_archelp_data *data, char **name, + { + grub_err_t err; + grub_size_t namesize = read_number (hd.size, sizeof (hd.size)); +- *name = grub_malloc (namesize + 1); ++ ++ if (grub_add (namesize, 1, &sz)) ++ return grub_error (GRUB_ERR_BAD_FS, N_("name size overflow")); ++ ++ *name = grub_malloc (sz); + if (*name == NULL) + return grub_errno; + err = grub_disk_read (data->disk, 0, +@@ -117,15 +123,19 @@ grub_cpio_find_file (struct grub_archelp_data *data, char **name, + { + grub_err_t err; + grub_size_t linksize = read_number (hd.size, sizeof (hd.size)); +- if (data->linkname_alloc < linksize + 1) ++ ++ if (grub_add (linksize, 1, &sz)) ++ return grub_error (GRUB_ERR_BAD_FS, N_("link size overflow")); ++ ++ if (data->linkname_alloc < sz) + { + char *n; +- n = grub_calloc (2, linksize + 1); ++ n = grub_calloc (2, sz); + if (!n) + return grub_errno; + grub_free (data->linkname); + data->linkname = n; +- data->linkname_alloc = 2 * (linksize + 1); ++ data->linkname_alloc = 2 * (sz); + } + + err = grub_disk_read (data->disk, 0, +@@ -148,7 +158,10 @@ grub_cpio_find_file (struct grub_archelp_data *data, char **name, + while (extra_size < sizeof (hd.prefix) + && hd.prefix[extra_size]) + extra_size++; +- *name = grub_malloc (sizeof (hd.name) + extra_size + 2); ++ ++ if (grub_add (sizeof (hd.name) + 2, extra_size, &sz)) ++ return grub_error (GRUB_ERR_BAD_FS, N_("long name size overflow")); ++ *name = grub_malloc (sz); + if (*name == NULL) + return grub_errno; + if (hd.prefix[0]) +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2024-45781.patch b/SPECS/grub2/CVE-2024-45781.patch new file mode 100644 index 0000000000..a84b7b552e --- /dev/null +++ b/SPECS/grub2/CVE-2024-45781.patch @@ -0,0 +1,27 @@ +From 7ff0403a60ca37050a387708364a301d1f64e0bc Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 15:45:51 +0000 +Subject: [PATCH] Fix for CVE-2024-45781 + +Upstream reference: +https://brave-ocean-0baeae310.5.azurestaticapps.net/#/cve/CVE-2024-45781 +--- + grub-core/fs/ufs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/grub-core/fs/ufs.c b/grub-core/fs/ufs.c +index 34a698b..4727266 100644 +--- a/grub-core/fs/ufs.c ++++ b/grub-core/fs/ufs.c +@@ -463,7 +463,7 @@ grub_ufs_lookup_symlink (struct grub_ufs_data *data, int ino) + /* Check against zero is paylindromic, no need to swap. */ + if (data->inode.nblocks == 0 + && INODE_SIZE (data) <= sizeof (data->inode.symlink)) +- grub_strcpy (symlink, (char *) data->inode.symlink); ++ grub_strlcpy (symlink, (char *) data->inode.symlink, sz); + else + { + if (grub_ufs_read_file (data, 0, 0, 0, sz, symlink) < 0) +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2024-45782.nopatch b/SPECS/grub2/CVE-2024-45782.nopatch new file mode 100644 index 0000000000..179642ca30 --- /dev/null +++ b/SPECS/grub2/CVE-2024-45782.nopatch @@ -0,0 +1 @@ +# The CVE-2024-45782 is fixed as part of patch CVE-2024-56737.patch diff --git a/SPECS/grub2/CVE-2024-45783.patch b/SPECS/grub2/CVE-2024-45783.patch new file mode 100644 index 0000000000..fdb1c5be76 --- /dev/null +++ b/SPECS/grub2/CVE-2024-45783.patch @@ -0,0 +1,27 @@ +From f98f594b204e1922afd1c2714f6d5651a9208f1d Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 16:48:17 +0000 +Subject: [PATCH] Fix for CVE-2024-45783 + +Upstream reference: +https://cgit.git.savannah.gnu.org/cgit/grub.git/patch/?id=f7c070a2e28dfab7137db0739fb8db1dc02d8898 +--- + grub-core/fs/hfsplus.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/grub-core/fs/hfsplus.c b/grub-core/fs/hfsplus.c +index 19c7b33..e7fd98a 100644 +--- a/grub-core/fs/hfsplus.c ++++ b/grub-core/fs/hfsplus.c +@@ -393,7 +393,7 @@ grub_hfsplus_mount (grub_disk_t disk) + + fail: + +- if (grub_errno == GRUB_ERR_OUT_OF_RANGE) ++ if (grub_errno == GRUB_ERR_OUT_OF_RANGE || grub_errno == GRUB_ERR_NONE) + grub_error (GRUB_ERR_BAD_FS, "not a HFS+ filesystem"); + + grub_free (data); +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2024-56737.patch b/SPECS/grub2/CVE-2024-56737.patch new file mode 100644 index 0000000000..3df29e5390 --- /dev/null +++ b/SPECS/grub2/CVE-2024-56737.patch @@ -0,0 +1,27 @@ +From f00677a840dcb8d9c335f9c544b414a87aea56f6 Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 14:46:54 +0000 +Subject: [PATCH] Fix for CVE-2024-56737 and CVE-2024-45782 + +Upstream reference: +https://lists.gnu.org/archive/html/grub-devel/2025-02/msg00026.html +--- + grub-core/fs/hfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/grub-core/fs/hfs.c b/grub-core/fs/hfs.c +index f419965..bb7af5f 100644 +--- a/grub-core/fs/hfs.c ++++ b/grub-core/fs/hfs.c +@@ -379,7 +379,7 @@ grub_hfs_mount (grub_disk_t disk) + volume name. */ + key.parent_dir = grub_cpu_to_be32_compile_time (1); + key.strlen = data->sblock.volname[0]; +- grub_strcpy ((char *) key.str, (char *) (data->sblock.volname + 1)); ++ grub_strlcpy ((char *) key.str, (char *) (data->sblock.volname + 1), sizeof (key.str)); + + if (grub_hfs_find_node (data, (char *) &key, data->cat_root, + 0, (char *) &dir, sizeof (dir)) == 0) +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2025-0677.patch b/SPECS/grub2/CVE-2025-0677.patch new file mode 100644 index 0000000000..862815ca21 --- /dev/null +++ b/SPECS/grub2/CVE-2025-0677.patch @@ -0,0 +1,360 @@ +From 1452ed13eddc9d81e8db22f07dbdafb5f59993f0 Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 16:22:38 +0000 +Subject: [PATCH] Fix for CVE-2025-0677 CVE-2025-0684 CVE-2025-0685 + CVE-2025-0686 CVE-2025-0689 + +Upstream reference: +https://cgit.git.savannah.gnu.org/cgit/grub.git/patch/?id=c4bc55da28543d2522a939ba4ee0acde45f2fa74 +--- + grub-core/fs/affs.c | 9 +++++++-- + grub-core/fs/cbfs.c | 9 +++++++-- + grub-core/fs/jfs.c | 9 +++++++-- + grub-core/fs/minix.c | 9 +++++++-- + grub-core/fs/nilfs2.c | 9 +++++++-- + grub-core/fs/ntfs.c | 9 +++++++-- + grub-core/fs/reiserfs.c | 9 +++++++-- + grub-core/fs/romfs.c | 9 +++++++-- + grub-core/fs/sfs.c | 9 +++++++-- + grub-core/fs/udf.c | 9 +++++++-- + grub-core/fs/ufs.c | 9 +++++++-- + 11 files changed, 77 insertions(+), 22 deletions(-) + +diff --git a/grub-core/fs/affs.c b/grub-core/fs/affs.c +index cafcd0f..d676532 100644 +--- a/grub-core/fs/affs.c ++++ b/grub-core/fs/affs.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -699,11 +700,15 @@ static struct grub_fs grub_affs_fs = + + GRUB_MOD_INIT(affs) + { +- grub_fs_register (&grub_affs_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_affs_fs); ++ } + my_mod = mod; + } + + GRUB_MOD_FINI(affs) + { +- grub_fs_unregister (&grub_affs_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_affs_fs); + } +diff --git a/grub-core/fs/cbfs.c b/grub-core/fs/cbfs.c +index 581215e..477a14e 100644 +--- a/grub-core/fs/cbfs.c ++++ b/grub-core/fs/cbfs.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -390,12 +391,16 @@ GRUB_MOD_INIT (cbfs) + #if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) && !defined (GRUB_MACHINE_XEN) + init_cbfsdisk (); + #endif +- grub_fs_register (&grub_cbfs_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_cbfs_fs); ++ } + } + + GRUB_MOD_FINI (cbfs) + { +- grub_fs_unregister (&grub_cbfs_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_cbfs_fs); + #if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) && !defined (GRUB_MACHINE_XEN) + fini_cbfsdisk (); + #endif +diff --git a/grub-core/fs/jfs.c b/grub-core/fs/jfs.c +index 6f7c439..c0bbab8 100644 +--- a/grub-core/fs/jfs.c ++++ b/grub-core/fs/jfs.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -963,11 +964,15 @@ static struct grub_fs grub_jfs_fs = + + GRUB_MOD_INIT(jfs) + { +- grub_fs_register (&grub_jfs_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_jfs_fs); ++ } + my_mod = mod; + } + + GRUB_MOD_FINI(jfs) + { +- grub_fs_unregister (&grub_jfs_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_jfs_fs); + } +diff --git a/grub-core/fs/minix.c b/grub-core/fs/minix.c +index 3cd18c8..7588835 100644 +--- a/grub-core/fs/minix.c ++++ b/grub-core/fs/minix.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -732,7 +733,10 @@ GRUB_MOD_INIT(minix) + #endif + #endif + { +- grub_fs_register (&grub_minix_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_minix_fs); ++ } + my_mod = mod; + } + +@@ -754,5 +758,6 @@ GRUB_MOD_FINI(minix) + #endif + #endif + { +- grub_fs_unregister (&grub_minix_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_minix_fs); + } +diff --git a/grub-core/fs/nilfs2.c b/grub-core/fs/nilfs2.c +index 3c248a9..3f8e495 100644 +--- a/grub-core/fs/nilfs2.c ++++ b/grub-core/fs/nilfs2.c +@@ -34,6 +34,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -1231,11 +1232,15 @@ GRUB_MOD_INIT (nilfs2) + grub_nilfs2_dat_entry)); + COMPILE_TIME_ASSERT (1 << LOG_INODE_SIZE + == sizeof (struct grub_nilfs2_inode)); +- grub_fs_register (&grub_nilfs2_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_nilfs2_fs); ++ } + my_mod = mod; + } + + GRUB_MOD_FINI (nilfs2) + { +- grub_fs_unregister (&grub_nilfs2_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_nilfs2_fs); + } +diff --git a/grub-core/fs/ntfs.c b/grub-core/fs/ntfs.c +index deb058a..5b342da 100644 +--- a/grub-core/fs/ntfs.c ++++ b/grub-core/fs/ntfs.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -1316,11 +1317,15 @@ static struct grub_fs grub_ntfs_fs = + + GRUB_MOD_INIT (ntfs) + { +- grub_fs_register (&grub_ntfs_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_ntfs_fs); ++ } + my_mod = mod; + } + + GRUB_MOD_FINI (ntfs) + { +- grub_fs_unregister (&grub_ntfs_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_ntfs_fs); + } +diff --git a/grub-core/fs/reiserfs.c b/grub-core/fs/reiserfs.c +index af6a226..76cb231 100644 +--- a/grub-core/fs/reiserfs.c ++++ b/grub-core/fs/reiserfs.c +@@ -39,6 +39,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -1417,11 +1418,15 @@ static struct grub_fs grub_reiserfs_fs = + + GRUB_MOD_INIT(reiserfs) + { +- grub_fs_register (&grub_reiserfs_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_reiserfs_fs); ++ } + my_mod = mod; + } + + GRUB_MOD_FINI(reiserfs) + { +- grub_fs_unregister (&grub_reiserfs_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_reiserfs_fs); + } +diff --git a/grub-core/fs/romfs.c b/grub-core/fs/romfs.c +index d97b8fb..d174449 100644 +--- a/grub-core/fs/romfs.c ++++ b/grub-core/fs/romfs.c +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -475,10 +476,14 @@ static struct grub_fs grub_romfs_fs = + + GRUB_MOD_INIT(romfs) + { +- grub_fs_register (&grub_romfs_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_romfs_fs); ++ } + } + + GRUB_MOD_FINI(romfs) + { +- grub_fs_unregister (&grub_romfs_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_romfs_fs); + } +diff --git a/grub-core/fs/sfs.c b/grub-core/fs/sfs.c +index 983e880..f64bdd2 100644 +--- a/grub-core/fs/sfs.c ++++ b/grub-core/fs/sfs.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include + + GRUB_MOD_LICENSE ("GPLv3+"); +@@ -779,11 +780,15 @@ static struct grub_fs grub_sfs_fs = + + GRUB_MOD_INIT(sfs) + { +- grub_fs_register (&grub_sfs_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_sfs_fs); ++ } + my_mod = mod; + } + + GRUB_MOD_FINI(sfs) + { +- grub_fs_unregister (&grub_sfs_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_sfs_fs); + } +diff --git a/grub-core/fs/udf.c b/grub-core/fs/udf.c +index 2ac5c1d..f89c6b0 100644 +--- a/grub-core/fs/udf.c ++++ b/grub-core/fs/udf.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -1382,11 +1383,15 @@ static struct grub_fs grub_udf_fs = { + + GRUB_MOD_INIT (udf) + { +- grub_fs_register (&grub_udf_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_udf_fs); ++ } + my_mod = mod; + } + + GRUB_MOD_FINI (udf) + { +- grub_fs_unregister (&grub_udf_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_udf_fs); + } +diff --git a/grub-core/fs/ufs.c b/grub-core/fs/ufs.c +index 4727266..90fda07 100644 +--- a/grub-core/fs/ufs.c ++++ b/grub-core/fs/ufs.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -899,7 +900,10 @@ GRUB_MOD_INIT(ufs1) + #endif + #endif + { +- grub_fs_register (&grub_ufs_fs); ++ if (!grub_is_lockdown ()) ++ { ++ grub_fs_register (&grub_ufs_fs); ++ } + my_mod = mod; + } + +@@ -913,6 +917,7 @@ GRUB_MOD_FINI(ufs1) + #endif + #endif + { +- grub_fs_unregister (&grub_ufs_fs); ++ if (!grub_is_lockdown ()) ++ grub_fs_unregister (&grub_ufs_fs); + } + +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2025-0678.patch b/SPECS/grub2/CVE-2025-0678.patch new file mode 100644 index 0000000000..f10da0ac2d --- /dev/null +++ b/SPECS/grub2/CVE-2025-0678.patch @@ -0,0 +1,76 @@ +From 99fc7bef2d0ae92fe52095a104715b787e39a7e5 Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Tue, 17 Jun 2025 03:19:13 +0000 +Subject: [PATCH] Fix for CVE-2025-0678 CVE-2025-1125 + +Upstream reference: +https://gitweb.git.savannah.gnu.org/gitweb/?p=grub.git;a=patch;h=84bc0a9a68835952ae69165c11709811dae7634e +--- + grub-core/fs/btrfs.c | 4 ++-- + grub-core/fs/hfspluscomp.c | 9 +++++++-- + grub-core/fs/squash4.c | 8 ++++---- + 3 files changed, 13 insertions(+), 8 deletions(-) + +diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c +index 54a46b8..0c8d45c 100644 +--- a/grub-core/fs/btrfs.c ++++ b/grub-core/fs/btrfs.c +@@ -1276,8 +1276,8 @@ grub_btrfs_mount (grub_device_t dev) + } + + data->n_devices_allocated = 16; +- data->devices_attached = grub_malloc (sizeof (data->devices_attached[0]) +- * data->n_devices_allocated); ++ data->devices_attached = grub_calloc (data->n_devices_allocated, ++ sizeof (data->devices_attached[0])); + if (!data->devices_attached) + { + grub_free (data); +diff --git a/grub-core/fs/hfspluscomp.c b/grub-core/fs/hfspluscomp.c +index d76f3f1..4965ef1 100644 +--- a/grub-core/fs/hfspluscomp.c ++++ b/grub-core/fs/hfspluscomp.c +@@ -244,14 +244,19 @@ hfsplus_open_compressed_real (struct grub_hfsplus_file *node) + return 0; + } + node->compress_index_size = grub_le_to_cpu32 (index_size); +- node->compress_index = grub_malloc (node->compress_index_size +- * sizeof (node->compress_index[0])); ++ node->compress_index = grub_calloc (node->compress_index_size, ++ sizeof (node->compress_index[0])); + if (!node->compress_index) + { + node->compressed = 0; + grub_free (attr_node); + return grub_errno; + } ++ ++ /* ++ * The node->compress_index_size * sizeof (node->compress_index[0]) is safe here ++ * due to relevant checks done in grub_calloc() above. ++ */ + if (grub_hfsplus_read_file (node, 0, 0, + 0x104 + sizeof (index_size), + node->compress_index_size +diff --git a/grub-core/fs/squash4.c b/grub-core/fs/squash4.c +index 6dd731e..f79fc75 100644 +--- a/grub-core/fs/squash4.c ++++ b/grub-core/fs/squash4.c +@@ -804,10 +804,10 @@ direct_read (struct grub_squash_data *data, + break; + } + total_blocks = ((total_size + data->blksz - 1) >> data->log2_blksz); +- ino->block_sizes = grub_malloc (total_blocks +- * sizeof (ino->block_sizes[0])); +- ino->cumulated_block_sizes = grub_malloc (total_blocks +- * sizeof (ino->cumulated_block_sizes[0])); ++ ino->block_sizes = grub_calloc (total_blocks, ++ sizeof (ino->block_sizes[0])); ++ ino->cumulated_block_sizes = grub_calloc (total_blocks, ++ sizeof (ino->cumulated_block_sizes[0])); + if (!ino->block_sizes || !ino->cumulated_block_sizes) + { + grub_free (ino->block_sizes); +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2025-0684.nopatch b/SPECS/grub2/CVE-2025-0684.nopatch new file mode 100644 index 0000000000..fbd4786af4 --- /dev/null +++ b/SPECS/grub2/CVE-2025-0684.nopatch @@ -0,0 +1 @@ +# The CVE-2025-0684 is fixed as part of patch CVE-2025-0677.patch diff --git a/SPECS/grub2/CVE-2025-0685.nopatch b/SPECS/grub2/CVE-2025-0685.nopatch new file mode 100644 index 0000000000..9899abb8db --- /dev/null +++ b/SPECS/grub2/CVE-2025-0685.nopatch @@ -0,0 +1 @@ +# The CVE-2025-0685 is fixed as part of patch CVE-2025-0677.patch diff --git a/SPECS/grub2/CVE-2025-0686.nopatch b/SPECS/grub2/CVE-2025-0686.nopatch new file mode 100644 index 0000000000..1e74917384 --- /dev/null +++ b/SPECS/grub2/CVE-2025-0686.nopatch @@ -0,0 +1 @@ +# The CVE-2025-0686 is fixed as part of patch CVE-2025-0677.patch diff --git a/SPECS/grub2/CVE-2025-0689.nopatch b/SPECS/grub2/CVE-2025-0689.nopatch new file mode 100644 index 0000000000..75ca0c644d --- /dev/null +++ b/SPECS/grub2/CVE-2025-0689.nopatch @@ -0,0 +1 @@ +# The CVE-2025-0689 is fixed as part of patch CVE-2025-0677.patch diff --git a/SPECS/grub2/CVE-2025-0690.patch b/SPECS/grub2/CVE-2025-0690.patch new file mode 100644 index 0000000000..e740b3fcf3 --- /dev/null +++ b/SPECS/grub2/CVE-2025-0690.patch @@ -0,0 +1,62 @@ +From ed31abc5a78639d6b5f9b73352fbf1b3e83d4af9 Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Tue, 17 Jun 2025 02:34:17 +0000 +Subject: [PATCH] Fix for CVE-2025-0690 + +Upstream reference: +https://cgit.git.savannah.gnu.org/cgit/grub.git/patch/?id=dad8f502974ed9ad0a70ae6820d17b4b142558fc +--- + grub-core/commands/read.c | 19 +++++++++++++++---- + 1 file changed, 15 insertions(+), 4 deletions(-) + +diff --git a/grub-core/commands/read.c b/grub-core/commands/read.c +index fe3e88b..f3ff826 100644 +--- a/grub-core/commands/read.c ++++ b/grub-core/commands/read.c +@@ -25,19 +25,21 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + + static char * + grub_getline (void) + { +- int i; ++ grub_size_t i; + char *line; + char *tmp; + char c; ++ grub_size_t alloc_size; + + i = 0; +- line = grub_malloc (1 + i + sizeof('\0')); ++ line = grub_malloc (1 + sizeof('\0')); + if (! line) + return NULL; + +@@ -50,8 +52,17 @@ grub_getline (void) + line[i] = c; + if (grub_isprint (c)) + grub_printf ("%c", c); +- i++; +- tmp = grub_realloc (line, 1 + i + sizeof('\0')); ++ if (grub_add (i, 1, &i)) ++ { ++ grub_error (GRUB_ERR_OUT_OF_RANGE, N_("overflow is detected")); ++ return NULL; ++ } ++ if (grub_add (i, 1 + sizeof('\0'), &alloc_size)) ++ { ++ grub_error (GRUB_ERR_OUT_OF_RANGE, N_("overflow is detected")); ++ return NULL; ++ } ++ tmp = grub_realloc (line, alloc_size); + if (! tmp) + { + grub_free (line); +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2025-1118.patch b/SPECS/grub2/CVE-2025-1118.patch new file mode 100644 index 0000000000..b51647a727 --- /dev/null +++ b/SPECS/grub2/CVE-2025-1118.patch @@ -0,0 +1,29 @@ +From 6c823e608a8ca4e261ff29ca9b6d67dd8b20c009 Mon Sep 17 00:00:00 2001 +From: Kshitiz Godara +Date: Mon, 16 Jun 2025 15:55:46 +0000 +Subject: [PATCH] Fix for CVE-2025-1118 + +Upstream reference: +https://cgit.git.savannah.gnu.org/cgit/grub.git/patch/?id=34824806ac6302f91e8cabaa41308eaced25725f +--- + grub-core/commands/minicmd.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/grub-core/commands/minicmd.c b/grub-core/commands/minicmd.c +index fa49893..903af33 100644 +--- a/grub-core/commands/minicmd.c ++++ b/grub-core/commands/minicmd.c +@@ -203,8 +203,8 @@ GRUB_MOD_INIT(minicmd) + grub_register_command ("help", grub_mini_cmd_help, + 0, N_("Show this message.")); + cmd_dump = +- grub_register_command ("dump", grub_mini_cmd_dump, +- N_("ADDR [SIZE]"), N_("Show memory contents.")); ++ grub_register_command_lockdown ("dump", grub_mini_cmd_dump, ++ N_("ADDR [SIZE]"), N_("Show memory contents.")); + cmd_rmmod = + grub_register_command ("rmmod", grub_mini_cmd_rmmod, + N_("MODULE"), N_("Remove a module.")); +-- +2.45.3 + diff --git a/SPECS/grub2/CVE-2025-1125.nopatch b/SPECS/grub2/CVE-2025-1125.nopatch new file mode 100644 index 0000000000..02f568f39d --- /dev/null +++ b/SPECS/grub2/CVE-2025-1125.nopatch @@ -0,0 +1 @@ +# The CVE-2025-1125 is fixed as part of patch CVE-2025-0678.patch diff --git a/SPECS/grub2/CVE-2025-61661.patch b/SPECS/grub2/CVE-2025-61661.patch new file mode 100644 index 0000000000..355cf91cfb --- /dev/null +++ b/SPECS/grub2/CVE-2025-61661.patch @@ -0,0 +1,35 @@ +From 549a9cc372fd0b96a4ccdfad0e12140476cc62a3 Mon Sep 17 00:00:00 2001 +From: Jamie +Date: Mon, 14 Jul 2025 09:52:59 +0100 +Subject: [PATCH] commands/usbtest: Use correct string length field + +An incorrect length field is used for buffer allocation. This leads to +grub_utf16_to_utf8() receiving an incorrect/different length and possibly +causing OOB write. This makes sure to use the correct length. + +Fixes: CVE-2025-61661 + +Reported-by: Jamie +Signed-off-by: Jamie +Reviewed-by: Daniel Kiper + +Upstream Patch Reference: https://gitweb.git.savannah.gnu.org/gitweb/?p=grub.git;a=patch;h=549a9cc372fd0b96a4ccdfad0e12140476cc62a3 +--- + grub-core/commands/usbtest.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/grub-core/commands/usbtest.c b/grub-core/commands/usbtest.c +index 2c6d93fe6..8ef187a9a 100644 +--- a/grub-core/commands/usbtest.c ++++ b/grub-core/commands/usbtest.c +@@ -99,7 +99,7 @@ grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid, + return GRUB_USB_ERR_NONE; + } + +- *string = grub_malloc (descstr.length * 2 + 1); ++ *string = grub_malloc (descstrp->length * 2 + 1); + if (! *string) + { + grub_free (descstrp); +-- +2.39.5 diff --git a/SPECS/grub2/CVE-2025-61662.patch b/SPECS/grub2/CVE-2025-61662.patch new file mode 100644 index 0000000000..e5a1fe21dd --- /dev/null +++ b/SPECS/grub2/CVE-2025-61662.patch @@ -0,0 +1,67 @@ +From 8ed78fd9f0852ab218cc1f991c38e5a229e43807 Mon Sep 17 00:00:00 2001 +From: Alec Brown +Date: Thu, 21 Aug 2025 21:14:06 +0000 +Subject: [PATCH] gettext/gettext: Unregister gettext command on module unload + +When the gettext module is loaded, the gettext command is registered but +isn't unregistered when the module is unloaded. We need to add a call to +grub_unregister_command() when unloading the module. + +Fixes: CVE-2025-61662 + +Reported-by: Alec Brown +Signed-off-by: Alec Brown +Reviewed-by: Daniel Kiper + +Upstream Patch Reference: https://gitweb.git.savannah.gnu.org/gitweb/?p=grub.git;a=patch;h=8ed78fd9f0852ab218cc1f991c38e5a229e43807 +--- + grub-core/gettext/gettext.c | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +diff --git a/grub-core/gettext/gettext.c b/grub-core/gettext/gettext.c +index 4d02e62..47509c3 100644 +--- a/grub-core/gettext/gettext.c ++++ b/grub-core/gettext/gettext.c +@@ -497,6 +497,8 @@ grub_cmd_translate (grub_command_t cmd __attribute__ ((unused)), + return 0; + } + ++static grub_command_t cmd; ++ + GRUB_MOD_INIT (gettext) + { + const char *lang; +@@ -516,13 +518,14 @@ GRUB_MOD_INIT (gettext) + grub_register_variable_hook ("locale_dir", NULL, read_main); + grub_register_variable_hook ("secondary_locale_dir", NULL, read_secondary); + +- grub_register_command_p1 ("gettext", grub_cmd_translate, +- N_("STRING"), +- /* TRANSLATORS: It refers to passing the string through gettext. +- So it's "translate" in the same meaning as in what you're +- doing now. +- */ +- N_("Translates the string with the current settings.")); ++ cmd = grub_register_command_p1 ("gettext", grub_cmd_translate, ++ N_("STRING"), ++ /* ++ * TRANSLATORS: It refers to passing the string through gettext. ++ * So it's "translate" in the same meaning as in what you're ++ * doing now. ++ */ ++ N_("Translates the string with the current settings.")); + + /* Reload .mo file information if lang changes. */ + grub_register_variable_hook ("lang", NULL, grub_gettext_env_write_lang); +@@ -535,6 +538,8 @@ GRUB_MOD_INIT (gettext) + + GRUB_MOD_FINI (gettext) + { ++ grub_unregister_command (cmd); ++ + grub_gettext_delete_list (&main_context); + grub_gettext_delete_list (&secondary_context); + +-- +2.43.0 + diff --git a/SPECS/grub2/CVE-2025-61663.patch b/SPECS/grub2/CVE-2025-61663.patch new file mode 100644 index 0000000000..7d265f1ecf --- /dev/null +++ b/SPECS/grub2/CVE-2025-61663.patch @@ -0,0 +1,60 @@ +From 05d3698b8b03eccc49e53491bbd75dba15f40917 Mon Sep 17 00:00:00 2001 +From: Alec Brown +Date: Thu, 21 Aug 2025 21:14:07 +0000 +Subject: [PATCH] normal/main: Unregister commands on module unload + +When the normal module is loaded, the normal and normal_exit commands +are registered but aren't unregistered when the module is unloaded. We +need to add calls to grub_unregister_command() when unloading the module +for these commands. + +Fixes: CVE-2025-61663 +Fixes: CVE-2025-61664 + +Reported-by: Alec Brown +Signed-off-by: Alec Brown +Reviewed-by: Daniel Kiper + +Upstream Patch Reference: https://gitweb.git.savannah.gnu.org/gitweb/?p=grub.git;a=patch;h=05d3698b8b03eccc49e53491bbd75dba15f40917 +--- + grub-core/normal/main.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c +index c4ebe9e..65fa95b 100644 +--- a/grub-core/normal/main.c ++++ b/grub-core/normal/main.c +@@ -499,7 +499,7 @@ grub_mini_cmd_clear (struct grub_command *cmd __attribute__ ((unused)), + return 0; + } + +-static grub_command_t cmd_clear; ++static grub_command_t cmd_clear, cmd_normal, cmd_normal_exit; + + static void (*grub_xputs_saved) (const char *str); + static const char *features[] = { +@@ -541,10 +541,10 @@ GRUB_MOD_INIT(normal) + grub_env_export ("pager"); + + /* Register a command "normal" for the rescue mode. */ +- grub_register_command ("normal", grub_cmd_normal, +- 0, N_("Enter normal mode.")); +- grub_register_command ("normal_exit", grub_cmd_normal_exit, +- 0, N_("Exit from normal mode.")); ++ cmd_normal = grub_register_command ("normal", grub_cmd_normal, ++ 0, N_("Enter normal mode.")); ++ cmd_normal_exit = grub_register_command ("normal_exit", grub_cmd_normal_exit, ++ 0, N_("Exit from normal mode.")); + + /* Reload terminal colors when these variables are written to. */ + grub_register_variable_hook ("color_normal", NULL, grub_env_write_color_normal); +@@ -584,4 +584,6 @@ GRUB_MOD_FINI(normal) + grub_register_variable_hook ("pager", 0, 0); + grub_fs_autoload_hook = 0; + grub_unregister_command (cmd_clear); ++ grub_unregister_command (cmd_normal); ++ grub_unregister_command (cmd_normal_exit); + } +-- +2.43.0 + diff --git a/SPECS/grub2/grub2.spec b/SPECS/grub2/grub2.spec index 1b39f76691..d13704dfd0 100644 --- a/SPECS/grub2/grub2.spec +++ b/SPECS/grub2/grub2.spec @@ -7,7 +7,7 @@ Summary: GRand Unified Bootloader Name: grub2 Version: 2.06 -Release: 25%{?dist} +Release: 26%{?dist} License: GPLv3+ Vendor: Intel Corporation Distribution: Edge Microvisor Toolkit @@ -110,6 +110,38 @@ Patch: sbat-4-0006-fs-ntfs-Make-code-more-readable.patch # dropped in scenarios like PXE booting. Patch: disable-checksum-code-optimization.patch Patch: CVE-2025-0624.patch + +# Additional bulk CVEs +Patch: CVE-2014-3591.patch +Patch: CVE-2019-13627.patch +Patch: CVE-2017-7526.patch +Patch: CVE-2024-56737.patch +Patch: CVE-2024-45774.patch +Patch: CVE-2024-45781.patch +Patch: CVE-2024-45775.patch +Patch: CVE-2025-1118.patch +Patch: CVE-2025-0677.patch +Patch: CVE-2024-45777.patch +Patch: CVE-2024-45776.patch +Patch: CVE-2024-45783.patch +Patch: CVE-2025-0690.patch +Patch: CVE-2024-45778.patch +Patch: CVE-2025-0678.patch +Patch: CVE-2024-45780.patch +Patch: CVE-2025-61661.patch +Patch: CVE-2025-61662.patch +Patch: CVE-2025-61663.patch +# Following are included as part of above CVEs and kept here as nopatch +# and commented out, because from patch command perspective, these files +# have garbage content. +#Patch: CVE-2024-45782.nopatch +#Patch: CVE-2025-0684.nopatch +#Patch: CVE-2025-0685.nopatch +#Patch: CVE-2025-0686.nopatch +#Patch: CVE-2025-0689.nopatch +#Patch: CVE-2024-45779.nopatch +#Patch: CVE-2025-1125.nopatch + BuildRequires: autoconf BuildRequires: device-mapper-devel BuildRequires: python3 @@ -436,6 +468,37 @@ cp $GRUB_PXE_MODULE_SOURCE $EFI_BOOT_DIR/$GRUB_PXE_MODULE_NAME %config(noreplace) %{_sysconfdir}/grub.d/41_custom %changelog +* Mon Feb 23 2026 Lee Chee Yang - 2.06-26 +- merge from Azure Linux 3.0.20260107-3.0 +- Patch CVE-2025-61661, CVE-2025-61662 & CVE-2025-61663 + +* Tue Jan 6 2025 Lee Chee Yang - 2.06-26 +- merge from Azure Linux 3.0.20251206-3.0 +- Addressed following grub2 CVEs +- CVE-2025-0684 +- CVE-2024-45782 +- CVE-2024-45778 +- CVE-2025-0686 +- CVE-2025-0678 +- CVE-2025-0685 +- CVE-2024-45779 +- CVE-2025-0689 +- CVE-2024-45780 +- CVE-2025-1125 +- CVE-2025-0690 +- CVE-2024-45783 +- CVE-2024-45776 +- CVE-2024-45777 +- CVE-2025-0677 +- CVE-2025-1118 +- CVE-2024-45775 +- CVE-2024-45781 +- CVE-2024-45774 +- CVE-2024-56737 +- CVE-2017-7526 +- CVE-2019-13627 +- CVE-2014-3591 + * Mon Sep 8 2025 Lee Chee Yang - 2.06-25 - merge from Azure Linux 3.0.20250910-3.0. - Patch CVE-2025-0624 diff --git a/SPECS/influx-cli/generate_source_tarball.sh b/SPECS/influx-cli/generate_source_tarball.sh deleted file mode 100755 index 9ead0a5074..0000000000 --- a/SPECS/influx-cli/generate_source_tarball.sh +++ /dev/null @@ -1,105 +0,0 @@ -#!/bin/bash -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -# Quit on failure -set -e - -PKG_VERSION="" -SRC_TARBALL="" -OUT_FOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# parameters: -# -# --srcTarball : src tarball file -# this file contains the 'initial' source code of the component -# and should be replaced with the new/modified src code -# --outFolder : folder where to copy the new tarball(s) -# --pkgVersion : package version -# -PARAMS="" -while (( "$#" )); do - case "$1" in - --srcTarball) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - SRC_TARBALL=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --outFolder) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - OUT_FOLDER=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --pkgVersion) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - PKG_VERSION=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - -*|--*=) # unsupported flags - echo "Error: Unsupported flag $1" >&2 - exit 1 - ;; - *) # preserve positional arguments - PARAMS="$PARAMS $1" - shift - ;; - esac -done - -echo "--srcTarball -> $SRC_TARBALL" -echo "--outFolder -> $OUT_FOLDER" -echo "--pkgVersion -> $PKG_VERSION" - -if [ -z "$PKG_VERSION" ]; then - echo "--pkgVersion parameter cannot be empty" - exit 1 -fi - -echo "-- create temp folder" -tmpdir=$(mktemp -d) -function cleanup { - echo "+++ cleanup -> remove $tmpdir" - rm -rf $tmpdir -} -trap cleanup EXIT - -TARBALL_FOLDER="$tmpdir/tarballFolder" -mkdir -p $TARBALL_FOLDER -cp $SRC_TARBALL $tmpdir - -pushd $tmpdir > /dev/null - -PKG_NAME="influx-cli" -NAME_VER="$PKG_NAME-$PKG_VERSION" -VENDOR_TARBALL="$OUT_FOLDER/$NAME_VER-vendor.tar.gz" - -echo "Unpacking source tarball..." -tar -xf $SRC_TARBALL - -echo "Vendor go modules..." -cd $NAME_VER -go mod vendor - -echo "" -echo "=========================" -echo "Tar vendored tarball" -tar --sort=name \ - --mtime="2021-04-26 00:00Z" \ - --owner=0 --group=0 --numeric-owner \ - --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ - -cf "$VENDOR_TARBALL" vendor - -popd > /dev/null -echo "$PKG_NAME vendored modules are available at $VENDOR_TARBALL and static assets in $STATIC_ASSETS_TARBALL" diff --git a/SPECS/influx-cli/influx-cli.signatures.json b/SPECS/influx-cli/influx-cli.signatures.json deleted file mode 100644 index 4d193b3a8e..0000000000 --- a/SPECS/influx-cli/influx-cli.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "influx-cli-2.7.5.tar.gz": "2741105c0fa7bf0f728643807aa21e9a8e356b17a681e92f06c4ff680e6944ac", - "influx-cli-2.7.5-vendor.tar.gz": "236129aa82f73b371007b161a2b33745245a9ccda2107fa986a3c17eabeadb7e" - } -} diff --git a/SPECS/influx-cli/influx-cli.spec b/SPECS/influx-cli/influx-cli.spec deleted file mode 100644 index ed61601f91..0000000000 --- a/SPECS/influx-cli/influx-cli.spec +++ /dev/null @@ -1,165 +0,0 @@ -# -# spec file for package influx-cli -# -# Copyright (c) 2021 SUSE LLC -# -# All modifications and additions to the file contributed by third parties -# remain the property of their copyright owners, unless otherwise agreed -# upon. The license for this file, and modifications and additions to the -# file, is the same license as for the pristine package itself (unless the -# license for the pristine package is not an Open Source License, in which -# case the license is the MIT License). An "Open Source License" is a -# license that conforms to the Open Source Definition (Version 1.9) -# published by the Open Source Initiative. - -# Please submit bugfixes or comments via https://bugs.opensuse.org/ -# - -Summary: CLI for managing resources in InfluxDB -Name: influx-cli -Version: 2.7.5 -Release: 3%{?dist} -License: MIT -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Productivity/Databases/Servers -URL: https://github.com/influxdata/influx-cli -Source0: %{url}/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -# Below is a manually created tarball, no download link. -# We're using pre-populated Go modules from this tarball, since network is disabled during build time. -# Use generate_source_tarbbal.sh to get this generated from a source code file. -# How to re-build this file: -# 1. wget https://github.com/influxdata/influx-cli/archive/refs/tags/v%%{version}.tar.gz -O %%{name}-%%{version}.tar.gz -# 2. tar -xf %%{name}-%%{version}.tar.gz -# 3. cd %%{name}-%%{version} -# 4. go mod vendor -# 5. tar --sort=name \ -# --mtime="2021-04-26 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cf %%{name}-%%{version}-vendor.tar.gz vendor -# -Source1: %{name}-%{version}-vendor.tar.gz -BuildRequires: golang -BuildRequires: systemd-rpm-macros - -%description -CLI for managing resources in InfluxDB v2. - -%package bash-completion -Summary: Bash Completion for %{name} -Group: Productivity/Databases/Servers -Requires: bash-completion -Supplements: (%{name} and bash-completion) -BuildArch: noarch - -%description bash-completion -The official bash completion script for influx. It includes support -for every argument that can currently be passed to influx. - -%package zsh-completion -Summary: ZSH Completion for %{name} -Group: Productivity/Databases/Servers -Supplements: (%{name} and zsh) -BuildArch: noarch - -%description zsh-completion -The official zsh completion script for influx. - -%prep -%autosetup -a 1 - -%build -export GOPATH=$HOME/go -export GOBIN=$GOPATH/bin -export PATH=$PATH:$GOPATH:$GOBIN -export GO111MODULE=on -go build -mod vendor -ldflags="-X main.version=%{version}" -o bin/influx ./cmd/influx - -%install -mkdir -p %{buildroot}%{_bindir} -install -D -m 0755 bin/influx %{buildroot}%{_bindir}/ - -mkdir -p %{buildroot}/%{_datadir}/bash-completion/completions -bin/influx completion bash > %{buildroot}/%{_datadir}/bash-completion/completions/influx - -mkdir -p %{buildroot}/%{_datadir}/zsh/site-functions -bin/influx completion zsh > %{buildroot}/%{_datadir}/zsh/site-functions/_influx - -%files -%license LICENSE -%doc README.md CHANGELOG.md -%{_bindir}/influx - -%files bash-completion -%{_datadir}/bash-completion - -%files zsh-completion -%{_datadir}/zsh - -%changelog -* Fri Apr 28 2025 Ranjan Dutta - 2.7.5-3 -- merge from Azure Linux tag 3.0.20250423-3.0 -- Add back bash-completion subpackage for influx-cli - -* Fri Mar 21 2025 Anuj Mittal - 2.7.5-2 -- Bump Release to rebuild - -* Tue Feb 11 2025 CBL-Mariner Servicing Account - 2.7.5-1 -- Auto-upgrade to 2.7.5 - Update influx-cli to match influxdb version for CVE-2023-44487 - -* Thu Mar 07 2024 Andrew Phelps - 2.7.3-2 -- Remove restriction on golang BR version - -* Thu Feb 01 2024 Mykhailo Bykhovtsev - 2.7.3-1 -- Upgrade to version 2.7.3 - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 2.6.1-13 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 2.6.1-12 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 2.6.1-11 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 2.6.1-10 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 2.6.1-9 -- Bump release to rebuild with go 1.19.10 - -* Thu May 25 2023 Mykhailo Bykhovtsev - 2.6.1-8 -- Removed bash-completion subpackage since the script produced is included in original bash-completion. - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 2.6.1-7 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 2.6.1-6 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 2.6.1-5 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 10 2023 Mykhailo Bykhovtsev - 2.6.1-4 -- Fixing spec supplement of bash-completion library to not conflict with existing bash-completion - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 2.6.1-3 -- Bump release to rebuild with go 1.19.5 - -* Wed Feb 1 2023 Mykhailo Bykhovtsev - 2.6.1-2 -- Fixed build issue by requring to use golang 1.18.8. Does not work on 1.19 yet - -* Mon Jan 30 2023 Mykhailo Bykhovtsev - 2.6.1-1 -- Upgrade to version 2.6.1 - -* Wed Jan 18 2023 Mykhailo Bykhovtsev - 2.4.0-1 -- Initial CBL-Mariner import from openSUSE Tumbleweed (license: same as "License" tag) -- License verified -- Upgrade to version 2.4.0 - -* Wed Jun 15 2022 Matwey Kornilov -- Version 2.3.0 - -* Wed Nov 17 2021 Matwey Kornilov -- Initial version diff --git a/SPECS/intel-xpu-smi/intel-xpu-smi.spec b/SPECS/intel-xpu-smi/intel-xpu-smi.spec index 301a972e19..6565e2890f 100644 --- a/SPECS/intel-xpu-smi/intel-xpu-smi.spec +++ b/SPECS/intel-xpu-smi/intel-xpu-smi.spec @@ -1,7 +1,7 @@ Summary: Intel XPU System Management Interface Name: intel-xpu-smi Version: 1.2.39 -Release: 6%{?dist} +Release: 7%{?dist} License: MIT Vendor: Intel Corporation Distribution: Edge Microvisor Toolkit @@ -9,7 +9,7 @@ URL: https://github.com/intel/xpumanager Source0: https://github.com/intel/xpumanager/archive/refs/tags/V%{version}.tar.gz#/%{name}-%{version}.tar.gz Patch0: system-installed-spdlog.patch BuildRequires: cmake -BuildRequires: glibc-static >= 2.38-12%{?dist} +BuildRequires: glibc-static >= 2.38-18%{?dist} BuildRequires: libpciaccess-devel BuildRequires: intel-level-zero-devel BuildRequires: intel-metee-devel @@ -77,6 +77,9 @@ make install DESTDIR=%{buildroot} %{_libdir}/xpu-smi/resources/* %changelog +* Thu Mar 12 2026 Lee Chee Yang - 1.2.39-7 +- Bump to rebuild with updated glibc + * Fri Oct 10 2025 Lee Chee Yang - 1.2.39-6 - Bump to rebuild with updated glibc diff --git a/SPECS/jx/jx.signatures.json b/SPECS/jx/jx.signatures.json deleted file mode 100644 index 4a4b3a9c3e..0000000000 --- a/SPECS/jx/jx.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "jx-3.10.182-vendor.tar.gz": "47bcb18176e44be2c7ffb3666b04d6e5cbaeea93bc3fe6c5fcb974086abe00b4", - "jx-3.10.182.tar.gz": "2abfc9432773007e7c17f78c44ad03aa5b9a6bf8a0118d44bf97a230c1ebd1fb" - } -} diff --git a/SPECS/jx/jx.spec b/SPECS/jx/jx.spec deleted file mode 100644 index 42cd6be001..0000000000 --- a/SPECS/jx/jx.spec +++ /dev/null @@ -1,122 +0,0 @@ -Summary: Command line tool for working with Jenkins X. -Name: jx -Version: 3.10.182 -Release: 3%{?dist} -License: Apache-2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Applications/Tools -URL: https://github.com/jenkins-x/jx -Source0: https://github.com/jenkins-x/jx/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -# Below is a manually created tarball, no download link. -# We're using pre-populated Go modules from this tarball, since network is disabled during build time. -# How to re-build this file: -# 1. wget https://github.com/jenkins-x/jx/archive/v%{version}.tar.gz -O %%{name}-%%{version}.tar.gz -# 2. tar -xf %%{name}-%%{version}.tar.gz -# 3. cd %%{name}-%%{version} -# 4. go mod vendor -# 5. tar --sort=name \ -# --mtime="2021-04-26 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cf %%{name}-%%{version}-vendor.tar.gz vendor -# -# NOTES: -# - You require GNU tar version 1.28+. -# - The additional options enable generation of a tarball with the same hash every time regardless of the environment. -# See: https://reproducible-builds.org/docs/archives/ -# - For the value of "--mtime" use the date "2021-04-26 00:00Z" to simplify future updates. -Source1: %{name}-%{version}-vendor.tar.gz - -BuildRequires: golang < 1.25 -%global debug_package %{nil} -%define our_gopath %{_topdir}/.gopath - -%description -Command line tool for working with Jenkins X. - -%prep -%autosetup -N -# Apply vendor before patching -tar --no-same-owner -xf %{SOURCE1} -%autopatch -p1 - -%build -export GOPATH=%{our_gopath} -# No download use vednor cache locally -sed -i 's/go mod download/# go mod download/' ./Makefile -sed -i 's/CGO_ENABLED=$(CGO_ENABLED) $(GO) $(BUILD_TARGET)/CGO_ENABLED=$(CGO_ENABLED) $(GO) $(BUILD_TARGET) -mod=vendor/' ./Makefile -make build - -%install -install -m 755 -d %{buildroot}%{_bindir} -install -p -m 755 -t %{buildroot}%{_bindir} ./build/jx - -%check -./build/jx --help - -%files -%defattr(-,root,root) -%license LICENSE -%doc README.md -%{_bindir}/jx - -%changelog -* Fri Oct 3 2025 Lee Chee Yang - 3.10.182-3 -- merge from Azure Linux 3.0.20250910-3.0 -- Set BR for golang to < 1.25 - -* Fri Mar 21 2025 Anuj Mittal - 3.10.182-2 -- Bump Release to rebuild - -* Thu Feb 13 2025 CBL-Mariner Servicing Account - 3.10.182-1 -- Auto-upgrade to 3.10.182 - Fix CVE-2023-39325 and CVE-2023-44487 in jx - -* Thu Aug 22 2024 Sumedh Sharma - 3.10.116-2 -- Add patch to resolve CVE-2023-45288 - -* Fri Oct 27 2023 CBL-Mariner Servicing Account - 3.10.116-1 -- Auto-upgrade to 3.10.116 - Azure Linux 3.0 - package upgrades - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 3.2.236-14 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 3.2.236-13 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 3.2.236-12 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 3.2.236-11 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 3.2.236-10 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 3.2.236-9 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 3.2.236-8 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 3.2.236-7 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 3.2.236-6 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 3.2.236-5 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 3.2.236-4 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 3.2.236-3 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 3.2.236-2 -- Bump release to rebuild against Go 1.18.5 - -* Wed Jun 22 2022 Suresh Babu Chalamalasetty - 3.2.236-1 -- Original version for CBL-Mariner. -- License verified. diff --git a/SPECS/keda/CVE-2024-45338.patch b/SPECS/keda/CVE-2024-45338.patch deleted file mode 100644 index 7dc58f35e9..0000000000 --- a/SPECS/keda/CVE-2024-45338.patch +++ /dev/null @@ -1,63 +0,0 @@ -From a61bc7a45809410b36644afd5a29c14f138a1485 Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Thu, 2 Jan 2025 10:22:12 +0000 -Subject: [PATCH] Fix CVE CVE-2024-45338 in gh - ---- - vendor/golang.org/x/net/html/doctype.go | 2 +- - vendor/golang.org/x/net/html/foreign.go | 3 +-- - vendor/golang.org/x/net/html/parse.go | 4 ++-- - 3 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go -index c484e5a..bca3ae9 100644 ---- a/vendor/golang.org/x/net/html/doctype.go -+++ b/vendor/golang.org/x/net/html/doctype.go -@@ -87,7 +87,7 @@ func parseDoctype(s string) (n *Node, quirks bool) { - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && -- strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { -+ strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") { - quirks = true - } - } -diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go -index 9da9e9d..e8515d8 100644 ---- a/vendor/golang.org/x/net/html/foreign.go -+++ b/vendor/golang.org/x/net/html/foreign.go -@@ -40,8 +40,7 @@ func htmlIntegrationPoint(n *Node) bool { - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { -- val := strings.ToLower(a.Val) -- if val == "text/html" || val == "application/xhtml+xml" { -+ if strings.EqualFold(a.Val, "text/html") || strings.EqualFold(a.Val, "application/xhtml+xml") { - return true - } - } -diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go -index 46a89ed..5b8374b 100644 ---- a/vendor/golang.org/x/net/html/parse.go -+++ b/vendor/golang.org/x/net/html/parse.go -@@ -1031,7 +1031,7 @@ func inBodyIM(p *parser) bool { - if p.tok.DataAtom == a.Input { - for _, t := range p.tok.Attr { - if t.Key == "type" { -- if strings.ToLower(t.Val) == "hidden" { -+ if strings.EqualFold(t.Val, "hidden") { - // Skip setting framesetOK = false - return true - } -@@ -1459,7 +1459,7 @@ func inTableIM(p *parser) bool { - return inHeadIM(p) - case a.Input: - for _, t := range p.tok.Attr { -- if t.Key == "type" && strings.ToLower(t.Val) == "hidden" { -+ if t.Key == "type" && strings.EqualFold(t.Val, "hidden") { - p.addElement() - p.oe.pop() - return true --- -2.39.4 - diff --git a/SPECS/keda/CVE-2024-51744.patch b/SPECS/keda/CVE-2024-51744.patch deleted file mode 100644 index 1ada595bb5..0000000000 --- a/SPECS/keda/CVE-2024-51744.patch +++ /dev/null @@ -1,168 +0,0 @@ -From 98fa1373fce24555da98c0fb283d3a80c4c1944f Mon Sep 17 00:00:00 2001 -From: Sreenivasulu Malavathula -Date: Thu, 3 Apr 2025 13:46:25 -0500 -Subject: [PATCH] Address CVE-2024-51744 -Upstream Patch Reference: https://github.com/golang-jwt/jwt/commit/7b1c1c00a171c6c79bbdb40e4ce7d197060c1c2c - ---- - vendor/github.com/golang-jwt/jwt/parser.go | 36 +++++++++------- - vendor/github.com/golang-jwt/jwt/v4/parser.go | 41 +++++++++---------- - 2 files changed, 41 insertions(+), 36 deletions(-) - -diff --git a/vendor/github.com/golang-jwt/jwt/parser.go b/vendor/github.com/golang-jwt/jwt/parser.go -index d6901d9a..bfb480c9 100644 ---- a/vendor/github.com/golang-jwt/jwt/parser.go -+++ b/vendor/github.com/golang-jwt/jwt/parser.go -@@ -14,12 +14,21 @@ type Parser struct { - } - - // Parse, validate, and return a token. --// keyFunc will receive the parsed token and should return the key for validating. --// If everything is kosher, err will be nil -+// Parse parses, validates, verifies the signature and returns the parsed token. keyFunc will -+// receive the parsed token and should return the key for validating. - func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) - } - -+// ParseWithClaims parses, validates, and verifies like Parse, but supplies a default object -+// implementing the Claims interface. This provides default values which can be overridden and -+// allows a caller to use their own type, rather than the default MapClaims implementation of -+// Claims. -+// -+// Note: If you provide a custom claim implementation that embeds one of the standard claims (such -+// as RegisteredClaims), make sure that a) you either embed a non-pointer version of the claims or -+// b) if you are using a pointer, allocate the proper memory for it before passing in the overall -+// claims, otherwise you might run into a panic. - func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - token, parts, err := p.ParseUnverified(tokenString, claims) - if err != nil { -@@ -56,12 +65,17 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - return token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable} - } - -+ // Perform validation -+ token.Signature = parts[2] -+ if err := token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { -+ return token, &ValidationError{Inner: err, Errors: ValidationErrorSignatureInvalid} -+ } -+ - vErr := &ValidationError{} - - // Validate Claims - if !p.SkipClaimsValidation { - if err := token.Claims.Valid(); err != nil { -- - // If the Claims Valid returned an error, check if it is a validation error, - // If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set - if e, ok := err.(*ValidationError); !ok { -@@ -69,22 +83,14 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - } else { - vErr = e - } -+ return token, vErr - } - } - -- // Perform validation -- token.Signature = parts[2] -- if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { -- vErr.Inner = err -- vErr.Errors |= ValidationErrorSignatureInvalid -- } -- -- if vErr.valid() { -- token.Valid = true -- return token, nil -- } -+ // No errors so far, token is valid. -+ token.Valid = true - -- return token, vErr -+ return token, nil - } - - // WARNING: Don't use this method unless you know what you're doing -diff --git a/vendor/github.com/golang-jwt/jwt/v4/parser.go b/vendor/github.com/golang-jwt/jwt/v4/parser.go -index 8e7e67c4..0fc510a0 100644 ---- a/vendor/github.com/golang-jwt/jwt/v4/parser.go -+++ b/vendor/github.com/golang-jwt/jwt/v4/parser.go -@@ -38,19 +38,21 @@ func NewParser(options ...ParserOption) *Parser { - return p - } - --// Parse parses, validates, verifies the signature and returns the parsed token. --// keyFunc will receive the parsed token and should return the key for validating. -+// Parse parses, validates, verifies the signature and returns the parsed token. keyFunc will -+// receive the parsed token and should return the key for validating. - func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) - } - --// ParseWithClaims parses, validates, and verifies like Parse, but supplies a default object implementing the Claims --// interface. This provides default values which can be overridden and allows a caller to use their own type, rather --// than the default MapClaims implementation of Claims. -+// ParseWithClaims parses, validates, and verifies like Parse, but supplies a default object -+// implementing the Claims interface. This provides default values which can be overridden and -+// allows a caller to use their own type, rather than the default MapClaims implementation of -+// Claims. - // --// Note: If you provide a custom claim implementation that embeds one of the standard claims (such as RegisteredClaims), --// make sure that a) you either embed a non-pointer version of the claims or b) if you are using a pointer, allocate the --// proper memory for it before passing in the overall claims, otherwise you might run into a panic. -+// Note: If you provide a custom claim implementation that embeds one of the standard claims (such -+// as RegisteredClaims), make sure that a) you either embed a non-pointer version of the claims or -+// b) if you are using a pointer, allocate the proper memory for it before passing in the overall -+// claims, otherwise you might run into a panic. - func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - token, parts, err := p.ParseUnverified(tokenString, claims) - if err != nil { -@@ -87,12 +89,17 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - return token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable} - } - -+ // Perform validation -+ token.Signature = parts[2] -+ if err := token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { -+ return token, &ValidationError{Inner: err, Errors: ValidationErrorSignatureInvalid} -+ } -+ - vErr := &ValidationError{} - - // Validate Claims - if !p.SkipClaimsValidation { - if err := token.Claims.Valid(); err != nil { -- - // If the Claims Valid returned an error, check if it is a validation error, - // If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set - if e, ok := err.(*ValidationError); !ok { -@@ -100,22 +107,14 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - } else { - vErr = e - } -+ return token, vErr - } - } - -- // Perform validation -- token.Signature = parts[2] -- if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { -- vErr.Inner = err -- vErr.Errors |= ValidationErrorSignatureInvalid -- } -- -- if vErr.valid() { -- token.Valid = true -- return token, nil -- } -+ // No errors so far, token is valid. -+ token.Valid = true - -- return token, vErr -+ return token, nil - } - - // ParseUnverified parses the token but doesn't validate the signature. --- -2.45.2 - diff --git a/SPECS/keda/CVE-2024-6104.patch b/SPECS/keda/CVE-2024-6104.patch deleted file mode 100644 index 4f27cab85f..0000000000 --- a/SPECS/keda/CVE-2024-6104.patch +++ /dev/null @@ -1,81 +0,0 @@ -From a0837c510dfd0e0bf33aa2a721aa5f4d82dca577 Mon Sep 17 00:00:00 2001 -From: Balakumaran Kannan -Date: Thu, 1 Aug 2024 13:12:11 +0000 -Subject: [PATCH] Patch CVE-2024-6104 - ---- - .../hashicorp/go-retryablehttp/client.go | 28 ++++++++++++++----- - 1 file changed, 21 insertions(+), 7 deletions(-) - -diff --git a/vendor/github.com/hashicorp/go-retryablehttp/client.go b/vendor/github.com/hashicorp/go-retryablehttp/client.go -index c9edbd0..48ff4df 100644 ---- a/vendor/github.com/hashicorp/go-retryablehttp/client.go -+++ b/vendor/github.com/hashicorp/go-retryablehttp/client.go -@@ -609,9 +609,9 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - if logger != nil { - switch v := logger.(type) { - case LeveledLogger: -- v.Debug("performing request", "method", req.Method, "url", req.URL) -+ v.Debug("performing request", "method", req.Method, "url", redactURL(req.URL)) - case Logger: -- v.Printf("[DEBUG] %s %s", req.Method, req.URL) -+ v.Printf("[DEBUG] %s %s", req.Method, redactURL(req.URL)) - } - } - -@@ -666,9 +666,9 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - if err != nil { - switch v := logger.(type) { - case LeveledLogger: -- v.Error("request failed", "error", err, "method", req.Method, "url", req.URL) -+ v.Error("request failed", "error", err, "method", req.Method, "url", redactURL(req.URL)) - case Logger: -- v.Printf("[ERR] %s %s request failed: %v", req.Method, req.URL, err) -+ v.Printf("[ERR] %s %s request failed: %v", req.Method, redactURL(req.URL), err) - } - } else { - // Call this here to maintain the behavior of logging all requests, -@@ -704,7 +704,7 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - - wait := c.Backoff(c.RetryWaitMin, c.RetryWaitMax, i, resp) - if logger != nil { -- desc := fmt.Sprintf("%s %s", req.Method, req.URL) -+ desc := fmt.Sprintf("%s %s", req.Method, redactURL(req.URL)) - if resp != nil { - desc = fmt.Sprintf("%s (status: %d)", desc, resp.StatusCode) - } -@@ -760,11 +760,11 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - // communicate why - if err == nil { - return nil, fmt.Errorf("%s %s giving up after %d attempt(s)", -- req.Method, req.URL, attempt) -+ req.Method, redactURL(req.URL), attempt) - } - - return nil, fmt.Errorf("%s %s giving up after %d attempt(s): %w", -- req.Method, req.URL, attempt, err) -+ req.Method, redactURL(req.URL), attempt, err) - } - - // Try to read the response body so we can reuse this connection. -@@ -845,3 +845,17 @@ func (c *Client) StandardClient() *http.Client { - Transport: &RoundTripper{Client: c}, - } - } -+ -+ -+// Taken from url.URL#Redacted() which was introduced in go 1.15. -+func redactURL(u *url.URL) string { -+ if u == nil { -+ return "" -+ } -+ -+ ru := *u -+ if _, has := ru.User.Password(); has { -+ ru.User = url.UserPassword(ru.User.Username(), "xxxxx") -+ } -+ return ru.String() -+} --- -2.33.8 - diff --git a/SPECS/keda/CVE-2025-22868.patch b/SPECS/keda/CVE-2025-22868.patch deleted file mode 100644 index c4f136f3ca..0000000000 --- a/SPECS/keda/CVE-2025-22868.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 681b4d8edca1bcfea5bce685d77ea7b82ed3e7b3 Mon Sep 17 00:00:00 2001 -From: Neal Patel -Date: Thu, 30 Jan 2025 14:10:09 -0500 -Subject: [PATCH] jws: split token into fixed number of parts - -Thanks to 'jub0bs' for reporting this issue. - -Fixes #71490 -Fixes CVE-2025-22868 - -Change-Id: I2552731f46d4907f29aafe7863c558387b6bd6e2 -Reviewed-on: https://go-review.googlesource.com/c/oauth2/+/652155 -Auto-Submit: Gopher Robot -Reviewed-by: Damien Neil -Reviewed-by: Roland Shoemaker -LUCI-TryBot-Result: Go LUCI ---- - vendor/golang.org/x/oauth2/jws/jws.go | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/oauth2/jws/jws.go b/vendor/golang.org/x/oauth2/jws/jws.go -index 95015648b..6f03a49d3 100644 ---- a/vendor/golang.org/x/oauth2/jws/jws.go -+++ b/vendor/golang.org/x/oauth2/jws/jws.go -@@ -165,11 +165,11 @@ func Encode(header *Header, c *ClaimSet, key *rsa.PrivateKey) (string, error) { - // Verify tests whether the provided JWT token's signature was produced by the private key - // associated with the supplied public key. - func Verify(token string, key *rsa.PublicKey) error { -- parts := strings.Split(token, ".") -- if len(parts) != 3 { -+ if strings.Count(token, ".") != 2 { - return errors.New("jws: invalid token received, token must have 3 parts") - } - -+ parts := strings.SplitN(token, ".", 3) - signedContent := parts[0] + "." + parts[1] - signatureString, err := base64.RawURLEncoding.DecodeString(parts[2]) - if err != nil { diff --git a/SPECS/keda/CVE-2025-22870.patch b/SPECS/keda/CVE-2025-22870.patch deleted file mode 100644 index 9cea4c70dc..0000000000 --- a/SPECS/keda/CVE-2025-22870.patch +++ /dev/null @@ -1,48 +0,0 @@ -From d42c66b8fc868546fc04bac6cb451d6402263fec Mon Sep 17 00:00:00 2001 -From: Sreenivasulu Malavathula -Date: Thu, 3 Apr 2025 13:33:51 -0500 -Subject: [PATCH] Address CVE-2025-22870 -Upstream Patch Reference: https://github.com/golang/go/commit/25177ecde0922c50753c043579d17828b7ee88e7 - ---- - vendor/golang.org/x/net/http/httpproxy/proxy.go | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/http/httpproxy/proxy.go b/vendor/golang.org/x/net/http/httpproxy/proxy.go -index 6404aaf1..d89c257a 100644 ---- a/vendor/golang.org/x/net/http/httpproxy/proxy.go -+++ b/vendor/golang.org/x/net/http/httpproxy/proxy.go -@@ -14,6 +14,7 @@ import ( - "errors" - "fmt" - "net" -+ "net/netip" - "net/url" - "os" - "strings" -@@ -177,8 +178,10 @@ func (cfg *config) useProxy(addr string) bool { - if host == "localhost" { - return false - } -- ip := net.ParseIP(host) -- if ip != nil { -+ nip, err := netip.ParseAddr(host) -+ var ip net.IP -+ if err == nil { -+ ip = net.IP(nip.AsSlice()) - if ip.IsLoopback() { - return false - } -@@ -360,6 +363,9 @@ type domainMatch struct { - } - - func (m domainMatch) match(host, port string, ip net.IP) bool { -+ if ip != nil { -+ return false -+ } - if strings.HasSuffix(host, m.host) || (m.matchHost && host == m.host[1:]) { - return m.port == "" || m.port == port - } --- -2.45.2 - diff --git a/SPECS/keda/CVE-2025-22872.patch b/SPECS/keda/CVE-2025-22872.patch deleted file mode 100644 index e48663a033..0000000000 --- a/SPECS/keda/CVE-2025-22872.patch +++ /dev/null @@ -1,42 +0,0 @@ -From a8476aabe877b168950f4c9a0b68d2e784e621ad Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Fri, 25 Apr 2025 08:16:15 +0000 -Subject: [PATCH] Address CVE-2025-22872 - -Upstream Reference Link : https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9.patch ---- - vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index 3c57880..6598c1f 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType { - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } -- // Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken --- -2.45.2 - diff --git a/SPECS/keda/CVE-2025-27144.patch b/SPECS/keda/CVE-2025-27144.patch deleted file mode 100644 index 43c7dffdef..0000000000 --- a/SPECS/keda/CVE-2025-27144.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 72e5dc031b9ecdc0ba2db04b715bb43b8eefcf59 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Fri, 28 Feb 2025 09:57:57 +0000 -Subject: [PATCH] CVE-2025-27144 - ---- - vendor/github.com/go-jose/go-jose/v4/jwe.go | 5 +++-- - vendor/github.com/go-jose/go-jose/v4/jws.go | 5 +++-- - 2 files changed, 6 insertions(+), 4 deletions(-) - -diff --git a/vendor/github.com/go-jose/go-jose/v4/jwe.go b/vendor/github.com/go-jose/go-jose/v4/jwe.go -index 89f03ee3..9f1322dc 100644 ---- a/vendor/github.com/go-jose/go-jose/v4/jwe.go -+++ b/vendor/github.com/go-jose/go-jose/v4/jwe.go -@@ -288,10 +288,11 @@ func ParseEncryptedCompact( - keyAlgorithms []KeyAlgorithm, - contentEncryption []ContentEncryption, - ) (*JSONWebEncryption, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 5 { -+ // Five parts is four separators -+ if strings.Count(input, ".") != 4 { - return nil, fmt.Errorf("go-jose/go-jose: compact JWE format must have five parts") - } -+ parts := strings.SplitN(input, ".", 5) - - rawProtected, err := base64.RawURLEncoding.DecodeString(parts[0]) - if err != nil { -diff --git a/vendor/github.com/go-jose/go-jose/v4/jws.go b/vendor/github.com/go-jose/go-jose/v4/jws.go -index 3a912301..d09d8ba5 100644 ---- a/vendor/github.com/go-jose/go-jose/v4/jws.go -+++ b/vendor/github.com/go-jose/go-jose/v4/jws.go -@@ -327,10 +327,11 @@ func parseSignedCompact( - payload []byte, - signatureAlgorithms []SignatureAlgorithm, - ) (*JSONWebSignature, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 3 { -+ // Three parts is two separators -+ if strings.Count(input, ".") != 2 { - return nil, fmt.Errorf("go-jose/go-jose: compact JWS format must have three parts") - } -+ parts := strings.SplitN(input, ".", 3) - - if parts[1] != "" && payload != nil { - return nil, fmt.Errorf("go-jose/go-jose: payload is not detached") --- -2.45.2 - diff --git a/SPECS/keda/CVE-2025-29786.patch b/SPECS/keda/CVE-2025-29786.patch deleted file mode 100644 index 43afca11fd..0000000000 --- a/SPECS/keda/CVE-2025-29786.patch +++ /dev/null @@ -1,635 +0,0 @@ -From 387fc2ebedb3b5f54f9494c95506e6163f6f7af5 Mon Sep 17 00:00:00 2001 -From: Kshitiz Godara -Date: Mon, 24 Mar 2025 13:30:36 +0000 -Subject: [PATCH] Fix for CVE-2025-29786 - -Upstream source reference: -https://github.com/expr-lang/expr/pull/762 - -Signed-off-by: Kshitiz Godara ---- - .../github.com/expr-lang/expr/conf/config.go | 52 ++-- - .../expr-lang/expr/parser/parser.go | 228 +++++++++++++----- - vendor/github.com/expr-lang/expr/vm/utils.go | 3 - - vendor/github.com/expr-lang/expr/vm/vm.go | 23 +- - 4 files changed, 213 insertions(+), 93 deletions(-) - -diff --git a/vendor/github.com/expr-lang/expr/conf/config.go b/vendor/github.com/expr-lang/expr/conf/config.go -index 01a407a..2312984 100644 ---- a/vendor/github.com/expr-lang/expr/conf/config.go -+++ b/vendor/github.com/expr-lang/expr/conf/config.go -@@ -9,34 +9,46 @@ import ( - "github.com/expr-lang/expr/vm/runtime" - ) - -+const ( -+ // DefaultMemoryBudget represents an upper limit of memory usage -+ DefaultMemoryBudget uint = 1e6 -+ -+ // DefaultMaxNodes represents an upper limit of AST nodes -+ DefaultMaxNodes uint = 10000 -+) -+ - type FunctionsTable map[string]*builtin.Function - - type Config struct { -- Env any -- Types TypesTable -- MapEnv bool -- DefaultType reflect.Type -- Expect reflect.Kind -- ExpectAny bool -- Optimize bool -- Strict bool -- Profile bool -- ConstFns map[string]reflect.Value -- Visitors []ast.Visitor -- Functions FunctionsTable -- Builtins FunctionsTable -- Disabled map[string]bool // disabled builtins -+ Env any -+ Types TypesTable -+ MapEnv bool -+ DefaultType reflect.Type -+ Expect reflect.Kind -+ ExpectAny bool -+ Optimize bool -+ Strict bool -+ Profile bool -+ MaxNodes uint -+ MemoryBudget uint -+ ConstFns map[string]reflect.Value -+ Visitors []ast.Visitor -+ Functions FunctionsTable -+ Builtins FunctionsTable -+ Disabled map[string]bool // disabled builtins - } - - // CreateNew creates new config with default values. - func CreateNew() *Config { - c := &Config{ -- Optimize: true, -- Types: make(TypesTable), -- ConstFns: make(map[string]reflect.Value), -- Functions: make(map[string]*builtin.Function), -- Builtins: make(map[string]*builtin.Function), -- Disabled: make(map[string]bool), -+ Optimize: true, -+ Types: make(TypesTable), -+ MaxNodes: DefaultMaxNodes, -+ MemoryBudget: DefaultMemoryBudget, -+ ConstFns: make(map[string]reflect.Value), -+ Functions: make(map[string]*builtin.Function), -+ Builtins: make(map[string]*builtin.Function), -+ Disabled: make(map[string]bool), - } - for _, f := range builtin.Builtins { - c.Builtins[f.Name] = f -diff --git a/vendor/github.com/expr-lang/expr/parser/parser.go b/vendor/github.com/expr-lang/expr/parser/parser.go -index 6d96561..a75557c 100644 ---- a/vendor/github.com/expr-lang/expr/parser/parser.go -+++ b/vendor/github.com/expr-lang/expr/parser/parser.go -@@ -45,12 +45,47 @@ var predicates = map[string]struct { - } - - type parser struct { -- tokens []Token -- current Token -- pos int -- err *file.Error -- depth int // closure call depth -- config *conf.Config -+ tokens []Token -+ current Token -+ pos int -+ err *file.Error -+ depth int // closure call depth -+ config *conf.Config -+ nodeCount uint // tracks number of AST nodes created -+} -+ -+// checkNodeLimit verifies that adding a new node won't exceed configured limits -+func (p *parser) checkNodeLimit() error { -+ p.nodeCount++ -+ if p.config.MaxNodes > 0 && p.nodeCount > p.config.MaxNodes { -+ p.error("compilation failed: expression exceeds maximum allowed nodes") -+ return nil -+ } -+ return nil -+} -+ -+// createNode handles creation of regular nodes -+func (p *parser) createNode(n Node, loc file.Location) Node { -+ if err := p.checkNodeLimit(); err != nil { -+ return nil -+ } -+ if n == nil || p.err != nil { -+ return nil -+ } -+ n.SetLocation(loc) -+ return n -+} -+ -+// createMemberNode handles creation of member nodes -+func (p *parser) createMemberNode(n *MemberNode, loc file.Location) *MemberNode { -+ if err := p.checkNodeLimit(); err != nil { -+ return nil -+ } -+ if n == nil || p.err != nil { -+ return nil -+ } -+ n.SetLocation(loc) -+ return n - } - - type Tree struct { -@@ -127,6 +162,10 @@ func (p *parser) expect(kind Kind, values ...string) { - // parse functions - - func (p *parser) parseExpression(precedence int) Node { -+ if p.err != nil { -+ return nil -+ } -+ - if precedence == 0 && p.current.Is(Operator, "let") { - return p.parseVariableDeclaration() - } -@@ -185,19 +224,23 @@ func (p *parser) parseExpression(precedence int) Node { - nodeRight = p.parseExpression(op.Precedence) - } - -- nodeLeft = &BinaryNode{ -+ nodeLeft = p.createNode(&BinaryNode{ - Operator: opToken.Value, - Left: nodeLeft, - Right: nodeRight, -+ }, opToken.Location) -+ if nodeLeft == nil { -+ return nil - } -- nodeLeft.SetLocation(opToken.Location) - - if negate { -- nodeLeft = &UnaryNode{ -+ nodeLeft = p.createNode(&UnaryNode{ - Operator: "not", - Node: nodeLeft, -+ }, notToken.Location) -+ if nodeLeft == nil { -+ return nil - } -- nodeLeft.SetLocation(notToken.Location) - } - - goto next -@@ -224,13 +267,11 @@ func (p *parser) parseVariableDeclaration() Node { - value := p.parseExpression(0) - p.expect(Operator, ";") - node := p.parseExpression(0) -- let := &VariableDeclaratorNode{ -+ return p.createNode(&VariableDeclaratorNode{ - Name: variableName.Value, - Value: value, - Expr: node, -- } -- let.SetLocation(variableName.Location) -- return let -+ }, variableName.Location) - } - - func (p *parser) parseConditional(node Node) Node { -@@ -248,10 +289,13 @@ func (p *parser) parseConditional(node Node) Node { - expr2 = p.parseExpression(0) - } - -- node = &ConditionalNode{ -+ node = p.createNode(&ConditionalNode{ - Cond: node, - Exp1: expr1, - Exp2: expr2, -+ }, p.current.Location) -+ if node == nil { -+ return nil - } - } - return node -@@ -264,11 +308,13 @@ func (p *parser) parsePrimary() Node { - if op, ok := operator.Unary[token.Value]; ok { - p.next() - expr := p.parseExpression(op.Precedence) -- node := &UnaryNode{ -+ node := p.createNode(&UnaryNode{ - Operator: token.Value, - Node: expr, -+ }, token.Location) -+ if node == nil { -+ return nil - } -- node.SetLocation(token.Location) - return p.parsePostfixExpression(node) - } - } -@@ -290,8 +336,10 @@ func (p *parser) parsePrimary() Node { - p.next() - } - } -- node := &PointerNode{Name: name} -- node.SetLocation(token.Location) -+ node := p.createNode(&PointerNode{Name: name}, token.Location) -+ if node == nil { -+ return nil -+ } - return p.parsePostfixExpression(node) - } - } else { -@@ -320,23 +368,31 @@ func (p *parser) parseSecondary() Node { - p.next() - switch token.Value { - case "true": -- node := &BoolNode{Value: true} -- node.SetLocation(token.Location) -+ node = p.createNode(&BoolNode{Value: true}, token.Location) -+ if node == nil { -+ return nil -+ } - return node - case "false": -- node := &BoolNode{Value: false} -- node.SetLocation(token.Location) -+ node = p.createNode(&BoolNode{Value: false}, token.Location) -+ if node == nil { -+ return nil -+ } - return node - case "nil": -- node := &NilNode{} -- node.SetLocation(token.Location) -+ node = p.createNode(&NilNode{}, token.Location) -+ if node == nil { -+ return nil -+ } - return node - default: - if p.current.Is(Bracket, "(") { - node = p.parseCall(token, []Node{}, true) - } else { -- node = &IdentifierNode{Value: token.Value} -- node.SetLocation(token.Location) -+ node = p.createNode(&IdentifierNode{Value: token.Value}, token.Location) -+ if node == nil { -+ return nil -+ } - } - } - -@@ -383,8 +439,10 @@ func (p *parser) parseSecondary() Node { - return node - case String: - p.next() -- node = &StringNode{Value: token.Value} -- node.SetLocation(token.Location) -+ node = p.createNode(&StringNode{Value: token.Value}, token.Location) -+ if node == nil { -+ return nil -+ } - - default: - if token.Is(Bracket, "[") { -@@ -404,7 +462,7 @@ func (p *parser) toIntegerNode(number int64) Node { - p.error("integer literal is too large") - return nil - } -- return &IntegerNode{Value: int(number)} -+ return p.createNode(&IntegerNode{Value: int(number)}, p.current.Location) - } - - func (p *parser) toFloatNode(number float64) Node { -@@ -412,7 +470,7 @@ func (p *parser) toFloatNode(number float64) Node { - p.error("float literal is too large") - return nil - } -- return &FloatNode{Value: number} -+ return p.createNode(&FloatNode{Value: number}, p.current.Location) - } - - func (p *parser) parseCall(token Token, arguments []Node, checkOverrides bool) Node { -@@ -454,25 +512,34 @@ func (p *parser) parseCall(token Token, arguments []Node, checkOverrides bool) N - - p.expect(Bracket, ")") - -- node = &BuiltinNode{ -+ node = p.createNode(&BuiltinNode{ - Name: token.Value, - Arguments: arguments, -+ }, token.Location) -+ if node == nil { -+ return nil - } -- node.SetLocation(token.Location) - } else if _, ok := builtin.Index[token.Value]; ok && !p.config.Disabled[token.Value] && !isOverridden { -- node = &BuiltinNode{ -+ node = p.createNode(&BuiltinNode{ - Name: token.Value, - Arguments: p.parseArguments(arguments), -+ }, token.Location) -+ if node == nil { -+ return nil - } -- node.SetLocation(token.Location) -+ - } else { -- callee := &IdentifierNode{Value: token.Value} -- callee.SetLocation(token.Location) -- node = &CallNode{ -+ callee := p.createNode(&IdentifierNode{Value: token.Value}, token.Location) -+ if callee == nil { -+ return nil -+ } -+ node = p.createNode(&CallNode{ - Callee: callee, - Arguments: p.parseArguments(arguments), -+ }, token.Location) -+ if node == nil { -+ return nil - } -- node.SetLocation(token.Location) - } - return node - } -@@ -534,8 +601,10 @@ func (p *parser) parseArrayExpression(token Token) Node { - end: - p.expect(Bracket, "]") - -- node := &ArrayNode{Nodes: nodes} -- node.SetLocation(token.Location) -+ node := p.createNode(&ArrayNode{Nodes: nodes}, token.Location) -+ if node == nil { -+ return nil -+ } - return node - } - -@@ -561,8 +630,10 @@ func (p *parser) parseMapExpression(token Token) Node { - // * identifier, which is equivalent to a string - // * expression, which must be enclosed in parentheses -- (1 + 2) - if p.current.Is(Number) || p.current.Is(String) || p.current.Is(Identifier) { -- key = &StringNode{Value: p.current.Value} -- key.SetLocation(token.Location) -+ key = p.createNode(&StringNode{Value: p.current.Value}, p.current.Location) -+ if key == nil { -+ return nil -+ } - p.next() - } else if p.current.Is(Bracket, "(") { - key = p.parseExpression(0) -@@ -573,16 +644,20 @@ func (p *parser) parseMapExpression(token Token) Node { - p.expect(Operator, ":") - - node := p.parseExpression(0) -- pair := &PairNode{Key: key, Value: node} -- pair.SetLocation(token.Location) -+ pair := p.createNode(&PairNode{Key: key, Value: node}, token.Location) -+ if pair == nil { -+ return nil -+ } - nodes = append(nodes, pair) - } - - end: - p.expect(Bracket, "}") - -- node := &MapNode{Pairs: nodes} -- node.SetLocation(token.Location) -+ node := p.createNode(&MapNode{Pairs: nodes}, token.Location) -+ if node == nil { -+ return nil -+ } - return node - } - -@@ -607,8 +682,10 @@ func (p *parser) parsePostfixExpression(node Node) Node { - p.error("expected name") - } - -- property := &StringNode{Value: propertyToken.Value} -- property.SetLocation(propertyToken.Location) -+ property := p.createNode(&StringNode{Value: propertyToken.Value}, propertyToken.Location) -+ if property == nil { -+ return nil -+ } - - chainNode, isChain := node.(*ChainNode) - optional := postfixToken.Value == "?." -@@ -617,26 +694,33 @@ func (p *parser) parsePostfixExpression(node Node) Node { - node = chainNode.Node - } - -- memberNode := &MemberNode{ -+ memberNode := p.createMemberNode(&MemberNode{ - Node: node, - Property: property, - Optional: optional, -+ }, propertyToken.Location) -+ if memberNode == nil { -+ return nil - } -- memberNode.SetLocation(propertyToken.Location) - - if p.current.Is(Bracket, "(") { - memberNode.Method = true -- node = &CallNode{ -+ node = p.createNode(&CallNode{ - Callee: memberNode, - Arguments: p.parseArguments([]Node{}), -+ }, propertyToken.Location) -+ if node == nil { -+ return nil - } -- node.SetLocation(propertyToken.Location) - } else { - node = memberNode - } - - if isChain || optional { -- node = &ChainNode{Node: node} -+ node = p.createNode(&ChainNode{Node: node}, propertyToken.Location) -+ if node == nil { -+ return nil -+ } - } - - } else if postfixToken.Value == "[" { -@@ -650,11 +734,13 @@ func (p *parser) parsePostfixExpression(node Node) Node { - to = p.parseExpression(0) - } - -- node = &SliceNode{ -+ node = p.createNode(&SliceNode{ - Node: node, - To: to, -+ }, postfixToken.Location) -+ if node == nil { -+ return nil - } -- node.SetLocation(postfixToken.Location) - p.expect(Bracket, "]") - - } else { -@@ -668,25 +754,32 @@ func (p *parser) parsePostfixExpression(node Node) Node { - to = p.parseExpression(0) - } - -- node = &SliceNode{ -+ node = p.createNode(&SliceNode{ - Node: node, - From: from, - To: to, -+ }, postfixToken.Location) -+ if node == nil { -+ return nil - } -- node.SetLocation(postfixToken.Location) - p.expect(Bracket, "]") - - } else { - // Slice operator [:] was not found, - // it should be just an index node. -- node = &MemberNode{ -+ node = p.createNode(&MemberNode{ - Node: node, - Property: from, - Optional: optional, -+ }, postfixToken.Location) -+ if node == nil { -+ return nil - } -- node.SetLocation(postfixToken.Location) - if optional { -- node = &ChainNode{Node: node} -+ node = p.createNode(&ChainNode{Node: node}, postfixToken.Location) -+ if node == nil { -+ return nil -+ } - } - p.expect(Bracket, "]") - } -@@ -698,26 +791,29 @@ func (p *parser) parsePostfixExpression(node Node) Node { - } - return node - } -- - func (p *parser) parseComparison(left Node, token Token, precedence int) Node { - var rootNode Node - for { - comparator := p.parseExpression(precedence + 1) -- cmpNode := &BinaryNode{ -+ cmpNode := p.createNode(&BinaryNode{ - Operator: token.Value, - Left: left, - Right: comparator, -+ }, token.Location) -+ if cmpNode == nil { -+ return nil - } -- cmpNode.SetLocation(token.Location) - if rootNode == nil { - rootNode = cmpNode - } else { -- rootNode = &BinaryNode{ -+ rootNode = p.createNode(&BinaryNode{ - Operator: "&&", - Left: rootNode, - Right: cmpNode, -+ }, token.Location) -+ if rootNode == nil { -+ return nil - } -- rootNode.SetLocation(token.Location) - } - - left = comparator -diff --git a/vendor/github.com/expr-lang/expr/vm/utils.go b/vendor/github.com/expr-lang/expr/vm/utils.go -index fc2f5e7..1100513 100644 ---- a/vendor/github.com/expr-lang/expr/vm/utils.go -+++ b/vendor/github.com/expr-lang/expr/vm/utils.go -@@ -11,9 +11,6 @@ type ( - ) - - var ( -- // MemoryBudget represents an upper limit of memory usage. -- MemoryBudget uint = 1e6 -- - errorType = reflect.TypeOf((*error)(nil)).Elem() - ) - -diff --git a/vendor/github.com/expr-lang/expr/vm/vm.go b/vendor/github.com/expr-lang/expr/vm/vm.go -index 7e933ce..b497990 100644 ---- a/vendor/github.com/expr-lang/expr/vm/vm.go -+++ b/vendor/github.com/expr-lang/expr/vm/vm.go -@@ -11,6 +11,7 @@ import ( - "time" - - "github.com/expr-lang/expr/builtin" -+ "github.com/expr-lang/expr/conf" - "github.com/expr-lang/expr/file" - "github.com/expr-lang/expr/internal/deref" - "github.com/expr-lang/expr/vm/runtime" -@@ -20,11 +21,23 @@ func Run(program *Program, env any) (any, error) { - if program == nil { - return nil, fmt.Errorf("program is nil") - } -- - vm := VM{} - return vm.Run(program, env) - } - -+func RunWithConfig(program *Program, env any, config *conf.Config) (any, error) { -+ if program == nil { -+ return nil, fmt.Errorf("program is nil") -+ } -+ if config == nil { -+ return nil, fmt.Errorf("config is nil") -+ } -+ vm := VM{ -+ MemoryBudget: config.MemoryBudget, -+ } -+ return vm.Run(program, env) -+} -+ - func Debug() *VM { - vm := &VM{ - debug: true, -@@ -38,9 +51,9 @@ type VM struct { - Stack []any - Scopes []*Scope - Variables []any -+ MemoryBudget uint - ip int - memory uint -- memoryBudget uint - debug bool - step chan struct{} - curr chan int -@@ -76,7 +89,9 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { - vm.Variables = make([]any, program.variables) - } - -- vm.memoryBudget = MemoryBudget -+ if vm.MemoryBudget == 0 { -+ vm.MemoryBudget = conf.DefaultMemoryBudget -+ } - vm.memory = 0 - vm.ip = 0 - -@@ -580,7 +595,7 @@ func (vm *VM) pop() any { - - func (vm *VM) memGrow(size uint) { - vm.memory += size -- if vm.memory >= vm.memoryBudget { -+ if vm.memory >= vm.MemoryBudget { - panic("memory budget exceeded") - } - } --- -2.48.1.431.g5a526e5e18 - diff --git a/SPECS/keda/CVE-2025-29923.patch b/SPECS/keda/CVE-2025-29923.patch deleted file mode 100644 index 7725f36142..0000000000 --- a/SPECS/keda/CVE-2025-29923.patch +++ /dev/null @@ -1,273 +0,0 @@ -From 0f6b06d4ffc97cc1304b0b861646bd7e16d08bbe Mon Sep 17 00:00:00 2001 -From: Sudipta Pandit -Date: Thu, 17 Apr 2025 16:54:13 +0530 -Subject: [PATCH] Fix CVE-2025-29923 in vendor redis-go - -Fix wrong patch: https://github.com/microsoft/azurelinux/pull/13201 ---- - .../github.com/redis/go-redis/v9/options.go | 14 +++++++++- - .../redis/go-redis/v9/osscluster.go | 18 ++++++++++-- - vendor/github.com/redis/go-redis/v9/redis.go | 8 ++++-- - vendor/github.com/redis/go-redis/v9/ring.go | 19 +++++++++++-- - .../github.com/redis/go-redis/v9/sentinel.go | 28 ++++++++++++++++--- - .../github.com/redis/go-redis/v9/universal.go | 24 +++++++++++++--- - 6 files changed, 95 insertions(+), 16 deletions(-) - -diff --git a/vendor/github.com/redis/go-redis/v9/options.go b/vendor/github.com/redis/go-redis/v9/options.go -index dff52ae8..567ed0ef 100644 ---- a/vendor/github.com/redis/go-redis/v9/options.go -+++ b/vendor/github.com/redis/go-redis/v9/options.go -@@ -142,11 +142,23 @@ type Options struct { - // Enables read only queries on slave/follower nodes. - readOnly bool - -- // Disable set-lib on connect. Default is false. -+ // DisableIndentity - Disable set-lib on connect. -+ // -+ // default: false -+ // -+ // Deprecated: Use DisableIdentity instead. - DisableIndentity bool - -+ // DisableIdentity is used to disable CLIENT SETINFO command on connect. -+ // -+ // default: false -+ DisableIdentity bool -+ - // Add suffix to client name. Default is empty. - IdentitySuffix string -+ -+ // UnstableResp3 enables Unstable mode for Redis Search module with RESP3. -+ UnstableResp3 bool - } - - func (opt *Options) init() { -diff --git a/vendor/github.com/redis/go-redis/v9/osscluster.go b/vendor/github.com/redis/go-redis/v9/osscluster.go -index 17f98d9d..c67244c8 100644 ---- a/vendor/github.com/redis/go-redis/v9/osscluster.go -+++ b/vendor/github.com/redis/go-redis/v9/osscluster.go -@@ -85,8 +85,19 @@ type ClusterOptions struct { - ConnMaxIdleTime time.Duration - ConnMaxLifetime time.Duration - -- TLSConfig *tls.Config -- DisableIndentity bool // Disable set-lib on connect. Default is false. -+ TLSConfig *tls.Config -+ -+ // DisableIndentity - Disable set-lib on connect. -+ // -+ // default: false -+ // -+ // Deprecated: Use DisableIdentity instead. -+ DisableIndentity bool -+ -+ // DisableIdentity is used to disable CLIENT SETINFO command on connect. -+ // -+ // default: false -+ DisableIdentity bool - - IdentitySuffix string // Add suffix to client name. Default is empty. - } -@@ -294,7 +305,8 @@ func (opt *ClusterOptions) clientOptions() *Options { - MaxActiveConns: opt.MaxActiveConns, - ConnMaxIdleTime: opt.ConnMaxIdleTime, - ConnMaxLifetime: opt.ConnMaxLifetime, -- DisableIndentity: opt.DisableIndentity, -+ DisableIdentity: opt.DisableIdentity, -+ DisableIndentity: opt.DisableIdentity, - IdentitySuffix: opt.IdentitySuffix, - TLSConfig: opt.TLSConfig, - // If ClusterSlots is populated, then we probably have an artificial -diff --git a/vendor/github.com/redis/go-redis/v9/redis.go b/vendor/github.com/redis/go-redis/v9/redis.go -index d25a0d31..46b955bb 100644 ---- a/vendor/github.com/redis/go-redis/v9/redis.go -+++ b/vendor/github.com/redis/go-redis/v9/redis.go -@@ -340,7 +340,7 @@ func (c *baseClient) initConn(ctx context.Context, cn *pool.Conn) error { - return err - } - -- if !c.opt.DisableIndentity { -+ if !c.opt.DisableIdentity && !c.opt.DisableIndentity { - libName := "" - libVer := Version() - if c.opt.IdentitySuffix != "" { -@@ -349,7 +349,11 @@ func (c *baseClient) initConn(ctx context.Context, cn *pool.Conn) error { - p := conn.Pipeline() - p.ClientSetInfo(ctx, WithLibraryName(libName)) - p.ClientSetInfo(ctx, WithLibraryVersion(libVer)) -- _, _ = p.Exec(ctx) -+ // Handle network errors (e.g. timeouts) in CLIENT SETINFO to avoid -+ // out of order responses later on. -+ if _, err = p.Exec(ctx); err != nil && !isRedisError(err) { -+ return err -+ } - } - - if c.opt.OnConnect != nil { -diff --git a/vendor/github.com/redis/go-redis/v9/ring.go b/vendor/github.com/redis/go-redis/v9/ring.go -index 4ae00542..a8a00cd0 100644 ---- a/vendor/github.com/redis/go-redis/v9/ring.go -+++ b/vendor/github.com/redis/go-redis/v9/ring.go -@@ -98,8 +98,20 @@ type RingOptions struct { - TLSConfig *tls.Config - Limiter Limiter - -+ // DisableIndentity - Disable set-lib on connect. -+ // -+ // default: false -+ // -+ // Deprecated: Use DisableIdentity instead. -+ - DisableIndentity bool -- IdentitySuffix string -+ -+ // DisableIdentity is used to disable CLIENT SETINFO command on connect. -+ // -+ // default: false -+ DisableIdentity bool -+ IdentitySuffix string -+ UnstableResp3 bool - } - - func (opt *RingOptions) init() { -@@ -166,8 +178,11 @@ func (opt *RingOptions) clientOptions() *Options { - TLSConfig: opt.TLSConfig, - Limiter: opt.Limiter, - -+ DisableIdentity: opt.DisableIdentity, -+ - DisableIndentity: opt.DisableIndentity, -- IdentitySuffix: opt.IdentitySuffix, -+ IdentitySuffix: opt.IdentitySuffix, -+ UnstableResp3: opt.UnstableResp3, - } - } - -diff --git a/vendor/github.com/redis/go-redis/v9/sentinel.go b/vendor/github.com/redis/go-redis/v9/sentinel.go -index 188f8849..2988e300 100644 ---- a/vendor/github.com/redis/go-redis/v9/sentinel.go -+++ b/vendor/github.com/redis/go-redis/v9/sentinel.go -@@ -80,8 +80,20 @@ type FailoverOptions struct { - - TLSConfig *tls.Config - -+ // DisableIndentity - Disable set-lib on connect. -+ // -+ // default: false -+ // -+ // Deprecated: Use DisableIdentity instead. - DisableIndentity bool -- IdentitySuffix string -+ -+ // DisableIdentity is used to disable CLIENT SETINFO command on connect. -+ // -+ // default: false -+ DisableIdentity bool -+ -+ IdentitySuffix string -+ UnstableResp3 bool - } - - func (opt *FailoverOptions) clientOptions() *Options { -@@ -117,8 +129,12 @@ func (opt *FailoverOptions) clientOptions() *Options { - - TLSConfig: opt.TLSConfig, - -+ DisableIdentity: opt.DisableIdentity, -+ - DisableIndentity: opt.DisableIndentity, -- IdentitySuffix: opt.IdentitySuffix, -+ -+ IdentitySuffix: opt.IdentitySuffix, -+ UnstableResp3: opt.UnstableResp3, - } - } - -@@ -153,9 +169,11 @@ func (opt *FailoverOptions) sentinelOptions(addr string) *Options { - ConnMaxLifetime: opt.ConnMaxLifetime, - - TLSConfig: opt.TLSConfig, -+ DisableIdentity: opt.DisableIdentity, - - DisableIndentity: opt.DisableIndentity, -- IdentitySuffix: opt.IdentitySuffix, -+ IdentitySuffix: opt.IdentitySuffix, -+ UnstableResp3: opt.UnstableResp3, - } - } - -@@ -194,8 +212,10 @@ func (opt *FailoverOptions) clusterOptions() *ClusterOptions { - - TLSConfig: opt.TLSConfig, - -+ DisableIdentity: opt.DisableIdentity, -+ - DisableIndentity: opt.DisableIndentity, -- IdentitySuffix: opt.IdentitySuffix, -+ IdentitySuffix: opt.IdentitySuffix, - } - } - -diff --git a/vendor/github.com/redis/go-redis/v9/universal.go b/vendor/github.com/redis/go-redis/v9/universal.go -index 275bef3d..1ec64269 100644 ---- a/vendor/github.com/redis/go-redis/v9/universal.go -+++ b/vendor/github.com/redis/go-redis/v9/universal.go -@@ -61,14 +61,25 @@ type UniversalOptions struct { - RouteByLatency bool - RouteRandomly bool - -- // The sentinel master name. -- // Only failover clients. -+ // MasterName is the sentinel master name. -+ // Only for failover clients. - - MasterName string - -+ // DisableIndentity - Disable set-lib on connect. -+ // -+ // default: false -+ // -+ // Deprecated: Use DisableIdentity instead. - DisableIndentity bool -- IdentitySuffix string --} -+ -+ // DisableIdentity is used to disable CLIENT SETINFO command on connect. -+ // -+ // default: false -+ DisableIdentity bool -+ -+ IdentitySuffix string -+ UnstableResp3 bool} - - // Cluster returns cluster options created from the universal options. - func (o *UniversalOptions) Cluster() *ClusterOptions { -@@ -112,6 +123,7 @@ func (o *UniversalOptions) Cluster() *ClusterOptions { - - TLSConfig: o.TLSConfig, - -+ DisableIdentity: o.DisableIdentity, - DisableIndentity: o.DisableIndentity, - IdentitySuffix: o.IdentitySuffix, - } -@@ -158,6 +170,9 @@ func (o *UniversalOptions) Failover() *FailoverOptions { - - TLSConfig: o.TLSConfig, - -+ ReplicaOnly: o.ReadOnly, -+ -+ DisableIdentity: o.DisableIdentity, - DisableIndentity: o.DisableIndentity, - IdentitySuffix: o.IdentitySuffix, - } -@@ -201,6 +216,7 @@ func (o *UniversalOptions) Simple() *Options { - - TLSConfig: o.TLSConfig, - -+ DisableIdentity: o.DisableIdentity, - DisableIndentity: o.DisableIndentity, - IdentitySuffix: o.IdentitySuffix, - } --- -2.34.1 - diff --git a/SPECS/keda/CVE-2025-30204.patch b/SPECS/keda/CVE-2025-30204.patch deleted file mode 100644 index 6eb7de916b..0000000000 --- a/SPECS/keda/CVE-2025-30204.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 84c7f3d0b9dccb4a20d0ad4de10896d40344ba26 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Fri, 28 Mar 2025 20:43:26 +0000 -Subject: [PATCH] CVE-2025-30204 -Upstream Patch Reference : -v4 : https://github.com/golang-jwt/jwt/commit/2f0e9add62078527821828c76865661aa7718a84 -v5 : https://github.com/golang-jwt/jwt/commit/0951d184286dece21f73c85673fd308786ffe9c3 ---- - github.com/golang-jwt/jwt/v4/parser.go | 36 +++++++++++++++++++++++--- - github.com/golang-jwt/jwt/v5/parser.go | 36 +++++++++++++++++++++++--- - 2 files changed, 66 insertions(+), 6 deletions(-) - -diff --git a/vendor/github.com/golang-jwt/jwt/v4/parser.go b/vendor/github.com/golang-jwt/jwt/v4/parser.go -index c0a6f69..8e7e67c 100644 ---- a/vendor/github.com/golang-jwt/jwt/v4/parser.go -+++ b/vendor/github.com/golang-jwt/jwt/v4/parser.go -@@ -7,6 +7,8 @@ import ( - "strings" - ) - -+const tokenDelimiter = "." -+ - type Parser struct { - // If populated, only these methods will be considered valid. - // -@@ -123,9 +125,10 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - // It's only ever useful in cases where you know the signature is valid (because it has - // been checked previously in the stack) and you want to extract values from it. - func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { -- parts = strings.Split(tokenString, ".") -- if len(parts) != 3 { -- return nil, parts, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) -+ var ok bool -+ parts, ok = splitToken(tokenString) -+ if !ok { -+ return nil, nil, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) - } - - token = &Token{Raw: tokenString} -@@ -175,3 +178,30 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke - - return token, parts, nil - } -+ -+// splitToken splits a token string into three parts: header, claims, and signature. It will only -+// return true if the token contains exactly two delimiters and three parts. In all other cases, it -+// will return nil parts and false. -+func splitToken(token string) ([]string, bool) { -+ parts := make([]string, 3) -+ header, remain, ok := strings.Cut(token, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[0] = header -+ claims, remain, ok := strings.Cut(remain, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[1] = claims -+ // One more cut to ensure the signature is the last part of the token and there are no more -+ // delimiters. This avoids an issue where malicious input could contain additional delimiters -+ // causing unecessary overhead parsing tokens. -+ signature, _, unexpected := strings.Cut(remain, tokenDelimiter) -+ if unexpected { -+ return nil, false -+ } -+ parts[2] = signature -+ -+ return parts, true -+} -diff --git a/vendor/github.com/golang-jwt/jwt/v5/parser.go b/vendor/github.com/golang-jwt/jwt/v5/parser.go -index ecf99af..054c7eb 100644 ---- a/vendor/github.com/golang-jwt/jwt/v5/parser.go -+++ b/vendor/github.com/golang-jwt/jwt/v5/parser.go -@@ -8,6 +8,8 @@ import ( - "strings" - ) - -+const tokenDelimiter = "." -+ - type Parser struct { - // If populated, only these methods will be considered valid. - validMethods []string -@@ -136,9 +138,10 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - // It's only ever useful in cases where you know the signature is valid (since it has already - // been or will be checked elsewhere in the stack) and you want to extract values from it. - func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { -- parts = strings.Split(tokenString, ".") -- if len(parts) != 3 { -- return nil, parts, newError("token contains an invalid number of segments", ErrTokenMalformed) -+ var ok bool -+ parts, ok = splitToken(tokenString) -+ if !ok { -+ return nil, nil, newError("token contains an invalid number of segments", ErrTokenMalformed) - } - - token = &Token{Raw: tokenString} -@@ -196,6 +199,33 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke - return token, parts, nil - } - -+// splitToken splits a token string into three parts: header, claims, and signature. It will only -+// return true if the token contains exactly two delimiters and three parts. In all other cases, it -+// will return nil parts and false. -+func splitToken(token string) ([]string, bool) { -+ parts := make([]string, 3) -+ header, remain, ok := strings.Cut(token, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[0] = header -+ claims, remain, ok := strings.Cut(remain, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[1] = claims -+ // One more cut to ensure the signature is the last part of the token and there are no more -+ // delimiters. This avoids an issue where malicious input could contain additional delimiters -+ // causing unecessary overhead parsing tokens. -+ signature, _, unexpected := strings.Cut(remain, tokenDelimiter) -+ if unexpected { -+ return nil, false -+ } -+ parts[2] = signature -+ -+ return parts, true -+} -+ - // DecodeSegment decodes a JWT specific base64url encoding. This function will - // take into account whether the [Parser] is configured with additional options, - // such as [WithStrictDecoding] or [WithPaddingAllowed]. --- -2.45.2 - diff --git a/SPECS/keda/keda.signatures.json b/SPECS/keda/keda.signatures.json deleted file mode 100644 index 04ea160db2..0000000000 --- a/SPECS/keda/keda.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "keda-2.14.1-vendor.tar.gz": "8bd0e8a26be3011de6455166874e3613ce39e99f6e7c8af49eae7cbf05d02efe", - "keda-2.14.1.tar.gz": "5a843fccb39f23ea4de03a88a803129223baf9131ec802bbae438cb83bcf3272" - } -} diff --git a/SPECS/keda/keda.spec b/SPECS/keda/keda.spec deleted file mode 100644 index 32f08ac729..0000000000 --- a/SPECS/keda/keda.spec +++ /dev/null @@ -1,147 +0,0 @@ -Summary: Kubernetes-based Event Driven Autoscaling -Name: keda -Version: 2.14.1 -Release: 8%{?dist} -License: ASL 2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -URL: https://github.com/kedacore/keda -#Source0: https://github.com/kedacore/%%{name}/archive/refs/tags/v%%{version}.tar.gz -Source0: %{name}-%{version}.tar.gz -# Below is a manually created tarball, no download link. -# We're using pre-populated Go modules from this tarball, since network is disabled during build time. -# How to re-build this file: -# 1. wget https://github.com/kedacore/%%{name}/archive/refs/tags/v%%{version}.tar.gz -O %%{name}-%%{version}.tar.gz -# 2. tar -xf %%{name}-%%{version}.tar.gz -# 3. cd %%{name}-%%{version} -# 4. go mod vendor -# 5. tar --sort=name \ -# --mtime="2021-04-26 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cf %%{name}-%%{version}-vendor.tar.gz vendor -# -Source1: %{name}-%{version}-vendor.tar.gz -Patch0: CVE-2024-6104.patch -Patch1: CVE-2024-45338.patch -Patch2: CVE-2025-27144.patch -Patch3: CVE-2025-22868.patch -Patch4: CVE-2025-29786.patch -Patch5: CVE-2025-30204.patch -Patch6: CVE-2025-29923.patch -Patch7: CVE-2025-22870.patch -Patch8: CVE-2024-51744.patch -Patch9: CVE-2025-22872.patch -BuildRequires: golang >= 1.15 - -%description -KEDA is a Kubernetes-based Event Driven Autoscaling component. -It provides event driven scale for any container running in Kubernetes - -%prep -%autosetup -p1 -a1 - -%build -export LDFLAGS="-X=github.com/kedacore/keda/v2/version.GitCommit= -X=github.com/kedacore/keda/v2/version.Version=main" - -go build -ldflags "$LDFLAGS" -mod=vendor -v -o bin/keda cmd/operator/main.go - -gofmt -l -w -s . -go vet ./... - -go build -ldflags "$LDFLAGS" -mod=vendor -v -o bin/keda-adapter cmd/adapter/main.go - -go build -ldflags "$LDFLAGS" -mod=vendor -v -o bin/keda-admission-webhooks cmd/webhooks/main.go - -%install -mkdir -p %{buildroot}%{_bindir} -cp ./bin/keda %{buildroot}%{_bindir} -cp ./bin/keda-adapter %{buildroot}%{_bindir} -cp ./bin/keda-admission-webhooks %{buildroot}%{_bindir} - -%files -%defattr(-,root,root) -%license LICENSE -%{_bindir}/%{name} -%{_bindir}/%{name}-adapter -%{_bindir}/%{name}-admission-webhooks - -%changelog -* Fri May 30 2025 Ranjan Dutta - 2.14.1-8 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22872 -- Fixes an incorrect patch introduced with the patch for CVE-2025-29923 -- Fixes patches being overridden during the build step -- Fixes CVE-2025-22870 and CVE-2024-51744 - - -* Fri Apr 28 2025 Ranjan Dutta - 2.14.1-5 -- merge from Azure Linux tag 3.0.20250423-3.0 -- Patch CVE-2025-30204, CVE-2025-29923 -- Fix CVE-2025-29786 with an upstream patch - -* Fri Mar 21 2025 Anuj Mittal - 2.14.1-4 -- Bump Release to rebuild - -* Mon Mar 03 2025 Kanishk Bansal - 2.14.1-3 -- Fix CVE-2025-27144, CVE-2025-22868 with an upstream patch - -* Wed Jan 08 2025 - 2.14.1-2 -- Add patch for CVE-2024-45338 - -* Fri Sep 27 2024 Archana Choudhary - 2.14.1-1 -- Upgrade to 2.14.1 -- Fix CVE-2024-35255 in github.com/Azure/azure-sdk-for-go/sdk/azidentity - -* Thu Aug 01 2024 Bala - 2.14.0-2 -- Added CVE-2024-6104.patch - -* Mon May 06 2024 Sean Dougherty - 2.14.0-1 -- Upgrade to 2.14.0 for Azure Linux 3.0 -- Added keda-admission-webhooks binary, added to KEDA in v2.10.0 - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 2.4.0-15 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 2.4.0-14 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 2.4.0-13 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 2.4.0-12 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 2.4.0-11 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 2.4.0-10 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 2.4.0-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 2.4.0-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 2.4.0-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 2.4.0-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 2.4.0-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 2.4.0-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 2.4.0-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 2.4.0-2 -- Bump release to rebuild with golang 1.18.3 -- License verified - -* Wed Aug 25 2021 Henry Li - 2.4.0-1 -- Original version for CBL-Mariner diff --git a/SPECS/kexec-tools/51_kexec_tools.cfg b/SPECS/kexec-tools/51_kexec_tools.cfg new file mode 100644 index 0000000000..71c2b7d934 --- /dev/null +++ b/SPECS/kexec-tools/51_kexec_tools.cfg @@ -0,0 +1 @@ +GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX crashkernel=512M-32G:256M,32G-:512M" diff --git a/SPECS/kexec-tools/98-kexec.rules b/SPECS/kexec-tools/98-kexec.rules new file mode 100644 index 0000000000..b73b701ef9 --- /dev/null +++ b/SPECS/kexec-tools/98-kexec.rules @@ -0,0 +1,16 @@ +SUBSYSTEM=="cpu", ACTION=="add", GOTO="kdump_reload" +SUBSYSTEM=="cpu", ACTION=="remove", GOTO="kdump_reload" +SUBSYSTEM=="memory", ACTION=="online", GOTO="kdump_reload" +SUBSYSTEM=="memory", ACTION=="offline", GOTO="kdump_reload" + +GOTO="kdump_reload_end" + +LABEL="kdump_reload" + +# If kdump is not loaded, calling kdump-udev-throttle will end up +# doing nothing, but systemd-run will always generate extra logs for +# each call, so trigger the kdump-udev-throttler only if kdump +# service is active to avoid unnecessary logs +RUN+="/bin/sh -c '/usr/bin/systemctl is-active kdump.service || exit 0; /usr/bin/systemd-run --quiet --no-block /usr/lib/udev/kdump-udev-throttler'" + +LABEL="kdump_reload_end" diff --git a/SPECS/kexec-tools/dracut-early-kdump-module-setup.sh b/SPECS/kexec-tools/dracut-early-kdump-module-setup.sh new file mode 100755 index 0000000000..e069867042 --- /dev/null +++ b/SPECS/kexec-tools/dracut-early-kdump-module-setup.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +. /etc/sysconfig/kdump +. /lib/kdump/kdump-lib.sh + +KDUMP_KERNEL="" +KDUMP_INITRD="" + +check() { + if [ ! -f /etc/sysconfig/kdump ] || [ ! -f /lib/kdump/kdump-lib.sh ]\ + || [ -n "${IN_KDUMP}" ] + then + return 1 + fi + return 255 +} + +depends() { + echo "base shutdown" + return 0 +} + +prepare_kernel_initrd() { + KDUMP_BOOTDIR=$(check_boot_dir "${KDUMP_BOOTDIR}") + if [ -z "$KDUMP_KERNELVER" ]; then + kdump_kver=`uname -r` + if [ "$kernel" != "$kdump_kver" ]; then + dwarn "Using current kernel version '$kdump_kver' for early kdump," \ + "but the initramfs is generated for kernel version '$kernel'" + fi + else + kdump_kver=$KDUMP_KERNELVER + fi + KDUMP_KERNEL="${KDUMP_BOOTDIR}/${KDUMP_IMG}-${kdump_kver}${KDUMP_IMG_EXT}" + KDUMP_INITRD="${KDUMP_BOOTDIR}/initramfs-${kdump_kver}kdump.img" +} + +install() { + prepare_kernel_initrd + if [ ! -f "$KDUMP_KERNEL" ]; then + derror "Could not find required kernel for earlykdump," \ + "earlykdump will not work!" + return 1 + fi + if [ ! -f "$KDUMP_INITRD" ]; then + derror "Could not find required kdump initramfs for earlykdump," \ + "please ensure kdump initramfs is generated first," \ + "earlykdump will not work!" + return 1 + fi + + inst_multiple tail find cut dirname hexdump + inst_simple "/etc/sysconfig/kdump" + inst_binary "/usr/sbin/kexec" + inst_binary "/usr/bin/gawk" "/usr/bin/awk" + inst_script "/lib/kdump/kdump-lib.sh" "/lib/kdump-lib.sh" + inst_hook cmdline 00 "$moddir/early-kdump.sh" + inst_binary "$KDUMP_KERNEL" + inst_binary "$KDUMP_INITRD" + + ln_r "$KDUMP_KERNEL" "${KDUMP_BOOTDIR}/${KDUMP_IMG}-earlykdump${KDUMP_IMG_EXT}" + ln_r "$KDUMP_INITRD" "${KDUMP_BOOTDIR}/initramfs-earlykdump.img" + + chmod -x "${initdir}/$KDUMP_KERNEL" +} diff --git a/SPECS/kexec-tools/dracut-early-kdump.sh b/SPECS/kexec-tools/dracut-early-kdump.sh new file mode 100755 index 0000000000..69a34eb996 --- /dev/null +++ b/SPECS/kexec-tools/dracut-early-kdump.sh @@ -0,0 +1,75 @@ +#! /bin/sh + +KEXEC=/sbin/kexec +standard_kexec_args="-p" + +EARLY_KDUMP_INITRD="" +EARLY_KDUMP_KERNEL="" +EARLY_KDUMP_CMDLINE="" +EARLY_KDUMP_KERNELVER="" +EARLY_KEXEC_ARGS="" + +. /etc/sysconfig/kdump +. /lib/dracut-lib.sh +. /lib/kdump-lib.sh + +prepare_parameters() +{ + EARLY_KDUMP_CMDLINE=$(prepare_cmdline "${KDUMP_COMMANDLINE}" "${KDUMP_COMMANDLINE_REMOVE}" "${KDUMP_COMMANDLINE_APPEND}") + KDUMP_BOOTDIR=$(check_boot_dir "${KDUMP_BOOTDIR}") + + EARLY_KDUMP_KERNEL="${KDUMP_BOOTDIR}/${KDUMP_IMG}-earlykdump${KDUMP_IMG_EXT}" + EARLY_KDUMP_INITRD="${KDUMP_BOOTDIR}/initramfs-earlykdump.img" +} + +early_kdump_load() +{ + check_kdump_feasibility + if [ $? -ne 0 ]; then + return 1 + fi + + if is_fadump_capable; then + echo "WARNING: early kdump doesn't support fadump." + return 1 + fi + + check_current_kdump_status + if [ $? == 0 ]; then + return 1 + fi + + prepare_parameters + + EARLY_KEXEC_ARGS=$(prepare_kexec_args "${KEXEC_ARGS}") + + if is_secure_boot_enforced; then + echo "Secure Boot is enabled. Using kexec file based syscall." + EARLY_KEXEC_ARGS="$EARLY_KEXEC_ARGS -s" + fi + + $KEXEC ${EARLY_KEXEC_ARGS} $standard_kexec_args \ + --command-line="$EARLY_KDUMP_CMDLINE" \ + --initrd=$EARLY_KDUMP_INITRD $EARLY_KDUMP_KERNEL + if [ $? == 0 ]; then + echo "kexec: loaded early-kdump kernel" + return 0 + else + echo "kexec: failed to load early-kdump kernel" + return 1 + fi +} + +set_early_kdump() +{ + if getargbool 0 rd.earlykdump; then + echo "early-kdump is enabled." + early_kdump_load + else + echo "early-kdump is disabled." + fi + + return 0 +} + +set_early_kdump diff --git a/SPECS/kexec-tools/dracut-kdump-capture.service b/SPECS/kexec-tools/dracut-kdump-capture.service new file mode 100644 index 0000000000..3f20aba3dc --- /dev/null +++ b/SPECS/kexec-tools/dracut-kdump-capture.service @@ -0,0 +1,30 @@ +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +[Unit] +Description=Kdump Vmcore Save Service +After=initrd.target initrd-parse-etc.service sysroot.mount +After=dracut-initqueue.service dracut-pre-mount.service dracut-mount.service dracut-pre-pivot.service +Before=initrd-cleanup.service +ConditionPathExists=/etc/initrd-release +OnFailure=emergency.target +OnFailureJobMode=isolate + +[Service] +Environment=DRACUT_SYSTEMD=1 +Environment=NEWROOT=/sysroot +Type=oneshot +ExecStart=/bin/kdump.sh +StandardInput=null +StandardOutput=syslog +StandardError=syslog+console +KillMode=process +RemainAfterExit=yes + +# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash +# terminates cleanly. +KillSignal=SIGHUP diff --git a/SPECS/kexec-tools/dracut-kdump-emergency.service b/SPECS/kexec-tools/dracut-kdump-emergency.service new file mode 100644 index 0000000000..e0232843da --- /dev/null +++ b/SPECS/kexec-tools/dracut-kdump-emergency.service @@ -0,0 +1,28 @@ +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This service will be placed in kdump initramfs and replace both the systemd +# emergency service and dracut emergency shell. IOW, any emergency will be +# kick this service and in turn isolating to kdump error handler. + +[Unit] +Description=Kdump Emergency +DefaultDependencies=no +IgnoreOnIsolate=yes + +[Service] +ExecStart=/usr/bin/systemctl --no-block isolate kdump-error-handler.service +Type=oneshot +StandardInput=tty-force +StandardOutput=inherit +StandardError=inherit +KillMode=process +IgnoreSIGPIPE=no + +# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash +# terminates cleanly. +KillSignal=SIGHUP diff --git a/SPECS/kexec-tools/dracut-kdump-emergency.target b/SPECS/kexec-tools/dracut-kdump-emergency.target new file mode 100644 index 0000000000..a1bb493546 --- /dev/null +++ b/SPECS/kexec-tools/dracut-kdump-emergency.target @@ -0,0 +1,14 @@ +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +[Unit] +Description=Emergency Mode +Documentation=man:systemd.special(7) +Requires=emergency.service +After=emergency.service +AllowIsolate=yes +IgnoreOnIsolate=yes diff --git a/SPECS/kexec-tools/dracut-kdump-error-handler.service b/SPECS/kexec-tools/dracut-kdump-error-handler.service new file mode 100644 index 0000000000..a23b75e404 --- /dev/null +++ b/SPECS/kexec-tools/dracut-kdump-error-handler.service @@ -0,0 +1,33 @@ +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This service will run the real kdump error handler code. Executing the +# failure action configured in kdump.conf + +[Unit] +Description=Kdump Error Handler +DefaultDependencies=no +After=systemd-vconsole-setup.service +Wants=systemd-vconsole-setup.service +AllowIsolate=yes + +[Service] +Environment=HOME=/ +Environment=DRACUT_SYSTEMD=1 +Environment=NEWROOT=/sysroot +WorkingDirectory=/ +ExecStart=/bin/kdump-error-handler.sh +Type=oneshot +StandardInput=tty-force +StandardOutput=inherit +StandardError=inherit +KillMode=process +IgnoreSIGPIPE=no + +# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash +# terminates cleanly. +KillSignal=SIGHUP diff --git a/SPECS/kexec-tools/dracut-kdump-error-handler.sh b/SPECS/kexec-tools/dracut-kdump-error-handler.sh new file mode 100755 index 0000000000..fc2b9328d9 --- /dev/null +++ b/SPECS/kexec-tools/dracut-kdump-error-handler.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +. /lib/kdump-lib-initramfs.sh + +set -o pipefail +export PATH=$PATH:$KDUMP_SCRIPT_DIR + +get_kdump_confs +do_failure_action +do_final_action diff --git a/SPECS/kexec-tools/dracut-kdump.sh b/SPECS/kexec-tools/dracut-kdump.sh new file mode 100755 index 0000000000..b71278df67 --- /dev/null +++ b/SPECS/kexec-tools/dracut-kdump.sh @@ -0,0 +1,268 @@ +#!/bin/sh + +# continue here only if we have to save dump. +if [ -f /etc/fadump.initramfs ] && [ ! -f /proc/device-tree/rtas/ibm,kernel-dump ] && [ ! -f /proc/device-tree/ibm,opal/dump/mpipl-boot ]; then + exit 0 +fi + +exec &> /dev/console +. /lib/dracut-lib.sh +. /lib/kdump-lib-initramfs.sh + +set -o pipefail +DUMP_RETVAL=0 + +export PATH=$PATH:$KDUMP_SCRIPT_DIR + +do_dump() +{ + local _ret + + eval $DUMP_INSTRUCTION + _ret=$? + + if [ $_ret -ne 0 ]; then + echo "kdump: saving vmcore failed" + fi + + return $_ret +} + +do_kdump_pre() +{ + local _ret + + if [ -n "$KDUMP_PRE" ]; then + "$KDUMP_PRE" + _ret=$? + if [ $_ret -ne 0 ]; then + echo "kdump: $KDUMP_PRE exited with $_ret status" + return $_ret + fi + fi + + if [ -d /etc/kdump/pre.d ]; then + for file in /etc/kdump/pre.d/*; do + "$file" + _ret=$? + if [ $_ret -ne 0 ]; then + echo "kdump: $file exited with $_ret status" + fi + done + fi + return 0 +} + +do_kdump_post() +{ + local _ret + + if [ -d /etc/kdump/post.d ]; then + for file in /etc/kdump/post.d/*; do + "$file" "$1" + _ret=$? + if [ $_ret -ne 0 ]; then + echo "kdump: $file exited with $_ret status" + fi + done + fi + + if [ -n "$KDUMP_POST" ]; then + "$KDUMP_POST" "$1" + _ret=$? + if [ $_ret -ne 0 ]; then + echo "kdump: $KDUMP_POST exited with $_ret status" + fi + fi +} + +add_dump_code() +{ + DUMP_INSTRUCTION=$1 +} + +dump_raw() +{ + local _raw=$1 + + [ -b "$_raw" ] || return 1 + + echo "kdump: saving to raw disk $_raw" + + if ! $(echo -n $CORE_COLLECTOR|grep -q makedumpfile); then + _src_size=`ls -l /proc/vmcore | cut -d' ' -f5` + _src_size_mb=$(($_src_size / 1048576)) + monitor_dd_progress $_src_size_mb & + fi + + echo "kdump: saving vmcore" + $CORE_COLLECTOR /proc/vmcore | dd of=$_raw bs=$DD_BLKSIZE >> /tmp/dd_progress_file 2>&1 || return 1 + sync + + echo "kdump: saving vmcore complete" + return 0 +} + +dump_ssh() +{ + local _opt="-i $1 -o BatchMode=yes -o StrictHostKeyChecking=yes" + local _dir="$KDUMP_PATH/$HOST_IP-$DATEDIR" + local _host=$2 + + echo "kdump: saving to $_host:$_dir" + + cat /var/lib/random-seed > /dev/urandom + ssh -q $_opt $_host mkdir -p $_dir || return 1 + + save_vmcore_dmesg_ssh ${DMESG_COLLECTOR} ${_dir} "${_opt}" $_host + save_opalcore_ssh ${_dir} "${_opt}" $_host + + echo "kdump: saving vmcore" + + if [ "${CORE_COLLECTOR%%[[:blank:]]*}" = "scp" ]; then + scp -q $_opt /proc/vmcore "$_host:$_dir/vmcore-incomplete" || return 1 + ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore" || return 1 + else + $CORE_COLLECTOR /proc/vmcore | ssh $_opt $_host "dd bs=512 of=$_dir/vmcore-incomplete" || return 1 + ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore.flat" || return 1 + fi + + echo "kdump: saving vmcore complete" + return 0 +} + +save_opalcore_ssh() { + local _path=$1 + local _opts="$2" + local _location=$3 + + if [ ! -f $OPALCORE ]; then + # Check if we are on an old kernel that uses a different path + if [ -f /sys/firmware/opal/core ]; then + OPALCORE="/sys/firmware/opal/core" + else + return 0 + fi + fi + + echo "kdump: saving opalcore" + scp $_opts $OPALCORE $_location:$_path/opalcore-incomplete + if [ $? -ne 0 ]; then + echo "kdump: saving opalcore failed" + return 1 + fi + + ssh $_opts $_location mv $_path/opalcore-incomplete $_path/opalcore + echo "kdump: saving opalcore complete" + return 0 +} + +save_vmcore_dmesg_ssh() { + local _dmesg_collector=$1 + local _path=$2 + local _opts="$3" + local _location=$4 + + echo "kdump: saving vmcore-dmesg.txt" + $_dmesg_collector /proc/vmcore | ssh $_opts $_location "dd of=$_path/vmcore-dmesg-incomplete.txt" + _exitcode=$? + + if [ $_exitcode -eq 0 ]; then + ssh -q $_opts $_location mv $_path/vmcore-dmesg-incomplete.txt $_path/vmcore-dmesg.txt + echo "kdump: saving vmcore-dmesg.txt complete" + else + echo "kdump: saving vmcore-dmesg.txt failed" + fi +} + +get_host_ip() +{ + local _host + if is_nfs_dump_target || is_ssh_dump_target + then + kdumpnic=$(getarg kdumpnic=) + [ -z "$kdumpnic" ] && echo "kdump: failed to get kdumpnic!" && return 1 + _host=`ip addr show dev $kdumpnic|grep '[ ]*inet'` + [ $? -ne 0 ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1 + _host=`echo $_host | head -n 1 | cut -d' ' -f2` + _host="${_host%%/*}" + [ -z "$_host" ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1 + HOST_IP=$_host + fi + return 0 +} + +read_kdump_conf() +{ + if [ ! -f "$KDUMP_CONF" ]; then + echo "kdump: $KDUMP_CONF not found" + return + fi + + get_kdump_confs + + # rescan for add code for dump target + while read config_opt config_val; + do + # remove inline comments after the end of a directive. + case "$config_opt" in + dracut_args) + config_val=$(get_dracut_args_target "$config_val") + if [ -n "$config_val" ]; then + config_val=$(get_mntpoint_from_target "$config_val") + add_dump_code "dump_fs $config_val" + fi + ;; + ext[234]|xfs|btrfs|minix|nfs) + config_val=$(get_mntpoint_from_target "$config_val") + add_dump_code "dump_fs $config_val" + ;; + raw) + add_dump_code "dump_raw $config_val" + ;; + ssh) + add_dump_code "dump_ssh $SSH_KEY_LOCATION $config_val" + ;; + esac + done <<< "$(read_strip_comments $KDUMP_CONF)" +} + +fence_kdump_notify() +{ + if [ -n "$FENCE_KDUMP_NODES" ]; then + $FENCE_KDUMP_SEND $FENCE_KDUMP_ARGS $FENCE_KDUMP_NODES & + fi +} + +read_kdump_conf +fence_kdump_notify + +get_host_ip +if [ $? -ne 0 ]; then + echo "kdump: get_host_ip exited with non-zero status!" + exit 1 +fi + +if [ -z "$DUMP_INSTRUCTION" ]; then + add_dump_code "dump_fs $NEWROOT" +fi + +do_kdump_pre +if [ $? -ne 0 ]; then + echo "kdump: kdump_pre script exited with non-zero status!" + do_final_action +fi +make_trace_mem "kdump saving vmcore" '1:shortmem' '2+:mem' '3+:slab' +do_dump +DUMP_RETVAL=$? + +do_kdump_post $DUMP_RETVAL +if [ $? -ne 0 ]; then + echo "kdump: kdump_post script exited with non-zero status!" +fi + +if [ $DUMP_RETVAL -ne 0 ]; then + exit 1 +fi + +do_final_action diff --git a/SPECS/kexec-tools/dracut-module-setup.sh b/SPECS/kexec-tools/dracut-module-setup.sh new file mode 100755 index 0000000000..4cb67929b9 --- /dev/null +++ b/SPECS/kexec-tools/dracut-module-setup.sh @@ -0,0 +1,865 @@ +#!/bin/bash + +. $dracutfunctions +. /lib/kdump/kdump-lib.sh + +if ! [[ -d "${initdir}/tmp" ]]; then + mkdir -p "${initdir}/tmp" +fi + +check() { + [[ $debug ]] && set -x + #kdumpctl sets this explicitly + if [ -z "$IN_KDUMP" ] || [ ! -f /etc/kdump.conf ] + then + return 1 + fi + return 0 +} + +depends() { + local _dep="base shutdown" + + is_squash_available() { + for kmodule in squashfs overlay loop; do + if [ -z "$KDUMP_KERNELVER" ]; then + modprobe --dry-run $kmodule &>/dev/null || return 1 + else + modprobe -S $KDUMP_KERNELVER --dry-run $kmodule &>/dev/null || return 1 + fi + done + } + + if is_squash_available && ! is_fadump_capable; then + _dep="$_dep squash" + else + dwarning "Required modules to build a squashed kdump image is missing!" + fi + + if [ -n "$( find /sys/devices -name drm )" ] || [ -d /sys/module/hyperv_fb ]; then + _dep="$_dep drm" + fi + + if is_generic_fence_kdump || is_pcs_fence_kdump; then + _dep="$_dep network" + fi + + echo $_dep + return 0 +} + +kdump_is_bridge() { + [ -d /sys/class/net/"$1"/bridge ] +} + +kdump_is_bond() { + [ -d /sys/class/net/"$1"/bonding ] +} + +kdump_is_team() { + [ -f /usr/bin/teamnl ] && teamnl $1 ports &> /dev/null +} + +kdump_is_vlan() { + [ -f /proc/net/vlan/"$1" ] +} + +# $1: netdev name +source_ifcfg_file() { + local ifcfg_file + + ifcfg_file=$(get_ifcfg_filename $1) + if [ -f "${ifcfg_file}" ]; then + . ${ifcfg_file} + else + dwarning "The ifcfg file of $1 is not found!" + fi +} + +# $1: netdev name +kdump_setup_dns() { + local _nameserver _dns + local _dnsfile=${initdir}/etc/cmdline.d/42dns.conf + + source_ifcfg_file $1 + + [ -n "$DNS1" ] && echo "nameserver=$DNS1" > "$_dnsfile" + [ -n "$DNS2" ] && echo "nameserver=$DNS2" >> "$_dnsfile" + + while read content; + do + _nameserver=$(echo $content | grep ^nameserver) + [ -z "$_nameserver" ] && continue + + _dns=$(echo $_nameserver | cut -d' ' -f2) + [ -z "$_dns" ] && continue + + if [ ! -f $_dnsfile ] || [ ! $(cat $_dnsfile | grep -q $_dns) ]; then + echo "nameserver=$_dns" >> "$_dnsfile" + fi + done < "/etc/resolv.conf" +} + +#$1: netdev name +#$2: srcaddr +#if it use static ip echo it, or echo null +kdump_static_ip() { + local _netdev="$1" _srcaddr="$2" _ipv6_flag + local _netmask _gateway _ipaddr _target _nexthop + + _ipaddr=$(ip addr show dev $_netdev permanent | awk "/ $_srcaddr\/.* /{print \$2}") + + if is_ipv6_address $_srcaddr; then + _ipv6_flag="-6" + fi + + if [ -n "$_ipaddr" ]; then + _gateway=$(ip $_ipv6_flag route list dev $_netdev | \ + awk '/^default /{print $3}' | head -n 1) + + if [ "x" != "x"$_ipv6_flag ]; then + # _ipaddr="2002::56ff:feb6:56d5/64", _netmask is the number after "/" + _netmask=${_ipaddr#*\/} + _srcaddr="[$_srcaddr]" + _gateway="[$_gateway]" + else + _netmask=$(ipcalc -m $_ipaddr | cut -d'=' -f2) + fi + echo -n "${_srcaddr}::${_gateway}:${_netmask}::" + fi + + /sbin/ip $_ipv6_flag route show | grep -v default |\ + grep ".*via.* $_netdev " | grep -v "^[[:space:]]*nexthop" |\ + while read _route; do + _target=`echo $_route | cut -d ' ' -f1` + _nexthop=`echo $_route | cut -d ' ' -f3` + if [ "x" != "x"$_ipv6_flag ]; then + _target="[$_target]" + _nexthop="[$_nexthop]" + fi + echo "rd.route=$_target:$_nexthop:$_netdev" + done >> ${initdir}/etc/cmdline.d/45route-static.conf + + kdump_handle_mulitpath_route $_netdev $_srcaddr +} + +kdump_handle_mulitpath_route() { + local _netdev="$1" _srcaddr="$2" _ipv6_flag + local _target _nexthop _route _weight _max_weight _rule + + if is_ipv6_address $_srcaddr; then + _ipv6_flag="-6" + fi + + while IFS="" read _route; do + if [[ "$_route" =~ [[:space:]]+nexthop ]]; then + _route=$(echo "$_route" | sed -e 's/^[[:space:]]*//') + # Parse multipath route, using previous _target + [[ "$_target" == 'default' ]] && continue + [[ "$_route" =~ .*via.*\ $_netdev ]] || continue + + _weight=`echo "$_route" | cut -d ' ' -f7` + if [[ "$_weight" -gt "$_max_weight" ]]; then + _nexthop=`echo "$_route" | cut -d ' ' -f3` + _max_weight=$_weight + if [ "x" != "x"$_ipv6_flag ]; then + _rule="rd.route=[$_target]:[$_nexthop]:$_netdev" + else + _rule="rd.route=$_target:$_nexthop:$_netdev" + fi + fi + else + [[ -n "$_rule" ]] && echo "$_rule" + _target=`echo "$_route" | cut -d ' ' -f1` + _rule="" _max_weight=0 _weight=0 + fi + done >> ${initdir}/etc/cmdline.d/45route-static.conf\ + <<< "$(/sbin/ip $_ipv6_flag route show)" + + [[ -n $_rule ]] && echo $_rule >> ${initdir}/etc/cmdline.d/45route-static.conf +} + +kdump_get_mac_addr() { + cat /sys/class/net/$1/address +} + +#Bonding or team master modifies the mac address +#of its slaves, we should use perm address +kdump_get_perm_addr() { + local addr=$(ethtool -P $1 | sed -e 's/Permanent address: //') + if [ -z "$addr" ] || [ "$addr" = "00:00:00:00:00:00" ] + then + derror "Can't get the permanent address of $1" + else + echo "$addr" + fi +} + +# Prefix kernel assigned names with "kdump-". EX: eth0 -> kdump-eth0 +# Because kernel assigned names are not persistent between 1st and 2nd +# kernel. We could probably end up with eth0 being eth1, eth0 being +# eth1, and naming conflict happens. +kdump_setup_ifname() { + local _ifname + + # If ifname already has 'kdump-' prefix, we must be switching from + # fadump to kdump. Skip prefixing 'kdump-' in this case as adding + # another prefix may truncate the ifname. Since an ifname with + # 'kdump-' is already persistent, this should be fine. + if [[ $1 =~ eth* ]] && [[ ! $1 =~ ^kdump-* ]]; then + _ifname="kdump-$1" + else + _ifname="$1" + fi + + echo "$_ifname" +} + +kdump_setup_bridge() { + local _netdev=$1 + local _brif _dev _mac _kdumpdev + for _dev in `ls /sys/class/net/$_netdev/brif/`; do + _kdumpdev=$_dev + if kdump_is_bond "$_dev"; then + kdump_setup_bond "$_dev" + elif kdump_is_team "$_dev"; then + kdump_setup_team "$_dev" + elif kdump_is_vlan "$_dev"; then + kdump_setup_vlan "$_dev" + else + _mac=$(kdump_get_mac_addr $_dev) + _kdumpdev=$(kdump_setup_ifname $_dev) + echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/41bridge.conf + fi + _brif+="$_kdumpdev," + done + echo " bridge=$_netdev:$(echo $_brif | sed -e 's/,$//')" >> ${initdir}/etc/cmdline.d/41bridge.conf +} + +kdump_setup_bond() { + local _netdev=$1 + local _dev _mac _slaves _kdumpdev + for _dev in `cat /sys/class/net/$_netdev/bonding/slaves`; do + _mac=$(kdump_get_perm_addr $_dev) + _kdumpdev=$(kdump_setup_ifname $_dev) + echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/42bond.conf + _slaves+="$_kdumpdev," + done + echo -n " bond=$_netdev:$(echo $_slaves | sed 's/,$//')" >> ${initdir}/etc/cmdline.d/42bond.conf + # Get bond options specified in ifcfg + + source_ifcfg_file $_netdev + + bondoptions=":$(echo $BONDING_OPTS | xargs echo | tr " " ",")" + echo "$bondoptions" >> ${initdir}/etc/cmdline.d/42bond.conf +} + +kdump_setup_team() { + local _netdev=$1 + local _dev _mac _slaves _kdumpdev + for _dev in `teamnl $_netdev ports | awk -F':' '{print $2}'`; do + _mac=$(kdump_get_perm_addr $_dev) + _kdumpdev=$(kdump_setup_ifname $_dev) + echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/44team.conf + _slaves+="$_kdumpdev," + done + echo " team=$_netdev:$(echo $_slaves | sed -e 's/,$//')" >> ${initdir}/etc/cmdline.d/44team.conf + #Buggy version teamdctl outputs to stderr! + #Try to use the latest version of teamd. + teamdctl "$_netdev" config dump > ${initdir}/tmp/$$-$_netdev.conf + if [ $? -ne 0 ] + then + derror "teamdctl failed." + exit 1 + fi + inst_dir /etc/teamd + inst_simple ${initdir}/tmp/$$-$_netdev.conf "/etc/teamd/$_netdev.conf" + rm -f ${initdir}/tmp/$$-$_netdev.conf +} + +kdump_setup_vlan() { + local _netdev=$1 + local _phydev="$(awk '/^Device:/{print $2}' /proc/net/vlan/"$_netdev")" + local _netmac="$(kdump_get_mac_addr $_phydev)" + local _kdumpdev + + #Just support vlan over bond, it is not easy + #to support all other complex setup + if kdump_is_bridge "$_phydev"; then + derror "Vlan over bridge is not supported!" + exit 1 + elif kdump_is_team "$_phydev"; then + derror "Vlan over team is not supported!" + exit 1 + elif kdump_is_bond "$_phydev"; then + kdump_setup_bond "$_phydev" + echo " vlan=$(kdump_setup_ifname $_netdev):$_phydev" > ${initdir}/etc/cmdline.d/43vlan.conf + else + _kdumpdev="$(kdump_setup_ifname $_phydev)" + echo " vlan=$(kdump_setup_ifname $_netdev):$_kdumpdev ifname=$_kdumpdev:$_netmac" > ${initdir}/etc/cmdline.d/43vlan.conf + fi +} + +# setup s390 znet cmdline +# $1: netdev name +kdump_setup_znet() { + local _options="" + local _netdev=$1 + + source_ifcfg_file $_netdev + + for i in $OPTIONS; do + _options=${_options},$i + done + echo rd.znet=${NETTYPE},${SUBCHANNELS}${_options} rd.znet_ifname=$_netdev:${SUBCHANNELS} > ${initdir}/etc/cmdline.d/30znet.conf +} + +kdump_get_ip_route() +{ + local _route=$(/sbin/ip -o route get to $1 2>&1) + [ $? != 0 ] && die "Bad kdump network destination: $1" + echo $_route +} + +kdump_get_ip_route_field() +{ + if `echo $1 | grep -q $2`; then + echo ${1##*$2} | cut -d ' ' -f1 + fi +} + +kdump_get_remote_ip() +{ + local _remote=$(get_remote_host $1) _remote_temp + if is_hostname $_remote; then + _remote_temp=`getent ahosts $_remote | grep -v : | head -n 1` + if [ -z "$_remote_temp" ]; then + _remote_temp=`getent ahosts $_remote | head -n 1` + fi + _remote=`echo $_remote_temp | cut -d' ' -f1` + fi + echo $_remote +} + +# Setup dracut to bring up network interface that enable +# initramfs accessing giving destination +# $1: destination host +kdump_install_net() { + local _destaddr _srcaddr _route _netdev + local _static _proto _ip_conf _ip_opts _ifname_opts + + _destaddr=$(kdump_get_remote_ip $1) + _route=$(kdump_get_ip_route $_destaddr) + _srcaddr=$(kdump_get_ip_route_field "$_route" "src") + _netdev=$(kdump_get_ip_route_field "$_route" "dev") + _netmac=$(kdump_get_mac_addr $_netdev) + + if [ "$(uname -m)" = "s390x" ]; then + kdump_setup_znet $_netdev + fi + + _static=$(kdump_static_ip $_netdev $_srcaddr) + if [ -n "$_static" ]; then + _proto=none + elif is_ipv6_address $_srcaddr; then + _proto=either6 + else + _proto=dhcp + fi + + _ip_conf="${initdir}/etc/cmdline.d/40ip.conf" + _ip_opts=" ip=${_static}$(kdump_setup_ifname $_netdev):${_proto}" + + # dracut doesn't allow duplicated configuration for same NIC, even they're exactly the same. + # so we have to avoid adding duplicates + # We should also check /proc/cmdline for existing ip=xx arg. + # For example, iscsi boot will specify ip=xxx arg in cmdline. + if [ ! -f $_ip_conf ] || ! grep -q $_ip_opts $_ip_conf &&\ + ! grep -q "ip=[^[:space:]]*$_netdev" /proc/cmdline; then + echo "$_ip_opts" >> $_ip_conf + fi + + if kdump_is_bridge "$_netdev"; then + kdump_setup_bridge "$_netdev" + elif kdump_is_bond "$_netdev"; then + kdump_setup_bond "$_netdev" + elif kdump_is_team "$_netdev"; then + kdump_setup_team "$_netdev" + elif kdump_is_vlan "$_netdev"; then + kdump_setup_vlan "$_netdev" + else + _ifname_opts=" ifname=$(kdump_setup_ifname $_netdev):$_netmac" + echo "$_ifname_opts" >> $_ip_conf + fi + + kdump_setup_dns "$_netdev" + + if [ ! -f ${initdir}/etc/cmdline.d/50neednet.conf ]; then + # network-manager module needs this parameter + echo "rd.neednet" >> ${initdir}/etc/cmdline.d/50neednet.conf + fi + + # Save netdev used for kdump as cmdline + # Whoever calling kdump_install_net() is setting up the default gateway, + # ie. bootdev/kdumpnic. So don't override the setting if calling + # kdump_install_net() for another time. For example, after setting eth0 as + # the default gate way for network dump, eth1 in the fence kdump path will + # call kdump_install_net again and we don't want eth1 to be the default + # gateway. + if [ ! -f ${initdir}/etc/cmdline.d/60kdumpnic.conf ] && + [ ! -f ${initdir}/etc/cmdline.d/70bootdev.conf ]; then + echo "kdumpnic=$(kdump_setup_ifname $_netdev)" > ${initdir}/etc/cmdline.d/60kdumpnic.conf + echo "bootdev=$(kdump_setup_ifname $_netdev)" > ${initdir}/etc/cmdline.d/70bootdev.conf + fi +} + +# install etc/kdump/pre.d and /etc/kdump/post.d +kdump_install_pre_post_conf() { + if [ -d /etc/kdump/pre.d ]; then + for file in /etc/kdump/pre.d/*; do + if [ -x "$file" ]; then + dracut_install $file + else + echo "$file is not executable" + fi + done + fi + + if [ -d /etc/kdump/post.d ]; then + for file in /etc/kdump/post.d/*; do + if [ -x "$file" ]; then + dracut_install $file + else + echo "$file is not executable" + fi + done + fi +} + +default_dump_target_install_conf() +{ + local _target _fstype + local _mntpoint _save_path + + is_user_configured_dump_target && return + + _save_path=$(get_bind_mount_source $(get_save_path)) + _target=$(get_target_from_path $_save_path) + _mntpoint=$(get_mntpoint_from_target $_target) + + _fstype=$(get_fs_type_from_target $_target) + if is_fs_type_nfs $_fstype; then + kdump_install_net "$_target" + _fstype="nfs" + else + _target=$(kdump_get_persistent_dev $_target) + fi + + echo "$_fstype $_target" >> ${initdir}/tmp/$$-kdump.conf + + # don't touch the path under root mount + if [ "$_mntpoint" != "/" ]; then + _save_path=${_save_path##"$_mntpoint"} + fi + + #erase the old path line, then insert the parsed path + sed -i "/^path/d" ${initdir}/tmp/$$-kdump.conf + echo "path $_save_path" >> ${initdir}/tmp/$$-kdump.conf +} + +#install kdump.conf and what user specifies in kdump.conf +kdump_install_conf() { + local _opt _val _pdev + (read_strip_comments /etc/kdump.conf) > ${initdir}/tmp/$$-kdump.conf + + while read _opt _val; + do + # remove inline comments after the end of a directive. + case "$_opt" in + raw) + _pdev=$(persistent_policy="by-id" kdump_get_persistent_dev $_val) + sed -i -e "s#^$_opt[[:space:]]\+$_val#$_opt $_pdev#" ${initdir}/tmp/$$-kdump.conf + ;; + ext[234]|xfs|btrfs|minix) + _pdev=$(kdump_get_persistent_dev $_val) + sed -i -e "s#^$_opt[[:space:]]\+$_val#$_opt $_pdev#" ${initdir}/tmp/$$-kdump.conf + ;; + ssh|nfs) + kdump_install_net "$_val" + ;; + dracut_args) + if [[ $(get_dracut_args_fstype "$_val") = nfs* ]] ; then + kdump_install_net "$(get_dracut_args_target "$_val")" + fi + ;; + kdump_pre|kdump_post|extra_bins) + dracut_install $_val + ;; + core_collector) + dracut_install "${_val%%[[:blank:]]*}" + ;; + esac + done <<< "$(read_strip_comments /etc/kdump.conf)" + + kdump_install_pre_post_conf + + default_dump_target_install_conf + + kdump_configure_fence_kdump "${initdir}/tmp/$$-kdump.conf" + inst "${initdir}/tmp/$$-kdump.conf" "/etc/kdump.conf" + rm -f ${initdir}/tmp/$$-kdump.conf +} + +# Remove user custom configurations sysctl.conf & sysctl.d/* +# and apply some optimization for kdump +overwrite_sysctl_conf() { + # As custom configurations like vm.min_free_kbytes can lead + # to OOM issues in kdump kernel, avoid them + rm -f "${initdir}/etc/sysctl.conf" + rm -rf "${initdir}/etc/sysctl.d" + rm -rf "${initdir}/run/sysctl.d" + rm -rf "${initdir}/usr/lib/sysctl.d" + + mkdir -p "${initdir}/etc/sysctl.d" + echo "vm.zone_reclaim_mode = 3" > "${initdir}/etc/sysctl.d/99-zone-reclaim.conf" +} + +kdump_iscsi_get_rec_val() { + + local result + + # The open-iscsi 742 release changed to using flat files in + # /var/lib/iscsi. + + result=$(/sbin/iscsiadm --show -m session -r ${1} | grep "^${2} = ") + result=${result##* = } + echo $result +} + +kdump_get_iscsi_initiator() { + local _initiator + local initiator_conf="/etc/iscsi/initiatorname.iscsi" + + [ -f "$initiator_conf" ] || return 1 + + while read _initiator; do + [ -z "${_initiator%%#*}" ] && continue # Skip comment lines + + case $_initiator in + InitiatorName=*) + initiator=${_initiator#InitiatorName=} + echo "rd.iscsi.initiator=${initiator}" + return 0;; + *) ;; + esac + done < ${initiator_conf} + + return 1 +} + +# Figure out iBFT session according to session type +is_ibft() { + [ "$(kdump_iscsi_get_rec_val $1 "node.discovery_type")" = fw ] +} + +kdump_setup_iscsi_device() { + local path=$1 + local tgt_name; local tgt_ipaddr; + local username; local password; local userpwd_str; + local username_in; local password_in; local userpwd_in_str; + local netroot_str ; local initiator_str; + local netroot_conf="${initdir}/etc/cmdline.d/50iscsi.conf" + local initiator_conf="/etc/iscsi/initiatorname.iscsi" + + dinfo "Found iscsi component $1" + + # Check once before getting explicit values, so we can bail out early, + # e.g. in case of pure-hardware(all-offload) iscsi. + if ! /sbin/iscsiadm -m session -r ${path} &>/dev/null ; then + return 1 + fi + + if is_ibft ${path}; then + return + fi + + # Remove software iscsi cmdline generated by 95iscsi, + # and let kdump regenerate here. + rm -f ${initdir}/etc/cmdline.d/95iscsi.conf + + tgt_name=$(kdump_iscsi_get_rec_val ${path} "node.name") + tgt_ipaddr=$(kdump_iscsi_get_rec_val ${path} "node.conn\[0\].address") + + # get and set username and password details + username=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.username") + [ "$username" == "" ] && username="" + password=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.password") + [ "$password" == "" ] && password="" + username_in=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.username_in") + [ -n "$username" ] && userpwd_str="$username:$password" + + # get and set incoming username and password details + [ "$username_in" == "" ] && username_in="" + password_in=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.password_in") + [ "$password_in" == "" ] && password_in="" + + [ -n "$username_in" ] && userpwd_in_str=":$username_in:$password_in" + + kdump_install_net "$tgt_ipaddr" + + # prepare netroot= command line + # FIXME: Do we need to parse and set other parameters like protocol, port + # iscsi_iface_name, netdev_name, LUN etc. + + if is_ipv6_address $tgt_ipaddr; then + tgt_ipaddr="[$tgt_ipaddr]" + fi + netroot_str="netroot=iscsi:${userpwd_str}${userpwd_in_str}@$tgt_ipaddr::::$tgt_name" + + [[ -f $netroot_conf ]] || touch $netroot_conf + + # If netroot target does not exist already, append. + if ! grep -q $netroot_str $netroot_conf; then + echo $netroot_str >> $netroot_conf + dinfo "Appended $netroot_str to $netroot_conf" + fi + + # Setup initator + initiator_str=$(kdump_get_iscsi_initiator) + [ $? -ne "0" ] && derror "Failed to get initiator name" && return 1 + + # If initiator details do not exist already, append. + if ! grep -q "$initiator_str" $netroot_conf; then + echo "$initiator_str" >> $netroot_conf + dinfo "Appended "$initiator_str" to $netroot_conf" + fi +} + +kdump_check_iscsi_targets () { + # If our prerequisites are not met, fail anyways. + type -P iscsistart >/dev/null || return 1 + + kdump_check_setup_iscsi() ( + local _dev + _dev=$1 + + [[ -L /sys/dev/block/$_dev ]] || return + cd "$(readlink -f /sys/dev/block/$_dev)" + until [[ -d sys || -d iscsi_session ]]; do + cd .. + done + [[ -d iscsi_session ]] && kdump_setup_iscsi_device "$PWD" + ) + + [[ $hostonly ]] || [[ $mount_needs ]] && { + for_each_host_dev_and_slaves_all kdump_check_setup_iscsi + } +} + +# hostname -a is deprecated, do it by ourself +get_alias() { + local ips + local entries + local alias_set + + ips=$(hostname -I) + for ip in $ips + do + # in /etc/hosts, alias can come at the 2nd column + entries=$(grep $ip /etc/hosts | awk '{ $1=""; print $0 }') + if [ $? -eq 0 ]; then + alias_set="$alias_set $entries" + fi + done + + echo $alias_set +} + +is_localhost() { + local hostnames=$(hostname -A) + local shortnames=$(hostname -A -s) + local aliasname=$(get_alias) + local nodename=$1 + + hostnames="$hostnames $shortnames $aliasname" + + for name in ${hostnames}; do + if [ "$name" == "$nodename" ]; then + return 0 + fi + done + return 1 +} + +# retrieves fence_kdump nodes from Pacemaker cluster configuration +get_pcs_fence_kdump_nodes() { + local nodes + + pcs cluster sync > /dev/null 2>&1 && pcs cluster cib-upgrade > /dev/null 2>&1 + # get cluster nodes from cluster cib, get interface and ip address + nodelist=`pcs cluster cib | xmllint --xpath "/cib/status/node_state/@uname" -` + + # nodelist is formed as 'uname="node1" uname="node2" ... uname="nodeX"' + # we need to convert each to node1, node2 ... nodeX in each iteration + for node in ${nodelist}; do + # convert $node from 'uname="nodeX"' to 'nodeX' + eval $node + nodename=$uname + # Skip its own node name + if is_localhost $nodename; then + continue + fi + nodes="$nodes $nodename" + done + + echo $nodes +} + +# retrieves fence_kdump args from config file +get_pcs_fence_kdump_args() { + if [ -f $FENCE_KDUMP_CONFIG_FILE ]; then + . $FENCE_KDUMP_CONFIG_FILE + echo $FENCE_KDUMP_OPTS + fi +} + +get_generic_fence_kdump_nodes() { + local filtered + local nodes + + nodes=$(get_option_value "fence_kdump_nodes") + for node in ${nodes}; do + # Skip its own node name + if is_localhost $node; then + continue + fi + filtered="$filtered $node" + done + echo $filtered +} + +# setup fence_kdump in cluster +# setup proper network and install needed files +kdump_configure_fence_kdump () { + local kdump_cfg_file=$1 + local nodes + local args + + if is_generic_fence_kdump; then + nodes=$(get_generic_fence_kdump_nodes) + + elif is_pcs_fence_kdump; then + nodes=$(get_pcs_fence_kdump_nodes) + + # set appropriate options in kdump.conf + echo "fence_kdump_nodes $nodes" >> ${kdump_cfg_file} + + args=$(get_pcs_fence_kdump_args) + if [ -n "$args" ]; then + echo "fence_kdump_args $args" >> ${kdump_cfg_file} + fi + + else + # fence_kdump not configured + return 1 + fi + + # setup network for each node + for node in ${nodes}; do + kdump_install_net $node + done + + dracut_install /etc/hosts + dracut_install /etc/nsswitch.conf + dracut_install $FENCE_KDUMP_SEND +} + +# Install a random seed used to feed /dev/urandom +# By the time kdump service starts, /dev/uramdom is already fed by systemd +kdump_install_random_seed() { + local poolsize=`cat /proc/sys/kernel/random/poolsize` + + if [ ! -d ${initdir}/var/lib/ ]; then + mkdir -p ${initdir}/var/lib/ + fi + + dd if=/dev/urandom of=${initdir}/var/lib/random-seed \ + bs=$poolsize count=1 2> /dev/null +} + +install() { + kdump_install_conf + overwrite_sysctl_conf + + if is_ssh_dump_target; then + kdump_install_random_seed + fi + dracut_install -o /etc/adjtime /etc/localtime + inst "$moddir/monitor_dd_progress" "/kdumpscripts/monitor_dd_progress" + chmod +x ${initdir}/kdumpscripts/monitor_dd_progress + inst "/bin/dd" "/bin/dd" + inst "/bin/grep" "/bin/grep" + inst "/bin/tail" "/bin/tail" + inst "/bin/date" "/bin/date" + inst "/bin/sync" "/bin/sync" + inst "/bin/cut" "/bin/cut" + inst "/bin/head" "/bin/head" + inst "/bin/awk" "/bin/awk" + inst "/bin/sed" "/bin/sed" + inst "/sbin/makedumpfile" "/sbin/makedumpfile" + inst "/sbin/vmcore-dmesg" "/sbin/vmcore-dmesg" + inst "/lib/kdump/kdump-lib.sh" "/lib/kdump-lib.sh" + inst "/lib/kdump/kdump-lib-initramfs.sh" "/lib/kdump-lib-initramfs.sh" + inst "$moddir/kdump.sh" "/usr/bin/kdump.sh" + inst "$moddir/kdump-capture.service" "$systemdsystemunitdir/kdump-capture.service" + mkdir -p "$initdir/$systemdsystemunitdir/initrd.target.wants" + ln_r "$systemdsystemunitdir/kdump-capture.service" "$systemdsystemunitdir/initrd.target.wants/kdump-capture.service" + inst "$moddir/kdump-error-handler.sh" "/usr/bin/kdump-error-handler.sh" + inst "$moddir/kdump-error-handler.service" "$systemdsystemunitdir/kdump-error-handler.service" + # Replace existing emergency service and emergency target + cp "$moddir/kdump-emergency.service" "$initdir/$systemdsystemunitdir/emergency.service" + cp "$moddir/kdump-emergency.target" "$initdir/$systemdsystemunitdir/emergency.target" + # Also redirect dracut-emergency to kdump error handler + ln_r "$systemdsystemunitdir/emergency.service" "$systemdsystemunitdir/dracut-emergency.service" + + # Check for all the devices and if any device is iscsi, bring up iscsi + # target. Ideally all this should be pushed into dracut iscsi module + # at some point of time. + kdump_check_iscsi_targets + + # nfs/ssh dump will need to get host ip in second kernel and need to call 'ip' tool, see get_host_ip for more detail + if is_nfs_dump_target || is_ssh_dump_target; then + inst "ip" + fi + + # For the lvm type target under kdump, in /etc/lvm/lvm.conf we can + # safely replace "reserved_memory=XXXX"(default value is 8192) with + # "reserved_memory=1024" to lower memory pressure under kdump. We do + # it unconditionally here, if "/etc/lvm/lvm.conf" doesn't exist, it + # actually does nothing. + sed -i -e \ + 's/\(^[[:space:]]*reserved_memory[[:space:]]*=\)[[:space:]]*[[:digit:]]*/\1 1024/' \ + ${initdir}/etc/lvm/lvm.conf &>/dev/null + + # Kdump turns out to require longer default systemd mount timeout + # than 1st kernel(90s by default), we use default 300s for kdump. + grep -r "^[[:space:]]*DefaultTimeoutStartSec=" ${initdir}/etc/systemd/system.conf* &>/dev/null + if [ $? -ne 0 ]; then + mkdir -p ${initdir}/etc/systemd/system.conf.d + echo "[Manager]" > ${initdir}/etc/systemd/system.conf.d/kdump.conf + echo "DefaultTimeoutStartSec=300s" >> ${initdir}/etc/systemd/system.conf.d/kdump.conf + fi + + # Forward logs to console directly, this avoids unneccessary memory + # consumption and make console output more useful. + # Only do so for non fadump image. + if ! is_fadump_capable; then + mkdir -p ${initdir}/etc/systemd/journald.conf.d + echo "[Journal]" > ${initdir}/etc/systemd/journald.conf.d/kdump.conf + echo "Storage=none" >> ${initdir}/etc/systemd/journald.conf.d/kdump.conf + echo "ForwardToConsole=yes" >> ${initdir}/etc/systemd/journald.conf.d/kdump.conf + + # Save more memory by dropping switch root capability + dracut_no_switch_root + fi +} diff --git a/SPECS/kexec-tools/dracut-monitor_dd_progress b/SPECS/kexec-tools/dracut-monitor_dd_progress new file mode 100644 index 0000000000..e139d33387 --- /dev/null +++ b/SPECS/kexec-tools/dracut-monitor_dd_progress @@ -0,0 +1,28 @@ +#!/bin/sh + +SRC_FILE_MB=$1 + +while true +do + DD_PID=`pidof dd` + if [ -n "$DD_PID" ]; then + break + fi +done + +while true +do + sleep 5 + if [ ! -d /proc/$DD_PID ]; then + break + fi + + kill -s USR1 $DD_PID + CURRENT_SIZE=`tail -n 1 /tmp/dd_progress_file | sed "s/[^0-9].*//g"` + [ -n "$CURRENT_SIZE" ] && { + CURRENT_MB=$(($CURRENT_SIZE / 1048576)) + echo -e "Copied $CURRENT_MB MB / $SRC_FILE_MB MB\r" + } +done + +rm -f /tmp/dd_progress_file diff --git a/SPECS/kexec-tools/early-kdump-howto.txt b/SPECS/kexec-tools/early-kdump-howto.txt new file mode 100644 index 0000000000..68b23c7d1f --- /dev/null +++ b/SPECS/kexec-tools/early-kdump-howto.txt @@ -0,0 +1,95 @@ +Early Kdump HOWTO + +Introduction +------------ + +Early kdump is a mechanism to make kdump operational earlier than normal kdump +service. The kdump service starts early enough for general crash cases, but +there are some cases where it has no chance to make kdump operational in boot +sequence, such as detecting devices and starting early services. If you hit +such a case, early kdump may allow you to get more information of it. + +Early kdump is implemented as a dracut module. It adds a kernel (vmlinuz) and +initramfs for kdump to your system's initramfs in order to load them as early +as possible. After that, if you provide "rd.earlykdump" in kernel command line, +then in the initramfs, early kdump will load those files like the normal kdump +service. This is disabled by default. + +For the normal kdump service, it can check whether the early kdump has loaded +the crash kernel and initramfs. It has no conflict with the early kdump. + +How to configure early kdump +---------------------------- + +We assume if you're reading this document, you should already have kexec-tools +installed. + +You can rebuild the initramfs with earlykdump support with below steps: + +1. start kdump service to make sure kdump initramfs is created. + + # systemctl start kdump + + NOTE: If a crash occurs during boot process, early kdump captures a vmcore + and reboot the system by default, so the system might go into crash loop. + You can avoid such a crash loop by adding the following settings, which + power off the system after dump capturing, to kdump.conf in advance: + + final_action poweroff + failure_action poweroff + + For the failure_action, you can choose anything other than "reboot". + +2. rebuild system initramfs with earlykdump support. + + # dracut --force --add earlykdump + + NOTE: Recommend to backup the original system initramfs before performing + this step to put it back if something happens during boot-up. + +3. add rd.earlykdump in grub kernel command line. + +After making said changes, reboot your system to take effect. Of course, if you +want to disable early kdump, you can simply remove "rd.earlykdump" from kernel +boot parameters in grub, and reboot system like above. + +Once the boot is completed, you can check the status of the early kdump support +on the command prompt: + + # journalctl -b | grep early-kdump + +Then, you will see some useful logs, for example: + +- if early kdump is successful. + +Mar 09 09:57:56 localhost dracut-cmdline[190]: early-kdump is enabled. +Mar 09 09:57:56 localhost dracut-cmdline[190]: kexec: loaded early-kdump kernel + +- if early kdump is disabled. + +Mar 09 10:02:47 localhost dracut-cmdline[189]: early-kdump is disabled. + +Notes +----- + +- The size of early kdump initramfs will be large because it includes vmlinuz + and kdump initramfs. + +- Early kdump inherits the settings of normal kdump, so any changes that + caused normal kdump rebuilding also require rebuilding the system initramfs + to make sure that the changes take effect for early kdump. Therefore, after + the rebuilding of kdump initramfs is completed, provide a prompt message to + tell the fact. + +- If you install an updated kernel and reboot the system with it, the early + kdump will be disabled by default. To enable it with the new kernel, you + need to take the above steps again. + +Limitation +---------- + +- At present, early kdump doesn't support fadump. + +- Early kdump loads a crash kernel and initramfs at the beginning of the + process in system's initramfs, so a crash at earlier than that (e.g. in + kernel initialization) cannot be captured even with the early kdump. diff --git a/SPECS/kexec-tools/fadump-howto.txt b/SPECS/kexec-tools/fadump-howto.txt new file mode 100644 index 0000000000..c891e37441 --- /dev/null +++ b/SPECS/kexec-tools/fadump-howto.txt @@ -0,0 +1,338 @@ +Firmware assisted dump (fadump) HOWTO + +Introduction + +Firmware assisted dump is a new feature in the 3.4 mainline kernel supported +only on powerpc architecture. The goal of firmware-assisted dump is to enable +the dump of a crashed system, and to do so from a fully-reset system, and to +minimize the total elapsed time until the system is back in production use. A +complete documentation on implementation can be found at +Documentation/powerpc/firmware-assisted-dump.txt in upstream linux kernel tree +from 3.4 version and above. + +Please note that the firmware-assisted dump feature is only available on Power6 +and above systems with recent firmware versions. + +Overview + +Fadump + +Fadump is a robust kernel crash dumping mechanism to get reliable kernel crash +dump with assistance from firmware. This approach does not use kexec, instead +firmware assists in booting the kdump kernel while preserving memory contents. +Unlike kdump, the system is fully reset, and loaded with a fresh copy of the +kernel. In particular, PCI and I/O devices are reinitialized and are in a +clean, consistent state. This second kernel, often called a capture kernel, +boots with very little memory and captures the dump image. + +The first kernel registers the sections of memory with the Power firmware for +dump preservation during OS initialization. These registered sections of memory +are reserved by the first kernel during early boot. When a system crashes, the +Power firmware fully resets the system, preserves all the system memory +contents, save the low memory (boot memory of size larger of 5% of system +RAM or 256MB) of RAM to the previous registered region. It will also save +system registers, and hardware PTE's. + +Fadump is supported only on ppc64 platform. The standard kernel and capture +kernel are one and the same on ppc64. + +If you're reading this document, you should already have kexec-tools +installed. If not, you install it via the following command: + + # yum install kexec-tools + +Fadump Operational Flow: + +Like kdump, fadump also exports the ELF formatted kernel crash dump through +/proc/vmcore. Hence existing kdump infrastructure can be used to capture fadump +vmcore. The idea is to keep the functionality transparent to end user. From +user perspective there is no change in the way kdump init script works. + +However, unlike kdump, fadump does not pre-load kdump kernel and initrd into +reserved memory, instead it always uses default OS initrd during second boot +after crash. Hence, for fadump, we rebuild the new kdump initrd and replace it +with default initrd. Before replacing existing default initrd we take a backup +of original default initrd for user's reference. The dracut package has been +enhanced to rebuild the default initrd with vmcore capture steps. The initrd +image is rebuilt as per the configuration in /etc/kdump.conf file. + +The control flow of fadump works as follows: +01. System panics. +02. At the crash, kernel informs power firmware that kernel has crashed. +03. Firmware takes the control and reboots the entire system preserving + only the memory (resets all other devices). +04. The reboot follows the normal booting process (non-kexec). +05. The boot loader loads the default kernel and initrd from /boot +06. The default initrd loads and runs /init +07. dracut-kdump.sh script present in fadump aware default initrd checks if + '/proc/device-tree/rtas/ibm,kernel-dump' file exists before executing + steps to capture vmcore. + (This check will help to bypass the vmcore capture steps during normal boot + process.) +09. Captures dump according to /etc/kdump.conf +10. Is dump capture successful (yes goto 12, no goto 11) +11. Perform the failure action specified in /etc/kdump.conf + (The default failure action is reboot, if unspecified) +12. Perform the final action specified in /etc/kdump.conf + (The default final action is reboot, if unspecified) + + +How to configure fadump: + +Again, we assume if you're reading this document, you should already have +kexec-tools installed. If not, you install it via the following command: + + # yum install kexec-tools + +Make the kernel to be configured with FADump as the default boot entry, if +it isn't already: + + # grubby --set-default=/boot/vmlinuz- + +Boot into the kernel to be configured for FADump. To be able to do much of +anything interesting in the way of debug analysis, you'll also need to install +the kernel-debuginfo package, of the same arch as your running kernel, and the +crash utility: + + # yum --enablerepo=\*debuginfo install kernel-debuginfo.$(uname -m) crash + +Next up, we need to modify some boot parameters to enable firmware assisted +dump. With the help of grubby, it's very easy to append "fadump=on" to the end +of your kernel boot parameters. To reserve the appropriate amount of memory +for boot memory preservation, pass 'crashkernel=X' kernel cmdline parameter. +For the recommended value of X, see 'FADump Memory Requirements' section. + + # grubby --args="fadump=on crashkernel=6G" --update-kernel=/boot/vmlinuz-`uname -r` + +The term 'boot memory' means size of the low memory chunk that is required for +a kernel to boot successfully when booted with restricted memory. By default, +the boot memory size will be the larger of 5% of system RAM or 256MB. +Alternatively, user can also specify boot memory size through boot parameter +'fadump_reserve_mem=' which will override the default calculated size. Use this +option if default boot memory size is not sufficient for second kernel to boot +successfully. + +After making said changes, reboot your system, so that the specified memory is +reserved and left untouched by the normal system. Take note that the output of +'free -m' will show X MB less memory than without this parameter, which is +expected. If you see OOM (Out Of Memory) error messages while loading capture +kernel, then you should bump up the memory reservation size. + +Now that you've got that reserved memory region set up, you want to turn on +the kdump init script: + + # systemctl enable kdump.service + +Then, start up kdump as well: + + # systemctl start kdump.service + +This should turn on the firmware assisted functionality in kernel by +echo'ing 1 to /sys/kernel/fadump_registered, leaving the system ready +to capture a vmcore upon crashing. For journaling filesystems like XFS an +additional step is required to ensure bootloader does not pick the +older initrd (without vmcore capture scripts): + + * If /boot is a separate partition, run the below commands as the root user, + or as a user with CAP_SYS_ADMIN rights: + + # fsfreeze -f + # fsfreeze -u + + * If /boot is not a separate partition, reboot the system. + +After reboot check if the kdump service is up and running with: + + # systemctl status kdump.service + +To test out whether FADump is configured properly, you can force-crash your +system by echo'ing a 'c' into /proc/sysrq-trigger: + + # echo c > /proc/sysrq-trigger + +You should see some panic output, followed by the system reset and booting into +fresh copy of kernel. When default initrd loads and runs /init, vmcore should +be copied out to disk (by default, in /var/crash//vmcore), +then the system rebooted back into your normal kernel. + +Once back to your normal kernel, you can use the previously installed crash +kernel in conjunction with the previously installed kernel-debuginfo to +perform postmortem analysis: + + # crash /usr/lib/debug/lib/modules/2.6.17-1.2621.el5/vmlinux + /var/crash/2006-08-23-15:34/vmcore + + crash> bt + +and so on... + +Saving vmcore-dmesg.txt +----------------------- +Kernel log bufferes are one of the most important information available +in vmcore. Now before saving vmcore, kernel log bufferes are extracted +from /proc/vmcore and saved into a file vmcore-dmesg.txt. After +vmcore-dmesg.txt, vmcore is saved. Destination disk and directory for +vmcore-dmesg.txt is same as vmcore. Note that kernel log buffers will +not be available if dump target is raw device. + +FADump Memory Requirements: + + System Memory Recommended memory +--------------------- ---------------------- + 4 GB - 16 GB : 768 MB + 16 GB - 64 GB : 1024 MB + 64 GB - 128 GB : 2 GB + 128 GB - 1 TB : 4 GB + 1 TB - 2 TB : 6 GB + 2 TB - 4 TB : 12 GB + 4 TB - 8 TB : 20 GB + 8 TB - 16 TB : 36 GB + 16 TB - 32 TB : 64 GB + 32 TB - 64 TB : 128 GB + 64 TB & above : 180 GB + +Things to remember: + +1) The memory required to boot capture Kernel is a moving target that depends + on many factors like hardware attached to the system, kernel and modules in + use, packages installed and services enabled, there is no one-size-fits-all. + But the above recommendations are based on system memory. So, the above + recommendations for FADump come with a few assumptions, based on available + system memory, about the resources the system could have. So, please take + the recommendations with a pinch of salt and remember to try capturing dump + a few times to confirm that the system is configured successfully with dump + capturing support. + +2) Though the memory requirements for FADump seem high, this memory is not + completely set aside but made available for userspace applications to use, + through the CMA allocator. + +3) As the same initrd is used for booting production kernel as well as capture + kernel and with dump being captured in a restricted memory environment, few + optimizations (like not inclding network dracut module, disabling multipath + and such) are applied while building the initrd. In case, the production + environment needs these optimizations to be avoided, dracut_args option in + /etc/kdump.conf file could be leveraged. For example, if a user wishes for + network module to be included in the initrd, adding the below entry in + /etc/kdump.conf file and restarting kdump service would take care of it. + + dracut_args --add "network" + +4) If FADump is configured to capture vmcore to a remote dump target using SSH + or NFS protocol, the network interface is renamed to kdump- + if is generic, for example, *eth#, or net#. This problem + occurs because the vmcore capture scripts in the initial RAM disk (initrd) + add the kdump- prefix to the network interface name to secure persistent + naming. As the same initrd is used for production kernel boot, the interface + name is changed for the production kernel too. + +Dump Triggering methods: + +This section talks about the various ways, other than a Kernel Panic, in which +fadump can be triggered. The following methods assume that fadump is configured +on your system, with the scripts enabled as described in the section above. + +1) AltSysRq C + +FAdump can be triggered with the combination of the 'Alt','SysRq' and 'C' +keyboard keys. Please refer to the following link for more details: + +https://fedoraproject.org/wiki/QA/Sysrq + +In addition, on PowerPC boxes, fadump can also be triggered via Hardware +Management Console(HMC) using 'Ctrl', 'O' and 'C' keyboard keys. + +2) Kernel OOPs + +If we want to generate a dump everytime the Kernel OOPses, we can achieve this +by setting the 'Panic On OOPs' option as follows: + + # echo 1 > /proc/sys/kernel/panic_on_oops + +3) PowerPC specific methods: + +On IBM PowerPC machines, issuing a soft reset invokes the XMON debugger(if +XMON is configured). To configure XMON one needs to compile the kernel with +the CONFIG_XMON and CONFIG_XMON_DEFAULT options, or by compiling with +CONFIG_XMON and booting the kernel with xmon=on option. + +Following are the ways to remotely issue a soft reset on PowerPC boxes, which +would drop you to XMON. Pressing a 'X' (capital alphabet X) followed by an +'Enter' here will trigger the dump. + +3.1) HMC + +Hardware Management Console(HMC) available on Power4 and Power5 machines allow +partitions to be reset remotely. This is specially useful in hang situations +where the system is not accepting any keyboard inputs. + +Once you have HMC configured, the following steps will enable you to trigger +fadump via a soft reset: + +On Power4 + Using GUI + + * In the right pane, right click on the partition you wish to dump. + * Select "Operating System->Reset". + * Select "Soft Reset". + * Select "Yes". + + Using HMC Commandline + + # reset_partition -m -p -t soft + +On Power5 + Using GUI + + * In the right pane, right click on the partition you wish to dump. + * Select "Restart Partition". + * Select "Dump". + * Select "OK". + + Using HMC Commandline + + # chsysstate -m -n -o dumprestart -r lpar + +3.2) Blade Management Console for Blade Center + +To initiate a dump operation, go to Power/Restart option under "Blade Tasks" in +the Blade Management Console. Select the corresponding blade for which you want +to initate the dump and then click "Restart blade with NMI". This issues a +system reset and invokes xmon debugger. + + +Advanced Setups & Failure action: + +Kdump and fadump exhibit similar behavior in terms of setup & failure action. +For fadump advanced setup related information see section "Advanced Setups" in +"kexec-kdump-howto.txt" document. Refer to "Failure action" section in "kexec- +kdump-howto.txt" document for fadump failure action related information. + +Compression and filtering + +Refer "Compression and filtering" section in "kexec-kdump-howto.txt" document. +Compression and filtering are same for kdump & fadump. + + +Notes on rootfs mount: +Dracut is designed to mount rootfs by default. If rootfs mounting fails it +will refuse to go on. So fadump leaves rootfs mounting to dracut currently. +We make the assumtion that proper root= cmdline is being passed to dracut +initramfs for the time being. If you need modify "KDUMP_COMMANDLINE=" in +/etc/sysconfig/kdump, you will need to make sure that appropriate root= +options are copied from /proc/cmdline. In general it is best to append +command line options using "KDUMP_COMMANDLINE_APPEND=" instead of replacing +the original command line completely. + +How to disable FADump: + +Remove "fadump=on" from kernel cmdline parameters: + + # grubby --update-kernel=/boot/vmlinuz-`uname -r` --remove-args="fadump=on" + +If KDump is to be used as the dump capturing mechanism, update the crashkernel +parameter (Else, remove "crashkernel=" parameter too, using grubby): + + # grubby --update-kernel=/boot/vmlinuz-$kver --args="crashkernl=auto" + +Reboot the system for the settings to take effect. diff --git a/SPECS/kexec-tools/kdump-dep-generator.sh b/SPECS/kexec-tools/kdump-dep-generator.sh new file mode 100644 index 0000000000..b6fab2dbe6 --- /dev/null +++ b/SPECS/kexec-tools/kdump-dep-generator.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +# More details about systemd generator: +# http://www.freedesktop.org/wiki/Software/systemd/Generators/ + +. /usr/lib/kdump/kdump-lib.sh + +# If invokded with no arguments for testing purpose, output to /tmp to +# avoid overriding the existing. +dest_dir="/tmp" + +if [ -n "$1" ]; then + dest_dir=$1 +fi + +systemd_dir=/usr/lib/systemd/system +kdump_wants=$dest_dir/kdump.service.wants + +if is_ssh_dump_target; then + mkdir -p $kdump_wants + ln -sf $systemd_dir/network-online.target $kdump_wants/ +fi diff --git a/SPECS/kexec-tools/kdump-in-cluster-environment.txt b/SPECS/kexec-tools/kdump-in-cluster-environment.txt new file mode 100644 index 0000000000..de1eb5e33b --- /dev/null +++ b/SPECS/kexec-tools/kdump-in-cluster-environment.txt @@ -0,0 +1,91 @@ +Kdump-in-cluster-environment HOWTO + +Introduction + +Kdump is a kexec based crash dumping mechansim for Linux. This docuement +illustrate how to configure kdump in cluster environment to allow the kdump +crash recovery service complete without being preempted by traditional power +fencing methods. + +Overview + +Kexec/Kdump + +Details about Kexec/Kdump are available in Kexec-Kdump-howto file and will not +be described here. + +fence_kdump + +fence_kdump is an I/O fencing agent to be used with the kdump crash recovery +service. When the fence_kdump agent is invoked, it will listen for a message +from the failed node that acknowledges that the failed node is executing the +kdump crash kernel. Note that fence_kdump is not a replacement for traditional +fencing methods. The fence_kdump agent can only detect that a node has entered +the kdump crash recovery service. This allows the kdump crash recovery service +complete without being preempted by traditional power fencing methods. + +fence_kdump_send + +fence_kdump_send is a utility used to send messages that acknowledge that the +node itself has entered the kdump crash recovery service. The fence_kdump_send +utility is typically run in the kdump kernel after a cluster node has +encountered a kernel panic. Once the cluster node has entered the kdump crash +recovery service, fence_kdump_send will periodically send messages to all +cluster nodes. When the fence_kdump agent receives a valid message from the +failed nodes, fencing is complete. + +How to configure Pacemaker cluster environment: + +If we want to use kdump in Pacemaker cluster environment, fence-agents-kdump +should be installed in every nodes in the cluster. You can achieve this via +the following command: + + # yum install -y fence-agents-kdump + +Next is to add kdump_fence to the cluster. Assuming that the cluster consists +of three nodes, they are node1, node2 and node3, and use Pacemaker to perform +resource management and pcs as cli configuration tool. + +With pcs it is easy to add a stonith resource to the cluster. For example, add +a stonith resource named mykdumpfence with fence type of fence_kdump via the +following commands: + + # pcs stonith create mykdumpfence fence_kdump \ + pcmk_host_check=static-list pcmk_host_list="node1 node2 node3" + # pcs stonith update mykdumpfence pcmk_monitor_action=metadata --force + # pcs stonith update mykdumpfence pcmk_status_action=metadata --force + # pcs stonith update mykdumpfence pcmk_reboot_action=off --force + +Then enable stonith + # pcs property set stonith-enabled=true + +How to configure kdump: + +Actually there are two ways how to configure fence_kdump support: + +1) Pacemaker based clusters + If you have successfully configured fence_kdump in Pacemaker, there is + no need to add some special configuration in kdump. So please refer to + Kexec-Kdump-howto file for more information. + +2) Generic clusters + For other types of clusters there are two configuration options in + kdump.conf which enables fence_kdump support: + + fence_kdump_nodes + Contains list of cluster node(s) separated by space to send + fence_kdump notification to (this option is mandatory to enable + fence_kdump) + + fence_kdump_args + Command line arguments for fence_kdump_send (it can contain + all valid arguments except hosts to send notification to) + + These options will most probably be configured by your cluster software, + so please refer to your cluster documentation how to enable fence_kdump + support. + +Please be aware that these two ways cannot be combined and 2) has precedence +over 1). It means that if fence_kdump is configured using fence_kdump_nodes +and fence_kdump_args options in kdump.conf, Pacemaker configuration is not +used even if it exists. diff --git a/SPECS/kexec-tools/kdump-lib-initramfs.sh b/SPECS/kexec-tools/kdump-lib-initramfs.sh new file mode 100755 index 0000000000..c98a43b473 --- /dev/null +++ b/SPECS/kexec-tools/kdump-lib-initramfs.sh @@ -0,0 +1,221 @@ +# These variables and functions are useful in 2nd kernel + +. /lib/kdump-lib.sh + +KDUMP_PATH="/var/crash" +CORE_COLLECTOR="" +DEFAULT_CORE_COLLECTOR="makedumpfile -l --message-level 1 -d 31" +DMESG_COLLECTOR="/sbin/vmcore-dmesg" +FAILURE_ACTION="systemctl reboot -f" +DATEDIR=`date +%Y-%m-%d-%T` +HOST_IP='127.0.0.1' +DUMP_INSTRUCTION="" +SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa" +KDUMP_SCRIPT_DIR="/kdumpscripts" +DD_BLKSIZE=512 +FINAL_ACTION="systemctl reboot -f" +KDUMP_CONF="/etc/kdump.conf" +KDUMP_PRE="" +KDUMP_POST="" +NEWROOT="/sysroot" +OPALCORE="/sys/firmware/opal/mpipl/core" + +get_kdump_confs() +{ + local config_opt config_val + + while read config_opt config_val; + do + # remove inline comments after the end of a directive. + case "$config_opt" in + path) + KDUMP_PATH="$config_val" + ;; + core_collector) + [ -n "$config_val" ] && CORE_COLLECTOR="$config_val" + ;; + sshkey) + if [ -f "$config_val" ]; then + SSH_KEY_LOCATION=$config_val + fi + ;; + kdump_pre) + KDUMP_PRE="$config_val" + ;; + kdump_post) + KDUMP_POST="$config_val" + ;; + fence_kdump_args) + FENCE_KDUMP_ARGS="$config_val" + ;; + fence_kdump_nodes) + FENCE_KDUMP_NODES="$config_val" + ;; + failure_action|default) + case $config_val in + shell) + FAILURE_ACTION="kdump_emergency_shell" + ;; + reboot) + FAILURE_ACTION="systemctl reboot -f && exit" + ;; + halt) + FAILURE_ACTION="halt && exit" + ;; + poweroff) + FAILURE_ACTION="systemctl poweroff -f && exit" + ;; + dump_to_rootfs) + FAILURE_ACTION="dump_to_rootfs" + ;; + esac + ;; + final_action) + case $config_val in + reboot) + FINAL_ACTION="systemctl reboot -f" + ;; + halt) + FINAL_ACTION="halt" + ;; + poweroff) + FINAL_ACTION="systemctl poweroff -f" + ;; + esac + ;; + esac + done <<< "$(read_strip_comments $KDUMP_CONF)" + + if [ -z "$CORE_COLLECTOR" ]; then + CORE_COLLECTOR="$DEFAULT_CORE_COLLECTOR" + if is_ssh_dump_target || is_raw_dump_target; then + CORE_COLLECTOR="$CORE_COLLECTOR -F" + fi + fi +} + +# dump_fs +dump_fs() +{ + local _mp=$1 + local _dev=$(get_mount_info SOURCE target $_mp -f) + local _op=$(get_mount_info OPTIONS target $_mp -f) + + # If dump path have a corresponding device entry but not mounted, mount it. + if [ -n "$_dev" ]; then + if ! is_mounted "$_mp"; then + echo "kdump: dump target $_dev is not mounted, trying to mount..." + mkdir -p $_mp + mount -o $_op $_dev $_mp + + if [ $? -ne 0 ]; then + echo "kdump: mounting failed (mount point: $_mp, option: $_op)" + return 1 + fi + fi + else + echo "kdump: failed to dump to \"$_mp\", it's not a mount point!" + return 1 + fi + + # Remove -F in makedumpfile case. We don't want a flat format dump here. + [[ $CORE_COLLECTOR = *makedumpfile* ]] && CORE_COLLECTOR=`echo $CORE_COLLECTOR | sed -e "s/-F//g"` + + local _dump_path=$(echo "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/" | tr -s /) + + echo "kdump: saving to $_dump_path" + + # Only remount to read-write mode if the dump target is mounted read-only. + if [[ "$_op" = "ro"* ]]; then + echo "kdump: Mounting Dump target $_dev in rw mode." + mount -o remount,rw $_dev $_mp || return 1 + fi + + mkdir -p $_dump_path || return 1 + + save_vmcore_dmesg_fs ${DMESG_COLLECTOR} "$_dump_path" + save_opalcore_fs "$_dump_path" + + echo "kdump: saving vmcore" + $CORE_COLLECTOR /proc/vmcore $_dump_path/vmcore-incomplete || return 1 + mv $_dump_path/vmcore-incomplete $_dump_path/vmcore + sync + + echo "kdump: saving vmcore complete" + + # improper kernel cmdline can cause the failure of echo, we can ignore this kind of failure + return 0 +} + +save_vmcore_dmesg_fs() { + local _dmesg_collector=$1 + local _path=$2 + + echo "kdump: saving vmcore-dmesg.txt" + $_dmesg_collector /proc/vmcore > ${_path}/vmcore-dmesg-incomplete.txt + _exitcode=$? + if [ $_exitcode -eq 0 ]; then + mv ${_path}/vmcore-dmesg-incomplete.txt ${_path}/vmcore-dmesg.txt + + # Make sure file is on disk. There have been instances where later + # saving vmcore failed and system rebooted without sync and there + # was no vmcore-dmesg.txt available. + sync + echo "kdump: saving vmcore-dmesg.txt complete" + else + echo "kdump: saving vmcore-dmesg.txt failed" + fi +} + +save_opalcore_fs() { + local _path=$1 + + if [ ! -f $OPALCORE ]; then + # Check if we are on an old kernel that uses a different path + if [ -f /sys/firmware/opal/core ]; then + OPALCORE="/sys/firmware/opal/core" + else + return 0 + fi + fi + + echo "kdump: saving opalcore" + cp $OPALCORE ${_path}/opalcore + if [ $? -ne 0 ]; then + echo "kdump: saving opalcore failed" + return 1 + fi + + sync + echo "kdump: saving opalcore complete" + return 0 +} + +dump_to_rootfs() +{ + + echo "Kdump: trying to bring up rootfs device" + systemctl start dracut-initqueue + echo "Kdump: waiting for rootfs mount, will timeout after 90 seconds" + systemctl start sysroot.mount + + dump_fs $NEWROOT +} + +kdump_emergency_shell() +{ + echo "PS1=\"kdump:\\\${PWD}# \"" >/etc/profile + /bin/dracut-emergency + rm -f /etc/profile +} + +do_failure_action() +{ + echo "Kdump: Executing failure action $FAILURE_ACTION" + eval $FAILURE_ACTION +} + +do_final_action() +{ + eval $FINAL_ACTION +} diff --git a/SPECS/kexec-tools/kdump-lib.sh b/SPECS/kexec-tools/kdump-lib.sh new file mode 100755 index 0000000000..f78e06481c --- /dev/null +++ b/SPECS/kexec-tools/kdump-lib.sh @@ -0,0 +1,725 @@ +#!/bin/sh +# +# Kdump common variables and functions +# + +DEFAULT_PATH="/var/crash/" +FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump" +FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send" +FADUMP_ENABLED_SYS_NODE="/sys/kernel/fadump_enabled" + +is_fadump_capable() +{ + # Check if firmware-assisted dump is enabled + # if no, fallback to kdump check + if [ -f $FADUMP_ENABLED_SYS_NODE ]; then + rc=`cat $FADUMP_ENABLED_SYS_NODE` + [ $rc -eq 1 ] && return 0 + fi + return 1 +} + +perror_exit() { + echo $@ >&2 + exit 1 +} + +perror() { + echo $@ >&2 +} + +is_fs_type_nfs() +{ + [ "$1" = "nfs" ] || [ "$1" = "nfs4" ] +} + +is_ssh_dump_target() +{ + grep -q "^ssh[[:blank:]].*@" /etc/kdump.conf +} + +is_nfs_dump_target() +{ + if grep -q "^nfs" /etc/kdump.conf; then + return 0; + fi + + if is_fs_type_nfs $(get_dracut_args_fstype "$(grep "^dracut_args .*\-\-mount" /etc/kdump.conf)"); then + return 0 + fi + + local _save_path=$(get_save_path) + local _target=$(get_target_from_path $_save_path) + local _fstype=$(get_fs_type_from_target $_target) + + if is_fs_type_nfs $_fstype; then + return 0 + fi + + return 1 +} + +is_raw_dump_target() +{ + grep -q "^raw" /etc/kdump.conf +} + +is_fs_dump_target() +{ + egrep -q "^ext[234]|^xfs|^btrfs|^minix" /etc/kdump.conf +} + +strip_comments() +{ + echo $@ | sed -e 's/\(.*\)#.*/\1/' +} + +# Read from kdump config file stripping all comments +read_strip_comments() +{ + # strip heading spaces, and print any content starting with + # neither space or #, and strip everything after # + sed -n -e "s/^\s*\([^# \t][^#]\+\).*/\1/gp" $1 +} + +# Check if fence kdump is configured in Pacemaker cluster +is_pcs_fence_kdump() +{ + # no pcs or fence_kdump_send executables installed? + type -P pcs > /dev/null || return 1 + [ -x $FENCE_KDUMP_SEND ] || return 1 + + # fence kdump not configured? + (pcs cluster cib | grep 'type="fence_kdump"') &> /dev/null || return 1 +} + +# Check if fence_kdump is configured using kdump options +is_generic_fence_kdump() +{ + [ -x $FENCE_KDUMP_SEND ] || return 1 + + grep -q "^fence_kdump_nodes" /etc/kdump.conf +} + +to_dev_name() { + local dev="${1//\"/}" + + case "$dev" in + UUID=*) + dev=`blkid -U "${dev#UUID=}"` + ;; + LABEL=*) + dev=`blkid -L "${dev#LABEL=}"` + ;; + esac + echo $dev +} + +is_user_configured_dump_target() +{ + grep -E -q "^ext[234]|^xfs|^btrfs|^minix|^raw|^nfs|^ssh" /etc/kdump.conf || is_mount_in_dracut_args; +} + +get_user_configured_dump_disk() +{ + local _target + + _target=$(egrep "^ext[234]|^xfs|^btrfs|^minix|^raw" /etc/kdump.conf 2>/dev/null |awk '{print $2}') + [ -n "$_target" ] && echo $_target && return + + _target=$(get_dracut_args_target "$(grep "^dracut_args .*\-\-mount" /etc/kdump.conf)") + [ -b "$_target" ] && echo $_target +} + +get_root_fs_device() +{ + findmnt -k -f -n -o SOURCE / +} + +get_save_path() +{ + local _save_path=$(awk '$1 == "path" {print $2}' /etc/kdump.conf) + [ -z "$_save_path" ] && _save_path=$DEFAULT_PATH + + # strip the duplicated "/" + echo $_save_path | tr -s / +} + +get_block_dump_target() +{ + local _target _path + + if is_ssh_dump_target || is_nfs_dump_target; then + return + fi + + _target=$(get_user_configured_dump_disk) + [ -n "$_target" ] && echo $(to_dev_name $_target) && return + + # Get block device name from local save path + _path=$(get_save_path) + _target=$(get_target_from_path $_path) + [ -b "$_target" ] && echo $(to_dev_name $_target) +} + +is_dump_to_rootfs() +{ + grep -E "^(failure_action|default)[[:space:]]dump_to_rootfs" /etc/kdump.conf >/dev/null +} + +get_failure_action_target() +{ + local _target + + if is_dump_to_rootfs; then + # Get rootfs device name + _target=$(get_root_fs_device) + [ -b "$_target" ] && echo $(to_dev_name $_target) && return + # Then, must be nfs root + echo "nfs" + fi +} + +# Get kdump targets(including root in case of dump_to_rootfs). +get_kdump_targets() +{ + local _target _root + local kdump_targets + + _target=$(get_block_dump_target) + if [ -n "$_target" ]; then + kdump_targets=$_target + elif is_ssh_dump_target; then + kdump_targets="ssh" + else + kdump_targets="nfs" + fi + + # Add the root device if dump_to_rootfs is specified. + _root=$(get_failure_action_target) + if [ -n "$_root" -a "$kdump_targets" != "$_root" ]; then + kdump_targets="$kdump_targets $_root" + fi + + echo "$kdump_targets" +} + +# Return the bind mount source path, return the path itself if it's not bind mounted +# Eg. if /path/to/src is bind mounted to /mnt/bind, then: +# /mnt/bind -> /path/to/src, /mnt/bind/dump -> /path/to/src/dump +# +# findmnt uses the option "-v, --nofsroot" to exclusive the [/dir] +# in the SOURCE column for bind-mounts, then if $_mntpoint equals to +# $_mntpoint_nofsroot, the mountpoint is not bind mounted directory. +# +# Below is just an example for mount info +# /dev/mapper/atomicos-root[/ostree/deploy/rhel-atomic-host/var], if the +# directory is bind mounted. The former part represents the device path, rest +# part is the bind mounted directory which quotes by bracket "[]". +get_bind_mount_source() +{ + local _path=$1 + # In case it's a sub path in a mount point, get the mount point first + local _mnt_top=$(df $_path | tail -1 | awk '{print $NF}') + local _mntpoint=$(findmnt $_mnt_top | tail -n 1 | awk '{print $2}') + local _mntpoint_nofsroot=$(findmnt -v $_mnt_top | tail -n 1 | awk '{print $2}') + + if [[ "$_mntpoint" = $_mntpoint_nofsroot ]]; then + echo $_path && return + fi + + _mntpoint=${_mntpoint#*$_mntpoint_nofsroot} + _mntpoint=${_mntpoint#[} + _mntpoint=${_mntpoint%]} + _path=${_path#$_mnt_top} + + echo $_mntpoint$_path +} + +# Return the current underlaying device of a path, ignore bind mounts +get_target_from_path() +{ + local _target + + _target=$(df $1 2>/dev/null | tail -1 | awk '{print $1}') + [[ "$_target" == "/dev/root" ]] && [[ ! -e /dev/root ]] && _target=$(get_root_fs_device) + echo $_target +} + +is_mounted() +{ + findmnt -k -n $1 &>/dev/null +} + +get_mount_info() +{ + local _info_type=$1 _src_type=$2 _src=$3; shift 3 + local _info=$(findmnt --real -k -n -r -o $_info_type --$_src_type $_src $@) + + [ -z "$_info" ] && [ -e "/etc/fstab" ] && _info=$(findmnt --real -s -n -r -o $_info_type --$_src_type $_src $@) + + echo $_info +} + +get_fs_type_from_target() +{ + get_mount_info FSTYPE source $1 -f +} + +get_mntopt_from_target() +{ + get_mount_info OPTIONS source $1 -f +} +# Find the general mount point of a dump target, not the bind mount point +get_mntpoint_from_target() +{ + # Expcilitly specify --source to findmnt could ensure non-bind mount is returned + get_mount_info TARGET source $1 -f +} + +# Get the path where the target will be mounted in kdump kernel +# $1: kdump target device +get_kdump_mntpoint_from_target() +{ + local _mntpoint=$(get_mntpoint_from_target $1) + + # mount under /sysroot if dump to root disk or mount under + # mount under /kdumproot if dump target is not mounted in first kernel + # mount under /kdumproot/$_mntpoint in other cases in 2nd kernel. + # systemd will be in charge to umount it. + if [ -z "$_mntpoint" ];then + _mntpoint="/kdumproot" + else + if [ "$_mntpoint" = "/" ];then + _mntpoint="/sysroot" + else + _mntpoint="/kdumproot/$_mntpoint" + fi + fi + + # strip duplicated "/" + echo $_mntpoint | tr -s "/" +} + +# get_option_value +# retrieves value of option defined in kdump.conf +get_option_value() { + strip_comments `grep "^$1[[:space:]]\+" /etc/kdump.conf | tail -1 | cut -d\ -f2-` +} + +kdump_get_persistent_dev() { + local dev="${1//\"/}" + + case "$dev" in + UUID=*) + dev=`blkid -U "${dev#UUID=}"` + ;; + LABEL=*) + dev=`blkid -L "${dev#LABEL=}"` + ;; + esac + echo $(get_persistent_dev "$dev") +} + +is_atomic() +{ + grep -q "ostree" /proc/cmdline +} + +is_ipv6_address() +{ + echo $1 | grep -q ":" +} + +# get ip address or hostname from nfs/ssh config value +get_remote_host() +{ + local _config_val=$1 + + # ipv6 address in kdump.conf is around with "[]", + # factor out the ipv6 address + _config_val=${_config_val#*@} + _config_val=${_config_val%:/*} + _config_val=${_config_val#[} + _config_val=${_config_val%]} + echo $_config_val +} + +is_hostname() +{ + local _hostname=`echo $1 | grep ":"` + + if [ -n "$_hostname" ]; then + return 1 + fi + echo $1 | grep -q "[a-zA-Z]" +} + +# Copied from "/etc/sysconfig/network-scripts/network-functions" +get_hwaddr() +{ + if [ -f "/sys/class/net/${1}/address" ]; then + awk '{ print toupper($0) }' < /sys/class/net/${1}/address + elif [ -d "/sys/class/net/${1}" ]; then + LC_ALL= LANG= ip -o link show ${1} 2>/dev/null | \ + awk '{ print toupper(gensub(/.*link\/[^ ]* ([[:alnum:]:]*).*/, + "\\1", 1)); }' + fi +} + +get_ifcfg_by_device() +{ + grep -E -i -l "^[[:space:]]*DEVICE=\"*${1}\"*[[:space:]]*$" \ + /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1 +} + +get_ifcfg_by_hwaddr() +{ + grep -E -i -l "^[[:space:]]*HWADDR=\"*${1}\"*[[:space:]]*$" \ + /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1 +} + +get_ifcfg_by_uuid() +{ + grep -E -i -l "^[[:space:]]*UUID=\"*${1}\"*[[:space:]]*$" \ + /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1 +} + +get_ifcfg_by_name() +{ + grep -E -i -l "^[[:space:]]*NAME=\"*${1}\"*[[:space:]]*$" \ + /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1 +} + +is_nm_running() +{ + [ "$(LANG=C nmcli -t --fields running general status 2>/dev/null)" = "running" ] +} + +is_nm_handling() +{ + LANG=C nmcli -t --fields device,state dev status 2>/dev/null \ + | grep -q "^\(${1}:connected\)\|\(${1}:connecting.*\)$" +} + +# $1: netdev name +get_ifcfg_nmcli() +{ + local nm_uuid nm_name + local ifcfg_file + + # Get the active nmcli config name of $1 + if is_nm_running && is_nm_handling "${1}" ; then + # The configuration "uuid" and "name" generated by nm is wrote to + # the ifcfg file as "UUID=" and "NAME=". + nm_uuid=$(LANG=C nmcli -t --fields uuid,device c show --active 2>/dev/null \ + | grep "${1}" | head -1 | cut -d':' -f1) + nm_name=$(LANG=C nmcli -t --fields name,device c show --active 2>/dev/null \ + | grep "${1}" | head -1 | cut -d':' -f1) + ifcfg_file=$(get_ifcfg_by_uuid "${nm_uuid}") + [ -z "${ifcfg_file}" ] && ifcfg_file=$(get_ifcfg_by_name "${nm_name}") + fi + + echo -n "${ifcfg_file}" +} + +# $1: netdev name +get_ifcfg_legacy() +{ + local ifcfg_file + + ifcfg_file="/etc/sysconfig/network-scripts/ifcfg-${1}" + [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return + + ifcfg_file=$(get_ifcfg_by_name "${1}") + [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return + + local hwaddr=$(get_hwaddr "${1}") + if [ -n "$hwaddr" ]; then + ifcfg_file=$(get_ifcfg_by_hwaddr "${hwaddr}") + [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return + fi + + ifcfg_file=$(get_ifcfg_by_device "${1}") + + echo -n "${ifcfg_file}" +} + +# $1: netdev name +# Return the ifcfg file whole name(including the path) of $1 if any. +get_ifcfg_filename() { + local ifcfg_file + + ifcfg_file=$(get_ifcfg_nmcli "${1}") + if [ -z "${ifcfg_file}" ]; then + ifcfg_file=$(get_ifcfg_legacy "${1}") + fi + + echo -n "${ifcfg_file}" +} + +# returns 0 when omission of watchdog module is desired in dracut_args +# returns 1 otherwise +is_wdt_mod_omitted() { + local dracut_args + local ret=1 + + dracut_args=$(grep "^dracut_args" /etc/kdump.conf) + [[ -z $dracut_args ]] && return $ret + + eval set -- $dracut_args + while :; do + [[ -z $1 ]] && break + case $1 in + -o|--omit) + echo $2 | grep -qw "watchdog" + [[ $? == 0 ]] && ret=0 + break + esac + shift + done + + return $ret +} + +# If "dracut_args" contains "--mount" information, use it +# directly without any check(users are expected to ensure +# its correctness). +is_mount_in_dracut_args() +{ + grep -q "^dracut_args .*\-\-mount" /etc/kdump.conf +} + +# If $1 contains dracut_args "--mount", return +get_dracut_args_fstype() +{ + echo $1 | grep "\-\-mount" | sed "s/.*--mount .\(.*\)/\1/" | cut -d' ' -f3 +} + +# If $1 contains dracut_args "--mount", return +get_dracut_args_target() +{ + echo $1 | grep "\-\-mount" | sed "s/.*--mount .\(.*\)/\1/" | cut -d' ' -f1 +} + +check_crash_mem_reserved() +{ + local mem_reserved + + mem_reserved=$(cat /sys/kernel/kexec_crash_size) + if [ $mem_reserved -eq 0 ]; then + echo "No memory reserved for crash kernel" + return 1 + fi + + return 0 +} + +check_kdump_feasibility() +{ + if [ ! -e /sys/kernel/kexec_crash_loaded ]; then + echo "Kdump is not supported on this kernel" + return 1 + fi + check_crash_mem_reserved + return $? +} + +check_current_kdump_status() +{ + if [ ! -f /sys/kernel/kexec_crash_loaded ];then + echo "Perhaps CONFIG_CRASH_DUMP is not enabled in kernel" + return 1 + fi + + rc=`cat /sys/kernel/kexec_crash_loaded` + if [ $rc == 1 ]; then + return 0 + else + return 1 + fi +} + +# remove_cmdline_param [] ... [] +# Remove a list of kernel parameters from a given kernel cmdline and print the result. +# For each "arg" in the removing params list, "arg" and "arg=xxx" will be removed if exists. +remove_cmdline_param() +{ + local cmdline=$1 + shift + + for arg in $@; do + cmdline=`echo $cmdline | \ + sed -e "s/\b$arg=[^ ]*//g" \ + -e "s/^$arg\b//g" \ + -e "s/[[:space:]]$arg\b//g" \ + -e "s/\s\+/ /g"` + done + echo $cmdline +} + +# +# This function returns the "apicid" of the boot +# cpu (cpu 0) if present. +# +get_bootcpu_apicid() +{ + awk ' \ + BEGIN { CPU = "-1"; } \ + $1=="processor" && $2==":" { CPU = $NF; } \ + CPU=="0" && /^apicid/ { print $NF; } \ + ' \ + /proc/cpuinfo +} + +# +# append_cmdline +# This function appends argument "$2=$3" to string ($1) if not already present. +# +append_cmdline() +{ + local cmdline=$1 + local newstr=${cmdline/$2/""} + + # unchanged str implies argument wasn't there + if [ "$cmdline" == "$newstr" ]; then + cmdline="${cmdline} ${2}=${3}" + fi + + echo $cmdline +} + +# This function check iomem and determines if we have more than +# 4GB of ram available. Returns 1 if we do, 0 if we dont +need_64bit_headers() +{ + return `tail -n 1 /proc/iomem | awk '{ split ($1, r, "-"); \ + print (strtonum("0x" r[2]) > strtonum("0xffffffff")); }'` +} + +# Check if secure boot is being enforced. +# +# Per Peter Jones, we need check efivar SecureBoot-$(the UUID) and +# SetupMode-$(the UUID), they are both 5 bytes binary data. The first four +# bytes are the attributes associated with the variable and can safely be +# ignored, the last bytes are one-byte true-or-false variables. If SecureBoot +# is 1 and SetupMode is 0, then secure boot is being enforced. +# +# Assume efivars is mounted at /sys/firmware/efi/efivars. +is_secure_boot_enforced() +{ + local secure_boot_file setup_mode_file + local secure_boot_byte setup_mode_byte + + secure_boot_file=$(find /sys/firmware/efi/efivars -name SecureBoot-* 2>/dev/null) + setup_mode_file=$(find /sys/firmware/efi/efivars -name SetupMode-* 2>/dev/null) + + if [ -f "$secure_boot_file" ] && [ -f "$setup_mode_file" ]; then + secure_boot_byte=$(hexdump -v -e '/1 "%d\ "' $secure_boot_file|cut -d' ' -f 5) + setup_mode_byte=$(hexdump -v -e '/1 "%d\ "' $setup_mode_file|cut -d' ' -f 5) + + if [ "$secure_boot_byte" = "1" ] && [ "$setup_mode_byte" = "0" ]; then + return 0 + fi + fi + + return 1 +} + +# +# prepare_kexec_args +# This function prepares kexec argument. +# +prepare_kexec_args() +{ + local kexec_args=$1 + local found_elf_args + + ARCH=`uname -m` + if [ "$ARCH" == "i686" -o "$ARCH" == "i386" ] + then + need_64bit_headers + if [ $? == 1 ] + then + found_elf_args=`echo $kexec_args | grep elf32-core-headers` + if [ -n "$found_elf_args" ] + then + echo -n "Warning: elf32-core-headers overrides correct elf64 setting" + echo + else + kexec_args="$kexec_args --elf64-core-headers" + fi + else + found_elf_args=`echo $kexec_args | grep elf64-core-headers` + if [ -z "$found_elf_args" ] + then + kexec_args="$kexec_args --elf32-core-headers" + fi + fi + fi + echo $kexec_args +} + +check_boot_dir() +{ + local kdump_bootdir=$1 + #If user specify a boot dir for kdump kernel, let's use it. Otherwise + #check whether it's a atomic host. If yes parse the subdirectory under + #/boot; If not just find it under /boot. + if [ -n "$kdump_bootdir" ]; then + echo "$kdump_bootdir" + return + fi + + if ! is_atomic || [ "$(uname -m)" = "s390x" ]; then + kdump_bootdir="/boot" + else + eval $(cat /proc/cmdline| grep "BOOT_IMAGE" | cut -d' ' -f1) + kdump_bootdir="/boot"$(dirname ${BOOT_IMAGE#*)}) + fi + echo $kdump_bootdir +} + +# +# prepare_cmdline +# This function performs a series of edits on the command line. +# Store the final result in global $KDUMP_COMMANDLINE. +prepare_cmdline() +{ + local cmdline id + + if [ -z "$1" ]; then + cmdline=$(cat /proc/cmdline) + else + cmdline="$1" + fi + + # These params should always be removed + cmdline=$(remove_cmdline_param "$cmdline" crashkernel panic_on_warn) + # These params can be removed configurably + cmdline=$(remove_cmdline_param "$cmdline" "$2") + + # Always remove "root=X", as we now explicitly generate all kinds + # of dump target mount information including root fs. + # + # We do this before KDUMP_COMMANDLINE_APPEND, if one really cares + # about it(e.g. for debug purpose), then can pass "root=X" using + # KDUMP_COMMANDLINE_APPEND. + cmdline=$(remove_cmdline_param "$cmdline" root) + + # With the help of "--hostonly-cmdline", we can avoid some interitage. + cmdline=$(remove_cmdline_param "$cmdline" rd.lvm.lv rd.luks.uuid rd.dm.uuid rd.md.uuid fcoe) + + # Remove netroot, rd.iscsi.initiator and iscsi_initiator since + # we get duplicate entries for the same in case iscsi code adds + # it as well. + cmdline=$(remove_cmdline_param "$cmdline" netroot rd.iscsi.initiator iscsi_initiator) + + cmdline="${cmdline} $3" + + id=$(get_bootcpu_apicid) + if [ ! -z ${id} ] ; then + cmdline=$(append_cmdline "${cmdline}" disable_cpu_apicid ${id}) + fi + echo ${cmdline} +} diff --git a/SPECS/kexec-tools/kdump-udev-throttler b/SPECS/kexec-tools/kdump-udev-throttler new file mode 100755 index 0000000000..cd77a31932 --- /dev/null +++ b/SPECS/kexec-tools/kdump-udev-throttler @@ -0,0 +1,42 @@ +#!/bin/bash +# This util helps to reduce the workload of kdump service restarting +# on udev event. When hotplugging memory / CPU, multiple udev +# events may be triggered concurrently, and obviously, we don't want +# to restart kdump service for each event. + +# This script will be called by udev, and make sure kdump service is +# restart after all events we are watching are settled. + +# On each call, this script will update try to aquire the $throttle_lock +# The first instance acquired the file lock will keep waiting for events +# to settle and then reload kdump. Other instances will just exit +# In this way, we can make sure kdump service is restarted immediately +# and for exactly once after udev events are settled. + +throttle_lock="/var/lock/kdump-udev-throttle" + +exec 9>$throttle_lock +if [ $? -ne 0 ]; then + echo "Failed to create the lock file! Fallback to non-throttled kdump service restart" + /bin/kdumpctl reload + exit 1 +fi + +flock -n 9 +if [ $? -ne 0 ]; then + echo "Throttling kdump restart for concurrent udev event" + exit 0 +fi + +# Wait for at least 1 second, at most 4 seconds for udev to settle +# Idealy we will have a less than 1 second lag between udev events settle +# and kdump reload +sleep 1 && udevadm settle --timeout 3 + +# Release the lock, /bin/kdumpctl will block and make the process +# holding two locks at the same time and we might miss some events +exec 9>&- + +/bin/kdumpctl reload + +exit 0 diff --git a/SPECS/kexec-tools/kdump.conf b/SPECS/kexec-tools/kdump.conf new file mode 100644 index 0000000000..ed78507b27 --- /dev/null +++ b/SPECS/kexec-tools/kdump.conf @@ -0,0 +1,185 @@ +# This file contains a series of commands to perform (in order) in the kdump +# kernel after a kernel crash in the crash kernel(1st kernel) has happened. +# +# Directives in this file are only applicable to the kdump initramfs, and have +# no effect once the root filesystem is mounted and the normal init scripts are +# processed. +# +# Currently, only one dump target and path can be specified. If the dumping to +# the configured target fails, the failure action which can be configured via +# the "failure_action" directive will be performed. +# +# Supported options: +# +# raw +# - Will dd /proc/vmcore into . +# Use persistent device names for partition devices, +# such as /dev/vg/. +# +# nfs +# - Will mount nfs to , and copy /proc/vmcore to +# //%HOST-%DATE/, supports DNS. +# +# ssh +# - Will scp /proc/vmcore to :/%HOST-%DATE/, +# supports DNS. +# NOTE: make sure the user has write permissions on the server. +# +# sshkey +# - Will use the sshkey to do ssh dump. +# Specify the path of the ssh key to use when dumping +# via ssh. The default value is /root/.ssh/kdump_id_rsa. +# +# +# - Will mount -t , and copy +# /proc/vmcore to //%HOST_IP-%DATE/. +# NOTE: can be a device node, label or uuid. +# It's recommended to use persistent device names +# such as /dev/vg/. +# Otherwise it's suggested to use label or uuid. +# +# path +# - "path" represents the file system path in which vmcore +# will be saved. If a dump target is specified in +# kdump.conf, then "path" is relative to the specified +# dump target. +# +# Interpretation of "path" changes a bit if the user didn't +# specify any dump target explicitly in kdump.conf. In this +# case, "path" represents the absolute path from root. The +# dump target and adjusted path are arrived at automatically +# depending on what's mounted in the current system. +# +# Ignored for raw device dumps. If unset, will use the default +# "/var/crash". +# +# core_collector +# - This allows you to specify the command to copy +# the vmcore. The default is makedumpfile, which on +# some architectures can drastically reduce vmcore size. +# See /sbin/makedumpfile --help for a list of options. +# Note that the -i and -g options are not needed here, +# as the initrd will automatically be populated with a +# config file appropriate for the running kernel. +# The default core_collector for raw/ssh dump is: +# "makedumpfile -F -l --message-level 1 -d 31". +# The default core_collector for other targets is: +# "makedumpfile -l --message-level 1 -d 31". +# +# "makedumpfile -F" will create a flattened vmcore. +# You need to use "makedumpfile -R" to rearrange the dump data to +# a normal dumpfile readable with analysis tools. For example: +# "makedumpfile -R vmcore < vmcore.flat". +# +# For core_collector format details, you can refer to +# kexec-kdump-howto.txt or kdump.conf manpage. +# +# kdump_post +# - This directive allows you to run a executable binary +# or script after the vmcore dump process terminates. +# The exit status of the current dump process is fed to +# the executable binary or script as its first argument. +# If /etc/kdump/post.d directory exists, all files in +# the directory are collectively sorted and executed in +# lexical order, before binary or script specified +# kdump_post parameter is executed. +# +# kdump_pre +# - Works like the "kdump_post" directive, but instead of running +# after the dump process, runs immediately before it. +# Exit status of this binary is interpreted as follows: +# 0 - continue with dump process as usual +# non 0 - reboot the system +# If /etc/kdump/pre.d directory exists, all files in +# the directory are collectively sorted and executed in +# lexical order, after binary or script specified +# kdump_pre parameter is executed. +# Even if the binary or script in /etc/kdump/pre.d directory +# returns non 0 exit status, the processing is continued. +# +# extra_bins +# - This directive allows you to specify additional binaries or +# shell scripts to be included in the kdump initrd. +# Generally they are useful in conjunction with a kdump_post +# or kdump_pre binary or script which depends on these extra_bins. +# +# extra_modules +# - This directive allows you to specify extra kernel modules +# that you want to be loaded in the kdump initrd. +# Multiple modules can be listed, separated by spaces, and any +# dependent modules will automatically be included. +# +# failure_action +# - Action to perform in case dumping fails. +# reboot: Reboot the system. +# halt: Halt the system. +# poweroff: Power down the system. +# shell: Drop to a bash shell. +# Exiting the shell reboots the system by default, +# or perform "final_action". +# dump_to_rootfs: Dump vmcore to rootfs from initramfs context and +# reboot by default or perform "final_action". +# Useful when non-root dump target is specified. +# The default option is "reboot". +# +# default +# - Same as the "failure_action" directive above, but this directive +# is obsolete and will be removed in the future. +# +# final_action +# - Action to perform in case dumping succeeds. Also performed +# when "shell" or "dump_to_rootfs" failure action finishes. +# Each action is same as the "failure_action" directive above. +# The default is "reboot". +# +# force_rebuild <0 | 1> +# - By default, kdump initrd will only be rebuilt when necessary. +# Specify 1 to force rebuilding kdump initrd every time when kdump +# service starts. +# +# force_no_rebuild <0 | 1> +# - By default, kdump initrd will be rebuilt when necessary. +# Specify 1 to bypass rebuilding of kdump initrd. +# +# force_no_rebuild and force_rebuild options are mutually +# exclusive and they should not be set to 1 simultaneously. +# +# override_resettable <0 | 1> +# - Usually an unresettable block device can't be a dump target. +# Specifying 1 when you want to dump even though the block +# target is unresettable +# By default, it is 0, which will not try dumping destined to fail. +# +# dracut_args +# - Pass extra dracut options when rebuilding kdump initrd. +# +# fence_kdump_args +# - Command line arguments for fence_kdump_send (it can contain +# all valid arguments except hosts to send notification to). +# +# fence_kdump_nodes +# - List of cluster node(s) except localhost, separated by spaces, +# to send fence_kdump notifications to. +# (this option is mandatory to enable fence_kdump). +# + +#raw /dev/vg/lv_kdump +#ext4 /dev/vg/lv_kdump +#ext4 LABEL=/boot +#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937 +#nfs my.server.com:/export/tmp +#ssh user@my.server.com +#sshkey /root/.ssh/kdump_id_rsa +path /var/crash +core_collector makedumpfile -l --message-level 1 -d 31 +#core_collector scp +#kdump_post /var/crash/scripts/kdump-post.sh +#kdump_pre /var/crash/scripts/kdump-pre.sh +#extra_bins /usr/bin/lftp +#extra_modules gfs2 +#failure_action shell +#force_rebuild 1 +#force_no_rebuild 1 +#dracut_args --omit-drivers "cfg80211 snd" --add-drivers "ext2 ext3" +#fence_kdump_args -p 7410 -f auto -c 0 -i 10 +#fence_kdump_nodes node1 node2 diff --git a/SPECS/kexec-tools/kdump.conf.5 b/SPECS/kexec-tools/kdump.conf.5 new file mode 100644 index 0000000000..9f2b2b611e --- /dev/null +++ b/SPECS/kexec-tools/kdump.conf.5 @@ -0,0 +1,372 @@ +.TH KDUMP.CONF 5 "07/23/2008" "kexec-tools" + +.SH NAME +kdump.conf \- configuration file for kdump kernel. + +.SH DESCRIPTION + +kdump.conf is a configuration file for the kdump kernel crash +collection service. + +kdump.conf provides post-kexec instructions to the kdump kernel. It is +stored in the initrd file managed by the kdump service. If you change +this file and do not want to reboot in order for the changes to take +effect, restart the kdump service to rebuild the initrd. + +For most configurations, you can simply review the examples provided +in the stock /etc/kdump.conf. + +.B NOTE: +For filesystem dumps the dump target must be mounted before building +kdump initramfs. + +kdump.conf only affects the behavior of the initramfs. Please read the +kdump operational flow section of kexec-kdump-howto.txt in the docs to better +understand how this configuration file affects the behavior of kdump. + +.SH OPTIONS + +.B raw +.RS +Will dd /proc/vmcore into . Use persistent device names for +partition devices, such as /dev/vg/. +.RE + +.B nfs +.RS +Will mount nfs to , and copy /proc/vmcore to //%HOST-%DATE/, +supports DNS. Note that a fqdn should be used as the server name in the +mount point. +.RE + +.B ssh +.RS +Will scp /proc/vmcore to :/%HOST-%DATE/, +supports DNS. NOTE: make sure user has necessary write permissions on +server and that a fqdn is used as the server name. +.RE + +.B sshkey +.RS +Specify the path of the ssh key to use when dumping via ssh. +The default value is /root/.ssh/kdump_id_rsa. +.RE + +.B +.RS +Will mount -t , and copy /proc/vmcore to +//%HOST_IP-%DATE/. NOTE: can be a device node, label +or uuid. It's recommended to use persistent device names such as +/dev/vg/. Otherwise it's suggested to use label or uuid. +.RE + +.B path +.RS +"path" represents the file system path in which vmcore will be saved. +If a dump target is specified in kdump.conf, then "path" is relative to the +specified dump target. +.PP +Interpretation of "path" changes a bit if the user didn't specify any dump +target explicitly in kdump.conf. In this case, "path" represents the +absolute path from root. The dump target and adjusted path are arrived +at automatically depending on what's mounted in the current system. +.PP +Ignored for raw device dumps. If unset, will use the default "/var/crash". +.RE + +.B core_collector +.RS +This allows you to specify the command to copy the vmcore. +The default is makedumpfile, which on some architectures can drastically reduce +core file size. See /sbin/makedumpfile --help for a list of options. +Note that the -i and -g options are not needed here, as the initrd +will automatically be populated with a config file appropriate +for the running kernel. +.PP +Note 1: About default core collector: +The default core_collector for raw/ssh dump is: +"makedumpfile -F -l --message-level 1 -d 31". +The default core_collector for other targets is: +"makedumpfile -l --message-level 1 -d 31". +Even if core_collector option is commented out in kdump.conf, makedumpfile +is the default core collector and kdump uses it internally. +If one does not want makedumpfile as default core_collector, then they +need to specify one using core_collector option to change the behavior. +.PP +Note 2: If "makedumpfile -F" is used then you will get a flattened format +vmcore.flat, you will need to use "makedumpfile -R" to rearrange the +dump data from standard input to a normal dumpfile (readable with analysis +tools). +ie. "makedumpfile -R vmcore < vmcore.flat" + +.RE + +.B kdump_post +.RS +This directive allows you to run a specified executable +just after the vmcore dump process terminates. The exit +status of the current dump process is fed to the kdump_post +executable as its first argument($1). Executable can modify +it to indicate the new exit status of succeeding dump process, +.PP +If /etc/kdump/post.d directory exists, All files in +the directory are collectively sorted and executed in +lexical order, before binary or script specified +kdump_post parameter is executed. +.PP +Note that scripts written for use with this directive must use +the /bin/bash interpreter. +.RE + +.B kdump_pre +.RS +Works just like the "kdump_post" directive, but instead +of running after the dump process, runs immediately +before. Exit status of this binary is interpreted +as follows: +.PP +0 - continue with dump process as usual +.PP +non 0 - reboot the system +.PP +If /etc/kdump/pre.d directory exists, all files in +the directory are collectively sorted and executed in +lexical order, after binary or script specified +kdump_pre parameter is executed. +Even if the binary or script in /etc/kdump/pre.d directory +returns non 0 exit status, the processing is continued. +.PP +Note that scripts written for this directive must use +the /bin/bash interpreter. +.RE + +.B extra_bins +.RS +This directive allows you to specify additional +binaries or shell scripts you'd like to include in +your kdump initrd. Generally only useful in +conjunction with a kdump_post binary or script that +relies on other binaries or scripts. +.RE + +.B extra_modules +.RS +This directive allows you to specify extra kernel +modules that you want to be loaded in the kdump +initrd, typically used to set up access to +non-boot-path dump targets that might otherwise +not be accessible in the kdump environment. Multiple +modules can be listed, separated by spaces, and any +dependent modules will automatically be included. +.RE + +.B failure_action +.RS +Action to perform in case dumping to the intended target fails. The default is "reboot". +reboot: Reboot the system (this is what most people will want, as it returns the system +to a normal state). halt: Halt the system and lose the vmcore. poweroff: The system +will be powered down. shell: Drop to a shell session inside the initramfs, from which +you can manually perform additional recovery actions. Exiting this shell reboots the +system by default or performs "final_action". +Note: kdump uses bash as the default shell. dump_to_rootfs: If non-root dump +target is specified, the failure action can be set as dump_to_rootfs. That means when +dumping to target fails, dump vmcore to rootfs from initramfs context and reboot +by default or perform "final_action". +.RE + +.B default +.RS +Same as the "failure_action" directive above, but this directive is obsolete +and will be removed in the future. +.RE + +.B final_action +.RS +Action to perform in case dumping to the intended target succeeds. +Also performed when "shell" or "dump_to_rootfs" failure action finishes. +Each action is same as the "failure_action" directive above. +The default is "reboot". +.RE + +.B force_rebuild <0 | 1> +.RS +By default, kdump initrd will only be rebuilt when necessary. +Specify 1 to force rebuilding kdump initrd every time when kdump service starts. +.RE + +.B force_no_rebuild <0 | 1> +.RS +By default, kdump initrd will be rebuilt when necessary. +Specify 1 to bypass rebuilding of kdump initrd. + +.PP +force_no_rebuild and force_rebuild options are mutually exclusive and +they should not be set to 1 simultaneously. +.RE + +.B override_resettable <0 | 1> +.RS +Usually an unresettable block device can't be a dump target. Specifying 1 means +that even though the block target is unresettable, the user wants to try dumping anyway. +By default, it's set to 0, which will not try something destined to fail. +.RE + + +.B dracut_args +.RS +Kdump uses dracut to generate initramfs for second kernel. This option +allows a user to pass arguments to dracut directly. +.RE + + +.B fence_kdump_args +.RS +Command line arguments for fence_kdump_send (it can contain all valid +arguments except hosts to send notification to). +.RE + + +.B fence_kdump_nodes +.RS +List of cluster node(s) except localhost, separated by spaces, to send fence_kdump notification +to (this option is mandatory to enable fence_kdump). +.RE + + +.SH DEPRECATED OPTIONS + +.B net | +.RS +net option is replaced by nfs and ssh options. Use nfs or ssh options +directly. +.RE + +.B options

as

, but the -tokenizer emits the SelfClosingTagToken token incorrectly. When the -parser is used to parse foreign content, this results in an incorrect -DOM. - -Thanks to Sean Ng (https://ensy.zip) for reporting this issue. - -Fixes golang/go#73070 -Fixes CVE-2025-22872 - -Change-Id: I65c18df6d6244bf943b61e6c7a87895929e78f4f -Reviewed-on: https://go-review.googlesource.com/c/net/+/661256 -Reviewed-by: Neal Patel -Reviewed-by: Roland Shoemaker -LUCI-TryBot-Result: Go LUCI -Auto-Submit: Gopher Robot -Link: https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9 ---- - vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index 3c57880..6598c1f 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType { - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } -- // Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken --- -2.34.1 - diff --git a/SPECS/kube-vip-cloud-provider/kube-vip-cloud-provider.signatures.json b/SPECS/kube-vip-cloud-provider/kube-vip-cloud-provider.signatures.json deleted file mode 100644 index ac3ed1c65d..0000000000 --- a/SPECS/kube-vip-cloud-provider/kube-vip-cloud-provider.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "kube-vip-cloud-provider-0.0.10-vendor.tar.gz": "944c9bcf0f4d1bb3cc04efb0fbae98667572d3892584878224d4dde74e9db64d", - "kube-vip-cloud-provider-0.0.10.tar.gz": "eeff169d3b0a450ba17834074470bf429ddc96b5b3bdfaedd83d16189ee138a6" - } -} diff --git a/SPECS/kube-vip-cloud-provider/kube-vip-cloud-provider.spec b/SPECS/kube-vip-cloud-provider/kube-vip-cloud-provider.spec deleted file mode 100644 index 6f89136821..0000000000 --- a/SPECS/kube-vip-cloud-provider/kube-vip-cloud-provider.spec +++ /dev/null @@ -1,104 +0,0 @@ -Summary: The Kube-Vip cloud provider functions as a general-purpose cloud provider for on-premises bare-metal or virtualized setups -Name: kube-vip-cloud-provider -Version: 0.0.10 -Release: 5%{?dist} -License: ASL 2.0 -URL: https://github.com/kube-vip/kube-vip-cloud-provider -Group: Applications/Text -Vendor: Microsoft Corporation -Distribution: Azure Linux -Source0: https://github.com/kube-vip/%{name}/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -#Note that the source file should be renamed to the format {name}-%{version}.tar.gz - -# Steps to manually create the vendor tarball, no download link. -# We're using pre-populated Go modules from this tarball, since network is disabled during build time. -# Adding the vendor folder and creating a tarball -# How to re-build this file: -# 1. wget https://github.com/kube-vip/%%{name}/archive/refs/tags/v%%{version}tar.gz -O %%{name}-%%{version}.tar.gz -# 2. /toolkit/scripts/build_go_vendor_cache.sh %%{name}-%%{version}.tar.gz - -Source1: %{name}-%{version}-vendor.tar.gz - -Patch1: CVE-2023-47108.patch -Patch2: CVE-2024-45338.patch -# CVE-2025-22872 is fixed in go net version .38.0 by https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9 -Patch3: CVE-2025-22872.patch - -BuildRequires: golang >= 1.22 - -%description -The Kube-Vip cloud provider functions as a general-purpose cloud provider for on-premises bare-metal or virtualized setups. - -%prep -%autosetup -a 1 -p1 - -%build -go build -mod=vendor - -%install -install -d %{buildroot}%{_bindir} -install kube-vip-cloud-provider %{buildroot}%{_bindir}/kube-vip-cloud-provider - -%files -%{_bindir}/kube-vip-cloud-provider - -%changelog -* Fri May 30 2025 Ranjan Dutta - 0.0.10-5 -- merge from Azure Linux 3.0.20250521-3.0 -- Add patch for CVE-2025-22872 - -* Fri Mar 21 2025 Anuj Mittal - 0.0.10-4 -- Bump Release to rebuild - -* Tue Dec 31 2024 Rohit Rawat - 0.0.10-3 -- Add patch for CVE-2024-45338 - -* Tue Sep 03 2024 Pawel Winogrodzki - 0.0.10-2 -- Release bump to fix package information. - -* Mon Jul 08 2024 Tobias Brick - 0.0.10-1 -- Upgrade to 0.0.10 -- Patch CVE-2023-47108 - -* Fri Oct 27 2023 CBL-Mariner Servicing Account - 0.0.7-1 -- Auto-upgrade to 0.0.7 - Azure Linux 3.0 - package upgrades - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 0.0.2-13 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 0.0.2-12 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 0.0.2-11 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 0.0.2-10 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 0.0.2-9 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 0.0.2-8 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 0.0.2-7 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 0.0.2-6 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 0.0.2-5 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 0.0.2-4 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 0.0.2-3 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 0.0.2-2 -- Bump release to rebuild with go 1.18.8 - -* Tue Sep 06 2022 Vinayak Gupta - 0.0.2-1 -- Original version for CBL-Mariner -- License Verified diff --git a/SPECS/kured/CVE-2023-45288.patch b/SPECS/kured/CVE-2023-45288.patch deleted file mode 100644 index 80eaa40216..0000000000 --- a/SPECS/kured/CVE-2023-45288.patch +++ /dev/null @@ -1,83 +0,0 @@ -Author: Damien Neil -AuthorDate: 2024-01-10 13:41:39 -0800 -Commit: Gopher Robot -CommitDate: 2024-04-03 17:06:00 +0000 - -[internal-branch.go1.21-vendor] http2: close connections when receiving too many headers - -Maintaining HPACK state requires that we parse and process -all HEADERS and CONTINUATION frames on a connection. -When a request's headers exceed MaxHeaderBytes, we don't -allocate memory to store the excess headers but we do -parse them. This permits an attacker to cause an HTTP/2 -endpoint to read arbitrary amounts of data, all associated -with a request which is going to be rejected. - -Set a limit on the amount of excess header frames we -will process before closing a connection. - -Thanks to Bartek Nowotarski for reporting this issue. - -Fixes CVE-2023-45288 -For golang/go#65051 - -Change-Id: I15df097268df13bb5a9e9d3a5c04a8a141d850f6 -Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2130527 -Reviewed-by: Roland Shoemaker -Reviewed-by: Tatiana Bradley -Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2197243 -Run-TryBot: Damien Neil -Reviewed-by: Dmitri Shuralyov -Reviewed-on: https://go-review.googlesource.com/c/net/+/576057 -LUCI-TryBot-Result: Go LUCI -Auto-Submit: Dmitri Shuralyov - -diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go -index c1f6b90..175c154 100644 ---- a/vendor/golang.org/x/net/http2/frame.go -+++ b/vendor/golang.org/x/net/http2/frame.go -@@ -1565,6 +1565,7 @@ - if size > remainSize { - hdec.SetEmitEnabled(false) - mh.Truncated = true -+ remainSize = 0 - return - } - remainSize -= size -@@ -1577,6 +1578,36 @@ - var hc headersOrContinuation = hf - for { - frag := hc.HeaderBlockFragment() -+ -+ // Avoid parsing large amounts of headers that we will then discard. -+ // If the sender exceeds the max header list size by too much, -+ // skip parsing the fragment and close the connection. -+ // -+ // "Too much" is either any CONTINUATION frame after we've already -+ // exceeded the max header list size (in which case remainSize is 0), -+ // or a frame whose encoded size is more than twice the remaining -+ // header list bytes we're willing to accept. -+ if int64(len(frag)) > int64(2*remainSize) { -+ if VerboseLogs { -+ log.Printf("http2: header list too large") -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the struture of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ -+ // Also close the connection after any CONTINUATION frame following an -+ // invalid header, since we stop tracking the size of the headers after -+ // an invalid one. -+ if invalid != nil { -+ if VerboseLogs { -+ log.Printf("http2: invalid header: %v", invalid) -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the struture of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ - if _, err := hdec.Write(frag); err != nil { - return nil, ConnectionError(ErrCodeCompression) - } diff --git a/SPECS/kured/kured-imagePullPolicy.patch b/SPECS/kured/kured-imagePullPolicy.patch deleted file mode 100644 index ae861a5a00..0000000000 --- a/SPECS/kured/kured-imagePullPolicy.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/kured-ds.yaml b/kured-ds.yaml -index 340ef46..a6d9e64 100644 ---- a/kured-ds.yaml -+++ b/kured-ds.yaml -@@ -39,7 +39,7 @@ spec: - # If you find yourself here wondering why there is no - # :latest tag on Docker Hub,see the FAQ in the README - image: ghcr.io/kubereboot/kured:1.15.0 -- imagePullPolicy: IfNotPresent -+ imagePullPolicy: Always - securityContext: - privileged: true # Give permission to nsenter /proc/1/ns/mnt - readOnlyRootFilesystem: true diff --git a/SPECS/kured/kured.signatures.json b/SPECS/kured/kured.signatures.json deleted file mode 100644 index 2bbe0841a7..0000000000 --- a/SPECS/kured/kured.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "kured-1.15.0-vendor.tar.gz": "9474c0ad60ca5f83b0fd09703fb1ce745cd72d161e2456bae6900ec19aaf1f7f", - "kured-1.15.0.tar.gz": "53b22a1e377fe0922a0ddbe7a2d006e47d2c89da5e062907ec97a2cb786473a4" - } -} diff --git a/SPECS/kured/kured.spec b/SPECS/kured/kured.spec deleted file mode 100644 index e2deb691c7..0000000000 --- a/SPECS/kured/kured.spec +++ /dev/null @@ -1,371 +0,0 @@ -# -# spec file for package kured -# -# Copyright (c) 2021 SUSE LLC -# -# All modifications and additions to the file contributed by third parties -# remain the property of their copyright owners, unless otherwise agreed -# upon. The license for this file, and modifications and additions to the -# file, is the same license as for the pristine package itself (unless the -# license for the pristine package is not an Open Source License, in which -# case the license is the MIT License). An "Open Source License" is a -# license that conforms to the Open Source Definition (Version 1.9) -# published by the Open Source Initiative. - -# Please submit bugfixes or comments via https://bugs.opensuse.org/ -# -# nodebuginfo - - -# Remove stripping of Go binaries. -%define __arch_install_post export NO_BRP_STRIP_DEBUG=true -# Project upstream commit. -%define commit 2b36eab -%global debug_package %{nil} -Summary: Kubernetes daemonset to perform safe automatic node reboots -Name: kured -Version: 1.15.0 -Release: 3%{?dist} -License: Apache-2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: System/Management -URL: https://github.com/weaveworks/kured -#Source0: https://github.com/weaveworks/kured/archive/refs/tags/%{version}.tar.gz -Source0: %{name}-%{version}.tar.gz -# Below is a manually created tarball, no download link. -# We're using pre-populated Go modules from this tarball, since network is disabled during build time. -# How to re-build this file: -# 1. wget https://github.com/weaveworks/kured/archive/refs/tags/%%{version}.tar.gz -O %%{name}-%%{version}.tar.gz -# 2. tar -xf %%{name}-%%{version}.tar.gz -# 3. cd %%{name}-%%{version} -# 4. go mod vendor -# 5. tar --sort=name \ -# --mtime="2021-04-26 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cf %%{name}-%%{version}-vendor.tar.gz vendor -# -Source1: %{name}-%{version}-vendor.tar.gz -Patch0: kured-imagePullPolicy.patch -Patch1: CVE-2023-45288.patch -BuildRequires: fdupes -BuildRequires: go-go-md2man -BuildRequires: golang -ExcludeArch: s390 - -%description -Kured (KUbernetes REboot Daemon) is a Kubernetes daemonset that -performs safe automatic node reboots when the need to do so is -indicated by the package management system of the underlying OS. - -- Watches for the presence of a reboot sentinel e.g. %{_localstatedir}/run/reboot-required - -- Utilises a lock in the API server to ensure only one node reboots at a time - -- Optionally defers reboots in the presence of active Prometheus alerts - -- Cordons & drains worker nodes before reboot, uncordoning them after - -%package k8s-yaml -Summary: Kubernetes yaml file to run kured container -Group: System/Management -BuildArch: noarch - -%description k8s-yaml -This package contains the yaml file requried to download and run the -kured container in a kubernetes cluster. - -%prep -%setup -q -%patch 0 -p1 - -# create vendor folder from the vendor tarball and set vendor mode -tar -xf %{SOURCE1} --no-same-owner -%patch 1 -p1 - -%build - -# Build the binary. -export VERSION=%{version} -export COMMIT=%{commit} -go build \ - -mod vendor -v -buildmode=pie \ - -ldflags "-s -w -X main.gitCommit=$COMMIT -X main.version=$VERSION" \ - -o %{name} cmd/kured/*go - -%install -# Install the binary. -install -D -m 0755 %{name} "%{buildroot}/%{_bindir}/%{name}" - -# Build the man page from markdown documentation. -go-md2man -in README.md -out %{name}.1 - -# Install the man page. -install -D -m 0644 %{name}.1 "%{buildroot}/%{_mandir}/man1/%{name}.1" -rm %{name}.1 - -# Install provided yaml file to download and run the kured container -mkdir -p %{buildroot}%{_datadir}/k8s-yaml/kured -cat kured-rbac.yaml kured-ds.yaml > %{buildroot}%{_datadir}/k8s-yaml/kured/kured.yaml -chmod 644 %{buildroot}%{_datadir}/k8s-yaml/kured/kured.yaml -sed -i -e 's|image: .*|image: registry.opensuse.org/kubic/kured:%{version}|g' %{buildroot}%{_datadir}/k8s-yaml/kured/kured.yaml - -%fdupes %{buildroot} - -%files -%doc README.md -%license LICENSE -%{_bindir}/%{name} -%{_mandir}/man1/kured.1.* - -%files k8s-yaml -%dir %{_datarootdir}/k8s-yaml -%dir %{_datarootdir}/k8s-yaml/kured -%{_datarootdir}/k8s-yaml/kured/kured.yaml - -%changelog -* Fri Mar 21 2025 Anuj Mittal - 1.15.0-3 -- Bump Release to rebuild - -* Fri Feb 14 2025 Kanishk Bansal - 1.15.0-2 -- Address CVE-2023-45288 - -* Mon Jan 29 2024 Sean Dougherty - 1.15.0-1 -- Upgrade to 1.15.0 for Mariner 3.0 - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 1.9.1-15 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 1.9.1-14 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.9.1-13 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 1.9.1-12 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 1.9.1-11 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.9.1-10 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 1.9.1-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 1.9.1-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 1.9.1-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 1.9.1-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 1.9.1-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 1.9.1-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 1.9.1-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 1.9.1-2 -- Bump release to rebuild with golang 1.18.3 - -* Wed Feb 09 2022 Henry Li - 1.9.1-1 -- Upgrade to version 1.9.1 -- Remove systemctl-path.patch -- Update kured-imagePullPolicy.patch - -* Tue Oct 12 2021 Pawel Winogrodzki - 1.6.1-2 -- Switching to using a single digit for the 'Release' tag. - -* Fri Jun 18 2021 Henry Li 1.6.1-1.6 -- Initial CBL-Mariner import from openSUSE Tumbleweed (license: same as "License" tag). -- License Verified -- Use golang as build dependency -- Remove {?ext_man}, which is not supported in CBL-Mariner -- Add %global debug_package %{nil} to resolve empty file error -- Use self-built go vendor source -- Add -v to the go build step - -* Tue Feb 2 2021 kukuk@suse.com -- Update to version 1.6.1: - - add additional parameters to override the drain/reboot slack messages - - rename message template parameters so they are not related to slack - - Improve coordinated reboot output - - Add more logs into gates - - Added support for time wrap in timewindow.Contains - -* Tue Nov 24 2020 kukuk@suse.com -- Update to version 1.5.1: - * rename annotation-ttl to lock-ttl in all places, follow-up to #213 - * Drain: allow pods grace period to terminate - * Prepare 1.5.1 release - * Add lint job - * Make lint happier in pkg folder - * Make lint happier - * Remove prom-active-alerts - * update docs following #210 - * run 'go mod tidy' - * Replaced --annotationTTL with --lockTTL and made it work correctly - * Refactor drain/uncordon - * Remove kubectl exception in container scanning - * Bump prometheus - * Use kubectl as library instead of calling from cli - * fix: Follow DKL-DI-0004 guideline - * feat: Add security scanning into CI - * add missing quote - thanks Karan Arora for reporting - * Bump helm chart version - * Remove quote for parameter alert-filter-regexp - * Release helper - -* Mon Sep 21 2020 kukuk@suse.com -- Update to version 1.5.0: - * Prepare 1.5.0 release - * Bump helm/kind-action from v1.0.0-rc.1 to v1.0.0 - * Bump helm/chart-testing-action from v1.0.0-rc.2 to v1.0.0 - * Add dependabot - * Prepare for k8s release 1.19 (Aug 25) - -* Fri Aug 14 2020 kukuk@suse.com -- Update to version 1.4.5: - * document how releases are town wrt Helm bits - * bump versions for 1.4.5 release - * Use nindent, not indent - * chart: update readme - * Bump chart version - * Add missing 'end' - * Chart: Support extraEnvVars - * update install instructions to use latest - * update chart version - * Prep for 1.4.4 release - * bump and fix - * split matchLabels template - * restructured and improved service - -* Tue Jun 30 2020 dmueller@suse.com -- Update to version 1.4.3: - * bump and fix - * split matchLabels template - * restructured and improved service - * bumped kured to upcoming 1.4.3 fixed servicemonitor indent fixed quotes for arguments - * update things for 1.4.2 release - * Use GITHUB_TOKEN for releasing chart - * make markdownlint happier - * update version - * prepare chart-release for 1.4.1 - * Revert #139 -- use obs-service for regenerating vendor.tar.gz - -* Tue Jun 30 2020 Thorsten Kukuk -- Update to version 1.4.2 - - Adding --annotation-ttl for automatic unlock -- Refresh vendor.tar.xz - -* Mon May 18 2020 Thorsten Kukuk -- kured-imagePullPolicy.patch: always update the image - -* Sun May 17 2020 Thorsten Kukuk -- systemctl-path.patch: last systemd update removed symlinks - from /bin ... - -* Mon May 11 2020 Thorsten Kukuk -- Update to version 1.4.0 - - Updated kubectl, client-go, etc to k8s 1.17 (#127, #135) - - Update to go 1.13 (#130) - - print node id when commanding reboot (#134) - -* Wed Apr 22 2020 Dominique Leuenberger -- Fix build-dependency: we require golang(API) 1.12, not the exact - go package version 1.12. - -* Mon Mar 2 2020 Thorsten Kukuk -- Update to version 1.3.0 - - Update k8s client tools to 1.15.x - - Ad Slack channel name configuration - - Add reboot window -- Obsoletes k8s-1.14.diff -- Remove kured-telemetrics.patch, chances that upstream accepts - any third party code are nearly zero. -- Update vendor.tar.xz - -* Mon Jun 24 2019 kukuk@suse.de -- k8s-1.14.diff: kubernetes 1.14.1 support from git - -* Wed Jun 5 2019 kukuk@suse.de -- Fix path to image in manifest - -* Wed May 22 2019 kukuk@suse.de -- Update to version 1.2.0 - - support newer kubernetes versions -- Adjust kured-telemetrics.patch -- Update vendor.tar.gz with recent versions - -* Sat Apr 6 2019 kukuk@suse.de -- Enable building on s390x - -* Thu Mar 28 2019 Jan Engelhardt -- Combine %%setup calls. - -* Thu Mar 28 2019 kukuk@suse.de -- kured-telemetrics.patch: add hooks for telemetrics data -- Renamed kured-yaml to kured-k8s-yaml to follow new policy - -* Thu Feb 28 2019 kukuk@suse.de -- Change path in yaml file to point to official container image - -* Fri Jan 18 2019 kukuk@suse.de -- Create a correct yaml file to download and run the kured container - image in a kubernetes cluster -- Create new subpackage containing only the yaml file, so that - people using the container don't need to install the not needed - full package. - -* Thu Nov 15 2018 Jeff Kowalczyk -- Update to kured 1.1.0 -- Upstream bumped dependency on go1.10 via dependency k8s.io/client-go 0.9.0 - https://github.com/kubernetes/client-go -- Provide dependencies in separate vendor.tar.gz -- Improvements - * RBAC support - * Use the systemctl in the host mount namespace to effect reboots, reducing - image size and eliminating the potential for incompatibility - * Notify Slack on drain in addition to reboot - * Pass through log output from invoked kubectl commands - * Tolerate NoSchedule taint on node-role.kubernetes.io/master - * Fixed reversal of daemonset name/namespace arguments and comments in the - manifest -- Kubernetes Version Compatibility - * The daemon image contains a 1.12.x k8s.io/client-go and kubectl binary for - the purposes of maintaining the lock and draining worker nodes. Kubernetes - aims to provide forwards & backwards compatibility of one minor version - between client and server, so this should work on 1.11.x and 1.13.x. - * Tested in minikube on 1.11.4, 1.12.1 & 1.13.0-alpha.2 - * Tested in production on 1.11.2 & 1.12.2 - -* Thu Sep 13 2018 jkowalczyk@suse.com -- Remove hardcoded GOARCH=amd64 and GOOS=linux -- Revise go build arg -ldflags and add -buildmode=pie -- Together these fix rpmlint warnings: - * position-independent-executable-suggested - * statically-linked-binary -- Upstream kured project code imports package as 'context'. Bump BuildRequires - to go1.7 wherein import path for package context graduates from - 'golang.org/x/net/context' to the standard library as 'context'. - https://golang.org/doc/go1.7#context -- Bump release number - -* Wed Sep 12 2018 jkowalczyk@suse.com -- Initial packaging of upstream master branch @ 5731b98 (tagged 1.0.0 + 24) -- Include 24 commits since release 1.0.0 updating kubernetes version support -- Dependency sources vendored via dep ensure per upstream build instructions -- Man page converted from README.md, some HTML formatting artifacts present -- rpmlint warning: position-independent-executable-suggested - * go1.11 currently in review status supports option -buildmode=pie -- rpmlint warning: statically-linked-binary - * Go binaries are generally statically linked diff --git a/SPECS/libogg/libogg.signatures.json b/SPECS/libogg/libogg.signatures.json deleted file mode 100644 index 190a1ad8a2..0000000000 --- a/SPECS/libogg/libogg.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "libogg-1.3.4.tar.xz": "c163bc12bc300c401b6aa35907ac682671ea376f13ae0969a220f7ddf71893fe" - } -} diff --git a/SPECS/libogg/libogg.spec b/SPECS/libogg/libogg.spec deleted file mode 100644 index 3e30c69413..0000000000 --- a/SPECS/libogg/libogg.spec +++ /dev/null @@ -1,327 +0,0 @@ -Vendor: Microsoft Corporation -Distribution: Azure Linux -Summary: The Ogg bitstream file format library -Name: libogg -Version: 1.3.4 -Release: 4%{?dist} -License: BSD -URL: http://www.xiph.org/ - -Source: http://downloads.xiph.org/releases/ogg/%{name}-%{version}.tar.xz - -BuildRequires: gcc - -%description -Libogg is a library for manipulating Ogg bitstream file formats. -Libogg supports both making Ogg bitstreams and getting packets from -Ogg bitstreams. - - -%package devel -Summary: Files needed for development using libogg -Requires: libogg = %{version}-%{release} -Requires: pkgconfig -Requires: automake - - -%description devel -Libogg is a library used for manipulating Ogg bitstreams. The -libogg-devel package contains the header files and documentation -needed for development using libogg. - - -%package devel-docs -Summary: Documentation for developing Ogg applications -BuildArch: noarch - - -%description devel-docs -Documentation for developing applications with libogg - - -%prep -%setup -q - - -%build -sed -i "s|-O20|$RPM_OPT_FLAGS|" configure -sed -i "s|-ffast-math||" configure -%configure --disable-static -make %{?_smp_mflags} - - -%install -make DESTDIR=$RPM_BUILD_ROOT install - -rm -f $RPM_BUILD_ROOT%{_libdir}/*.la - -mv $RPM_BUILD_ROOT%{_docdir}/%{name} __installed_docs - - -%ldconfig_scriptlets - - -%files -%doc AUTHORS CHANGES COPYING README.md -%{_libdir}/libogg.so.0* - - -%files devel -%dir %{_includedir}/ogg -%{_includedir}/ogg/ogg.h -%{_includedir}/ogg/os_types.h -%{_includedir}/ogg/config_types.h -%{_libdir}/libogg.so -%{_libdir}/pkgconfig/ogg.pc -%{_datadir}/aclocal/ogg.m4 - - -%files devel-docs -%doc __installed_docs/* - - -%changelog -* Mon Nov 01 2021 Muhammad Falak - 1.3.4-4 -- Remove epoch - -* Fri Oct 15 2021 Pawel Winogrodzki - 2:1.3.4-3 -- Initial CBL-Mariner import from Fedora 32 (license: MIT). - -* Wed Jan 29 2020 Fedora Release Engineering - 2:1.3.4-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Mon Sep 02 2019 Miroslav Lichvar 2:1.3.4-1 -- update to 1.3.4 -- include soname in file list - -* Thu Jul 25 2019 Fedora Release Engineering - 2:1.3.3-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Fri Feb 01 2019 Fedora Release Engineering - 2:1.3.3-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Fri Jul 20 2018 Miroslav Lichvar 2:1.3.3-1 -- update to 1.3.3 -- add gcc to build requirements - -* Fri Jul 13 2018 Fedora Release Engineering - 2:1.3.2-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Wed Feb 07 2018 Fedora Release Engineering - 2:1.3.2-10 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Sat Feb 03 2018 Igor Gnatenko - 2:1.3.2-9 -- Switch to %%ldconfig_scriptlets - -* Thu Aug 03 2017 Fedora Release Engineering - 2:1.3.2-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Wed Jul 26 2017 Fedora Release Engineering - 2:1.3.2-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Fri Feb 10 2017 Fedora Release Engineering - 2:1.3.2-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Thu Feb 04 2016 Fedora Release Engineering - 2:1.3.2-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Thu Jun 18 2015 Ralf Corsépius - 2:1.3.2-4 -- Use '|' instead of '/' as pattern delimiter in sed expressions (Fix FTBFS). - -* Wed Jun 17 2015 Fedora Release Engineering - 2:1.3.2-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Sun Aug 17 2014 Fedora Release Engineering - 2:1.3.2-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Tue Aug 05 2014 Jaromir Capik - 2:1.3.2-1 -- Upgrading to 1.3.2 -- Cleaning the spec -- Fixing bogus dates in the changelog - -* Sat Jun 07 2014 Fedora Release Engineering - 2:1.3.0-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Sat Aug 03 2013 Fedora Release Engineering - 2:1.3.0-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Tue Apr 09 2013 Jaromir Capik - 2:1.3.0-5 -- fixing multilib conflict (#831414) - -* Tue Mar 26 2013 Jaromir Capik - 2:1.3.0-4 -- aarch64 support (#925834) -- minor spec cleaning - -* Thu Feb 14 2013 Fedora Release Engineering - 2:1.3.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild - -* Thu Jul 19 2012 Fedora Release Engineering - 2:1.3.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Wed May 16 2012 Gregory Maxwell 1.3.0-1 -- libogg 1.3.0 - -* Fri Jan 13 2012 Fedora Release Engineering - 2:1.2.2-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild - -* Tue Feb 08 2011 Fedora Release Engineering - 2:1.2.2-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Wed Dec 08 2010 Adam Jackson 1.2.2-2 -- Fix epoch. - -* Tue Dec 07 2010 Adam Jackson 1.2.2-1 -- libogg 1.2.2 - -* Mon Apr 26 2010 Adam Jackson 1.2.0-1 -- libogg 1.2.0 - -* Tue Nov 10 2009 Rakesh Pandit - 2:1.1.4-3 -- fixed libogg-devel-docs (BZ #510608) (By Edward Sheldrake) - -* Fri Jul 24 2009 Fedora Release Engineering - 2:1.1.4-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Thu Jul 02 2009 Adam Jackson 1.1.4-1 -- libogg 1.1.4 - -* Wed Jun 03 2009 Adam Jackson 1.1.4-0.1.rc1 -- libogg 1.1.4rc1 -- split devel docs to noarch subpackage - -* Wed Feb 25 2009 Fedora Release Engineering - 2:1.1.3-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - -* Thu Dec 18 2008 Mamoru Tasaka - 2:1.1.3-10 -- Rebuild for pkgconfig provides - -* Tue Feb 19 2008 Fedora Release Engineering - 2:1.1.3-9 -- Autorebuild for GCC 4.3 - -* Wed Nov 14 2007 Hans de Goede - 2:1.1.3-8 -- Some more small specfile cleanups for merge review (bz 226035) - -* Wed Nov 14 2007 Hans de Goede - 2:1.1.3-7 -- Some small specfile cleanups -- Add smpflags to make invocation (bz 226035) - -* Sun Oct 21 2007 Hans de Goede - 2:1.1.3-6 -- Don't install Makefile's as %%doc, avoiding a multilib conflict (bz 342281) - -* Wed Aug 22 2007 Adam Jackson - 2:1.1.3-5 -- Rebuild for PPC toolchain bug - -* Sun Jun 17 2007 Matthias Clasen - 2:1.1.3-4 -- Require automake in the -devel package - -* Thu Feb 8 2007 Matthias Clasen - 2:1.1.3-3 -- Package review cleanups -- Don't ship a static library - -* Thu Aug 17 2006 Matthias Clasen - 2:1.1.3-2.fc6 -- Fix 202280 - -* Wed Jul 12 2006 Jesse Keating - 2:1.1.3-1.2.1 -- rebuild - -* Fri Feb 10 2006 Jesse Keating - 2:1.1.3-1.2 -- bump again for double-long bug on ppc(64) - -* Tue Feb 07 2006 Jesse Keating - 2:1.1.3-1.1 -- rebuilt for new gcc4.1 snapshot and glibc changes - -* Wed Jan 18 2006 John (J5) Palmieri 2:1.1.3-1 -- Update to 1.1.3 -- doc/ogg changed to doc/libogg - -* Fri Dec 09 2005 Jesse Keating -- rebuilt - -* Wed Mar 02 2005 John (J5) Palmieri 2:1.1.2-2 -- rebuild for gcc 4.0 - -* Wed Sep 29 2004 Colin Walters 2:1.1.2-1 -- Update to 1.1.2 -- Delete upstreamed libogg-1.1-64bit.patch -- Delete upstreamed libogg-underquoted.patch - -* Thu Jul 15 2004 Tim Waugh 2:1.1-4 -- Fixed warnings in shipped m4 file. - -* Tue Jun 15 2004 Elliot Lee -- rebuilt - -* Tue Mar 02 2004 Elliot Lee -- rebuilt - -* Fri Feb 13 2004 Elliot Lee -- rebuilt - -* Thu Dec 11 2003 Bill Nottingham 2:1.1-1 -- update to 1.1 - -* Sun Jun 8 2003 Tim Powers 2:1.0-5.1 -- build for RHEL - -* Wed Jun 04 2003 Elliot Lee -- rebuilt - -* Tue Jun 3 2003 Jeff Johnson -- add explicit epoch's where needed. - -* Wed Jan 22 2003 Tim Powers -- rebuilt - -* Wed Dec 11 2002 Bill Nottingham 2:1.0-3 -- fix ogg.m4 - -* Fri Nov 29 2002 Tim Powers 2:1.0-2 -- remove unpackaged files from the buildroot - -* Thu Jul 18 2002 Bill Nottingham 1.0-1 -- one-dot-oh - -* Fri Jun 21 2002 Tim Powers -- automated rebuild - -* Thu May 23 2002 Tim Powers -- automated rebuild - -* Wed Jan 09 2002 Tim Powers -- automated rebuild - -* Tue Jan 1 2002 Bill Nottingham -- update to 1.0rc3 - -* Mon Aug 13 2001 Bill Nottingham -- update to 1.0rc2 - -* Fri Jul 6 2001 Bill Nottingham -- own %%{_includedir}/ogg - -* Tue Jun 19 2001 Bill Nottingham -- update to 1.0rc1 - -* Mon Feb 26 2001 Bill Nottingham -- fix license tag - -* Mon Feb 26 2001 Bill Nottingham -- beta4 - -* Tue Feb 6 2001 Bill Nottingham -- update CVS in prep for beta4 - -* Wed Dec 27 2000 Bill Nottingham -- update CVS - -* Mon Dec 11 2000 Bill Nottingham -- fix bogus group - -* Fri Dec 01 2000 Bill Nottingham -- rebuild because of broken fileutils - -* Mon Nov 13 2000 Bill Nottingham -- clean up specfile slightly - -* Sat Sep 02 2000 Jack Moffitt -- initial spec file created diff --git a/SPECS/libseccomp/libseccomp.signatures.json b/SPECS/libseccomp/libseccomp.signatures.json deleted file mode 100644 index 7fa4a65ebe..0000000000 --- a/SPECS/libseccomp/libseccomp.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "libseccomp-2.5.6.tar.gz": "04c37d72965dce218a0c94519b056e1775cf786b5260ee2b7992956c4ee38633" - } -} diff --git a/SPECS/libseccomp/libseccomp.spec b/SPECS/libseccomp/libseccomp.spec deleted file mode 100644 index b8b81e235a..0000000000 --- a/SPECS/libseccomp/libseccomp.spec +++ /dev/null @@ -1,112 +0,0 @@ -Summary: Enhanced seccomp library -Name: libseccomp -Version: 2.5.6 -Release: 1%{?dist} -License: LGPLv2 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: System Environment/Libraries -URL: https://github.com/seccomp/libseccomp/wiki -Source0: https://github.com/seccomp/libseccomp/releases/download/v%{version}/%{name}-%{version}.tar.gz -BuildRequires: gperf -%if 0%{?with_check} -BuildRequires: which -%endif - -%description -The libseccomp library provides an easy to use, platform independent, interface -to the Linux Kernel syscall filtering mechanism: seccomp. The libseccomp API -is designed to abstract away the underlying BPF based syscall filter language -and present a more conventional function-call based filtering interface that -should be familiar to, and easily adopted by application developers. - -%package devel -Summary: Development files used to build applications with libseccomp support -Group: Development/Libraries -Requires: %{name} = %{version}-%{release} -Provides: %{name}-static = %{version}-%{release} - -%description devel -The libseccomp-devel package contains the libraries and header files -needed for developing secure applications. - -%prep -%autosetup - -%build -%configure -%make_build - -%install -%make_install -find %{buildroot} -type f -name "*.la" -delete -print - -%check -%make_build check - -%ldconfig_scriptlets - -%files -%license LICENSE -%doc CREDITS README.md -%{_libdir}/libseccomp.so.2* - -%files devel -%{_includedir}/seccomp.h -%{_includedir}/seccomp-syscalls.h -%{_libdir}/libseccomp.so -%{_libdir}/libseccomp.a -%{_libdir}/pkgconfig/libseccomp.pc -%{_bindir}/scmp_sys_resolver -%{_mandir}/man1/* -%{_mandir}/man3/* - -%changelog -* Fri Oct 31 2025 Nan Liu - 2.5.6-1 -- Upgrade to 2.5.6 - -* Tue Nov 05 2024 Nan Liu - 2.5.5-1 -- Upgrade to 2.5.5 as other older version is no longer supported upstream - -* Fri Oct 27 2023 CBL-Mariner Servicing Account - 2.5.4-1 -- Auto-upgrade to 2.5.4 - Azure Linux 3.0 - package upgrades - -* Thu Jan 13 2022 Henry Li - 2.5.3-1 -- Upgrade to version 2.5.3 -- Add gperf as BR -- Add /usr/include/seccomp-syscalls.h to libseccomp-devel package - -* Fri Jul 23 2021 Thomas Crain - 2.4.1-4 -- Remove pkgconfig provides (no longer necessary) -- Require base package from devel subpackage -- Include libseccomp soname version in %%file section - -* Tue Jun 29 2021 Thomas Crain - 2.4.1-3 -- Provide libseccomp-static from devel subpackage -- Version the pkgconfig provides -- Modernize spec with macros -- Remove libtool archive files - -* Sat May 09 2020 Nick Samson -- Added %%license line automatically - -* Tue Mar 17 2020 Henry Beberman - 2.4.1-1 -- Update to 2.4.1. License verified. - -* Tue Sep 03 2019 Mateusz Malisz - 2.3.3-3 -- Initial CBL-Mariner import from Photon (license: Apache2). - -* Wed Jan 9 2019 Michelle Wang - 2.3.3-2 -- Fix make check for libseccomp. - -* Mon Sep 10 2018 Bo Gan - 2.3.3-1 -- Updated to version 2.3.3. - -* Tue Apr 11 2017 Harish Udaiya KUmar - 2.3.2-1 -- Updated to version 2.3.2. - -* Tue May 24 2016 Priyesh Padmavilasom - 2.2.3-2 -- GA - Bump release of all rpms. - -* Sat Jan 16 2016 Fabio Rapposelli - 2.2.3-1 -- First release of the package. diff --git a/SPECS/libtheora/libtheora.signatures.json b/SPECS/libtheora/libtheora.signatures.json deleted file mode 100644 index 7abbf2d2ce..0000000000 --- a/SPECS/libtheora/libtheora.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "libtheora-1.1.1.tar.gz": "40952956c47811928d1e7922cda3bc1f427eb75680c3c37249c91e949054916b" - } -} diff --git a/SPECS/libtheora/libtheora.spec b/SPECS/libtheora/libtheora.spec deleted file mode 100644 index 91ba732a3e..0000000000 --- a/SPECS/libtheora/libtheora.spec +++ /dev/null @@ -1,321 +0,0 @@ -Summary: Theora video compression codec -Name: libtheora -Version: 1.1.1 -Release: 1%{?dist} -License: BSD-3-Clause -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Productivity/Multimedia/Other -URL: https://www.theora.org/ -Source0: https://ftp.osuosl.org/pub/xiph/releases/theora/%{name}-%{version}.tar.gz -BuildRequires: gcc-c++ -BuildRequires: libogg-devel -BuildRequires: libtool -BuildRequires: libvorbis-devel -BuildRequires: pkgconf-pkg-config - -%description -Theora is a free and open video compression format from the Xiph.org Foundation. Like all our -multimedia technology it can be used to distribute film and video online and on disc without -the licensing and royalty fees or vendor lock-in associated with other formats. - -%package -n libtheora0 -Summary: Theora video compression codec -Group: System/Libraries -Provides: %{name} = %{version} -Obsoletes: %{name} <= %{version} - -%description -n libtheora0 -Theora is a free and open video compression format from the Xiph.org Foundation. Like all our -multimedia technology it can be used to distribute film and video online and on disc without -the licensing and royalty fees or vendor lock-in associated with other formats. - -Theora scales from postage stamp to HD resolution, and is considered particularly competitive -at low bitrates. It is in the same class as MPEG-4/DiVX, and like the Vorbis audio codec it -has lots of room for improvement as encoder technology develops. - -Theora is in full public release as of November 3, 2008. The bitstream format for Theora I -was frozen Thursday, 2004 July 1. All bitstreams encoded since that date will remain compatible -with future releases. - -The package contains the library that can decode and encode Theora streams. Theora is also -able to playback VP3 streams. - -%package -n libtheoradec1 -Summary: Theora video decompression library -Group: System/Libraries - -%description -n libtheoradec1 -Theora is a free and open video compression format from the Xiph.org Foundation. Like all our -multimedia technology it can be used to distribute film and video online and on disc without -the licensing and royalty fees or vendor lock-in associated with other formats. - -This subpackage contains the decoder library. - -%package -n libtheoraenc1 -Summary: Theora video compression library -Group: System/Libraries - -%description -n libtheoraenc1 -Theora is a free and open video compression format from the Xiph.org Foundation. Like all our -multimedia technology it can be used to distribute film and video online and on disc without -the licensing and royalty fees or vendor lock-in associated with other formats. - -This subpackage contains the encoder library. - -%package devel -Summary: Theora video compression codec -Group: Development/Libraries/C and C++ -Requires: libogg-devel -Requires: libtheora0 = %{version} -Requires: libtheoradec1 = %{version} -Requires: libtheoraenc1 = %{version} - -%description devel -Theora is a free and open video compression format from the Xiph.org Foundation. Like all our -multimedia technology it can be used to distribute film and video online and on disc without -the licensing and royalty fees or vendor lock-in associated with other formats. - -Theora scales from postage stamp to HD resolution, and is considered particularly competitive -at low bitrates. It is in the same class as MPEG-4/DiVX, and like the Vorbis audio codec it -has lots of room for improvement as encoder technology develops. - -Theora is in full public release as of November 3, 2008. The bitstream format for Theora I -was frozen Thursday, 2004 July 1. All bitstreams encoded since that date will remain compatible -with future releases. - -The package contains the library that can decode and encode Theora streams. Theora is also -able to playback VP3 streams. - -%prep -%autosetup -n %{name}-%{version} - -%build -ACLOCAL="aclocal -I m4" autoreconf -f -i -%configure --disable-examples \ - --disable-static \ - --with-pic -make %{?_smp_mflags} docdir=%{_docdir}/%{name} - -%install -%make_install docdir=%{_docdir}/%{name} -install -d %{buildroot}%{_bindir} -# Install remaining parts of documentation. -cp -a AUTHORS CHANGES COPYING LICENSE README %{buildroot}%{_docdir}/%{name} - -%check -make check - -%post -n libtheora0 -p /sbin/ldconfig -%postun -n libtheora0 -p /sbin/ldconfig -%post -n libtheoradec1 -p /sbin/ldconfig -%postun -n libtheoradec1 -p /sbin/ldconfig -%post -n libtheoraenc1 -p /sbin/ldconfig -%postun -n libtheoraenc1 -p /sbin/ldconfig - -%files -%license COPYING -%doc README - -%files -n libtheora0 -%defattr(-,root,root) -%{_libdir}/libtheora.so.0* - -%files -n libtheoradec1 -%defattr(-,root,root) -%{_libdir}/libtheoradec.so.1* - -%files -n libtheoraenc1 -%defattr(-,root,root) -%{_libdir}/libtheoraenc.so.1* - -%files devel -%defattr(-,root,root) -%doc %dir %{_docdir}/%{name} -%doc %{_docdir}/%{name}/* -%{_includedir}/theora -%{_libdir}/*.so -%{_libdir}/pkgconfig/theoradec.pc -%{_libdir}/pkgconfig/theoraenc.pc -%{_libdir}/pkgconfig/theora.pc -%exclude %{_libdir}/*.la - -%changelog -* Tue Nov 22 2022 Sumedh Sharma - 1.1.1-1 -- Initial CBL-Mariner import from openSUSE Tumbleweed (license: same as "License" tag) -- Converting the 'Release' tag to the '[number].[distribution]' format -- Disabled subpackage examples and devel-docs -- Remove sources for obsolete -XXBit packages -- Enable check section -- License verified - -* Mon Jun 21 2021 Matej Cepl -- Remove completely unnecessary python BR - -* Sat Aug 30 2014 jengelh@inai.de -- Split libtheoradec/enc from libtheora0 as they have different - SO numbers -- Trim huge description; improve on RPM group classificaiton - -* Thu May 23 2013 idonmez@suse.com -- Update descriptions, thanks to Perry Werneck - -* Sun Nov 20 2011 coolo@suse.com -- add libtool as buildrequire to avoid implicit dependency - -* Mon Aug 29 2011 crrodriguez@opensuse.org -- remove examples that fail to build, also SDL and png - are only needed for those, so remove from buildrequires. - -* Wed Jul 27 2011 crrodriguez@opensuse.org -- remove fno-strict-aliasing from CFLAGS as it is no longer - needed and will slow down things. - -* Mon May 23 2011 crrodriguez@opensuse.org -- Disable doxygen documentation to avoid build dates in - - devel packages. -- add missing BuildRequires libpng-devel - -* Fri Dec 18 2009 jengelh@medozas.de -- add baselibs.conf as a source - -* Wed Oct 7 2009 adrian@suse.de -- update to version 1.1.1 - * minor bugfixes - -* Sat Sep 26 2009 adrian@suse.de -- update to version 1.1.0 - * minor fixes since beta 3 - -* Thu Aug 27 2009 adrian@suse.de -- update to version 1.1 beta 3 - * Much better encoder - (faster and more details at same compressions level) - * Playback received speed improvements, but bitstream format is - untouched -- no package split yet for dec/enc/legacy libs due to 11.2 freeze - -* Fri Jul 17 2009 adrian@suse.de -- update to version 1.0 final - * new additional encoder and decoder libs with new api. - -* Wed Jan 7 2009 olh@suse.de -- obsolete old -XXbit packages (bnc#437293) - -* Wed May 21 2008 cthiel@suse.de -- fix baselibs.conf - -* Thu Apr 10 2008 ro@suse.de -- added baselibs.conf file to build xxbit packages - for multilib support - -* Thu Dec 13 2007 crrodriguez@suse.de -- fix package version numbers 1.0beta1 --> 1.0.beta2 -- libtheora 1.0.beta2 - - Fix a crash bug on char-is-unsigned architectures (PowerPC) - - Fix a buffer sizing issue that caused rare encoder crashes - - Fix a buffer alignment issue - - Improved format documentation. -- removed unneeded patch, use --with-pic configure option instead. - -* Thu Nov 8 2007 adrian@suse.de -- fix compiling with gcc 4.3 on ia32 - -* Wed Sep 26 2007 adrian@suse.de -- update to 1.0beta1 - From official changelog: - * Granulepos scheme modified to match other codecs. This bumps - the bitstream revision to 3.2.1. Bitstreams marked 3.2.0 are - handled correctly by this decoder. Older decoders will show - a one frame sync error in the less noticable direction. - * Switch to new spec compliant decoder from theora-exp branch. - Written by Dr. Timothy Terriberry. - * Add support to the encoder for using quantization settings - provided by the application. - * more assembly optimizations - -* Wed Aug 15 2007 coolo@suse.de -- fixing upgrade (#293401) - -* Sat Aug 11 2007 crrodriguez@suse.de -- fix build in x86_64 -- use library packaging policy -- run make check in the check section -- add missing call to ldconfig - -* Wed Mar 28 2007 sbrabec@suse.cz -- Updated to version 1.0alpha7: - * Enable mmx assembly by default - * Avoid some relocations that caused problems on SELinux - * Other build fixes - * time testing mode (-f) for the dump_video example - * Merge theora-mmx simd acceleration (x86_32 and x86_64) - * Major RTP payload specification update - * Minor format specification updates - * Fix some spurious calls to free() instead of _ogg_free() - * Fix invalid array indexing in PixelLineSearch() - * Improve robustness against invalid input - * General warning cleanup - * The offset_y member meaning fix. -- Use incremental versioning scheme. -- Documentation repackaged. -- Use less vague names for binaries. - -* Tue Aug 1 2006 dmueller@suse.de -- Reenable test suite run with valgrind. - -* Fri Jul 28 2006 aj@suse.de -- Disable test suite run with valgrind. - -* Fri Mar 10 2006 bk@suse.de -- libtheora-devel: add libogg-devel to Requires (found by .la check) - -* Mon Feb 6 2006 adrian@suse.de -- add -fstack-protector -- enable test suite run with valgrind - -* Sun Jan 29 2006 aj@suse.de -- Fix BuildRequires. - -* Wed Jan 25 2006 mls@suse.de -- converted neededforbuild to BuildRequires - -* Wed Oct 19 2005 adrian@suse.de -- update to version 1.0 alpha 5 -- enable test suite -- generate API documentation with doxygen - -* Thu Apr 14 2005 sbrabec@suse.cz -- Added audiofile-devel to neededforbuild. - -* Wed Jan 5 2005 adrian@suse.de -- update to version 1.0 alpha 4 - -* Tue Oct 26 2004 adrian@suse.de -- remove .svn directories - -* Mon Oct 18 2004 adrian@suse.de -- update to current cvs to get pc file - -* Thu Aug 19 2004 adrian@suse.de -- create -devel package - -* Tue Jun 29 2004 adrian@suse.de -- do not install the libtool scripts ... - -* Sat Apr 24 2004 adrian@suse.de -- use xorg-x11 packages - -* Wed Apr 21 2004 adrian@suse.de -- compile with -fno-strict-aliasing - -* Sun Mar 21 2004 adrian@suse.de -- update to alpha 3 release - on disc format is still not frozen, so this remain an internal package - -* Wed Feb 4 2004 adrian@suse.de -- remove binaries from example dir (they get installed anyway) - -* Fri Jan 30 2004 adrian@suse.de -- initial package of current snapshot (post alpha2) -- internal package only atm diff --git a/SPECS/libutempter/libutempter.signatures.json b/SPECS/libutempter/libutempter.signatures.json deleted file mode 100644 index 6cf5786b8d..0000000000 --- a/SPECS/libutempter/libutempter.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "libutempter-1.1.6.tar.bz2": "b898565f31ced7e5c1fa0a2eaa0f6ff0ed862b5fe375d26375b64bfbdfeac397" - } -} diff --git a/SPECS/libutempter/libutempter.spec b/SPECS/libutempter/libutempter.spec deleted file mode 100644 index 30eb5dc05b..0000000000 --- a/SPECS/libutempter/libutempter.spec +++ /dev/null @@ -1,265 +0,0 @@ -Vendor: Intel Corporation -Distribution: Edge Microvisor Toolkit -%define utempter_compat_ver 0.5.2 - -Summary: A privileged helper for utmp/wtmp updates -Name: libutempter -Version: 1.1.6 -Release: 20%{?dist} -License: LGPLv2+ -URL: https://github.com/altlinux/libutempter -#Sourece0: https://github.com/altlinux/libutempter/archive/refs/tags/1.1.6-alt2.tar.gz -#Source0: https://github.com/altlinux/libutempter/archive/refs/tags/%{name}-%{version}.tar.bz2 -Source0: https://ftp.altlinux.org/pub/people/ldv/libutempter/%{name}-%{version}.tar.bz2 - -BuildRequires: gcc - -Requires(pre): shadow-utils - -Provides: utempter = %{utempter_compat_ver} - -%description -This library provides interface for terminal emulators such as -screen and xterm to record user sessions to utmp and wtmp files. - -%package devel -Summary: Development environment for utempter -Requires: %{name} = %{version}-%{release} - -%description devel -This package contains development files required to build -utempter-based software. - -%prep -%setup -q - -%build -make CFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_LD_FLAGS" \ - libdir="%{_libdir}" libexecdir="%{_libexecdir}" - -%install -make install DESTDIR="$RPM_BUILD_ROOT" libdir="%{_libdir}" libexecdir="%{_libexecdir}" - -rm -f $RPM_BUILD_ROOT%{_libdir}/*.a - -%pre -{ - %{_sbindir}/groupadd -g 22 -r -f utmp || : - %{_sbindir}/groupadd -g 35 -r -f utempter || : -} - -%ldconfig_scriptlets - -%files -%license COPYING -%doc README -%{_libdir}/libutempter.so.0 -%{_libdir}/libutempter.so.1.* -%dir %attr(755,root,utempter) %{_libexecdir}/utempter -%attr(2711,root,utmp) %{_libexecdir}/utempter/utempter - -%files devel -%{_includedir}/utempter.h -%{_libdir}/libutempter.so -%{_mandir}/man3/* - -%changelog -* Thu Jul 03 2025 Swee Yee Fonn - 1.1.6-20 -- Initial Edge Microvisor Toolkit import from Azure Linux (license: MIT). -- Update with working Source0 url. -- License verified - -* Fri Oct 15 2021 Pawel Winogrodzki - 1.1.6-19 -- Initial CBL-Mariner import from Fedora 32 (license: MIT). - -* Wed Jan 29 2020 Fedora Release Engineering - 1.1.6-18 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Thu Jul 25 2019 Fedora Release Engineering - 1.1.6-17 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Fri Feb 01 2019 Fedora Release Engineering - 1.1.6-16 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Fri Jul 13 2018 Fedora Release Engineering - 1.1.6-15 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Mon Feb 26 2018 Miroslav Lichvar - 1.1.6-14 -- build with hardening LDFLAGS (#1548717) -- remove obsolete macro and comments -- add gcc to build requirements - -* Wed Feb 07 2018 Fedora Release Engineering - 1.1.6-13 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Sat Feb 03 2018 Igor Gnatenko - 1.1.6-12 -- Switch to %%ldconfig_scriptlets - -* Thu Aug 03 2017 Fedora Release Engineering - 1.1.6-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Wed Jul 26 2017 Fedora Release Engineering - 1.1.6-10 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Fri Feb 10 2017 Fedora Release Engineering - 1.1.6-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Thu Feb 04 2016 Fedora Release Engineering - 1.1.6-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Wed Jun 17 2015 Fedora Release Engineering - 1.1.6-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Sun Aug 17 2014 Fedora Release Engineering - 1.1.6-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Fri Jul 18 2014 Tom Callaway - 1.1.6-5 -- fix license handling - -* Sat Jun 07 2014 Fedora Release Engineering - 1.1.6-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Sat Aug 03 2013 Fedora Release Engineering - 1.1.6-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Thu Jan 24 2013 Miroslav Lichvar - 1.1.6-2 -- compile with PIE and RELRO flags (#853176) - -* Thu Oct 11 2012 Miroslav Lichvar - 1.1.6-1 -- update to 1.1.6 -- fix license tag -- remove unnecessary macros - -* Thu Jul 19 2012 Fedora Release Engineering - 1.1.5-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Fri Jan 13 2012 Fedora Release Engineering - 1.1.5-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild - -* Tue Feb 08 2011 Fedora Release Engineering - 1.1.5-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Sat Jul 25 2009 Fedora Release Engineering - 1.1.5-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Wed Feb 25 2009 Fedora Release Engineering - 1.1.5-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - -* Tue Feb 19 2008 Fedora Release Engineering - 1.1.5-2 -- Autorebuild for GCC 4.3 - -* Wed Nov 07 2007 Andreas Bierfert -- 1.1.5-1 -- version upgrade -- fix #246063 - -* Tue Aug 21 2007 Adam Jackson - 1.1.4-4 -- Rebuild for build id - -* Thu Jul 27 2006 Mike A. Harris 1.1.4-3.fc6 -- Create 'utempter' group with official allocated GID==35 (from setup package). - -* Tue Jul 25 2006 Mike A. Harris 1.1.4-2.fc6 -- Removed usage of rpm macros inside the spec changelog (#200051) -- Removed non-UTF-8 chars from changelog. - -* Mon Jul 24 2006 Mike A. Harris 1.1.4-1.fc6 -- Initial build of Dimitry's libutempter replacement for Fedora Core. -- Reworked the upstream spec file for Fedora packaging compliance. -- Removed static lib subpackage as we dont ship those. - -* Fri Dec 09 2005 Dmitry V. Levin 1.1.4-alt1 -- Enabled almost all diagnostics supported by gcc and fixed all - issues found by gcc-3.4.4-alt3. -- Added FreeBSD support, based on patches from Gentoo/FreeBSD. -- Makefile: - + Fixed few portability issues reported by Gentoo developers. -- libutempter: Linked with -Wl,-z,defs. -- utempter: - + Fixed struct utmp initialization on 64-bit architectures - with 32-bit backwards compatibility enabled (like x86_64). - + Linked with -Wl,-z,now, i.e., marked it to tell the dynamic - linker to resolve all symbols when the program is started. - Suggested by Gentoo developers. - -* Thu Aug 18 2005 Dmitry V. Levin 1.1.3-alt1 -- Restricted list of global symbols exported by the library. -- Updated FSF postal address. - -* Sun Sep 05 2004 Dmitry V. Levin 1.1.2-alt1 -- Added multilib support. - -* Fri Feb 14 2003 Dmitry V. Levin 1.1.1-alt1 -- iface.c: don't block SIGCHLD; redefine signal handler instead. - -* Mon Dec 23 2002 Dmitry V. Levin 1.1.0-alt1 -- Changed soname back to libutempter.so.0, introduced versioning. - -* Tue Sep 24 2002 Dmitry V. Levin 1.0.7-alt1 -- If helper execution fails, try saved group ID. - -* Tue May 21 2002 Dmitry V. Levin 1.0.6-alt1 -- New function: utempter_set_helper. - -* Mon Dec 10 2001 Dmitry V. Levin 1.0.5-alt1 -- iface.c: block SIGCHLD instead of redefine signal handler. - -* Wed Nov 21 2001 Dmitry V. Levin 1.0.4-alt1 -- utempter.h: do not use "__attribute ((unused))". - -* Tue Nov 13 2001 Dmitry V. Levin 1.0.3-alt1 -- Added compatibility declarations to ease upgrade of old applications. -- Added small README file. -- Corrected provides. - -* Thu Nov 08 2001 Dmitry V. Levin 1.0.2-alt1 -- Added compatibility library to ease upgrade of old applications. - -* Mon Nov 05 2001 Dmitry V. Levin 1.0.1-alt1 -- Indented code a bit (Solar request). - -* Mon Oct 15 2001 Dmitry V. Levin 1.0.0-alt1 -- Rewritten the code completely. -- Renamed to libutempter. -- Corrected the package description. -- FHSificated (yes, there are no more {_sbindir}/utempter). -- Libificated. - -* Fri Oct 12 2001 Dmitry V. Levin 0.5.2-alt4 -- {_libdir}/utempter sounds better so use it as helper directory. - -* Thu Oct 11 2001 Dmitry V. Levin 0.5.2-alt3 -- Specfile cleanup. -- Owl-compatible changes: - + added utempter group; - + utempter binary moved to {_libdir}/utempter.d, - owned by group utempter with 710 permissions. - -* Thu Jun 28 2001 Sergie Pugachev 0.5.2-alt1 -- new version - -* Tue Dec 05 2000 AEN -- build for RE - -* Tue Jul 25 2000 Thierry Vignaud 0.5.1-4mdk -- BM - -* Fri May 19 2000 Pixel 0.5.1-3mdk -- add -devel -- add soname -- spec helper cleanup - -* Sat Apr 08 2000 Christopher Molnar 0.5.1-2mdk -- changed group - -* Tue Oct 26 1999 Chmouel Boudjnah -- 0.5.1 -- fix utmp as group 22. -- strip utempter. -- defattr to root. - -* Thu Jun 10 1999 Bernhard Rosenkraenzer -- Mandrake adaptions - -* Fri Jun 4 1999 Jeff Johnson -- ignore SIGCHLD while processing utmp. diff --git a/SPECS/libvirt-python/libvirt-python.signatures.json b/SPECS/libvirt-python/libvirt-python.signatures.json new file mode 100644 index 0000000000..73d2461810 --- /dev/null +++ b/SPECS/libvirt-python/libvirt-python.signatures.json @@ -0,0 +1,5 @@ +{ + "Signatures": { + "libvirt-python-10.10.0.tar.gz": "8acf6dcfb33a03ed92f9440cb1a0b8d3fc53fb23bba2e76ceedeb8bfb5327557" + } +} diff --git a/SPECS/libvirt-python/libvirt-python.spec b/SPECS/libvirt-python/libvirt-python.spec new file mode 100644 index 0000000000..fd89054cfc --- /dev/null +++ b/SPECS/libvirt-python/libvirt-python.spec @@ -0,0 +1,168 @@ +# Don't want provides for python shared objects +%{?filter_provides_in: %{filter_provides_in} %{python3_sitearch}/.*\.so} + +Summary: The libvirt virtualization API python3 binding +Name: libvirt-python +Version: 10.10.0 +Release: 1%{?dist} +License: GPLv2+ and LGPLv2+ +Vendor: Intel Corporation +Distribution: Edge Microvisor Toolkit +URL: https://libvirt.org +Source0: https://libvirt.org/sources/python/%{name}-%{version}.tar.gz + +BuildRequires: gcc +BuildRequires: libvirt-devel = %{version} +BuildRequires: python3-devel +BuildRequires: python3-lxml +%if 0%{with_check} +BuildRequires: python3-atomicwrites +BuildRequires: python3-attrs +BuildRequires: python3-pip +BuildRequires: python3-pytest +BuildRequires: python3-six +%endif + +%{?filter_setup} + +%description +The libvirt-python package contains a module that permits applications +written in the Python programming language to use the interface +supplied by the libvirt library to use the virtualization capabilities +of recent versions of Linux (and other OSes). + +%package -n python3-libvirt +Summary: The libvirt virtualization API python3 binding +URL: https://libvirt.org +%{?python_provide:%python_provide python3-libvirt} +Provides: libvirt-python3 = %{version}-%{release} +Obsoletes: libvirt-python3 <= 3.6.0-1%{?dist} + +%description -n python3-libvirt +The python3-libvirt package contains a module that permits applications +written in the Python 3.x programming language to use the interface +supplied by the libvirt library to use the virtualization capabilities +of recent versions of Linux (and other OSes). + +%prep +%autosetup + +# Unset execute bit for example scripts; it can introduce spurious +# RPM dependencies, like /usr/bin/python3 +# for the -python3 package +find examples -type f -exec chmod 0644 \{\} \; + +%build +%py3_build + +%install +%py3_install + +%check +pip3 install iniconfig +%pytest + +%files -n python3-libvirt +%doc ChangeLog AUTHORS README COPYING examples/ +%{python3_sitearch}/libvirt.py* +%{python3_sitearch}/libvirtaio.py* +%{python3_sitearch}/libvirt_qemu.py* +%{python3_sitearch}/libvirt_lxc.py* +%{python3_sitearch}/__pycache__/libvirt.cpython-*.py* +%{python3_sitearch}/__pycache__/libvirt_qemu.cpython-*.py* +%{python3_sitearch}/__pycache__/libvirt_lxc.cpython-*.py* +%{python3_sitearch}/__pycache__/libvirtaio.cpython-*.py* +%{python3_sitearch}/libvirtmod* +%{python3_sitearch}/*egg-info + +%changelog +* Fri Mar 20 2026 Lee Chee Yang - 10.10.0-1 +- Upgrade to 10.10.0 to align with libvirt +- Initial Edge Microvisor Toolkit import from Azure Linux (license: MIT). License verified. + +* Wed Mar 06 2024 Brian Fjeldstad - 10..00-1 +- Upgrade to 10.0.0. + +* Wed Jan 05 2022 Pawel Winogrodzki - 7.10.0-1 +- Initial CBL-Mariner import from Fedora 36 (license: MIT). +- License verified. +- Updated version to 7.10.0. +- Added BRs for tests. + +* Wed Nov 3 2021 Daniel P. Berrangé - 7.9.0-1 +- Update to 7.9.0 release + +* Fri Oct 1 2021 Daniel P. Berrangé - 7.8.0-1 +- Update to 7.8.0 release + +* Mon Aug 2 2021 Daniel P. Berrangé - 7.6.0-1 +- Update to 7.6.0 release + +* Thu Jul 22 2021 Fedora Release Engineering - 7.5.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Thu Jul 01 2021 Cole Robinson - 7.5.0-1 +- Update to version 7.5.0 + +* Fri Jun 04 2021 Python Maint - 7.4.0-2 +- Rebuilt for Python 3.10 + +* Tue Jun 01 2021 Cole Robinson - 7.4.0-1 +- Update to version 7.4.0 + +* Mon Apr 05 2021 Cole Robinson - 7.2.0-1 +- Update to version 7.2.0 + +* Mon Mar 01 2021 Cole Robinson - 7.1.0-1 +- Update to version 7.1.0 + +* Tue Jan 26 2021 Fedora Release Engineering - 7.0.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Mon Jan 18 2021 Cole Robinson - 7.0.0-1 +- Update to version 7.0.0 + +* Tue Dec 01 2020 Cole Robinson - 6.10.0-1 +- Update to version 6.10.0 + +* Tue Nov 03 2020 Cole Robinson - 6.9.0-1 +- Update to version 6.9.0 + +* Thu Oct 15 2020 Daniel P. Berrangé - 6.8.0-2 +- Fix regression with snapshot handling (rhbz #1888709) + +* Fri Oct 02 2020 Cole Robinson - 6.8.0-1 +- Update to version 6.8.0 + +* Wed Sep 02 2020 Cole Robinson - 6.7.0-1 +- Update to version 6.7.0 + +* Tue Aug 04 2020 Cole Robinson - 6.6.0-1 +- Update to version 6.6.0 + +* Tue Jul 28 2020 Fedora Release Engineering - 6.5.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Sat Jul 04 2020 Cole Robinson - 6.5.0-1 +- Update to version 6.5.0 + +* Tue Jun 02 2020 Cole Robinson - 6.4.0-1 +- Update to version 6.4.0 + +* Tue May 26 2020 Miro Hrončok - 6.3.0-2 +- Rebuilt for Python 3.9 + +* Tue May 05 2020 Cole Robinson - 6.3.0-1 +- Update to version 6.3.0 + +* Thu Apr 02 2020 Cole Robinson - 6.2.0-1 +- Update to version 6.2.0 + +* Wed Mar 04 2020 Cole Robinson - 6.1.0-1 +- Update to version 6.1.0 + +* Wed Jan 29 2020 Fedora Release Engineering - 6.0.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Wed Jan 15 2020 Cole Robinson - 6.0.0-1 +- Update to version 6.0.0 diff --git a/SPECS/libvirt/CVE-2024-1441.patch b/SPECS/libvirt/CVE-2024-1441.patch deleted file mode 100644 index 2b8f87a6ec..0000000000 --- a/SPECS/libvirt/CVE-2024-1441.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 2ebd1f031ecd93d74cb01051f23c8c4564998489 Mon Sep 17 00:00:00 2001 -From: Aninda -Date: Thu, 22 May 2025 22:10:00 -0400 -Subject: [PATCH] Address CVE-2024-1441 -Upstream Patch Reference: https://github.com/libvirt/libvirt/commit/c664015fe3a7bf59db26686e9ed69af011c6ebb8.patch - ---- - NEWS.rst | 16 ++++++++++++++++ - src/interface/interface_backend_udev.c | 2 +- - 2 files changed, 17 insertions(+), 1 deletion(-) - -diff --git a/NEWS.rst b/NEWS.rst -index d013fc7..97c3bc6 100644 ---- a/NEWS.rst -+++ b/NEWS.rst -@@ -10,6 +10,22 @@ For a more fine-grained view, use the `git log`_. - - v10.0.0 (2024-01-15) - ==================== -+* **Security** -+ -+ * ``CVE-2024-1441``: Fix off-by-one error leading to a crash -+ -+ In **libvirt-1.0.0** there were couple of interface listing APIs -+ introduced which had an off-by-one error. That error could lead to a -+ very rare crash if an array was passed to those functions which did -+ not fit all the interfaces. -+ -+ In **libvirt-5.10** a check for non-NULL arrays has been adjusted to -+ allow for NULL arrays with size 0 instead of rejecting all NULL -+ arrays. However that made the above issue significantly worse since -+ that off-by-one error now did not write beyond an array, but -+ dereferenced said NULL pointer making the crash certain in a -+ specific scenario in which a NULL array of size 0 was passed to the -+ aforementioned functions. - - * **New features** - -diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c -index fb6799e..4091483 100644 ---- a/src/interface/interface_backend_udev.c -+++ b/src/interface/interface_backend_udev.c -@@ -222,7 +222,7 @@ udevListInterfacesByStatus(virConnectPtr conn, - g_autoptr(virInterfaceDef) def = NULL; - - /* Ensure we won't exceed the size of our array */ -- if (count > names_len) -+ if (count >= names_len) - break; - - path = udev_list_entry_get_name(dev_entry); --- -2.34.1 - diff --git a/SPECS/libvirt/CVE-2024-2494.patch b/SPECS/libvirt/CVE-2024-2494.patch deleted file mode 100644 index d7b6f9fb09..0000000000 --- a/SPECS/libvirt/CVE-2024-2494.patch +++ /dev/null @@ -1,197 +0,0 @@ -From f0fbb57dae0b9328f53c9d8ba9d672bfc9fd5cf3 Mon Sep 17 00:00:00 2001 -From: Aninda -Date: Thu, 22 May 2025 22:27:55 -0400 -Subject: [PATCH] Address CVE-2024-2494 -Upstream Patch Reference: https://gitlab.com/libvirt/libvirt/-/commit/8a3f8d957507c1f8223fdcf25a3ff885b15557f2.patch - ---- - src/remote/remote_daemon_dispatch.c | 65 +++++++++++++++++++++++++++++ - src/rpc/gendispatch.pl | 5 +++ - 2 files changed, 70 insertions(+) - -diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c -index 7daf503..7542caa 100644 ---- a/src/remote/remote_daemon_dispatch.c -+++ b/src/remote/remote_daemon_dispatch.c -@@ -2291,6 +2291,10 @@ remoteDispatchDomainGetSchedulerParameters(virNetServer *server G_GNUC_UNUSED, - if (!conn) - goto cleanup; - -+ if (args->nparams < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be non-negative")); -+ goto cleanup; -+ } - if (args->nparams > REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; -@@ -2339,6 +2343,10 @@ remoteDispatchDomainGetSchedulerParametersFlags(virNetServer *server G_GNUC_UNUS - if (!conn) - goto cleanup; - -+ if (args->nparams < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be non-negative")); -+ goto cleanup; -+ } - if (args->nparams > REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; -@@ -2497,6 +2505,10 @@ remoteDispatchDomainBlockStatsFlags(virNetServer *server G_GNUC_UNUSED, - goto cleanup; - flags = args->flags; - -+ if (args->nparams < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be non-negative")); -+ goto cleanup; -+ } - if (args->nparams > REMOTE_DOMAIN_BLOCK_STATS_PARAMETERS_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; -@@ -2717,6 +2729,14 @@ remoteDispatchDomainGetVcpuPinInfo(virNetServer *server G_GNUC_UNUSED, - if (!(dom = get_nonnull_domain(conn, args->dom))) - goto cleanup; - -+ if (args->ncpumaps < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("ncpumaps must be non-negative")); -+ goto cleanup; -+ } -+ if (args->maplen < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("maplen must be non-negative")); -+ goto cleanup; -+ } - if (args->ncpumaps > REMOTE_VCPUINFO_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("ncpumaps > REMOTE_VCPUINFO_MAX")); - goto cleanup; -@@ -2811,6 +2831,11 @@ remoteDispatchDomainGetEmulatorPinInfo(virNetServer *server G_GNUC_UNUSED, - if (!(dom = get_nonnull_domain(conn, args->dom))) - goto cleanup; - -+ if (args->maplen < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("maplen must be non-negative")); -+ goto cleanup; -+ } -+ - /* Allocate buffers to take the results */ - if (args->maplen > 0) - cpumaps = g_new0(unsigned char, args->maplen); -@@ -2858,6 +2883,14 @@ remoteDispatchDomainGetVcpus(virNetServer *server G_GNUC_UNUSED, - if (!(dom = get_nonnull_domain(conn, args->dom))) - goto cleanup; - -+ if (args->maxinfo < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("maxinfo must be non-negative")); -+ goto cleanup; -+ } -+ if (args->maplen < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("maxinfo must be non-negative")); -+ goto cleanup; -+ } - if (args->maxinfo > REMOTE_VCPUINFO_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("maxinfo > REMOTE_VCPUINFO_MAX")); - goto cleanup; -@@ -3096,6 +3129,10 @@ remoteDispatchDomainGetMemoryParameters(virNetServer *server G_GNUC_UNUSED, - - flags = args->flags; - -+ if (args->nparams < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be non-negative")); -+ goto cleanup; -+ } - if (args->nparams > REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; -@@ -3156,6 +3193,10 @@ remoteDispatchDomainGetNumaParameters(virNetServer *server G_GNUC_UNUSED, - - flags = args->flags; - -+ if (args->nparams < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be non-negative")); -+ goto cleanup; -+ } - if (args->nparams > REMOTE_DOMAIN_NUMA_PARAMETERS_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; -@@ -3216,6 +3257,10 @@ remoteDispatchDomainGetBlkioParameters(virNetServer *server G_GNUC_UNUSED, - - flags = args->flags; - -+ if (args->nparams < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be non-negative")); -+ goto cleanup; -+ } - if (args->nparams > REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; -@@ -3277,6 +3322,10 @@ remoteDispatchNodeGetCPUStats(virNetServer *server G_GNUC_UNUSED, - - flags = args->flags; - -+ if (args->nparams < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be non-negative")); -+ goto cleanup; -+ } - if (args->nparams > REMOTE_NODE_CPU_STATS_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; -@@ -3339,6 +3388,10 @@ remoteDispatchNodeGetMemoryStats(virNetServer *server G_GNUC_UNUSED, - - flags = args->flags; - -+ if (args->nparams < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be non-negative")); -+ goto cleanup; -+ } - if (args->nparams > REMOTE_NODE_MEMORY_STATS_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; -@@ -3514,6 +3567,10 @@ remoteDispatchDomainGetBlockIoTune(virNetServer *server G_GNUC_UNUSED, - if (!conn) - goto cleanup; - -+ if (args->nparams < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be non-negative")); -+ goto cleanup; -+ } - if (args->nparams > REMOTE_DOMAIN_BLOCK_IO_TUNE_PARAMETERS_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; -@@ -5079,6 +5136,10 @@ remoteDispatchDomainGetInterfaceParameters(virNetServer *server G_GNUC_UNUSED, - - flags = args->flags; - -+ if (args->nparams < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be non-negative")); -+ goto cleanup; -+ } - if (args->nparams > REMOTE_DOMAIN_INTERFACE_PARAMETERS_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; -@@ -5299,6 +5360,10 @@ remoteDispatchNodeGetMemoryParameters(virNetServer *server G_GNUC_UNUSED, - - flags = args->flags; - -+ if (args->nparams < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be non-negative")); -+ goto cleanup; -+ } - if (args->nparams > REMOTE_NODE_MEMORY_PARAMETERS_MAX) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; -diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl -index 5ce988c..c5842dc 100755 ---- a/src/rpc/gendispatch.pl -+++ b/src/rpc/gendispatch.pl -@@ -1070,6 +1070,11 @@ elsif ($mode eq "server") { - print "\n"; - - if ($single_ret_as_list) { -+ print " if (args->$single_ret_list_max_var < 0) {\n"; -+ print " virReportError(VIR_ERR_RPC,\n"; -+ print " \"%s\", _(\"max$single_ret_list_name must be non-negative\"));\n"; -+ print " goto cleanup;\n"; -+ print " }\n"; - print " if (args->$single_ret_list_max_var > $single_ret_list_max_define) {\n"; - print " virReportError(VIR_ERR_RPC,\n"; - print " \"%s\", _(\"max$single_ret_list_name > $single_ret_list_max_define\"));\n"; --- -2.34.1 - diff --git a/SPECS/libvirt/CVE-2024-4418.patch b/SPECS/libvirt/CVE-2024-4418.patch deleted file mode 100644 index eedfaf9f5f..0000000000 --- a/SPECS/libvirt/CVE-2024-4418.patch +++ /dev/null @@ -1,44 +0,0 @@ -From e35fd05e2512a1c650b1940910bb394bfe8bd27d Mon Sep 17 00:00:00 2001 -From: Aninda -Date: Thu, 15 May 2025 08:56:07 -0400 -Subject: [PATCH] Address CVE-2024-4418 -Upstream Patch Reference: https://gitlab.com/libvirt/libvirt/-/commit/8074d64dc2eca846d6a61efe1a9b7428a0ce1dd1 ---- - src/rpc/virnetclient.c | 14 +++++++++++++- - 1 file changed, 13 insertions(+), 1 deletion(-) - -diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c -index 68098b1..147b0d6 100644 ---- a/src/rpc/virnetclient.c -+++ b/src/rpc/virnetclient.c -@@ -1657,7 +1657,7 @@ static int virNetClientIOEventLoop(virNetClient *client, - #endif /* !WIN32 */ - int timeout = -1; - virNetMessage *msg = NULL; -- g_autoptr(GSource) G_GNUC_UNUSED source = NULL; -+ g_autoptr(GSource) source = NULL; - GIOCondition ev = 0; - struct virNetClientIOEventData data = { - .client = client, -@@ -1721,6 +1721,18 @@ static int virNetClientIOEventLoop(virNetClient *client, - - g_main_loop_run(client->eventLoop); - -+ /* -+ * If virNetClientIOEventFD ran, this GSource will already be -+ * destroyed due to G_SOURCE_REMOVE. It is harmless to re-destroy -+ * it, since we still own a reference. -+ * -+ * If virNetClientIOWakeup ran, it will have interrupted the -+ * g_main_loop_run call, before virNetClientIOEventFD could -+ * run, and thus the GSource is still registered, and we need -+ * to destroy it since it is referencing stack memory for 'data' -+ */ -+ g_source_destroy(source); -+ - #ifndef WIN32 - ignore_value(pthread_sigmask(SIG_SETMASK, &oldmask, NULL)); - #endif /* !WIN32 */ --- -2.34.1 - diff --git a/SPECS/libvirt/CVE-2025-12748.patch b/SPECS/libvirt/CVE-2025-12748.patch new file mode 100644 index 0000000000..a29b69c4da --- /dev/null +++ b/SPECS/libvirt/CVE-2025-12748.patch @@ -0,0 +1,1055 @@ +From 6953acaafe8fc77684efe6a978691b8a28a7ad12 Mon Sep 17 00:00:00 2001 +From: Marc Deslauriers +Date: Mon, 8 Dec 2025 10:52:22 -0500 +Subject: [PATCH] CVE-2025-12748 + +Combined backported patches for CVE-2025-12748. + +NOTE: The original Ubuntu patches use 'header->compressed' but libvirt +10.9.0+ renamed this field to 'header->format' (upstream commit bd6d7ebf6). +This patch has been adjusted accordingly. + +Pre-requisite patch reference: +1. https://git.launchpad.net/ubuntu/+source/libvirt/patch/?id=42813e33416a8b4c052829bea5e8a938a7ba9eca +2. https://git.launchpad.net/ubuntu/+source/libvirt/patch/?id=d7d1c76f23d767698ce0838ec4eddf1b214c4bbf +3. https://git.launchpad.net/ubuntu/+source/libvirt/patch/?id=1991519ee70ae620312e808c5bfd1bc296208431 + +CVE-2025-12748.patch patch reference: +1. https://git.launchpad.net/ubuntu/+source/libvirt/patch/?id=4ceddd072ab794135b59364cb95386ef70b51b92 +2. https://git.launchpad.net/ubuntu/+source/libvirt/patch/?id=97a53db9756cbc880ed3f4dc054e9a15690a2176 +3. https://git.launchpad.net/ubuntu/+source/libvirt/patch/?id=1b8d1bd4b10e8eaa9a247487d709440ebba014ed +4. https://git.launchpad.net/ubuntu/+source/libvirt/patch/?id=7a62099efb32ca270e1808fead3263569b81eeea +5. https://git.launchpad.net/ubuntu/+source/libvirt/patch/?id=b4b37eb7ae3296c8b8520b5ad5e4cbce4dbcb8ca +6. https://git.launchpad.net/ubuntu/+source/libvirt/patch/?id=8928cf500e1a94b6f78bc5b1840fa300f18406dd +7. https://git.launchpad.net/ubuntu/+source/libvirt/patch/?id=e8e0d3ce28a0856c14d1fe3d2b5977f164938b9a +8. https://git.launchpad.net/ubuntu/+source/libvirt/patch/?id=6ab6e8705128808aa90b9281bcf046a8cf61dbba +--- +diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c +index 2bd1e4c38..fdbdc3118 100644 +--- a/src/bhyve/bhyve_driver.c ++++ b/src/bhyve/bhyve_driver.c +@@ -505,6 +505,15 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag + if (!caps) + return NULL; + ++ /* Avoid parsing the whole domain definition for ACL checks */ ++ if (!(def = virDomainDefIDsParseString(xml, privconn->xmlopt, parse_flags))) ++ return NULL; ++ ++ if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) ++ return NULL; ++ ++ g_clear_pointer(&def, virDomainDefFree); ++ + if ((def = virDomainDefParseString(xml, privconn->xmlopt, + NULL, parse_flags)) == NULL) + goto cleanup; +@@ -512,9 +521,6 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag + if (virXMLCheckIllegalChars("name", def->name, "\n") < 0) + goto cleanup; + +- if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) +- goto cleanup; +- + if (bhyveDomainAssignAddresses(def, NULL) < 0) + goto cleanup; + +@@ -878,11 +884,17 @@ bhyveDomainCreateXML(virConnectPtr conn, + if (flags & VIR_DOMAIN_START_AUTODESTROY) + start_flags |= VIR_BHYVE_PROCESS_START_AUTODESTROY; + +- if ((def = virDomainDefParseString(xml, privconn->xmlopt, +- NULL, parse_flags)) == NULL) +- goto cleanup; ++ /* Avoid parsing the whole domain definition for ACL checks */ ++ if (!(def = virDomainDefIDsParseString(xml, privconn->xmlopt, parse_flags))) ++ return NULL; + + if (virDomainCreateXMLEnsureACL(conn, def) < 0) ++ return NULL; ++ ++ g_clear_pointer(&def, virDomainDefFree); ++ ++ if ((def = virDomainDefParseString(xml, privconn->xmlopt, ++ NULL, parse_flags)) == NULL) + goto cleanup; + + if (bhyveDomainAssignAddresses(def, NULL) < 0) +diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c +index 6a8da5f35..be93a3ae6 100644 +--- a/src/ch/ch_driver.c ++++ b/src/ch/ch_driver.c +@@ -215,14 +215,19 @@ chDomainCreateXML(virConnectPtr conn, + if (flags & VIR_DOMAIN_START_VALIDATE) + parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; + ++ /* Avoid parsing the whole domain definition for ACL checks */ ++ if (!(vmdef = virDomainDefIDsParseString(xml, driver->xmlopt, parse_flags))) ++ return NULL; ++ ++ if (virDomainCreateXMLEnsureACL(conn, vmdef) < 0) ++ return NULL; ++ ++ g_clear_pointer(&vmdef, virDomainDefFree); + + if ((vmdef = virDomainDefParseString(xml, driver->xmlopt, + NULL, parse_flags)) == NULL) + goto cleanup; + +- if (virDomainCreateXMLEnsureACL(conn, vmdef) < 0) +- goto cleanup; +- + if (!(vm = virDomainObjListAdd(driver->domains, + &vmdef, + driver->xmlopt, +@@ -346,6 +351,15 @@ chDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) + if (flags & VIR_DOMAIN_START_VALIDATE) + parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; + ++ /* Avoid parsing the whole domain definition for ACL checks */ ++ if (!(vmdef = virDomainDefIDsParseString(xml, driver->xmlopt, parse_flags))) ++ return NULL; ++ ++ if (virDomainDefineXMLFlagsEnsureACL(conn, vmdef) < 0) ++ return NULL; ++ ++ g_clear_pointer(&vmdef, virDomainDefFree); ++ + if ((vmdef = virDomainDefParseString(xml, driver->xmlopt, + NULL, parse_flags)) == NULL) + goto cleanup; +@@ -353,9 +367,6 @@ chDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) + if (virXMLCheckIllegalChars("name", vmdef->name, "\n") < 0) + goto cleanup; + +- if (virDomainDefineXMLFlagsEnsureACL(conn, vmdef) < 0) +- goto cleanup; +- + if (!(vm = virDomainObjListAdd(driver->domains, &vmdef, + driver->xmlopt, + 0, &oldDef))) +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 4ad8289b8..3b4b426b6 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -19940,6 +19940,35 @@ virDomainDefParse(const char *xmlStr, + return virDomainDefParseNode(ctxt, xmlopt, parseOpaque, flags); + } + ++virDomainDef * ++virDomainDefIDsParseString(const char *xmlStr, ++ virDomainXMLOption *xmlopt, ++ unsigned int flags) ++{ ++ g_autoptr(virDomainDef) def = NULL; ++ g_autoptr(xmlDoc) xml = NULL; ++ g_autoptr(xmlXPathContext) ctxt = NULL; ++ bool uuid_generated = false; ++ ++ xml = virXMLParseWithIndent(NULL, xmlStr, _("(domain_definition)"), ++ "domain", &ctxt, "domain.rng", false); ++ ++ if (!xml) ++ return NULL; ++ ++ def = virDomainDefNew(xmlopt); ++ if (!def) ++ return NULL; ++ ++ if (virDomainDefParseIDs(def, ctxt, flags, &uuid_generated) < 0) ++ return NULL; ++ ++ if (uuid_generated) ++ memset(def->uuid, 0, VIR_UUID_BUFLEN); ++ ++ return g_steal_pointer(&def); ++} ++ + virDomainDef * + virDomainDefParseString(const char *xmlStr, + virDomainXMLOption *xmlopt, +diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h +index a187ab408..c748837ce 100644 +--- a/src/conf/domain_conf.h ++++ b/src/conf/domain_conf.h +@@ -3832,6 +3832,9 @@ virDomainDiskDef *virDomainDiskDefParse(const char *xmlStr, + virStorageSource *virDomainDiskDefParseSource(const char *xmlStr, + virDomainXMLOption *xmlopt, + unsigned int flags); ++virDomainDef * virDomainDefIDsParseString(const char *xmlStr, ++ virDomainXMLOption *xmlopt, ++ unsigned int flags); + virDomainDef *virDomainDefParseString(const char *xmlStr, + virDomainXMLOption *xmlopt, + void *parseOpaque, +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index c931003fa..fb673576b 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -347,6 +347,7 @@ virDomainDefHasSpiceGraphics; + virDomainDefHasUSB; + virDomainDefHasVcpusOffline; + virDomainDefHasVDPANet; ++virDomainDefIDsParseString; + virDomainDefLifecycleActionAllowed; + virDomainDefMaybeAddController; + virDomainDefMaybeAddInput; +diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c +index e72553603..df475a969 100644 +--- a/src/libxl/libxl_driver.c ++++ b/src/libxl/libxl_driver.c +@@ -1036,13 +1036,18 @@ libxlDomainCreateXML(virConnectPtr conn, const char *xml, + if (flags & VIR_DOMAIN_START_VALIDATE) + parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; + +- if (!(def = virDomainDefParseString(xml, driver->xmlopt, +- NULL, parse_flags))) ++ if (!(def = virDomainDefIDsParseString(xml, driver->xmlopt, parse_flags))) + goto cleanup; + + if (virDomainCreateXMLEnsureACL(conn, def) < 0) + goto cleanup; + ++ g_clear_pointer(&def, virDomainDefFree); ++ ++ if (!(def = virDomainDefParseString(xml, driver->xmlopt, ++ NULL, parse_flags))) ++ goto cleanup; ++ + if (!(vm = virDomainObjListAdd(driver->domains, &def, + driver->xmlopt, + VIR_DOMAIN_OBJ_LIST_ADD_LIVE | +@@ -2822,6 +2827,14 @@ libxlDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag + if (flags & VIR_DOMAIN_DEFINE_VALIDATE) + parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; + ++ if (!(def = virDomainDefIDsParseString(xml, driver->xmlopt, parse_flags))) ++ goto cleanup; ++ ++ if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) ++ goto cleanup; ++ ++ g_clear_pointer(&def, virDomainDefFree); ++ + if (!(def = virDomainDefParseString(xml, driver->xmlopt, + NULL, parse_flags))) + goto cleanup; +@@ -2829,9 +2842,6 @@ libxlDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag + if (virXMLCheckIllegalChars("name", def->name, "\n") < 0) + goto cleanup; + +- if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) +- goto cleanup; +- + if (!(vm = virDomainObjListAdd(driver->domains, &def, + driver->xmlopt, + 0, +diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c +index d682e7168..8c0aa61e9 100644 +--- a/src/lxc/lxc_driver.c ++++ b/src/lxc/lxc_driver.c +@@ -409,6 +409,15 @@ lxcDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) + if (!(caps = virLXCDriverGetCapabilities(driver, false))) + goto cleanup; + ++ /* Avoid parsing the whole domain definition for ACL checks */ ++ if (!(def = virDomainDefIDsParseString(xml, driver->xmlopt, parse_flags))) ++ goto cleanup; ++ ++ if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) ++ goto cleanup; ++ ++ g_clear_pointer(&def, virDomainDefFree); ++ + if (!(def = virDomainDefParseString(xml, driver->xmlopt, + NULL, parse_flags))) + goto cleanup; +@@ -416,9 +425,6 @@ lxcDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) + if (virXMLCheckIllegalChars("name", def->name, "\n") < 0) + goto cleanup; + +- if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) +- goto cleanup; +- + if (virSecurityManagerVerify(driver->securityManager, def) < 0) + goto cleanup; + +@@ -1078,13 +1084,19 @@ lxcDomainCreateXMLWithFiles(virConnectPtr conn, + if (!(caps = virLXCDriverGetCapabilities(driver, false))) + goto cleanup; + +- if (!(def = virDomainDefParseString(xml, driver->xmlopt, +- NULL, parse_flags))) ++ /* Avoid parsing the whole domain definition for ACL checks */ ++ if (!(def = virDomainDefIDsParseString(xml, driver->xmlopt, parse_flags))) + goto cleanup; + + if (virDomainCreateXMLWithFilesEnsureACL(conn, def) < 0) + goto cleanup; + ++ g_clear_pointer(&def, virDomainDefFree); ++ ++ if (!(def = virDomainDefParseString(xml, driver->xmlopt, ++ NULL, parse_flags))) ++ goto cleanup; ++ + if (virSecurityManagerVerify(driver->securityManager, def) < 0) + goto cleanup; + +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 09f7edda7..96e0cb88b 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -1588,11 +1588,17 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr conn, + if (flags & VIR_DOMAIN_START_RESET_NVRAM) + start_flags |= VIR_QEMU_PROCESS_START_RESET_NVRAM; + +- if (!(def = virDomainDefParseString(xml, driver->xmlopt, +- NULL, parse_flags))) +- goto cleanup; ++ /* Avoid parsing the whole domain definition for ACL checks */ ++ if (!(def = virDomainDefIDsParseString(xml, driver->xmlopt, parse_flags))) ++ return NULL; + + if (virDomainCreateXMLEnsureACL(conn, def) < 0) ++ return NULL; ++ ++ g_clear_pointer(&def, virDomainDefFree); ++ ++ if (!(def = virDomainDefParseString(xml, driver->xmlopt, ++ NULL, parse_flags))) + goto cleanup; + + if (!(vm = virDomainObjListAdd(driver->domains, &def, +@@ -5769,13 +5775,13 @@ qemuDomainRestoreInternal(virConnectPtr conn, + if (flags & VIR_DOMAIN_SAVE_RESET_NVRAM) + reset_nvram = true; + +- fd = qemuSaveImageOpen(driver, NULL, path, &def, &data, +- (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) != 0, +- &wrapperFd, false, false); +- if (fd < 0) ++ if (qemuSaveImageGetMetadata(driver, NULL, path, ensureACL, conn, &def, &data) < 0) + goto cleanup; + +- if (ensureACL(conn, def) < 0) ++ fd = qemuSaveImageOpen(driver, path, ++ (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) != 0, ++ &wrapperFd, false); ++ if (fd < 0) + goto cleanup; + + if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { +@@ -5900,25 +5906,19 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, const char *path, + virQEMUDriver *driver = conn->privateData; + char *ret = NULL; + g_autoptr(virDomainDef) def = NULL; +- int fd = -1; + virQEMUSaveData *data = NULL; + + virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL); + +- fd = qemuSaveImageOpen(driver, NULL, path, &def, &data, +- false, NULL, false, false); +- +- if (fd < 0) +- goto cleanup; +- +- if (virDomainSaveImageGetXMLDescEnsureACL(conn, def) < 0) ++ if (qemuSaveImageGetMetadata(driver, NULL, path, ++ virDomainSaveImageGetXMLDescEnsureACL, ++ conn, &def, &data) < 0) + goto cleanup; + + ret = qemuDomainDefFormatXML(driver, NULL, def, flags); + + cleanup: + virQEMUSaveDataFree(data); +- VIR_FORCE_CLOSE(fd); + return ret; + } + +@@ -5942,13 +5942,13 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, const char *path, + else if (flags & VIR_DOMAIN_SAVE_PAUSED) + state = 0; + +- fd = qemuSaveImageOpen(driver, NULL, path, &def, &data, +- false, NULL, true, false); +- +- if (fd < 0) ++ if (qemuSaveImageGetMetadata(driver, NULL, path, ++ virDomainSaveImageDefineXMLEnsureACL, ++ conn, &def, &data) < 0) + goto cleanup; + +- if (virDomainSaveImageDefineXMLEnsureACL(conn, def) < 0) ++ fd = qemuSaveImageOpen(driver, path, 0, NULL, false); ++ if (fd < 0) + goto cleanup; + + if (STREQ(data->xml, dxml) && +@@ -6001,7 +6001,6 @@ qemuDomainManagedSaveGetXMLDesc(virDomainPtr dom, unsigned int flags) + g_autofree char *path = NULL; + char *ret = NULL; + g_autoptr(virDomainDef) def = NULL; +- int fd = -1; + virQEMUSaveData *data = NULL; + qemuDomainObjPrivate *priv; + +@@ -6023,15 +6022,14 @@ qemuDomainManagedSaveGetXMLDesc(virDomainPtr dom, unsigned int flags) + goto cleanup; + } + +- if ((fd = qemuSaveImageOpen(driver, priv->qemuCaps, path, &def, &data, +- false, NULL, false, false)) < 0) ++ if (qemuSaveImageGetMetadata(driver, priv->qemuCaps, path, ++ NULL, NULL, &def, &data) < 0) + goto cleanup; + + ret = qemuDomainDefFormatXML(driver, priv->qemuCaps, def, flags); + + cleanup: + virQEMUSaveDataFree(data); +- VIR_FORCE_CLOSE(fd); + virDomainObjEndAPI(&vm); + return ret; + } +@@ -6087,14 +6085,26 @@ qemuDomainObjRestore(virConnectPtr conn, + virQEMUSaveData *data = NULL; + virFileWrapperFd *wrapperFd = NULL; + +- fd = qemuSaveImageOpen(driver, NULL, path, &def, &data, +- bypass_cache, &wrapperFd, false, true); +- if (fd < 0) { +- if (fd == -3) +- ret = 1; ++ ret = qemuSaveImageGetMetadata(driver, NULL, path, NULL, NULL, &def, &data); ++ if (ret < 0) { ++ if (qemuSaveImageIsCorrupt(driver, path)) { ++ if (unlink(path) < 0) { ++ virReportSystemError(errno, ++ _("cannot remove corrupt file: %1$s"), ++ path); ++ ret = -1; ++ } else { ++ virResetLastError(); ++ ret = 1; ++ } ++ } + goto cleanup; + } + ++ fd = qemuSaveImageOpen(driver, path, bypass_cache, &wrapperFd, false); ++ if (fd < 0) ++ goto cleanup; ++ + if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { + int hookret; + +@@ -6423,6 +6433,15 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, + if (flags & VIR_DOMAIN_DEFINE_VALIDATE) + parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; + ++ /* Avoid parsing the whole domain definition for ACL checks */ ++ if (!(def = virDomainDefIDsParseString(xml, driver->xmlopt, parse_flags))) ++ return NULL; ++ ++ if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) ++ return NULL; ++ ++ g_clear_pointer(&def, virDomainDefFree); ++ + if (!(def = virDomainDefParseString(xml, driver->xmlopt, + NULL, parse_flags))) + return NULL; +@@ -6430,9 +6449,6 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, + if (virXMLCheckIllegalChars("name", def->name, "\n") < 0) + goto cleanup; + +- if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) +- goto cleanup; +- + if (!(vm = virDomainObjListAdd(driver->domains, &def, + driver->xmlopt, + 0, &oldDef))) +@@ -10667,10 +10683,9 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn, + return -1; + } + +- if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname))) +- return -1; +- +- if (virDomainMigratePrepareTunnelEnsureACL(dconn, def) < 0) ++ if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname, ++ dconn, ++ virDomainMigratePrepareTunnelEnsureACL))) + return -1; + + return qemuMigrationDstPrepareTunnel(driver, dconn, +@@ -10720,10 +10735,9 @@ qemuDomainMigratePrepare2(virConnectPtr dconn, + return -1; + } + +- if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname))) +- return -1; +- +- if (virDomainMigratePrepare2EnsureACL(dconn, def) < 0) ++ if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname, ++ dconn, ++ virDomainMigratePrepare2EnsureACL))) + return -1; + + /* Do not use cookies in v2 protocol, since the cookie +@@ -10943,10 +10957,9 @@ qemuDomainMigratePrepare3(virConnectPtr dconn, + QEMU_MIGRATION_DESTINATION))) + return -1; + +- if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname))) +- return -1; +- +- if (virDomainMigratePrepare3EnsureACL(dconn, def) < 0) ++ if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname, ++ dconn, ++ virDomainMigratePrepare3EnsureACL))) + return -1; + + return qemuMigrationDstPrepareDirect(driver, dconn, +@@ -11046,10 +11059,9 @@ qemuDomainMigratePrepare3Params(virConnectPtr dconn, + return -1; + } + +- if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname))) +- return -1; +- +- if (virDomainMigratePrepare3ParamsEnsureACL(dconn, def) < 0) ++ if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname, ++ dconn, ++ virDomainMigratePrepare3ParamsEnsureACL))) + return -1; + + return qemuMigrationDstPrepareDirect(driver, dconn, +@@ -11091,10 +11103,9 @@ qemuDomainMigratePrepareTunnel3(virConnectPtr dconn, + QEMU_MIGRATION_DESTINATION))) + return -1; + +- if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname))) +- return -1; +- +- if (virDomainMigratePrepareTunnel3EnsureACL(dconn, def) < 0) ++ if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname, ++ dconn, ++ virDomainMigratePrepareTunnel3EnsureACL))) + return -1; + + return qemuMigrationDstPrepareTunnel(driver, dconn, +@@ -11143,10 +11154,9 @@ qemuDomainMigratePrepareTunnel3Params(virConnectPtr dconn, + QEMU_MIGRATION_DESTINATION))) + return -1; + +- if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname))) +- return -1; +- +- if (virDomainMigratePrepareTunnel3ParamsEnsureACL(dconn, def) < 0) ++ if (!(def = qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname, &origname, ++ dconn, ++ virDomainMigratePrepareTunnel3ParamsEnsureACL))) + return -1; + + return qemuMigrationDstPrepareTunnel(driver, dconn, +diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c +index 26a92d8ee..9c6b76728 100644 +--- a/src/qemu/qemu_migration.c ++++ b/src/qemu/qemu_migration.c +@@ -3957,7 +3957,9 @@ qemuMigrationAnyPrepareDef(virQEMUDriver *driver, + virQEMUCaps *qemuCaps, + const char *dom_xml, + const char *dname, +- char **origname) ++ char **origname, ++ virConnectPtr sconn, ++ int (*ensureACL)(virConnectPtr, virDomainDef *)) + { + virDomainDef *def; + char *name = NULL; +@@ -3968,6 +3970,24 @@ qemuMigrationAnyPrepareDef(virQEMUDriver *driver, + return NULL; + } + ++ if (ensureACL) { ++ g_autoptr(virDomainDef) aclDef = NULL; ++ ++ /* Avoid parsing the whole domain definition for ACL checks */ ++ if (!(aclDef = virDomainDefIDsParseString(dom_xml, driver->xmlopt, ++ VIR_DOMAIN_DEF_PARSE_INACTIVE))) ++ return NULL; ++ ++ if (dname) { ++ VIR_FREE(aclDef->name); ++ aclDef->name = g_strdup(dname); ++ } ++ ++ if (ensureACL(sconn, aclDef) < 0) { ++ return NULL; ++ } ++ } ++ + if (!(def = virDomainDefParseString(dom_xml, driver->xmlopt, + qemuCaps, + VIR_DOMAIN_DEF_PARSE_INACTIVE))) +@@ -4899,6 +4919,7 @@ qemuMigrationSrcRun(virQEMUDriver *driver, + if (!(persistDef = qemuMigrationAnyPrepareDef(driver, + priv->qemuCaps, + persist_xml, ++ NULL, NULL, + NULL, NULL))) + goto error; + } else { +diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h +index 4b7ef9688..1fca93edd 100644 +--- a/src/qemu/qemu_migration.h ++++ b/src/qemu/qemu_migration.h +@@ -133,7 +133,9 @@ qemuMigrationAnyPrepareDef(virQEMUDriver *driver, + virQEMUCaps *qemuCaps, + const char *dom_xml, + const char *dname, +- char **origname); ++ char **origname, ++ virConnectPtr sconn, ++ int (*ensureACL)(virConnectPtr, virDomainDef *)); + + int + qemuMigrationDstPrepareTunnel(virQEMUDriver *driver, +diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c +index 69617e07e..d9d53e33a 100644 +--- a/src/qemu/qemu_saveimage.c ++++ b/src/qemu/qemu_saveimage.c +@@ -249,6 +249,90 @@ qemuSaveImageGetCompressionCommand(virQEMUSaveFormat format) + } + + ++static int ++qemuSaveImageReadHeader(int fd, virQEMUSaveData **ret_data) ++{ ++ g_autoptr(virQEMUSaveData) data = NULL; ++ virQEMUSaveHeader *header; ++ size_t xml_len; ++ size_t cookie_len; ++ ++ data = g_new0(virQEMUSaveData, 1); ++ header = &data->header; ++ if (saferead(fd, header, sizeof(*header)) != sizeof(*header)) { ++ virReportError(VIR_ERR_OPERATION_FAILED, ++ "%s", _("failed to read qemu header")); ++ return -1; ++ } ++ ++ if (memcmp(header->magic, QEMU_SAVE_MAGIC, sizeof(header->magic)) != 0) { ++ if (memcmp(header->magic, QEMU_SAVE_PARTIAL, sizeof(header->magic)) == 0) { ++ virReportError(VIR_ERR_OPERATION_FAILED, "%s", ++ _("save image is incomplete")); ++ return -1; ++ } ++ ++ virReportError(VIR_ERR_OPERATION_FAILED, "%s", ++ _("image magic is incorrect")); ++ return -1; ++ } ++ ++ if (header->version > QEMU_SAVE_VERSION) { ++ /* convert endianness and try again */ ++ qemuSaveImageBswapHeader(header); ++ } ++ ++ if (header->version > QEMU_SAVE_VERSION) { ++ virReportError(VIR_ERR_OPERATION_FAILED, ++ _("image version is not supported (%1$d > %2$d)"), ++ header->version, QEMU_SAVE_VERSION); ++ return -1; ++ } ++ ++ if (header->format >= QEMU_SAVE_FORMAT_LAST) { ++ virReportError(VIR_ERR_OPERATION_FAILED, ++ _("unsupported save image format: %1$d"), header->format); ++ return -1; ++ } ++ ++ if (header->data_len <= 0) { ++ virReportError(VIR_ERR_OPERATION_FAILED, ++ _("invalid header data length: %1$d"), header->data_len); ++ return -1; ++ } ++ ++ if (header->cookieOffset) ++ xml_len = header->cookieOffset; ++ else ++ xml_len = header->data_len; ++ ++ cookie_len = header->data_len - xml_len; ++ ++ data->xml = g_new0(char, xml_len); ++ ++ if (saferead(fd, data->xml, xml_len) != xml_len) { ++ virReportError(VIR_ERR_OPERATION_FAILED, ++ "%s", _("failed to read domain XML")); ++ return -1; ++ } ++ ++ if (cookie_len > 0) { ++ data->cookie = g_new0(char, cookie_len); ++ ++ if (saferead(fd, data->cookie, cookie_len) != cookie_len) { ++ virReportError(VIR_ERR_OPERATION_FAILED, "%s", ++ _("failed to read cookie")); ++ return -1; ++ } ++ } ++ ++ if (ret_data) ++ *ret_data = g_steal_pointer(&data); ++ ++ return 0; ++} ++ ++ + /** + * qemuSaveImageDecompressionStart: + * @data: data from memory state file +@@ -522,41 +606,116 @@ qemuSaveImageGetCompressionProgram(const char *imageFormat, + + + /** +- * qemuSaveImageOpen: ++ * qemuSaveImageIsCorrupt: ++ * @driver: qemu driver data ++ * @path: path of the save image ++ * ++ * Returns true if the save image file identified by @path does not exist or ++ * has a corrupt header. Returns false otherwise. ++ */ ++ ++bool ++qemuSaveImageIsCorrupt(virQEMUDriver *driver, const char *path) ++{ ++ g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); ++ VIR_AUTOCLOSE fd = -1; ++ virQEMUSaveHeader header; ++ ++ if ((fd = qemuDomainOpenFile(cfg, NULL, path, O_RDONLY, NULL)) < 0) ++ return true; ++ ++ if (saferead(fd, &header, sizeof(header)) != sizeof(header)) ++ return true; ++ ++ if (memcmp(header.magic, QEMU_SAVE_MAGIC, sizeof(header.magic)) != 0 || ++ memcmp(header.magic, QEMU_SAVE_PARTIAL, sizeof(header.magic)) == 0) ++ return true; ++ ++ return false; ++} ++ ++ ++/** ++ * qemuSaveImageGetMetadata: + * @driver: qemu driver data + * @qemuCaps: pointer to qemuCaps if the domain is running or NULL + * @path: path of the save image ++ * @ensureACL: ACL callback to check against the definition or NULL ++ * @conn: parameter for the @ensureACL callback + * @ret_def: returns domain definition created from the XML stored in the image + * @ret_data: returns structure filled with data from the image header ++ * ++ * Open the save image file, read libvirt's save image metadata, optionally ++ * check ACLs before parsing the whole domain definition and populate the ++ * @ret_def and @ret_data structures. Returns 0 on success and -1 on failure. ++ */ ++int ++qemuSaveImageGetMetadata(virQEMUDriver *driver, ++ virQEMUCaps *qemuCaps, ++ const char *path, ++ int (*ensureACL)(virConnectPtr, virDomainDef *), ++ virConnectPtr conn, ++ virDomainDef **ret_def, ++ virQEMUSaveData **ret_data) ++{ ++ g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); ++ VIR_AUTOCLOSE fd = -1; ++ virQEMUSaveData *data; ++ g_autoptr(virDomainDef) def = NULL; ++ unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE | ++ VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE; ++ int rc; ++ ++ if ((fd = qemuDomainOpenFile(cfg, NULL, path, O_RDONLY, NULL)) < 0) ++ return -1; ++ ++ if ((rc = qemuSaveImageReadHeader(fd, ret_data)) < 0) ++ return rc; ++ ++ data = *ret_data; ++ ++ if (ensureACL) { ++ /* Parse only the IDs for ACL checks */ ++ g_autoptr(virDomainDef) aclDef = virDomainDefIDsParseString(data->xml, ++ driver->xmlopt, ++ parse_flags); ++ ++ if (!aclDef || ensureACL(conn, aclDef) < 0) ++ return -1; ++ } ++ ++ /* Create a domain from this XML */ ++ if (!(def = virDomainDefParseString(data->xml, driver->xmlopt, qemuCaps, ++ parse_flags))) ++ return -1; ++ ++ *ret_def = g_steal_pointer(&def); ++ ++ return 0; ++} ++ ++ ++/** ++ * qemuSaveImageOpen: ++ * @driver: qemu driver data ++ * @path: path of the save image + * @bypass_cache: bypass cache when opening the file + * @wrapperFd: returns the file wrapper structure + * @open_write: open the file for writing (for updates) +- * @unlink_corrupt: remove the image file if it is corrupted + * +- * Returns the opened fd of the save image file and fills the appropriate fields +- * on success. On error returns -1 on most failures, -3 if corrupt image was +- * unlinked (no error raised). ++ * Returns the opened fd of the save image file on success, -1 on failure. + */ + int + qemuSaveImageOpen(virQEMUDriver *driver, +- virQEMUCaps *qemuCaps, + const char *path, +- virDomainDef **ret_def, +- virQEMUSaveData **ret_data, + bool bypass_cache, + virFileWrapperFd **wrapperFd, +- bool open_write, +- bool unlink_corrupt) ++ bool open_write) + { + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); + VIR_AUTOCLOSE fd = -1; + int ret = -1; +- g_autoptr(virQEMUSaveData) data = NULL; +- virQEMUSaveHeader *header; +- g_autoptr(virDomainDef) def = NULL; + int oflags = open_write ? O_RDWR : O_RDONLY; +- size_t xml_len; +- size_t cookie_len; + + if (bypass_cache) { + int directFlag = virFileDirectFdFlag(); +@@ -576,100 +735,10 @@ qemuSaveImageOpen(virQEMUDriver *driver, + VIR_FILE_WRAPPER_BYPASS_CACHE))) + return -1; + +- data = g_new0(virQEMUSaveData, 1); +- +- header = &data->header; +- if (saferead(fd, header, sizeof(*header)) != sizeof(*header)) { +- if (unlink_corrupt) { +- if (unlink(path) < 0) { +- virReportSystemError(errno, +- _("cannot remove corrupt file: %1$s"), +- path); +- return -1; +- } else { +- return -3; +- } +- } +- +- virReportError(VIR_ERR_OPERATION_FAILED, +- "%s", _("failed to read qemu header")); ++ /* Read the header to position the file pointer for QEMU. Unfortunately we ++ * can't use lseek with virFileWrapperFD. */ ++ if (qemuSaveImageReadHeader(fd, NULL) < 0) + return -1; +- } +- +- if (memcmp(header->magic, QEMU_SAVE_MAGIC, sizeof(header->magic)) != 0) { +- if (memcmp(header->magic, QEMU_SAVE_PARTIAL, sizeof(header->magic)) == 0) { +- if (unlink_corrupt) { +- if (unlink(path) < 0) { +- virReportSystemError(errno, +- _("cannot remove corrupt file: %1$s"), +- path); +- return -1; +- } else { +- return -3; +- } +- } +- +- virReportError(VIR_ERR_OPERATION_FAILED, "%s", +- _("save image is incomplete")); +- return -1; +- } +- +- virReportError(VIR_ERR_OPERATION_FAILED, "%s", +- _("image magic is incorrect")); +- return -1; +- } +- +- if (header->version > QEMU_SAVE_VERSION) { +- /* convert endianness and try again */ +- qemuSaveImageBswapHeader(header); +- } +- +- if (header->version > QEMU_SAVE_VERSION) { +- virReportError(VIR_ERR_OPERATION_FAILED, +- _("image version is not supported (%1$d > %2$d)"), +- header->version, QEMU_SAVE_VERSION); +- return -1; +- } +- +- if (header->data_len <= 0) { +- virReportError(VIR_ERR_OPERATION_FAILED, +- _("invalid header data length: %1$d"), header->data_len); +- return -1; +- } +- +- if (header->cookieOffset) +- xml_len = header->cookieOffset; +- else +- xml_len = header->data_len; +- +- cookie_len = header->data_len - xml_len; +- +- data->xml = g_new0(char, xml_len); +- +- if (saferead(fd, data->xml, xml_len) != xml_len) { +- virReportError(VIR_ERR_OPERATION_FAILED, +- "%s", _("failed to read domain XML")); +- return -1; +- } +- +- if (cookie_len > 0) { +- data->cookie = g_new0(char, cookie_len); +- +- if (saferead(fd, data->cookie, cookie_len) != cookie_len) { +- virReportError(VIR_ERR_OPERATION_FAILED, "%s", +- _("failed to read cookie")); +- return -1; +- } +- } +- +- /* Create a domain from this XML */ +- if (!(def = virDomainDefParseString(data->xml, driver->xmlopt, qemuCaps, +- VIR_DOMAIN_DEF_PARSE_INACTIVE | +- VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) +- return -1; +- +- *ret_def = g_steal_pointer(&def); +- *ret_data = g_steal_pointer(&data); + + ret = fd; + fd = -1; +diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h +index 0e58dd14b..2527042c4 100644 +--- a/src/qemu/qemu_saveimage.h ++++ b/src/qemu/qemu_saveimage.h +@@ -69,17 +69,28 @@ qemuSaveImageStartVM(virConnectPtr conn, + virDomainAsyncJob asyncJob) + ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5) ATTRIBUTE_NONNULL(6); + ++bool ++qemuSaveImageIsCorrupt(virQEMUDriver *driver, ++ const char *path) ++ ATTRIBUTE_NONNULL(2); ++ ++int ++qemuSaveImageGetMetadata(virQEMUDriver *driver, ++ virQEMUCaps *qemuCaps, ++ const char *path, ++ int (*ensureACL)(virConnectPtr, virDomainDef *), ++ virConnectPtr conn, ++ virDomainDef **ret_def, ++ virQEMUSaveData **ret_data) ++ ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7); ++ + int + qemuSaveImageOpen(virQEMUDriver *driver, +- virQEMUCaps *qemuCaps, + const char *path, +- virDomainDef **ret_def, +- virQEMUSaveData **ret_data, + bool bypass_cache, + virFileWrapperFd **wrapperFd, +- bool open_write, +- bool unlink_corrupt) +- ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4); ++ bool open_write) ++ ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4); + + int + qemuSaveImageGetCompressionProgram(const char *imageFormat, +diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c +index 18b2e478f..98d822898 100644 +--- a/src/qemu/qemu_snapshot.c ++++ b/src/qemu/qemu_snapshot.c +@@ -2377,11 +2377,12 @@ qemuSnapshotRevertExternalPrepare(virDomainObj *vm, + g_autoptr(virDomainDef) savedef = NULL; + + memdata->path = snapdef->memorysnapshotfile; +- memdata->fd = qemuSaveImageOpen(driver, NULL, memdata->path, +- &savedef, &memdata->data, +- false, NULL, +- false, false); ++ if (qemuSaveImageGetMetadata(driver, NULL, memdata->path, NULL, NULL, ++ &savedef, &memdata->data) < 0) ++ return -1; + ++ memdata->fd = qemuSaveImageOpen(driver, memdata->path, ++ false, NULL, false); + if (memdata->fd < 0) + return -1; + +diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c +index 4edea4bf1..8596e02c4 100644 +--- a/src/vz/vz_driver.c ++++ b/src/vz/vz_driver.c +@@ -796,6 +796,15 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) + if (flags & VIR_DOMAIN_DEFINE_VALIDATE) + parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; + ++ /* Avoid parsing the whole domain definition for ACL checks */ ++ if (!(def = virDomainDefIDsParseString(xml, driver->xmlopt, parse_flags))) ++ return NULL; ++ ++ if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) ++ return NULL; ++ ++ g_clear_pointer(&def, virDomainDefFree); ++ + if ((def = virDomainDefParseString(xml, driver->xmlopt, + NULL, parse_flags)) == NULL) + goto cleanup; +@@ -803,9 +812,6 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) + if (virXMLCheckIllegalChars("name", def->name, "\n") < 0) + goto cleanup; + +- if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) +- goto cleanup; +- + dom = virDomainObjListFindByUUID(driver->domains, def->uuid); + if (dom == NULL) { + virResetLastError(); +@@ -2973,9 +2979,9 @@ vzDomainMigratePrepare3Params(virConnectPtr conn, + | VZ_MIGRATION_COOKIE_DOMAIN_NAME) < 0) + return -1; + +- if (!(def = virDomainDefParseString(dom_xml, driver->xmlopt, +- NULL, +- VIR_DOMAIN_DEF_PARSE_INACTIVE))) ++ /* Avoid parsing the whole domain definition for ACL checks */ ++ if (!(def = virDomainDefIDsParseString(dom_xml, driver->xmlopt, ++ VIR_DOMAIN_DEF_PARSE_INACTIVE))) + return -1; + + if (dname) { diff --git a/SPECS/libvirt/CVE-2025-13193.patch b/SPECS/libvirt/CVE-2025-13193.patch new file mode 100644 index 0000000000..856da62ae2 --- /dev/null +++ b/SPECS/libvirt/CVE-2025-13193.patch @@ -0,0 +1,38 @@ +From b3c22760e37dbbd8c3be2368c62dc34289faff42 Mon Sep 17 00:00:00 2001 +From: Peter Krempa +Date: Wed, 12 Nov 2025 17:52:05 +0100 +Subject: [PATCH] qemu: snapshot: Set umask for 'qemu-img' when creating + external inactive snapshots + +External inactive snapshots are created by invoking 'qemu-img' which +creates the file. Currently qemu-img creates image with mode 644 based +on default umask as libvirt doesn't set any. + +Having a world-readable image is obviously wrong so set the umask to +077 to have the file readable only by the owner. + +Resolves: https://bugs.debian.org/1120119 +Signed-off-by: Peter Krempa +Signed-off-by: rpm-build +Upstream-reference: https://gitlab.com/libvirt/libvirt/-/commit/a379327d8abcde8ac8d3e16fe5e4ba6f790d767a.patch +--- + src/qemu/qemu_snapshot.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c +index 73ff533..9819448 100644 +--- a/src/qemu/qemu_snapshot.c ++++ b/src/qemu/qemu_snapshot.c +@@ -233,6 +233,9 @@ qemuSnapshotCreateQcow2Files(virQEMUDriver *driver, + NULL))) + return -1; + ++ /* ensure that new files are only readable by the user */ ++ virCommandSetUmask(cmd, 0077); ++ + /* adds cmd line arg: backing_fmt=format,backing_file=/path/to/backing/file */ + virBufferAsprintf(&buf, "backing_fmt=%s,backing_file=", + virStorageFileFormatTypeToString(defdisk->src->format)); +-- +2.45.4 + diff --git a/SPECS/libvirt/libvirt.signatures.json b/SPECS/libvirt/libvirt.signatures.json index 48a6842ab5..b1d26ea20d 100644 --- a/SPECS/libvirt/libvirt.signatures.json +++ b/SPECS/libvirt/libvirt.signatures.json @@ -1,5 +1,5 @@ { "Signatures": { - "libvirt-10.0.0.tar.xz": "8ba2e72ec8bdd2418554a1474c42c35704c30174b7611eaf9a16544b71bcf00a" + "libvirt-10.10.0.tar.xz": "e1bd7bd31b7c0d0ae073dec050bb5b0232b3e4adebdc58ea82fe8b366c765796" } } diff --git a/SPECS/libvirt/libvirt.spec b/SPECS/libvirt/libvirt.spec index c8573f7fee..75d3bbbc43 100644 --- a/SPECS/libvirt/libvirt.spec +++ b/SPECS/libvirt/libvirt.spec @@ -184,8 +184,8 @@ Summary: Library providing a simple virtualization API Name: libvirt -Version: 10.0.0 -Release: 5%{?dist} +Version: 10.10.0 +Release: 1%{?dist} License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1 Vendor: Intel Corporation Distribution: Edge Microvisor Toolkit @@ -196,10 +196,11 @@ URL: https://libvirt.org/ %endif Source: https://download.libvirt.org/%{?mainturl}libvirt-%{version}.tar.xz Patch0: libvirt-conf.patch -Patch1: 0001-PATCH-After-iptables.service.patch -Patch2: CVE-2024-1441.patch -Patch3: CVE-2024-2494.patch -Patch4: CVE-2024-4418.patch +Patch1: CVE-2025-13193.patch +Patch2: CVE-2025-12748.patch + +# emt specific patches +Patch99: 0001-PATCH-After-iptables.service.patch Requires: libvirt-daemon = %{version}-%{release} Requires: libvirt-daemon-config-network = %{version}-%{release} @@ -265,7 +266,7 @@ BuildRequires: libblkid-devel >= 2.17 BuildRequires: augeas BuildRequires: systemd-devel >= 185 BuildRequires: libpciaccess-devel >= 0.10.9 -BuildRequires: yajl-devel +BuildRequires: json-c-devel %if %{with_sanlock} BuildRequires: sanlock-devel >= 2.4 %endif @@ -1184,7 +1185,6 @@ export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/libvirt.spec) -Dapparmor_profiles=disabled \ -Dsecdriver_apparmor=disabled \ -Dudev=enabled \ - -Dyajl=enabled \ %{?arg_sanlock} \ -Dlibpcap=enabled \ %{?arg_nbdkit} \ @@ -1754,6 +1754,9 @@ exit 0 %dir %attr(0700, root, root) %{_localstatedir}/log/libvirt/ %attr(0755, root, root) %{_libexecdir}/libvirt_iohelper %attr(0755, root, root) %{_bindir}/virt-ssh-helper +%attr(0755, root, root) %{_libexecdir}/libvirt-ssh-proxy +%dir %{_sysconfdir}/ssh/ssh_config.d +%config(noreplace) %{_sysconfdir}/ssh/ssh_config.d/30-libvirt-ssh-proxy.conf %attr(0755, root, root) %{_libexecdir}/libvirt-guests.sh %{_mandir}/man1/virt-admin.1* %{_mandir}/man1/virt-host-validate.1* @@ -1830,8 +1833,11 @@ exit 0 %files daemon-driver-network %config(noreplace) %{_sysconfdir}/libvirt/virtnetworkd.conf +%config(noreplace) %{_sysconfdir}/libvirt/network.conf %{_datadir}/augeas/lenses/virtnetworkd.aug %{_datadir}/augeas/lenses/tests/test_virtnetworkd.aug +%{_datadir}/augeas/lenses/libvirtd_network.aug +%{_datadir}/augeas/lenses/tests/test_libvirtd_network.aug %{_unitdir}/virtnetworkd.service %{_unitdir}/virtnetworkd.socket %{_unitdir}/virtnetworkd-ro.socket @@ -1959,6 +1965,7 @@ exit 0 %config(noreplace) %{_prefix}/lib/sysctl.d/60-qemu-postcopy-migration.conf %{_datadir}/augeas/lenses/virtqemud.aug %{_datadir}/augeas/lenses/tests/test_virtqemud.aug +%{_prefix}/lib/sysusers.d/libvirt-qemu.conf %{_unitdir}/virtqemud.service %{_unitdir}/virtqemud.socket %{_unitdir}/virtqemud-ro.socket @@ -2190,6 +2197,18 @@ exit 0 %endif %changelog +* Thu Mar 12 2026 Lee Chee Yang - 10.10.0-1 +- merge from Azure Linux 3.0.20260304-3.0 +- Patch for CVE-2025-13193 +- Patch CVE-2025-12748 +- Upgrade to 10.10.0 +- Add new files introduced in 10.10.0: network.conf, libvirtd_network.aug, + libvirt-qemu.conf sysusers, libvirt-ssh-proxy and ssh config +- Remove CVE-2024-1441, CVE-2024-2494, CVE-2024-4418 patches (fixed upstream) +- Fix CVE-2025-12748.patch to use 'format' instead of 'compressed' field name + (field was renamed in upstream commit bd6d7ebf6 included in libvirt v10.9.0) +- Switch from yajl to json-c (required since libvirt 10.8.0) + * Mon Sep 8 2025 Lee Chee Yang - 10.0.0-5 - merge from Azure Linux 3.0.20250822-3.0. - Fixes CVE-2024-4418 with an upstream patch. @@ -2199,6 +2218,12 @@ exit 0 - Initial Edge Microvisor Toolkit import from Azure Linux (license: MIT). License verified. - Add After iptables.service +* Thu May 15 2025 Aninda Pradhan - 10.0.0-5 +- Fixes CVE-2024-4418 with an upstream patch + +* Fri May 23 2025 Aninda Pradhan - 10.0.0-4 +- Fix for CVE-2024-1441 and CVE-2024-2494 + * Thu May 30 2024 Sharath Srikanth Chellappa - 10.0.0-3 - Add patch to libvirt.conf to work with kubevirt. @@ -2263,9 +2288,6 @@ exit 0 - Temporarily disable 'libvirt-daemon-driver-storage-gluster' subpackage build. - Temporarily disable run-time requires for unused subpackages. -* Mon Jan 06 2025 Swee Yee Fonn - 6.1.0-4 -- Patch libvirt to start libvirtd service after iptables - * Mon Oct 26 2020 Nicolas Ontiveros - 6.1.0-2 - Use autosetup - Patch CVE-2020-25637 diff --git a/SPECS/libvorbis/libvorbis.signatures.json b/SPECS/libvorbis/libvorbis.signatures.json deleted file mode 100644 index 78355b478e..0000000000 --- a/SPECS/libvorbis/libvorbis.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "libvorbis-1.3.7.tar.xz": "b33cc4934322bcbf6efcbacf49e3ca01aadbea4114ec9589d1b1e9d20f72954b" - } -} diff --git a/SPECS/libvorbis/libvorbis.spec b/SPECS/libvorbis/libvorbis.spec deleted file mode 100644 index 7ed4eb026c..0000000000 --- a/SPECS/libvorbis/libvorbis.spec +++ /dev/null @@ -1,314 +0,0 @@ -Vendor: Microsoft Corporation -Distribution: Azure Linux -%{!?_pkgdocdir: %global _pkgdocdir %{_docdir}/%{name}-%{version}} - -Summary: The Vorbis General Audio Compression Codec -Name: libvorbis -Version: 1.3.7 -Release: 1%{?dist} -License: BSD -URL: https://www.xiph.org/ -Source: https://downloads.xiph.org/releases/vorbis/%{name}-%{version}.tar.xz -BuildRequires: gcc -BuildRequires: pkgconfig(ogg) >= 1.0 - -%description -Ogg Vorbis is a fully open, non-proprietary, patent- and royalty-free, -general-purpose compressed audio format for audio and music at fixed -and variable bitrates. - -The libvorbis package contains runtime libraries for use in programs -that support Ogg Vorbis. - -%package devel -Summary: Development tools for Vorbis applications -Requires: %{name}%{?_isa} = %{version}-%{release} - -%description devel -The libvorbis-devel package contains the header files and documentation -needed to develop applications with Ogg Vorbis. - -%package devel-docs -Summary: Documentation for developing Vorbis applications -Requires: %{name}-devel = %{version}-%{release} -BuildArch: noarch - -%description devel-docs -Documentation for developing applications with libvorbis. - -%prep - -%setup -q -sed -i "s|-O20|$RPM_OPT_FLAGS|" configure -sed -i "s/-ffast-math//" configure -sed -i "s/-mcpu=750//" configure - -%build -%configure --disable-static -%make_build - -%install -%make_install docdir=%{_pkgdocdir} -# remove unpackaged files from the buildroot -rm -f $RPM_BUILD_ROOT%{_libdir}/*.la - -%check -make check - -%files -%doc AUTHORS -%license COPYING -%{_libdir}/libvorbis.so.* -%{_libdir}/libvorbisfile.so.* -%{_libdir}/libvorbisenc.so.* - -%files devel -%{_includedir}/vorbis -%{_libdir}/libvorbis.so -%{_libdir}/libvorbisfile.so -%{_libdir}/libvorbisenc.so -%{_libdir}/pkgconfig/*.pc -%{_datadir}/aclocal/vorbis.m4 - -%files devel-docs -%{_pkgdocdir}/* -%exclude %{_pkgdocdir}/doxygen-build.stamp - -%ldconfig_scriptlets - -%changelog -* Wed Sep 06 2023 Archana Choudhary - 1.3.7-1 -- Upgrade to 1.3.7 - CVE-2018-10392 CVE-2018-10393 -- Remove patch libvorbis-1.3.6-git.patch -- License verified - -* Mon Nov 01 2021 Muhammad Falak - 1.3.6-8 -- Remove epoch - -* Fri Oct 15 2021 Pawel Winogrodzki - 1:1.3.6-7 -- Initial CBL-Mariner import from Fedora 32 (license: MIT). - -* Wed Jan 29 2020 Fedora Release Engineering - 1:1.3.6-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Thu Jul 25 2019 Fedora Release Engineering - 1:1.3.6-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Fri Feb 01 2019 Fedora Release Engineering - 1:1.3.6-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Tue Jul 31 2018 Adam Jackson - 1.3.6-3 -- Sync with git (CVE-2017-14160, CVE-2018-10392, - CVE-2018-10393, #1516379) - - -* Fri Jul 13 2018 Fedora Release Engineering - 1:1.3.6-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Fri Mar 16 2018 Adam Jackson - 1.3.6-1 -- libvorbis 1.3.6 - -* Wed Feb 07 2018 Fedora Release Engineering - 1:1.3.5-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Sat Feb 03 2018 Igor Gnatenko - 1:1.3.5-5 -- Switch to %%ldconfig_scriptlets - -* Thu Aug 03 2017 Fedora Release Engineering - 1:1.3.5-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Wed Jul 26 2017 Fedora Release Engineering - 1:1.3.5-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Fri Feb 10 2017 Fedora Release Engineering - 1:1.3.5-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Wed Dec 14 2016 David King - 1.3.5-1 -- Update to 1.3.5 (#1197923) -- Use license macro for COPYING -- Tighten subpackage dependencies -- Use make_install and make_build macros -- Use pkgconfig for BuildRequires -- Remove unnecessary Requires from devel subpackage -- Remove obsolete Obsoletes - -* Thu Feb 04 2016 Fedora Release Engineering - 1:1.3.4-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Wed Jun 17 2015 Yaakov Selkowitz - 1:1.3.4-5 -- Fix build for https://fedoraproject.org/wiki/Changes/Harden_All_Packages - -* Wed Jun 17 2015 Fedora Release Engineering - 1:1.3.4-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Sun Aug 17 2014 Fedora Release Engineering - 1:1.3.4-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Sat Jun 07 2014 Fedora Release Engineering - 1:1.3.4-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Wed Jan 22 2014 Peter Robinson 1.3.4-1 -- libvorbis 1.3.4 - -* Wed Jan 15 2014 Adam Jackson 1.3.3-7 -- Nuke -mcpu=750 from cflags for PPC, that plus -mcpu=power7 confuses gcc. - -* Thu Aug 8 2013 Ville Skyttä - 1:1.3.3-6 -- Install docs to %%{_pkgdocdir} where available (#993967). - -* Sat Aug 03 2013 Fedora Release Engineering - 1:1.3.3-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Thu Feb 14 2013 Fedora Release Engineering - 1:1.3.3-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild - -* Sat Jul 21 2012 Ville Skyttä - 1:1.3.3-3 -- Run test suite during build. -- Fix doc file permissions and duplicate doc dir ownership. -- rpmlint warning fixes. - -* Thu Jul 19 2012 Fedora Release Engineering - 1:1.3.3-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Mon Feb 13 2012 Adam Jackson 1.3.3-1 -- libvorbis 1.3.3 (#787635) - -* Wed Jan 04 2012 Jindrich Novy 1.3.2-2 -- ship documentation only in -doc subpackage and only license - in -devel (#540634) - thanks to Edward Sheldrake -- -devel-doc subpackage requires -devel - -* Wed Feb 09 2011 Adam Jackson 1.3.2-1 -- libvorbis 1.3.2 - -* Tue Feb 08 2011 Fedora Release Engineering - 1:1.3.1-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Thu Jul 08 2010 Adam Jackson 1.3.1-2 -- Include COPYING in base package too. - -* Mon Mar 29 2010 Adam Jackson 1.3.1-1 -- libvorbis 1.3.1. Fixes surround. - -* Tue Feb 09 2010 Adam Jackson 1.2.3-5 -- libvorbis-1.2.3-add-needed.patch: Fix FTBFS from --no-add-needed - -* Mon Nov 23 2009 Adam Jackson 1.2.3-4 -- Fix doc subpackage build (#540634) - -* Mon Nov 2 2009 Jindrich Novy 1.2.3-3 -- backport patches to fix CVE-2009-3379 (#531765) from upstream - -* Sat Jul 25 2009 Fedora Release Engineering - 1:1.2.3-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Mon Jul 13 2009 Adam Jackson 1.2.3-1 -- libvorbis 1.2.3 - -* Wed Jul 08 2009 Adam Jackson 1.2.2-2 -- libvorbis-1.2.2-svn16228.patch: Backport a fix from pre-1.2.3 to hopefully - fix small sound file playback. (#505610) - -* Thu Jul 02 2009 Adam Jackson 1.2.2-1 -- libvorbis 1.2.2 - -* Wed Jun 03 2009 Adam Jackson 1.2.2-0.1.rc1 -- libvorbis 1.2.2rc1 - -* Wed Feb 25 2009 Fedora Release Engineering - 1:1.2.0-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - -* Thu Feb 12 2009 Caolán McNamara -1:1.2.0-6 -- rebuild to get provides pkgconfig(vorbisenc) - -* Sun Sep 7 2008 Hans de Goede -1:1.2.0-5 -- Fix patch fuzz build failure - -* Wed May 14 2008 Jindrich Novy - 1:1.2.0-4 -- fix CVE-2008-1420, CVE-2008-1419, CVE-2008-1423 (#446344) - -* Tue Feb 19 2008 Fedora Release Engineering - 1:1.2.0-3 -- Autorebuild for GCC 4.3 - -* Sun Oct 21 2007 Hans de Goede - 1:1.2.0-2 -- Don't include Makefile's in %%doc, avoiding a multilib conflict (bz 342481) - -* Mon Oct 15 2007 Behdad Esfahbod - 1:1.2.0-1 -- Update to 1.2.0 -- Resolves: #250115 - -* Thu Aug 23 2007 Adam Jackson - 1:1.1.2-4 -- Rebuild for build ID - -* Mon Jun 25 2007 Matthias Clasen - 1:1.1.2-3 -- Fix typos in %%description (#245471) - -* Thu Feb 8 2007 Matthias Clasen - 1:1.1.2-2 -- Package review cleanups -- Don't ship static libraries - -* Wed Jul 12 2006 Jesse Keating - 1:1.1.2-1.2.1 -- rebuild - -* Fri Feb 10 2006 Jesse Keating - 1:1.1.2-1.2 -- bump again for double-long bug on ppc(64) - -* Tue Feb 07 2006 Jesse Keating - 1:1.1.2-1.1 -- rebuilt for new gcc4.1 snapshot and glibc changes - -* Wed Jan 18 2006 John (J5) Palmieri 1:1.1.2-1 -- Update to 1.1.2 - -* Fri Dec 09 2005 Jesse Keating -- rebuilt - -* Wed Mar 02 2005 John (J5) Palmieri 1:1.1.1-1 -- Update to 1.1.1 - -* Wed Mar 02 2005 John (J5) Palmieri 1:1.1.0-2 -- rebuild with gcc 4.0 - -* Wed Sep 29 2004 Colin Walters 1:1.1.0-1 -- Update to 1.1.0 -- Remove upstreamed patch libvorbis-underquoted.patch - -* Wed Sep 29 2004 Warren Togami 1:1.0.1-5 -- link to .pdf spec rather than ship redundant copy -- spec cleanups - -* Thu Jul 15 2004 Tim Waugh 1:1.0.1-4 -- Fixed warnings in shipped m4 file. - -* Tue Jun 15 2004 Elliot Lee -- rebuilt - -* Tue Mar 02 2004 Elliot Lee -- rebuilt - -* Fri Feb 13 2004 Elliot Lee -- rebuilt - -* Thu Dec 11 2003 Bill Nottingham 1:1.0.1-1 -- update to 1.0.1 - -* Wed Jun 04 2003 Elliot Lee -- rebuilt - -* Mon Feb 24 2003 Elliot Lee -- rebuilt - -* Fri Feb 21 2003 Elliot lee 1:1.0-6 -- Fix #81026 by updating libvorbis-1.0-m4.patch - -* Wed Jan 22 2003 Tim Powers -- rebuilt - -* Wed Dec 11 2002 Bill Nottingham 1:1.0-4 -- add epochs to dependencies, to avoid 1.0rc3 >= 1.0 miscomparisons - (#79374) -- fix vorbis.m4 - -* Fri Nov 29 2002 Tim Powers 1:1.0-2 -- remove unpackaged files from the buildroot -- tell configure where ogg libs are -- lib64'ize diff --git a/SPECS/lksctp-tools/lib-define-cmsg-array-with-correct-size-in-sendv-and.patch b/SPECS/lksctp-tools/lib-define-cmsg-array-with-correct-size-in-sendv-and.patch deleted file mode 100644 index 89cfe7a479..0000000000 --- a/SPECS/lksctp-tools/lib-define-cmsg-array-with-correct-size-in-sendv-and.patch +++ /dev/null @@ -1,63 +0,0 @@ -From f6d64dc3fdcba8f7ced61ea26270ebc0c38b5312 Mon Sep 17 00:00:00 2001 -From: Xin Long -Date: Sun, 28 Jan 2024 12:18:08 -0500 -Subject: [PATCH] lib: define cmsg array with correct size in sendv and recvv - -Philipp recently found a buffer overflow crash in his application when -using sctp_sendv(). - -In sctp_sendv(), the cmsg array is defined as one whole cmsg: - - char _cmsg[CMSG_SPACE(sizeof(struct sctp_sendv_spa))] - -while these options in struct sctp_sendv_spa are packed into msg_control -with multiple cmsgs, instead one whole cmsg. - -So fix it by defining cmsg array with correct size: - - char _cmsg[CMSG_SPACE(sizeof(struct sctp_sndinfo)) + - CMSG_SPACE(sizeof(struct sctp_prinfo)) + - CMSG_SPACE(sizeof(struct sctp_authinfo))]; - -Note that the similar fix is also needed in sctp_recvv(). - -Reported-by: Philipp Stanner -Signed-off-by: Xin Long ---- - src/lib/recvmsg.c | 4 ++-- - src/lib/sendmsg.c | 4 +++- - 2 files changed, 5 insertions(+), 3 deletions(-) - -diff --git a/src/lib/recvmsg.c b/src/lib/recvmsg.c -index 88fe061..d4bf558 100644 ---- a/src/lib/recvmsg.c -+++ b/src/lib/recvmsg.c -@@ -105,8 +105,8 @@ int sctp_recvv(int s, const struct iovec *iov, int iovlen, - struct sockaddr *from, socklen_t *fromlen, void *info, - socklen_t *infolen, unsigned int *infotype, int *flags) - { -- char incmsg[CMSG_SPACE(sizeof(struct sctp_rcvinfo) + -- sizeof(struct sctp_nxtinfo))]; -+ char incmsg[CMSG_SPACE(sizeof(struct sctp_rcvinfo)) + -+ CMSG_SPACE(sizeof(struct sctp_nxtinfo))]; - int error, len, _infolen; - struct cmsghdr *cmsg; - struct msghdr inmsg; -diff --git a/src/lib/sendmsg.c b/src/lib/sendmsg.c -index bee4921..385db7e 100644 ---- a/src/lib/sendmsg.c -+++ b/src/lib/sendmsg.c -@@ -123,7 +123,9 @@ int sctp_sendv(int s, const struct iovec *iov, int iovcnt, - struct sockaddr *addrs, int addrcnt, void *info, - socklen_t infolen, unsigned int infotype, int flags) - { -- char _cmsg[CMSG_SPACE(sizeof(struct sctp_sendv_spa))]; -+ char _cmsg[CMSG_SPACE(sizeof(struct sctp_sndinfo)) + -+ CMSG_SPACE(sizeof(struct sctp_prinfo)) + -+ CMSG_SPACE(sizeof(struct sctp_authinfo))]; - struct cmsghdr *cmsg = (struct cmsghdr *)_cmsg; - struct msghdr outmsg = {}; - struct sockaddr *addr; --- -2.39.1 - diff --git a/SPECS/lksctp-tools/lksctp-tools.signatures.json b/SPECS/lksctp-tools/lksctp-tools.signatures.json deleted file mode 100644 index 9b7caefd96..0000000000 --- a/SPECS/lksctp-tools/lksctp-tools.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "lksctp-tools-1.0.19.tar.gz": "0c8fac0a5c66eea339dce6be857101b308ce1064c838b81125b0dde3901e8032" - } -} diff --git a/SPECS/lksctp-tools/lksctp-tools.spec b/SPECS/lksctp-tools/lksctp-tools.spec deleted file mode 100644 index 1a63af7ba3..0000000000 --- a/SPECS/lksctp-tools/lksctp-tools.spec +++ /dev/null @@ -1,322 +0,0 @@ -Vendor: Microsoft Corporation -Distribution: Azure Linux -Name: lksctp-tools -Summary: User-space access to Linux Kernel SCTP -Version: 1.0.19 -Release: 10%{?dist} -License: GPL-2.0-or-later AND LGPL-2.0-only AND MIT -Group: System Environment/Libraries -URL: http://lksctp.sourceforge.net - -Source0: https://github.com/sctp/lksctp-tools/archive/%{name}-%{version}.tar.gz -Patch0: sctp_test-check-strdup-return-in-append_addr.patch -Patch1: man-add-the-missing-description-for-3-flags-in-sctp_.patch -Patch2: man-update-for-DESCRIPTION-and-SYSCTL-in-sctp.7.patch -Patch3: man-add-some-missing-items-in-STATISTICS-in-sctp.7.patch -Patch4: man-improve-the-description-in-SOCKET-OPTIONS-in-sct.patch -Patch5: man-add-the-missing-options-in-SOCKET-OPTIONS-in-sct.patch -Patch6: man-add-CONTROL-MSGS-and-NOTIFICATIONS-in-sctp.7.patch -Patch7: lib-define-cmsg-array-with-correct-size-in-sendv-and.patch -BuildRequires: libtool, automake, autoconf, make - -%description -This is the lksctp-tools package for Linux Kernel SCTP (Stream Control -Transmission Protocol) Reference Implementation. - -This package is intended to supplement the Linux Kernel SCTP Reference -Implementation now available in the Linux kernel source tree in -versions 2.5.36 and following. For more information on LKSCTP see the -package documentation README file, section titled "LKSCTP - Linux -Kernel SCTP." - -This package contains the base run-time library and command-line tools. - -%package devel -Summary: Development files for lksctp-tools -Group: Development/Libraries -Requires: %{name}%{?_isa} = %{version}-%{release} - -%description devel -Development files for lksctp-tools which include man pages, header files, -static libraries, symlinks to dynamic libraries and some tutorial source code. - -%package doc -Summary: Documents pertaining to SCTP -Group: System Environment/Libraries -Requires: %{name}%{?_isa} = %{version}-%{release} - -%description doc -Documents pertaining to LKSCTP & SCTP in general (IETF RFC's & Internet -Drafts). - -%prep -%setup -q -n %{name}-%{name}-%{version} -%patch -P0 -p1 -%patch -P1 -p1 -%patch -P2 -p1 -%patch -P3 -p1 -%patch -P4 -p1 -%patch -P5 -p1 -%patch -P6 -p1 -%patch -P7 -p1 - -%build -[ ! -x ./configure ] && sh bootstrap -%configure --disable-static -# remove rpath from libtool -sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool -sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool - -%make_build - -%install -rm -f doc/rfc2960.txt doc/states.txt -%make_install - -find $RPM_BUILD_ROOT -type f -name "*.la" -delete - -%files -%doc AUTHORS ChangeLog COPYING* README -%{_bindir}/* -%{_libdir}/libsctp.so.1* -%dir %{_libdir}/lksctp-tools/ -%{_libdir}/lksctp-tools/libwithsctp.so.1* -%{_mandir}/man7/* - -%files devel -%{_includedir}/* -%{_libdir}/libsctp.so -%{_libdir}/pkgconfig/libsctp.pc -%{_libdir}/lksctp-tools/libwithsctp.so -%{_datadir}/lksctp-tools/ -%{_mandir}/man3/* - -%files doc -%doc doc/*.txt - -%changelog -* Mon Jan 27 2025 Aninda Pradhan - 1.0.19-10 -- Initial Azure Linux import from Fedora 41 (license: MIT) -- License Verified. - -* Thu Jul 18 2024 Fedora Release Engineering - 1.0.19-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Mon Feb 26 2024 Xin Long - 1.0.19-8 -- man doc update and one fix for lib and another for sctp_test - -* Fri Jan 26 2024 Xin Long - 1.0.19-7 -- Use SDPX license IDs - -* Thu Jan 25 2024 Fedora Release Engineering - 1.0.19-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Sun Jan 21 2024 Fedora Release Engineering - 1.0.19-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Thu Jul 20 2023 Fedora Release Engineering - 1.0.19-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Thu Jan 19 2023 Fedora Release Engineering - 1.0.19-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Thu Jul 21 2022 Fedora Release Engineering - 1.0.19-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Sun Jun 5 2022 Peter Hanecak - 1.0.19-1 -- Updated to 1.0.19 -- Patches dropped since changes are now incorporated in the upstream - -* Thu Jan 20 2022 Fedora Release Engineering - 1.0.18-12 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Thu Jul 22 2021 Fedora Release Engineering - 1.0.18-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Sat Apr 17 2021 Peter Hanecak - 1.0.18-10 -- Added autoconf-2.70 fix from upstream - -* Tue Jan 26 2021 Fedora Release Engineering - 1.0.18-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Wed Sep 09 2020 Jeff Law - 1.0.18-8 -- Use symver attribute for symbol versioning. Re-enable LTO - -* Wed Aug 19 2020 Igor Raits - 1.0.18-7 -- Drop useless ldconfig scriptlets - -* Tue Jul 28 2020 Fedora Release Engineering - 1.0.18-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Wed Jul 01 2020 Jeff Law - 1.0.18-5 -- Disable LTO - -* Wed Jan 29 2020 Fedora Release Engineering - 1.0.18-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Fri Oct 18 2019 Vit Mojzis - 1.0.18-3 -- Added a patch to fix netinet/sctp.h not to be installed. -- Added some fixes for kernel feature detection. -- Updated to 1.0.18. [1568622] - -* Thu Jul 25 2019 Fedora Release Engineering - 1.0.16-12 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Fri Feb 01 2019 Fedora Release Engineering - 1.0.16-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Fri Jul 13 2018 Fedora Release Engineering - 1.0.16-10 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Thu Feb 08 2018 Fedora Release Engineering - 1.0.16-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Thu Aug 03 2017 Fedora Release Engineering - 1.0.16-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Wed Jul 26 2017 Fedora Release Engineering - 1.0.16-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Fri Feb 10 2017 Fedora Release Engineering - 1.0.16-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Thu Feb 04 2016 Fedora Release Engineering - 1.0.16-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Wed Jun 17 2015 Fedora Release Engineering - 1.0.16-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Sun Aug 17 2014 Fedora Release Engineering - 1.0.16-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Sat Jun 07 2014 Fedora Release Engineering - 1.0.16-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Tue May 6 2014 Peter Robinson 1.0.16-1 -- Update to 1.0.16 -- Spec cleanups - -* Sat Aug 03 2013 Fedora Release Engineering - 1.0.15-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Sun May 12 2013 Daniel Borkmann - 1.0.15-1 -- Update to 1.0.15 - -* Tue Apr 09 2013 Daniel Borkmann - 1.0.14-1 -- Update to 1.0.14 - -* Fri Jan 25 2013 Daniel Borkmann - 1.0.13-1 -- Update to 1.0.13 - -* Mon Jan 21 2013 Jan Safranek - 1.0.12-1 -- Update to 1.0.12 - -* Thu Jul 19 2012 Fedora Release Engineering - 1.0.11-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Fri Jan 13 2012 Fedora Release Engineering - 1.0.11-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild - -* Tue Feb 08 2011 Fedora Release Engineering - 1.0.11-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Tue Oct 05 2010 Parag Nemade - 1.0.11-2 -- Merge-review cleanup (#226100) - -* Tue Dec 1 2009 Jan Safranek 1.0.11-1 -- Update to 1.0.11 -- Remove rpath from compiled binaries -- Remove static libraries - -* Sat Jul 25 2009 Fedora Release Engineering - 1.0.10-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Tue Apr 14 2009 Zdenek Prikryl 1.0.10-1 -- added release tag to Requires of devel and doc packages (#492531) -- Update to 1.0.10 - -* Wed Feb 25 2009 Fedora Release Engineering - 1.0.9-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - -* Wed Aug 06 2008 Zdenek Prikryl 1.0.9-1 -- Update to 1.0.9 - -* Wed Jul 16 2008 Zdenek Prikryl 1.0.8-1 -- Update to 1.0.8 - -* Wed Feb 20 2008 Fedora Release Engineering - 1.0.7-3 -- Autorebuild for GCC 4.3 - -* Wed Aug 29 2007 Karsten Hopp 1.0.7-2 -- rebuild for buildid - -* Wed Aug 08 2007 Karsten Hopp 1.0.7-1 -- update to 1.0.7 -- update license tag - -* Wed Feb 21 2007 Karsten Hopp 1.0.6-3 -- add post/postun requirements -- review fixes - -* Tue Sep 19 2006 Karsten Hopp 1.0.6-2 -- fix fileconflict (#205225) - -* Tue Jul 25 2006 Karsten Hopp 1.0.6-1 -- update to 1.0.6 - -* Wed Jul 12 2006 Jesse Keating - 1.0.5-1.fc5.2.1 -- rebuild - -* Fri Feb 10 2006 Jesse Keating - 1.0.5-1.fc5.2 -- bump again for double-long bug on ppc(64) - -* Tue Feb 07 2006 Jesse Keating - 1.0.5-1.fc5.1 -- rebuilt for new gcc4.1 snapshot and glibc changes - -* Tue Jan 24 2006 Warren Togami 1.0.5-1 -- 1.0.5 - -* Fri Nov 11 2005 Matthias Saou 1.0.4-1 -- Update to 1.0.4. -- Update syntax patch. -- Execute bootstrap if no configure script is found. -- Don't own entire man? directories. -- Own data and lib lksctp-tools directories. -- Move devel libs in _libdir/lksctp-tools/ to devel package. -- Exclude .la files. -- Minor spec file cleanups. - -* Wed Mar 02 2005 Karsten Hopp 1.0.2-5 -- build with gcc-4 - -* Mon Feb 07 2005 Karsten Hopp 1.0.2-4 -- initialize variable before use -- fix subscript out of range bug (#147286) - -* Mon Jan 24 2005 Karsten Hopp 1.0.2-3 -- build for FC - -* Mon Jan 24 2005 Karsten Hopp 1.0.2-2.40E.1 -- initial RH version based on sourceforge rpm - -* Thu Dec 30 2004 Sridhar Samudrala 1.0.2-1 -- 1.0.2 Release - -* Tue May 11 2004 Sridhar Samudrala 1.0.1-1 -- 1.0.1 Release - -* Thu Feb 26 2004 Sridhar Samudrala 1.0.0-1 -- 1.0.0 Release - -* Fri Feb 6 2004 Francois-Xavier Kowalski 0.9.0-1 -- package only .txt doc files - -* Wed Feb 4 2004 Francois-Xavier Kowalski 0.7.5-1 -- badly placed & undelivered files -- simplified delivery list - -* Tue Jan 27 2004 Francois-Xavier Kowalski 0.7.5-1 -- Integrate comment from project team - -* Sat Jan 10 2004 Francois-Xavier Kowalski 2.6.0_test7_0.7.4-1 -- Creation diff --git a/SPECS/lksctp-tools/man-add-CONTROL-MSGS-and-NOTIFICATIONS-in-sctp.7.patch b/SPECS/lksctp-tools/man-add-CONTROL-MSGS-and-NOTIFICATIONS-in-sctp.7.patch deleted file mode 100644 index 2d996fffc8..0000000000 --- a/SPECS/lksctp-tools/man-add-CONTROL-MSGS-and-NOTIFICATIONS-in-sctp.7.patch +++ /dev/null @@ -1,150 +0,0 @@ -From 2a3a4bc0ba94656c007ebaae52e50b42b95ded32 Mon Sep 17 00:00:00 2001 -From: Xin Long -Date: Mon, 27 Feb 2023 18:10:32 -0500 -Subject: [PATCH 6/6] man: add CONTROL MSGS and NOTIFICATIONS in sctp.7 - -Control msgs and notifications are two very important parts -for users to understand and user in programming, and they -are wonth a place in the SCTP manual doc. - -Signed-off-by: Xin Long ---- - man/sctp.7 | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 122 insertions(+) - -diff --git a/man/sctp.7 b/man/sctp.7 -index 01bff6f..323d42e 100644 ---- a/man/sctp.7 -+++ b/man/sctp.7 -@@ -244,6 +244,128 @@ The number of SCTP packets discarded in receiving. - .TP - .B SctpInDataChunkDiscards - The number of SCTP data chunks discarded in receiving. -+.SH CONTROL MSGS -+The ancillary data is carried in msg_control field of struct msghdr, which is -+used in -+.B sendmsg(2) -+and -+.B recvmsg(2) -+call. The SCTP stack uses the ancillary data to communicate the attributes, -+such as SCTP_RCVINFO, of the message stored in msg_iov to the socket endpoint. -+Each ancillary data item is preceded by a struct cmsghdr, see -+.B cmsg(3). -+The different cmsg types for SCTP are listed below, and all these related macros -+and structures are defined in /usr/include/netinet/sctp.h. -+.TP -+.B SCTP_INIT -+This cmsg provides information for initializing new SCTP associations for sendmsg() -+with struct sctp_initmsg, which is the same as SCTP_INITMSG socket option's data -+structure. -+.TP -+.B SCTP_SNDRCV -+This cmsg specifies SCTP options for sendmsg() and describes SCTP header information -+about a received message through recvmsg() with struct sctp_sndrcvinfo. It mixes the -+send and receive path, and SCTP_SNDINFO and SCTP_RCVINFO split this information, so -+these structures should be used, when possible, since SCTP_SNDRCV is deprecated. -+.B sctp_sendmsg(3) -+and -+.B sctp_send(3) -+provide a simple way to use this cmsg. -+ -+Note that an application must use the SCTP_RECVRCVINFO socket option to enable the -+delivery of this information. -+.TP -+.B SCTP_EXTRCV -+This cmsg specifies SCTP options for SCTP header information about a received message -+via recvmsg() with struct sctp_extrcvinfo, and this structure is an extended version -+of SCTP_SNDRCV. Note that data in the next message is not valid unless the current -+message is completely read, i.e., unless the MSG_EOR is set. SCTP_NXTINFO should be -+used when possible, since SCTP_EXTRCV is considered deprecated. -+.B sctp_recvmsg(3) -+provides a simple way to use this cmsg. -+ -+Note that an application must use the SCTP_RECVNXTINFO socket option to enable the -+delivery of this information. -+.TP -+.B SCTP_RCVINFO, SCTP_NXTINFO -+These cmsgs describe SCTP receive information about a received message through -+recvmsg() with struct sctp_rcvinfo, and SCTP receive information of the next -+message that will be delivered through recvmsg() if this information is already -+available when delivering the current message with struct sctp_nxtinfo. -+.B sctp_recvv(3) -+provides a simple way to use these cmsgs. -+ -+Note that an application must use the SCTP_RECVRCVINFO and SCTP_RECVNXTINFO socket -+options accordingly to enable the delivery of this information. -+.TP -+.B SCTP_SNDINFO, SCTP_PRINFO, SCTP_AUTHINFO, SCTP_DSTADDRV4, SCTP_DSTADDRV6 -+These cmsgs specifie a couple of SCTP options for sendmsg() for SEND, PRSCTP, AUTH -+and DSTADDR information with struct sctp_sndinfo, sctp_prinfo, sctp_authinfo and -+in(6)_addr accordingly. -+.BR sctp_sendv(3) -+provides a simple way to use these cmsgs. -+.SH EVENTS and NOTIFICATIONS -+An SCTP application may need to understand and process events and errors -+that happen on the SCTP stack. These events include network status changes, -+association startups, remote operational errors, and undeliverable messages. -+When a notification arrives, recvmsg() returns the notification in the -+application-supplied data buffer via msg_iov, and sets MSG_NOTIFICATION in -+msg_flags. See socket option SCTP_EVENT for the event enabling. The different -+events are listed below, and all these related macros and structures are -+defined in /usr/include/netinet/sctp.h. -+.TP -+.B SCTP_ASSOC_CHANGE -+Communication notifications inform the application that an SCTP -+association has either begun or ended. The notification format -+is struct sctp_assoc_change. -+.TP -+.B SCTP_PEER_ADDR_CHANGE -+When a destination address of a multi-homed peer encounters a state -+change, a peer address change event is sent. The notification format -+is struct sctp_paddr_change. -+.TP -+.B SCTP_REMOTE_ERROR -+A remote peer may send an Operation Error message to its peer. This -+message indicates a variety of error conditions on an association. -+The notification format is struct sctp_remote_error. -+.TP -+.B SCTP_SEND_FAILED -+If SCTP cannot deliver a message, it can return back the message as a -+notification if the SCTP_SEND_FAILED event is enabled. The notification -+format is struct sctp_send_failed. Please note that this notification -+is deprecated. Use SCTP_SEND_FAILED_EVENT instead. -+.TP -+.B SCTP_SHUTDOWN_EVENT -+When a peer sends a SHUTDOWN, SCTP delivers this notification to inform -+the application that it should cease sending data. The notification -+format is struct sctp_shutdown_event. -+.TP -+.B SCTP_ADAPTATION_INDICATION -+When a peer sends an Adaptation Layer Indication parameter, SCTP delivers -+this notification to inform the application about the peer's adaptation -+layer indication. The notification format is struct sctp_adaptation_event. -+.TP -+.B SCTP_PARTIAL_DELIVERY_EVENT -+When a receiver is engaged in a partial delivery of a message, this -+notification will be used to indicate various events. The notification -+format is struct sctp_pdapi_event. -+.TP -+.B SCTP_AUTHENTICATION_EVENT -+This is used to report different events relating to the use of the -+extension to authenticate SCTP messages. The notification format is -+struct sctp_authkey_event. -+.TP -+.B SCTP_SENDER_DRY_EVENT -+When the SCTP stack has no more user data to send or retransmit, this -+notification is given to the user. Also, at the time when a user app -+subscribes to this event, if there is no data to be sent or retransmit, -+the stack will immediately send up this notification. The notification -+format is struct sctp_sender_dry_event. -+.TP -+.B SCTP_SEND_FAILED_EVENT -+If SCTP cannot deliver a message, it can return back the message as a -+notification if the SCTP_SEND_FAILED_EVENT event is enabled. The -+notification format is struct sctp_send_failed_event. - .SH "SOCKET OPTIONS" - To set or get a SCTP socket option, call - .BR getsockopt (2) --- -2.39.1 - diff --git a/SPECS/lksctp-tools/man-add-some-missing-items-in-STATISTICS-in-sctp.7.patch b/SPECS/lksctp-tools/man-add-some-missing-items-in-STATISTICS-in-sctp.7.patch deleted file mode 100644 index 465565b233..0000000000 --- a/SPECS/lksctp-tools/man-add-some-missing-items-in-STATISTICS-in-sctp.7.patch +++ /dev/null @@ -1,85 +0,0 @@ -From f128c927f7d4f5eb0fc80b857ff74660fb61d0d6 Mon Sep 17 00:00:00 2001 -From: Xin Long -Date: Mon, 27 Feb 2023 17:18:10 -0500 -Subject: [PATCH 3/6] man: add some missing items in STATISTICS in sctp.7 - -Many items have been added in /proc/net/sctp/assocs and -/proc/net/sctp/snmp, and this patch adds the missing -description for them. - -Signed-off-by: Xin Long ---- - man/sctp.7 | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- - 1 file changed, 49 insertions(+), 1 deletion(-) - -diff --git a/man/sctp.7 b/man/sctp.7 -index c19c2b7..730e1a8 100644 ---- a/man/sctp.7 -+++ b/man/sctp.7 -@@ -121,7 +121,10 @@ files. - Displays the following information about the active associations. - assoc ptr, sock ptr, socket style, sock state, association state, hash bucket, - association id, bytes in transmit queue, bytes in receive queue, user id, --inode, local port, remote port, local addresses and remote addresses. -+inode, local port, remote port, local addresses, remote addresses, -+heartbeat interval, in streams, out streams, max retransmissions, init retries, -+shutdown retries, retransmitted chunks, sock transmit queue committed bytes, -+sock transmit queue bytes, and sock send and receive buffer bytes. - .TP - .B eps - Displays the following information about the active endpoints. -@@ -196,6 +199,51 @@ The number of SCTP packets sent. Retransmitted DATA chunks are included. - .TP - .B SctpInSCTPPacks - The number of SCTP packets received. Duplicates are included. -+.TP -+.B SctpT1InitExpireds -+The number of timer T1 INIT expired. -+.TP -+.B SctpT1CookieExpireds -+The number of timer T1 COOKIE-ECHO expired. -+.TP -+.B SctpT2ShutdownExpireds -+The number of timer T2 SHUTDOWN expired. -+.TP -+.B SctpT3RtxExpireds -+The number of timer T3 RTX expired. -+.TP -+.B SctpT4RtoExpireds -+The number of timer T4 RTO expired. -+.TP -+.B SctpT5ShutdownGuardExpireds -+The number of timer T5 SHUTDOWN GUARD expired. -+.TP -+.B SctpDelaySackExpireds -+The number of timer DELAY_SACK expired. -+.TP -+.B SctpAutocloseExpireds -+The number of timer AUTOCLOSE expired. -+.TP -+.B SctpT3Retransmits -+The number of T3 timer retransmission. -+.TP -+.B SctpPmtudRetransmits -+The number of PMTUD retransmission. -+.TP -+.B SctpFastRetransmits -+The number of FAST retransmission. -+.TP -+.B SctpInPktSoftirq -+The number of SCTP packets received in Softirq. -+.TP -+.B SctpInPktBacklog -+The number of SCTP packets received in Backlog. -+.TP -+.B SctpInPktDiscards -+The number of SCTP packets discarded in receiving. -+.TP -+.B SctpInDataChunkDiscards -+The number of SCTP data chunks discarded in receiving. - .SH "SOCKET OPTIONS" - To set or get a SCTP socket option, call - .BR getsockopt (2) --- -2.39.1 - diff --git a/SPECS/lksctp-tools/man-add-the-missing-description-for-3-flags-in-sctp_.patch b/SPECS/lksctp-tools/man-add-the-missing-description-for-3-flags-in-sctp_.patch deleted file mode 100644 index 269d3da5d1..0000000000 --- a/SPECS/lksctp-tools/man-add-the-missing-description-for-3-flags-in-sctp_.patch +++ /dev/null @@ -1,52 +0,0 @@ -From d680721b59b5533f776705ad10f1265302f70103 Mon Sep 17 00:00:00 2001 -From: Xin Long -Date: Mon, 27 Feb 2023 12:57:49 -0500 -Subject: [PATCH 1/6] man: add the missing description for 3 flags in - sctp_sendmsg.3 - -This patch is to add the missing description for 3 flags: -SCTP_SENDALL, SCTP_SACK_IMMEDIATELY and SCTP_PR_SCTP_{TTL|RTX|PRIO}. -which have been supported in kernel for a long time. - -Signed-off-by: Xin Long ---- - man/sctp_sendmsg.3 | 19 ++++++++++++++++++- - 1 file changed, 18 insertions(+), 1 deletion(-) - -diff --git a/man/sctp_sendmsg.3 b/man/sctp_sendmsg.3 -index 51828fb..3e57131 100644 ---- a/man/sctp_sendmsg.3 -+++ b/man/sctp_sendmsg.3 -@@ -57,11 +57,28 @@ information of this error cause is provided in - .B SCTP_EOF - Setting this flag invokes the SCTP graceful shutdown procedure on the specific - association(one-to-many style only). -+.TP -+.B SCTP_SENDALL -+This flag, if set, will cause a one-to-many style socket to send the message -+to all associations that are currently established on this socket. For the -+one-to-one style socket, this flag has no effect. -+.TP -+.B SCTP_SACK_IMMEDIATELY -+This flag allows the application to set the I bit of the last DATA chunk when -+sending each user message to make sure the corresponding SACK can be sent by -+peer without delay. -+.TP -+.B SCTP_PR_SCTP_{TTL|RTX|PRIO} -+One of these 3 pr_policies can be used through this flag with its pr_value -+set in timetolive parameter for this message. Note that -+.B sctp_sendv(3) -+with infotype SCTP_SENDV_PRINFO also works for PR-SCTP. - .PP - .I timetolive - specifies the time duration in milliseconds. The sending side will expire the - message if the message has not been sent to the peer within this time period. --A value of 0 indicates that no timeout should occur on this message. -+A value of 0 indicates that no timeout should occur on this message. It also -+works as the pr_value if flags parameter is set to pr_policy. - .I ppid - is an opaque unsigned value that is passed to the remote end along with the - message. --- -2.39.1 - diff --git a/SPECS/lksctp-tools/man-add-the-missing-options-in-SOCKET-OPTIONS-in-sct.patch b/SPECS/lksctp-tools/man-add-the-missing-options-in-SOCKET-OPTIONS-in-sct.patch deleted file mode 100644 index 1b9b2f4868..0000000000 --- a/SPECS/lksctp-tools/man-add-the-missing-options-in-SOCKET-OPTIONS-in-sct.patch +++ /dev/null @@ -1,535 +0,0 @@ -From df0cd18b5d81a7f8c661e6e565e5e35e00fbb9d8 Mon Sep 17 00:00:00 2001 -From: Xin Long -Date: Mon, 27 Feb 2023 17:57:20 -0500 -Subject: [PATCH 5/6] man: add the missing options in SOCKET OPTIONS in sctp.7 - -There are a lot of options missing in in SOCKET OPTIONS in sctp.7, -and this patch adds them all. - -Signed-off-by: Xin Long ---- - man/sctp.7 | 508 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 508 insertions(+) - -diff --git a/man/sctp.7 b/man/sctp.7 -index 7756dda..01bff6f 100644 ---- a/man/sctp.7 -+++ b/man/sctp.7 -@@ -431,6 +431,514 @@ SACKs sent and received, SCTP packets sent and received. - - The parameter type is struct sctp_assoc_stats, for reading only. - sas_assoc_id is a specified assoc_id. -+.TP -+.B SCTP_DELAYED_ACK, SCTP_DELAYED_ACK_TIME, SCTP_DELAYED_SACK -+These options will affect the way delayed SACKs are performed. They allow -+the application to get or set the delayed SACK time, in milliseconds, and -+also allow changing the delayed SACK frequency. Changing the frequency -+to 1 disables the delayed SACK algorithm. Note that if sack_delay or -+sack_freq is 0 when setting this option, the current values will remain -+unchanged. -+ -+The parameter type is struct sctp_sack_info. For reading, sack_assoc_id is -+a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, sack_assoc_id is a -+specified assoc_id or SCTP_{FUTURE|CURRENT|ALL}_ASSOC. -+ -+Default: sackdelay=sysctl_net.sctp.sack_timeout,sackfreq=2. -+.TP -+.B SCTP_CONTEXT -+This option allows the setting, on an association basis, of a default -+context that will be received on reading messages from the peer. -+This is especially helpful for an application when using one-to-many -+style sockets to keep some reference to an internal state machine that -+is processing messages on the association. Note that the setting of -+this value only affects received messages from the peer and does not -+affect the value that is saved with outbound messages. -+ -+The parameter type is struct sctp_assoc_value. For reading, assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, assoc_id -+is a specified assoc_id or SCTP_{FUTURE|CURRENT|ALL}_ASSOC. -+ -+Default: 0. -+.TP -+.B SCTP_FRAGMENT_INTERLEAVE -+Fragmented interleave controls how the presentation of messages -+occurs for the message receiver. There are three levels of fragment -+interleave defined: level 0: SCTP_FRAGMENT_INTERLEAVE = 0; level 1: -+SCTP_FRAGMENT_INTERLEAVE = 1; level 2: SCTP_FRAGMENT_INTERLEAVE = 1 -+& SCTP_INTERLEAVING_SUPPORTED = 1. -+ -+The parameter type is int boolean, for reading and writing. -+ -+Default: 0. -+.TP -+.B SCTP_PARTIAL_DELIVERY_POINT -+This option will set or get the SCTP partial delivery point. This -+point is the size of a message where the partial delivery API will be -+invoked to help free up rwnd space for the peer. Setting this to a -+lower value will cause partial deliveries to happen more often. This -+option expects an integer that sets or gets the partial delivery -+point in bytes. Note also that the call will fail if the user -+attempts to set this value larger than the socket receive buffer -+size. Note that any single message having a length smaller than or equal -+to the SCTP partial delivery point will be delivered in a single read -+call as long as the user-provided buffer is large enough to hold the -+message. -+ -+The parameter type is uint32_t, for reading and writing. -+ -+Default: 0. -+.TP -+.B SCTP_MAX_BURST -+This option will allow a user to change the maximum burst of packets -+that can be emitted by this association. -+ -+The parameter type is struct sctp_assoc_value. For reading, assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, assoc_id -+is a specified assoc_id or SCTP_{FUTURE|CURRENT|ALL}_ASSOC. -+ -+Default: sysctl_net.sctp.max_burst. -+.TP -+.B SCTP_AUTH_CHUNK -+This option adds a chunk type that the user is requesting to be received -+only in an authenticated way, and it only affects the future associations. -+ -+The parameter type is struct sauth_chunk, for writing only. -+ -+Default: no chunks. -+Require: SCTP_AUTH_SUPPORTED. -+RFC: RFC4895. -+.TP -+.B SCTP_HMAC_IDENT -+This option gets or sets the list of Hashed Message Authentication -+Code (HMAC) algorithms that the local endpoint requires the peer -+to use. -+ -+The parameter type is struct sctp_hmacalgo, for reading and writing. -+shmac_idents can include SCTP_AUTH_HMAC_ID_{SHA1|SHA256}. -+ -+Default: SCTP_AUTH_HMAC_ID_SHA1. -+Require: SCTP_AUTH_SUPPORTED. -+.TP -+.B SCTP_AUTH_KEY -+This option will set a shared secret key that is used to build an -+association shared key. -+ -+The parameter type is struct sctp_authkey, for writing only. sca_assoc_id -+is a specified assoc_id or SCTP_{FUTURE|CURRENT|ALL}_ASSOC. -+ -+Default: null_key. -+Require: SCTP_AUTH_SUPPORTED. -+.TP -+.B SCTP_AUTH_ACTIVE_KEY -+This option will get or set the active shared key to be used to build -+the association shared key. -+ -+The parameter type is struct sctp_authkeyid, for writing only. -+scact_assoc_id is a specified assoc_id or -+SCTP_{FUTURE|CURRENT|ALL}_ASSOC. -+ -+Default: 0. -+Require: SCTP_AUTH_SUPPORTED. -+.TP -+.B SCTP_AUTH_DEACTIVATE_KEY -+This set option indicates that the application will no longer send -+user messages using the indicated key identifier. -+ -+The parameter type is struct sctp_authkeyid, for writing only. -+scact_assoc_id is a specified assoc_id or -+SCTP_{FUTURE|CURRENT|ALL}_ASSOC. -+ -+Require: SCTP_AUTH_SUPPORTED. -+.TP -+.B SCTP_AUTH_DELETE_KEY -+This set option will delete an SCTP association's shared secret key -+that has been deactivated. -+ -+The parameter type is struct sctp_authkeyid, for writing only. -+scact_assoc_id is a specified assoc_id or -+SCTP_{FUTURE|CURRENT|ALL}_ASSOC. -+ -+Require: SCTP_AUTH_SUPPORTED. -+.TP -+.B SCTP_PEER_AUTH_CHUNKS -+This option gets a list of chunk types for a specified association -+that the peer requires to be received authenticated only. -+ -+The parameter type is struct sctp_authchunks, for reading only. -+gauth_assoc_id is a specified assoc_id. -+ -+Require: SCTP_AUTH_SUPPORTED. -+.TP -+.B SCTP_LOCAL_AUTH_CHUNKS -+This option gets a list of chunk types for a specified association that -+the local endpoint requires to be received authenticated only. -+ -+The parameter type is struct sctp_authchunks, for reading only. -+gauth_assoc_id is a specified assoc_id or SCTP_FUTURE_ASSOC. -+ -+Require: SCTP_AUTH_SUPPORTED. -+.TP -+.B SCTP_GET_ASSOC_NUMBER -+This option gets the current number of associations that are attached -+to a one-to-many style socket. Note that this number is only a snapshot. -+This means that the number of associations may have changed when the -+caller gets back the option result. -+ -+The parameter type is uint32_t, for reading only. -+.TP -+.B SCTP_GET_ASSOC_ID_LIST -+This option gets the current list of SCTP association identifiers of -+the SCTP associations handled by a one-to-many style socket. It uses -+struct sctp_assoc_ids and must provide a large enough buffer to hold -+all association identifiers. If the buffer is too small, an error must -+be returned. The user can use the SCTP_GET_ASSOC_NUMBER socket option -+to get an idea of how large the buffer has to be. -+ -+The parameter type is struct sctp_assoc_ids, for reading only. -+.TP -+.B SCTP_EXPOSE_POTENTIALLY_FAILED_STATE, SCTP_EXPOSE_PF_STATE -+Applications can control the exposure of the PF path state in the -+SCTP_PEER_ADDR_CHANGE event, and if pf_expose is not 'enabled', no -+notification will be sent for a transport state change to SCTP_PF. -+It also affects the SCTP_GET_PEER_ADDR_INFO socket option, and if -+pf_expose is 'disabled', users can not access the transport info via -+SCTP_GET_PEER_ADDR_INFO option. -+ -+The parameter type is struct sctp_assoc_value, for reading and writing. -+assoc_id is a specified assoc_id or SCTP_FUTURE_ASSOC. -+ -+Default: sysctl_net.sctp.pf_expose. -+.TP -+.B SCTP_PEER_ADDR_THLDS -+Applications can control the SCTP-PF behavior by getting or setting -+the number of consecutive timeouts before a peer address is -+considered PF or unreachable.. -+ -+The parameter type is struct sctp_paddrthlds, for reading and writing. -+spt_address is a specified transport address or 0, spt_assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. -+ -+Default: pathmaxrxt=sysctl_net.sctp.path_max_retrans, -+ps_retrans=sysctl_net.sctp.ps_retrans. -+.TP -+.B SCTP_PEER_ADDR_THLDS_V2 -+Similar to SCTP_PEER_ADDR_THLDS, but it can also be used by applications -+to set and get the number of timeouts before the primary path is changed -+automatically by the Primary Path Switchover function. -+ -+The parameter type is struct sctp_paddrthlds_v2, for reading and writing. -+spt_address is a specified transport address or 0, spt_assoc_id is a -+specified assoc_id or SCTP_FUTURE_ASSOC. -+ -+Default: pathmaxrxt=sysctl_net.sctp.path_max_retrans, -+ps_retrans=sysctl_net.sctp.ps_retrans, pf_retrans=sysctl_net.sctp.pf_retrans. -+.TP -+.B SCTP_RECVRCVINFO -+Setting this option specifies that SCTP_RCVINFO (SCTP receive information -+about a received message) is returned as ancillary data by recvmsg(). See -+.B CONTROL MSGS -+for more details. -+ -+The parameter type is int, for reading and writing. -+ -+Default: 0. -+.TP -+.B SCTP_RECVNXTINFO -+Setting this option specifies that SCTP_NXTINFO (SCTP receive information -+of the next message) is returned as ancillary data by recvmsg(). See -+.B CONTROL MSGS -+for details. -+ -+The parameter type is int, for reading and writing. -+ -+Default: 0. -+.TP -+.B SCTP_DEFAULT_SNDINFO -+This option obsoletes SCTP_DEFAULT_SEND_PARAM. -+ -+The parameter type is struct sctp_sndinfo. For reading, snd_assoc_id is -+a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, snd_assoc_id is -+a specified assoc_id or SCTP_{FUTURE|CURRENT|ALL}_ASSOC. -+ -+Default: default_stream=0, default_flags=0, default_ppid=0, default_context=0. -+.TP -+.B SCTP_REUSE_PORT -+This option is similar to the socket level option SO_REUSEADDR, besides -+only supports one-to-one style SCTP sockets and must not be used after -+calling bind() or sctp_bindx(). -+ -+The parameter type is int, for reading and writing. -+ -+Default: 0. -+.TP -+.B SCTP_SOCKOPT_BINDX_ADD -+This option allows the user to bind a specific subset of addresses or, -+if the SCTP extension ASCONF is supported (see SCTP_ASCONF_SUPPORTED), -+add specific addresses. The API sctp_bindx() is based on this. -+ -+The parameter type is struct sockaddr[], for writing only. -+.TP -+.B SCTP_SOCKOPT_BINDX_REM -+Similar to SCTP_SOCKOPT_BINDX_ADD, but delete specific addresses. The API -+sctp_bindx() is based on this. -+ -+The parameter type is struct sockaddr[], for writing only. -+.TP -+.B SCTP_SOCKOPT_PEELOFF -+This option branches off an UDP type association into a separate socket -+returned back to users. The API sctp_peeloff() is based on this option. -+ -+The parameter type is sctp_peeloff_arg_t, for reading only. associd is a -+specified assoc_id. -+.TP -+.B SCTP_SOCKOPT_PEELOFF_FLAGS -+Peel off an UDP type association from a socket similar to SCTP_SOCKOPT_PEELOFF -+option, but it allows the flags like O_CLOEXEC and O_NONBLOCK to be used when -+creating the new socket. The API sctp_peeloff_flags() is based on this option. -+ -+The parameter type is sctp_peeloff_flags_arg_t, for reading only. associd -+is a specified assoc_id. -+.TP -+.B SCTP_SOCKOPT_CONNECTX_OLD -+This option allows a user to specify multiple addresses at which a peer can -+be reached, and the kernel stack will use the list of addresses to set up -+the association. The API sctp_connectx() is based on this option. -+ -+The parameter type is struct sockaddr[], for writing only. -+.TP -+.B SCTP_SOCKOPT_CONNECTX -+Similar to SCTP_SOCKOPT_CONNECTX_OLD, but it returns the new assoc's id. -+The API sctp_connectx2() is based on this option. -+ -+The parameter type is struct sockaddr[], for writing only. The new assoc's -+id is passed to users by the return value. -+.TP -+.B SCTP_SOCKOPT_CONNECTX3 -+Similar to SCTP_SOCKOPT_CONNECTX, but it uses different type parameter. The -+API sctp_connectx3() is based on this option. -+ -+The parameter type is struct sctp_getaddrs_old, for reading only. assoc_id -+is set to the new assoc's id by kernel and passed to users. -+.TP -+.B SCTP_GET_PEER_ADDRS -+This option is used to gets all peer addresses in an association. The API -+sctp_getpaddrs() is based on this option. -+ -+The parameter type is struct sctp_getaddrs, for reading only. assoc_id -+is a specified assoc_id. -+.TP -+.B SCTP_GET_LOCAL_ADDRS -+This option is used to get all local addresses in an association. The API -+sctp_getladdrs() is based on this option. -+ -+The parameter type is struct sctp_getaddrs, for reading only. assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. -+.TP -+.B SCTP_ADAPTATION_LAYER -+This option requests that the local endpoint set the specified -+Adaptation Layer Indication parameter for all future INIT and -+INIT-ACK exchanges. -+ -+The parameter type is struct sctp_setadaptation, for reading and writing. -+ -+Default: 0. -+.TP -+.B SCTP_EVENT -+This option obsoletes SCTP_EVENTS socket option, and it can set or get -+one specific type of event for a specified association. -+ -+The parameter type is struct sctp_event. For reading, se_assoc_id is -+a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, se_assoc_id -+is a specified assoc_id or SCTP_{FUTURE|CURRENT|ALL}_ASSOC. se_type -+can be one of enum sctp_sn_type. -+ -+Default: 0. -+.TP -+.B SCTP_PR_SUPPORTED -+This socket option allows the enabling or disabling of the negotiation of -+PR-SCTP support for future associations. -+ -+The parameter type is struct sctp_assoc_value. For reading, assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, assoc_id -+is SCTP_FUTURE_ASSOC. -+ -+Default: sysctl_net.sctp.prsctp_enable. -+RFC: RFC7496. -+.TP -+.B SCTP_DEFAULT_PRINFO -+This option sets and gets the default parameters for PR-SCTP. -+ -+The parameter type is struct sctp_default_prinfo. For reading, pr_assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, pr_assoc_id is -+a specified assoc_id or SCTP_{FUTURE|CURRENT|ALL}_ASSOC. pr_policy can be -+SCTP_PR_SCTP_{NONE|TTL|RTX|PRIO}. -+ -+Default: SCTP_PR_SCTP_NONE. -+Require: SCTP_DEFAULT_PRINFO. -+.TP -+.B SCTP_PR_ASSOC_STATUS -+This option is used to get Association-Specific PR-SCTP Status. -+ -+The parameter type is struct sctp_prstatus, for reading only. -+sprstat_assoc_id is a specified assoc_id, sprstat_policy -+can be SCTP_PR_SCTP_{TTL|RTX|PRIO|ALL}. -+.TP -+.B SCTP_PR_STREAM_STATUS -+This option is used to get Stream-Specific PR-SCTP Status. -+ -+The parameter type is struct sctp_prstatus, for reading only. -+sprstat_assoc_id is a specified assoc_id, sprstat_policy -+can be SCTP_PR_SCTP_{TTL|RTX|PRIO|ALL}. -+.TP -+.B SCTP_RECONFIG_SUPPORTED -+Enable the Stream Reconfiguration(RECONF) for the future associations. -+For different type of requests enabling, see SCTP_ENABLE_STREAM_RESET -+option. -+ -+The parameter type is struct sctp_assoc_value. For reading, assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, assoc_id -+is SCTP_FUTURE_ASSOC. -+ -+Default: sysctl_net.sctp.reconf_enable. -+RFC: RFC6525. -+.TP -+.B SCTP_ENABLE_STREAM_RESET -+This option allows a user to control whether the kernel processes or denies -+incoming requests in RECONF chunks. -+ -+The parameter type is struct sctp_assoc_value. For reading, assoc_id is -+a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, assoc_id is -+a specified assoc_id or SCTP_{FUTURE|CURRENT|ALL}_ASSOC. assoc_value -+can be SCTP_ENABLE_{RESET_STREAM_REQ|RESET_ASSOC_REQ|CHANGE_ASSOC_REQ}. -+ -+Default: 0. -+Require: SCTP_RECONFIG_SUPPORTED. -+.TP -+.B SCTP_RESET_STREAMS -+This option allows the user to request the reset of incoming and/or -+outgoing streams. -+ -+The parameter type is struct sctp_reset_streams, for writing only. -+srs_assoc_id is a specified assoc_id. -+ -+Require: SCTP_ENABLE_STREAM_RESET. -+.TP -+.B SCTP_RESET_ASSOC -+This option allows a user to request the reset of the SSN/TSN. -+ -+The parameter type is sctp_assoc_t, for writing only. It is a specified -+assoc_id. -+ -+Require: SCTP_ENABLE_STREAM_RESET. -+.TP -+.B SCTP_ADD_STREAMS -+This option allows a user to request the addition of a number of incoming -+and/or outgoing streams. -+ -+The parameter type is struct sctp_add_streams, for writing only. -+sas_assoc_id is a specified assoc_id. -+ -+Require: SCTP_ENABLE_STREAM_RESET. -+.TP -+.B SCTP_STREAM_SCHEDULER -+This option is used to select a stream scheduler for data sending. -+ -+The parameter type is struct sctp_assoc_value. For reading, assoc_id is -+a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, assoc_id is a -+specified assoc_id or SCTP_{FUTURE|CURRENT|ALL}_ASSOC. assoc_value can -+be SCTP_SS_{FCFS|PRIO|RR|FC|WFQ}. -+ -+Default: SCTP_SS_FCFS. -+RFC: RFC8260. -+.TP -+.B SCTP_STREAM_SCHEDULER_VALUE -+Some stream schedulers require additional information to be set for -+individual streams. -+ -+The parameter type is struct sctp_assoc_value. For reading, assoc_id is -+a specified assoc_id. For writing, assoc_id is a specified assoc_id or -+SCTP_CURRENT_ASSOC. -+ -+Require: SCTP_STREAM_SCHEDULER. -+.TP -+.B SCTP_INTERLEAVING_SUPPORTED -+This socket option allows the enabling or disabling of the negotiation of -+user message interleaving support for future associations. -+ -+The parameter type is struct sctp_assoc_value. For reading, assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, assoc_id -+is SCTP_FUTURE_ASSOC. -+ -+Default: sysctl_net.sctp.intl_enable. -+Require: SCTP_FRAGMENT_INTERLEAVE. -+RFC: RFC8260. -+.TP -+.B SCTP_ASCONF_SUPPORTED -+Enable the Dynamic Address Reconfiguration(ASCONF) for the future -+associations. -+ -+The parameter type is struct sctp_assoc_value. For reading, assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, assoc_id -+is SCTP_FUTURE_ASSOC. -+ -+Default: sysctl_net.sctp.addip_enable. -+RFC: RFC5061. -+.TP -+.B SCTP_AUTO_ASCONF -+This option will enable or disable the use of the automatic generation of -+ASCONF chunks to add and delete addresses to an existing association. -+Note that this option has two caveats, namely a) it only affects sockets -+that are bound to all addresses available to the SCTP stack, and b) the -+system administrator may have an overriding control that turns the ASCONF -+feature off no matter what setting the socket option may have. -+ -+The parameter type is int boolean, for reading and writing. -+ -+Default: sysctl_net.sctp.default_auto_asconf. -+.TP -+.B SCTP_AUTH_SUPPORTED -+Enable AUTH for the future associations. -+ -+The parameter type is struct sctp_assoc_value. For reading, assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, ssoc_id -+is SCTP_FUTURE_ASSOC. -+ -+Default: sysctl_net.sctp.auth_enable. -+RFC: RFC4895. -+.TP -+.B SCTP_ECN_SUPPORTED -+Enable ECN for the future associations. -+ -+The parameter type is struct sctp_assoc_value. For reading, assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, assoc_id -+is SCTP_FUTURE_ASSOC. -+ -+Default: sysctl_net.sctp.ecn_enable. -+.TP -+.B SCTP_REMOTE_UDP_ENCAPS_PORT -+This option is used to set the encapsulation port(a remote listening or -+dest port) for SCTP over UDP, which allows SCTP traffic to pass through -+legacy NATs that do not provide native SCTP support. -+ -+The parameter type is struct sctp_udpencaps, for reading and writing. -+sue_address is a specified transport address or 0, sue_assoc_id -+is a specified assoc_id or SCTP_FUTURE_ASSOC. -+ -+Default: sysctl_net.sctp.encap_port. -+RFC: RFC6951. -+.TP -+.B SCTP_PLPMTUD_PROBE_INTERVAL -+This option is used to configure the PROBE_INTERVAL for the Packetization -+Layer Path MTU Discovery(PLPMTUD). It can be set to a value >= 5000 or -+0(disabled). -+ -+The parameter type is struct sctp_probeinterval, for reading and writing. -+spi_address is a specified transport address or 0, spi_assoc_id is -+a specified assoc_id or SCTP_FUTURE_ASSOC. -+ -+Default: 0(disabled). -+RFC: RFC8899. - .SH AUTHORS - Sridhar Samudrala - .SH "SEE ALSO" --- -2.39.1 - diff --git a/SPECS/lksctp-tools/man-improve-the-description-in-SOCKET-OPTIONS-in-sct.patch b/SPECS/lksctp-tools/man-improve-the-description-in-SOCKET-OPTIONS-in-sct.patch deleted file mode 100644 index 2bfaa1ea80..0000000000 --- a/SPECS/lksctp-tools/man-improve-the-description-in-SOCKET-OPTIONS-in-sct.patch +++ /dev/null @@ -1,273 +0,0 @@ -From 1bf06687ff8b0db8b3ac38b0206eea8a7b6f4632 Mon Sep 17 00:00:00 2001 -From: Xin Long -Date: Mon, 27 Feb 2023 17:37:19 -0500 -Subject: [PATCH 4/6] man: improve the description in SOCKET OPTIONS in sctp.7 - -SCTP_{FUTURE|CURRENT|ALL}_ASSOC have been introduced for some options to -make set/get more effectively, we should mention it in the description -of these options. Also, it's better to give users more information like: -the structure it uses as parameter, the default value, the dependence on -other options if any, write or read permissions etc. - -Signed-off-by: Xin Long ---- - man/sctp.7 | 186 +++++++++++++++++++++++++++++++++++------------------ - 1 file changed, 123 insertions(+), 63 deletions(-) - -diff --git a/man/sctp.7 b/man/sctp.7 -index 730e1a8..7756dda 100644 ---- a/man/sctp.7 -+++ b/man/sctp.7 -@@ -251,95 +251,148 @@ to read or - .BR setsockopt (2) - to write the option with the option level argument set to - .BR SOL_SCTP. -+Note that all these macros and structures described for parameters are defined -+in /usr/include/netinet/sctp.h, and for one-to-one style sockets a specified -+assoc_id works the same as SCTP_FUTURE_ASSOC. - .TP - .BR SCTP_RTOINFO. - This option is used to get or set the protocol parameters used to --initialize and bound retransmission timeout(RTO). The structure sctp_rtoinfo --defined in /usr/include/netinet/sctp.h is used to access and modify these --parameters. -+initialize and bound retransmission timeout(RTO). -+ -+The parameter type is struct sctp_rtoinfo, for reading and writing. -+srto_assoc_id is a specified assoc_id or SCTP_FUTURE_ASSOC. -+ -+Default: srto_max=sysctl_net.sctp.rto_max, srto_min=sysctl_net.sctp.rto_min, -+srto_initial=sysctl_net.sctp.rto_initial. - .TP - .B SCTP_ASSOCINFO - This option is used to both examine and set various association and endpoint --parameters. The structure sctp_assocparams defined in --/usr/include/netinet/sctp.h is used to access and modify these parameters. -+parameters. -+ -+The parameter type is struct sctp_assocparams, for reading and writing. -+sasoc_assoc_id is a specified assoc_id or SCTP_FUTURE_ASSOC. Note that -+some fields of this structure are for reading only: -+ -+ struct sctp_assocparams { -+ sctp_assoc_t sasoc_assoc_id; -+ __u16 sasoc_asocmaxrxt; (RW) -+ __u16 sasoc_number_peer_destinations; (R) -+ __u32 sasoc_peer_rwnd; (R) -+ __u32 sasoc_local_rwnd; (R) -+ __u32 sasoc_cookie_life; (RW) -+ }; -+ -+Default: sasoc_asocmaxrxt=sysctl_net.sctp.association_max_retrans, -+sasoc_cookie_life=sysctl_net.sctp.valid_cookie_life. - .TP - .B SCTP_INITMSG - This option is used to get or set the protocol parameters for the default --association initialization. The structure sctp_initmsg defined in --/usr/include/netinet/sctp.h is used to access and modify these parameters. -+association initialization. -+ -+The parameter type is struct sctp_initmsg, for reading and writing. - --Setting initialization parameters is effective only on an unconnected --socket (for one-to-many style sockets only future associations are --effected by the change). With one-to-one style sockets, this option --is inherited by sockets derived from a listener socket. -+Default: sinit_num_ostreams=10, sinit_max_instreams=10, -+sinit_max_attempts=sysctl_net.sctp.max_init_retransmits, -+sinit_max_init_timeo=sysctl_net.sctp.rto_max. - .TP - .B SCTP_NODELAY - Turn on/off any Nagle-like algorithm. This means that packets are generally --sent as soon as possible and no unnecessary delays are introduced, at the cost --of more packets in the network. Expects an integer boolean flag. -+sent as soon as possible and no unnecessary delays are introduced, at the -+cost of more packets in the network. -+ -+The parameter type is int boolean, for reading and writing. -+ -+Default: 0. - .TP - .B SCTP_AUTOCLOSE --This socket option is applicable to the one-to-many style socket --only. When set it will cause associations that are idle for more than --the specified number of seconds to automatically close. An --association being idle is defined an association that has NOT sent or --received user data. The special value of 0 indicates that no --automatic close of any associations should be performed. The option --expects an integer defining the number of seconds of idle time before --an association is closed. -+This socket option is applicable to the one-to-many style socket only. -+When set it will cause associations that are idle for more than the -+specified number of seconds to automatically close. An association -+being idle is defined an association that has NOT sent or received -+user data within a period. -+ -+The parameter type is int(seconds), for reading and writing. 0 indicates -+that no automatic close of any associations should be performed. -+ -+Default: sysctl_net.sctp.max_autoclose. - .TP - .B SCTP_SET_PEER_PRIMARY_ADDR - Requests that the peer mark the enclosed address as the association - primary. The enclosed address must be one of the association's --locally bound addresses. The structure sctp_setpeerprim defined in --/usr/include/netinet/sctp.h is used to make a set peer primary request. -+locally bound addresses. -+ -+The parameter type is struct sctp_setpeerprim, for writing only. -+sspp_assoc_id is a specified assoc_id. -+ -+Default: the 1st local address added. -+Require: SCTP_ASCONF_SUPPORTED. - .TP - .B SCTP_PRIMARY_ADDR - Requests that the local SCTP stack use the enclosed peer address as - the association primary. The enclosed address must be one of the --association peer's addresses. The structure sctp_prim defined in --/usr/include/netinet/sctp.h is used to make a get/set primary request. -+association peer's addresses. -+ -+The parameter type is struct sctp_prim, for writing only. ssp_assoc_id -+is a specified assoc_id. -+ -+Default: the 1st peer address added. -+Require: SCTP_ASCONF_SUPPORTED. - .TP - .B SCTP_DISABLE_FRAGMENTS --This option is a on/off flag and is passed an integer where a non-zero is on --and a zero is off. If enabled no SCTP message fragmentation will be performed. --Instead if a message being sent exceeds the current PMTU size, the message will --NOT be sent and an error will be indicated to the user. -+If enabled no SCTP message fragmentation will be performed. Instead if a -+message being sent exceeds the current PMTU size, the message will NOT -+be sent and an error will be indicated to the user. -+ -+The parameter type is int boolean, for reading and writing. -+ -+Default: 0. - .TP - .B SCTP_PEER_ADDR_PARAMS - Using this option, applications can enable or disable heartbeats for any peer - address of an association, modify an address's heartbeat interval, force a - heartbeat to be sent immediately, and adjust the address's maximum number of --retransmissions sent before an address is considered unreachable. The structure --sctp_paddrparams defined in /usr/include/netinet/sctp.h is used to --access and modify an address's parameters. -+retransmissions sent before an address is considered unreachable. -+ -+The parameter type is struct sctp_paddrparams, for reading and writing. -+spp_address is a specified transport address or 0, spp_assoc_id is -+a specified assoc_id or SCTP_FUTURE_ASSOC. -+ -+Default: hbinterval=sysctl_net.sctp.hb_interval, -+pathmaxrxt=sysctl_net.sctp.path_max_retrans, -+pathmtu=dev/route's, sackdelay=sysctl_net.sctp.sack_timeout, -+param_flags=HB_ENABLE|PMTUD_ENABLE|SACKDELAY_ENABLE, flowlabel=0, dscp=0. - .TP - .B SCTP_DEFAULT_SEND_PARAM - Applications that wish to use the sendto() system call may wish to specify - a default set of parameters that would normally be supplied through the --inclusion of ancillary data. This socket option allows such an application to --set the default sctp_sndrcvinfo structure. The application that wishes to use --this socket option simply passes in to this call the sctp_sndrcvinfo structure --defined in /usr/include/netinet/sctp.h. The input parameters accepted by this --call include sinfo_stream, sinfo_flags, sinfo_ppid, sinfo_context, --sinfo_timetolive. The user must set the sinfo_assoc_id field to identify the --association to affect if the caller is using the one-to-many style. -+inclusion of ancillary data. This option has been obsoleted by -+SCTP_DEFAULT_SNDINFO. -+ -+The parameter type is struct sctp_sndrcvinfo. For reading, sinfo_assoc_id is -+a specified assoc_id or SCTP_FUTURE_ASSOC. For writing, sinfo_assoc_id is a -+specified assoc_id or SCTP_{FUTURE|CURRENT|ALL}_ASSOC. -+ -+Default: default_stream=0, default_flags=0, default_ppid=0, default_context=0, -+default_timetolive=0. - .TP - .B SCTP_EVENTS - This socket option is used to specify various notifications and ancillary data --the user wishes to receive. The structure sctp_event_subscribe defined in --/usr/include/netinet/sctp.h is used to access or modify the events of interest --to the user. -+the user wishes to receive. This option has been obsoleted by SCTP_EVENT. -+ -+The parameter type is struct sctp_event_subscribe, for reading and writing. -+ -+Default: 0. - .TP - .B SCTP_I_WANT_MAPPED_V4_ADDR --This socket option is a boolean flag which turns on or off mapped V4 --addresses. If this option is turned on and the socket is type PF_INET6, --then IPv4 addresses will be mapped to V6 representation. If this option is --turned off, then no mapping will be done of V4 addresses and a user will --receive both PF_INET6 and PF_INET type addresses on the socket. -+This socket option is used to turn on or off mapped V4 addresses. If this -+option is turned on and the socket is type PF_INET6, then IPv4 addresses -+will be mapped to V6 representation. If this option is turned off, then -+no mapping will be done of V4 addresses and a user will receive both -+PF_INET6 and PF_INET type addresses on the socket. - --By default this option is turned on and expects an integer to be passed where --non-zero turns on the option and zero turns off the option. -+The parameter type is int boolean, for reading and writing. -+ -+Default: 1. - .TP - .B SCTP_MAXSEG - This socket option specifies the maximum size to put in any outgoing -@@ -347,30 +400,37 @@ SCTP DATA chunk. If a message is larger than this size it will be - fragmented by SCTP into the specified size. Note that the underlying - SCTP implementation may fragment into smaller sized chunks when the - PMTU of the underlying association is smaller than the value set by --the user. The option expects an integer. -+the user. 0 indicates the user is NOT limiting fragmentation and only -+the PMTU will effect SCTP's choice of DATA chunk size. -+ -+The parameter type is struct sctp_assoc_value, for reading and writing. -+assoc_id is a specified assoc_id or SCTP_FUTURE_ASSOC. - --The default value for this option is 0 which indicates the user is --NOT limiting fragmentation and only the PMTU will effect SCTP's --choice of DATA chunk size. -+Default: 0(no limit). - .TP - .B SCTP_STATUS - Applications can retrieve current status information about an association, - including association state, peer receiver window size, number of unacked --data chunks, and number of data chunks pending receipt. This information is --read-only. The structure sctp_status defined in /usr/include/netinet/sctp.h --is used to access this information. -+data chunks, and number of data chunks pending receipt. -+ -+The parameter type is struct sctp_status, for reading only. sstat_assoc_id -+is a specified assoc_id. - .TP - .B SCTP_GET_PEER_ADDR_INFO --Applications can retrieve information about a specific peer address --of an association, including its reachability state, congestion window, --and retransmission timer values. This information is read-only. The structure --sctp_paddrinfo defined in /usr/include/netinet/sctp.h is used to access this --information. -+Applications can retrieve information about a specific peer address of -+an association, including its reachability state, congestion window, -+and retransmission timer values. -+ -+The parameter type is struct sctp_paddrinfo, for reading only. spinfo_address -+is a specified transport address, sas_assoc_id is a specified assoc_id -+or SCTP_FUTURE_ASSOC. - .TP - .B SCTP_GET_ASSOC_STATS - Applications can retrieve current statistics about an association, including --SACKs sent and received, SCTP packets sent and received. The complete list can --be found in /usr/include/netinet/sctp.h in struct sctp_assoc_stats. -+SACKs sent and received, SCTP packets sent and received. -+ -+The parameter type is struct sctp_assoc_stats, for reading only. -+sas_assoc_id is a specified assoc_id. - .SH AUTHORS - Sridhar Samudrala - .SH "SEE ALSO" --- -2.39.1 - diff --git a/SPECS/lksctp-tools/man-update-for-DESCRIPTION-and-SYSCTL-in-sctp.7.patch b/SPECS/lksctp-tools/man-update-for-DESCRIPTION-and-SYSCTL-in-sctp.7.patch deleted file mode 100644 index 8a829a06ae..0000000000 --- a/SPECS/lksctp-tools/man-update-for-DESCRIPTION-and-SYSCTL-in-sctp.7.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 90ef63cd633388b0b0487fee11885f4d2a6bcc8f Mon Sep 17 00:00:00 2001 -From: Xin Long -Date: Wed, 22 Feb 2023 20:24:59 -0500 -Subject: [PATCH 2/6] man: update for DESCRIPTION and SYSCTL in sctp.7 - -Update some out-of-date infomation in DESCRIPTION and SYSCTL -parts in sctp.7. - -Signed-off-by: Xin Long ---- - man/sctp.7 | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/man/sctp.7 b/man/sctp.7 -index 50b551e..c19c2b7 100644 ---- a/man/sctp.7 -+++ b/man/sctp.7 -@@ -18,9 +18,9 @@ sctp \- SCTP protocol. - .B sctp_socket = socket(PF_INET, SOCK_SEQPACKET, IPPROTO_SCTP); - .fi - .SH DESCRIPTION --This is an implementation of the SCTP protocol as defined in RFC2960 and --RFC3309. It is a message oriented, reliable transport protocol with direct --support for multihoming that runs on top of -+This is an implementation of the SCTP protocol as defined in RFC4960. It is -+a message oriented, reliable transport protocol with direct support for -+multihoming that runs on top of - .BR ip (7), - and supports both v4 and v6 versions. - .PP -@@ -32,8 +32,8 @@ data is achieved by using checksums and sequence numbers. A selective - retransmission mechanism is applied to correct loss or corruption of data. - .PP - This implementation supports a mapping of SCTP into sockets API as defined --in the draft-ietf-tsvwg-sctpsocket-10.txt(Sockets API extensions for SCTP). --Two styles of interfaces are supported. -+in the RFC6458(Sockets API extensions for SCTP). Two styles of interfaces -+are supported. - .PP - A - .B one-to-many -@@ -111,7 +111,7 @@ files or with the - interface. In addition, most IP sysctls also apply to SCTP. See - .BR ip (7). - .TP --Please check kernel documentation for this, at Documentation/networking/ip-sysctl.txt. -+Please check kernel documentation for this, at Documentation/networking/ip-sysctl.rst. - .SH "STATISTICS" - These variables can be accessed by the - .B /proc/net/sctp/* --- -2.39.1 - diff --git a/SPECS/lksctp-tools/sctp_test-check-strdup-return-in-append_addr.patch b/SPECS/lksctp-tools/sctp_test-check-strdup-return-in-append_addr.patch deleted file mode 100644 index e2d50e3472..0000000000 --- a/SPECS/lksctp-tools/sctp_test-check-strdup-return-in-append_addr.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 97970af0e414f480afca2914279f51616ff688bb Mon Sep 17 00:00:00 2001 -From: Xin Long -Date: Wed, 24 Nov 2021 10:55:24 -0500 -Subject: [PATCH] sctp_test: check strdup return in append_addr - -strdup() may return NULL in append_addr(), and we should do the -check for its return value before operating it. - -Signed-off-by: Xin Long -Signed-off-by: Marcelo Ricardo Leitner ---- - src/apps/sctp_test.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/src/apps/sctp_test.c b/src/apps/sctp_test.c -index e382804..59fd4ad 100644 ---- a/src/apps/sctp_test.c -+++ b/src/apps/sctp_test.c -@@ -499,6 +499,9 @@ append_addr(const char *parm, struct sockaddr *addrs, int *ret_count) - char *ifname; - int ifindex = 0; - -+ if (!ipaddr) -+ return NULL; -+ - /* check the interface. */ - ifname = strchr(ipaddr,'%'); - if (ifname) { --- -2.39.1 - diff --git a/SPECS/moby-containerd-cc/CVE-2024-25621.patch b/SPECS/moby-containerd-cc/CVE-2024-25621.patch new file mode 100644 index 0000000000..507949f187 --- /dev/null +++ b/SPECS/moby-containerd-cc/CVE-2024-25621.patch @@ -0,0 +1,89 @@ +From 0450f046e6942e513d0ebf1ef5c2aff13daa187f Mon Sep 17 00:00:00 2001 +From: Akihiro Suda +Date: Mon, 27 Oct 2025 16:42:59 +0900 +Subject: [PATCH] Fix directory permissions + +- Create /var/lib/containerd with 0o700 (was: 0o711). +- Create config.TempDir with 0o700 (was: 0o711). +- Create /run/containerd/io.containerd.grpc.v1.cri with 0o700 (was: 0o755). +- Create /run/containerd/io.containerd.sandbox.controller.v1.shim with 0o700 (was: 0o711). +- Leave /run/containerd and /run/containerd/io.containerd.runtime.v2.task created with 0o711, + as required by userns-remapped containers. + /run/containerd/io.containerd.runtime.v2.task// is created with: + - 0o700 for non-userns-remapped containers + - 0o710 for userns-remapped containers with the remapped root group as the owner group. + +Signed-off-by: AllSpark +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: AI Backport of https://github.com/containerd/containerd/commit/0450f046e6942e513d0ebf1ef5c2aff13daa187f.patch + +--- + pkg/cri/cri.go | 8 ++++++++ + runtime/v2/manager.go | 2 ++ + services/server/server.go | 14 ++++++++++++-- + 3 files changed, 22 insertions(+), 2 deletions(-) + +diff --git a/pkg/cri/cri.go b/pkg/cri/cri.go +index aa57313..55db3a2 100644 +--- a/pkg/cri/cri.go ++++ b/pkg/cri/cri.go +@@ -62,6 +62,14 @@ func initCRIService(ic *plugin.InitContext) (interface{}, error) { + return nil, fmt.Errorf("invalid plugin config: %w", err) + } + ++ if err := os.MkdirAll(ic.State, 0700); err != nil { ++ return nil, err ++ } ++ // chmod is needed for upgrading from an older release that created the dir with 0755 ++ if err := os.Chmod(ic.State, 0700); err != nil { ++ return nil, err ++ } ++ + c := criconfig.Config{ + PluginConfig: *pluginConfig, + ContainerdRootDir: filepath.Dir(ic.Root), +diff --git a/runtime/v2/manager.go b/runtime/v2/manager.go +index 73e1af7..d48ac8f 100644 +--- a/runtime/v2/manager.go ++++ b/runtime/v2/manager.go +@@ -133,6 +133,8 @@ type ManagerConfig struct { + // NewShimManager creates a manager for v2 shims + func NewShimManager(ctx context.Context, config *ManagerConfig) (*ShimManager, error) { + for _, d := range []string{config.Root, config.State} { ++ // root: the parent of this directory is created as 0700, not 0711. ++ // state: the parent of this directory is created as 0711 too, so as to support userns-remapped containers. + if err := os.MkdirAll(d, 0711); err != nil { + return nil, err + } +diff --git a/services/server/server.go b/services/server/server.go +index 2a548ef..04782bf 100644 +--- a/services/server/server.go ++++ b/services/server/server.go +@@ -76,12 +76,22 @@ func CreateTopLevelDirectories(config *srvconfig.Config) error { + return err + } + +- if err := sys.MkdirAllWithACL(config.State, 0711); err != nil { ++ if err := sys.MkdirAllWithACL(config.Root, 0700); err != nil { ++ return err ++ } ++ // chmod is needed for upgrading from an older release that created the dir with 0o711 ++ if err := os.Chmod(config.Root, 0700); err != nil { + return err + } + ++ // For supporting userns-remapped containers, the state dir cannot be just mkdired with 0o700. ++ // Each of plugins creates a dedicated directory beneath the state dir with appropriate permission bits. + if config.TempDir != "" { +- if err := sys.MkdirAllWithACL(config.TempDir, 0711); err != nil { ++ if err := sys.MkdirAllWithACL(config.TempDir, 0700); err != nil { ++ return err ++ } ++ // chmod is needed for upgrading from an older release that created the dir with 0o711 ++ if err := os.Chmod(config.Root, 0700); err != nil { + return err + } + if runtime.GOOS == "windows" { +-- +2.45.4 + diff --git a/SPECS/moby-containerd-cc/CVE-2025-64329.patch b/SPECS/moby-containerd-cc/CVE-2025-64329.patch new file mode 100644 index 0000000000..9e367f652a --- /dev/null +++ b/SPECS/moby-containerd-cc/CVE-2025-64329.patch @@ -0,0 +1,81 @@ +From 155777be3c6c8bb1e5d3c48df543079eed20bed9 Mon Sep 17 00:00:00 2001 +From: AllSpark +Date: Mon, 10 Nov 2025 03:04:25 +0000 +Subject: [PATCH] fix(cri): prevent goroutine leak in ContainerIO.Attach by + honoring ctx cancellation and removing writer group entries; plumb context + through attach call + +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: AI Backport of https://github.com/containerd/containerd/commit/c575d1b5f4011f33b32f71ace75367a92b08c750.patch +--- + pkg/cri/io/container_io.go | 14 +++++++++++--- + pkg/cri/sbserver/container_attach.go | 2 +- + pkg/cri/server/container_attach.go | 2 +- + 3 files changed, 13 insertions(+), 5 deletions(-) + +diff --git a/pkg/cri/io/container_io.go b/pkg/cri/io/container_io.go +index 70bc8b7..e158410 100644 +--- a/pkg/cri/io/container_io.go ++++ b/pkg/cri/io/container_io.go +@@ -17,6 +17,7 @@ + package io + + import ( ++ "context" + "errors" + "io" + "strings" +@@ -134,7 +135,7 @@ func (c *ContainerIO) Pipe() { + + // Attach attaches container stdio. + // TODO(random-liu): Use pools.Copy in docker to reduce memory usage? +-func (c *ContainerIO) Attach(opts AttachOptions) { ++func (c *ContainerIO) Attach(ctx context.Context, opts AttachOptions) { + var wg sync.WaitGroup + key := util.GenerateID() + stdinKey := streamKey(c.id, "attach-"+key, Stdin) +@@ -175,8 +176,15 @@ func (c *ContainerIO) Attach(opts AttachOptions) { + } + + attachStream := func(key string, close <-chan struct{}) { +- <-close +- logrus.Infof("Attach stream %q closed", key) ++ select { ++ case <-close: ++ logrus.Infof("Attach stream %q closed", key) ++ case <-ctx.Done(): ++ logrus.Infof("Attach client of %q cancelled", key) ++ // Avoid writeGroup heap up ++ c.stdoutGroup.Remove(key) ++ c.stderrGroup.Remove(key) ++ } + // Make sure stdin gets closed. + if stdinStreamRC != nil { + stdinStreamRC.Close() +diff --git a/pkg/cri/sbserver/container_attach.go b/pkg/cri/sbserver/container_attach.go +index 56f69c6..b2a534a 100644 +--- a/pkg/cri/sbserver/container_attach.go ++++ b/pkg/cri/sbserver/container_attach.go +@@ -79,6 +79,6 @@ func (c *criService) attachContainer(ctx context.Context, id string, stdin io.Re + }, + } + // TODO(random-liu): Figure out whether we need to support historical output. +- cntr.IO.Attach(opts) ++ cntr.IO.Attach(ctx, opts) + return nil + } +diff --git a/pkg/cri/server/container_attach.go b/pkg/cri/server/container_attach.go +index cd79f3b..aa6519a 100644 +--- a/pkg/cri/server/container_attach.go ++++ b/pkg/cri/server/container_attach.go +@@ -79,6 +79,6 @@ func (c *criService) attachContainer(ctx context.Context, id string, stdin io.Re + }, + } + // TODO(random-liu): Figure out whether we need to support historical output. +- cntr.IO.Attach(opts) ++ cntr.IO.Attach(ctx, opts) + return nil + } +-- +2.45.4 + diff --git a/SPECS/moby-containerd-cc/moby-containerd-cc.spec b/SPECS/moby-containerd-cc/moby-containerd-cc.spec index 207dbf88cd..2176a228c7 100644 --- a/SPECS/moby-containerd-cc/moby-containerd-cc.spec +++ b/SPECS/moby-containerd-cc/moby-containerd-cc.spec @@ -6,7 +6,7 @@ Summary: Industry-standard container runtime for confidential containers Name: moby-%{upstream_name} Version: 1.7.7 -Release: 10%{?dist} +Release: 11%{?dist} License: ASL 2.0 Group: Tools/Container URL: https://www.containerd.io @@ -25,6 +25,8 @@ Patch5: CVE-2023-45288.patch Patch7: CVE-2023-44487.patch Patch8: CVE-2025-27144.patch Patch9: CVE-2024-40635.patch +Patch10:CVE-2024-25621.patch +Patch11:CVE-2025-64329.patch %{?systemd_requires} @@ -82,6 +84,10 @@ fi %config(noreplace) %{_sysconfdir}/containerd/config.toml %changelog +* Tue Jan 6 2025 Lee Chee Yang - 1.7.7-11 +- merge from Azure Linux 3.0.20251206-3.0 +- Patch for CVE-2025-64329, CVE-2024-25621 + * Fri May 30 2025 Ranjan Dutta - 1.7.7-10 - merge from Azure Linux 3.0.20250521-3.0 - Fix CVE-2024-40635 diff --git a/SPECS/moby-engine/CVE-2025-58183.patch b/SPECS/moby-engine/CVE-2025-58183.patch new file mode 100644 index 0000000000..e0a9843ff3 --- /dev/null +++ b/SPECS/moby-engine/CVE-2025-58183.patch @@ -0,0 +1,62 @@ +From 9d9605d279c66333caaf20b3f46a440d659c48c2 Mon Sep 17 00:00:00 2001 +From: AllSpark +Date: Sat, 15 Nov 2025 06:37:02 +0000 +Subject: [PATCH] archive/tar: set a limit on the size of GNU sparse file 1.0 + regions; cap to maxSpecialFileSize; add errSparseTooLong; update reader to + enforce limit + +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: AI Backport of https://github.com/vbatts/tar-split/commit/55da7d6b43bd806ee785d783bdf66bcf302af118.patch +--- + vendor/github.com/vbatts/tar-split/archive/tar/common.go | 1 + + vendor/github.com/vbatts/tar-split/archive/tar/reader.go | 9 +++++++-- + 2 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/vendor/github.com/vbatts/tar-split/archive/tar/common.go b/vendor/github.com/vbatts/tar-split/archive/tar/common.go +index dee9e47..e687a08 100644 +--- a/vendor/github.com/vbatts/tar-split/archive/tar/common.go ++++ b/vendor/github.com/vbatts/tar-split/archive/tar/common.go +@@ -34,6 +34,7 @@ var ( + errMissData = errors.New("archive/tar: sparse file references non-existent data") + errUnrefData = errors.New("archive/tar: sparse file contains unreferenced data") + errWriteHole = errors.New("archive/tar: write non-NUL byte in sparse hole") ++ errSparseTooLong = errors.New("archive/tar: sparse map too long") + ) + + type headerError []string +diff --git a/vendor/github.com/vbatts/tar-split/archive/tar/reader.go b/vendor/github.com/vbatts/tar-split/archive/tar/reader.go +index 40f6c86..7a56fa1 100644 +--- a/vendor/github.com/vbatts/tar-split/archive/tar/reader.go ++++ b/vendor/github.com/vbatts/tar-split/archive/tar/reader.go +@@ -576,12 +576,17 @@ func readGNUSparseMap1x0(r io.Reader) (sparseDatas, error) { + cntNewline int64 + buf bytes.Buffer + blk block ++ totalSize int + ) + + // feedTokens copies data in blocks from r into buf until there are + // at least cnt newlines in buf. It will not read more blocks than needed. + feedTokens := func(n int64) error { + for cntNewline < n { ++ totalSize += len(blk) ++ if totalSize > maxSpecialFileSize { ++ return errSparseTooLong ++ } + if _, err := mustReadFull(r, blk[:]); err != nil { + return err + } +@@ -614,8 +619,8 @@ func readGNUSparseMap1x0(r io.Reader) (sparseDatas, error) { + } + + // Parse for all member entries. +- // numEntries is trusted after this since a potential attacker must have +- // committed resources proportional to what this library used. ++ // numEntries is trusted after this since feedTokens limits the number of ++ // tokens based on maxSpecialFileSize. + if err := feedTokens(2 * numEntries); err != nil { + return nil, err + } +-- +2.45.4 + diff --git a/SPECS/moby-engine/moby-engine.spec b/SPECS/moby-engine/moby-engine.spec index abfbc06e21..11d70a1c32 100644 --- a/SPECS/moby-engine/moby-engine.spec +++ b/SPECS/moby-engine/moby-engine.spec @@ -3,7 +3,7 @@ Summary: The open-source application container engine Name: moby-engine Version: 25.0.3 -Release: 15%{?dist} +Release: 16%{?dist} License: ASL 2.0 Group: Tools/Container URL: https://mobyproject.org @@ -29,6 +29,7 @@ Patch10: CVE-2025-22868.patch Patch11: CVE-2025-22869.patch Patch12: CVE-2025-30204.patch Patch13: CVE-2024-51744.patch +Patch14: CVE-2025-58183.patch %{?systemd_requires} @@ -131,6 +132,10 @@ chmod 0700 /opt/docker-data %{_unitdir}/* %changelog +* Tue Jan 6 2025 Lee Chee Yang - 25.0.3-16 +- merge from Azure Linux 3.0.20251206-3.0 +- Patch for CVE-2025-58183 + * Tue Nov 04 2025 Polmoorx Shiva Kumar - 25.0.3-15 - Add daemon.json with overlay2 to fix container startup issue diff --git a/SPECS/multus/CVE-2023-3978.patch b/SPECS/multus/CVE-2023-3978.patch deleted file mode 100755 index 9b04a4f1b0..0000000000 --- a/SPECS/multus/CVE-2023-3978.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 8ffa475fbdb33da97e8bf79cc5791ee8751fca5e Mon Sep 17 00:00:00 2001 -From: Roland Shoemaker -Date: Thu, 06 Jul 2023 10:25:47 -0700 -Subject: [PATCH] html: only render content literally in the HTML namespace - -Per the WHATWG HTML specification, section 13.3, only append the literal -content of a text node if we are in the HTML namespace. - -Thanks to Mohammad Thoriq Aziz for reporting this issue. - -Fixes golang/go#61615 -Fixes CVE-2023-3978 - -Change-Id: I332152904d4e7646bd2441602bcbe591fc655fa4 -Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1942896 -Reviewed-by: Tatiana Bradley -Run-TryBot: Roland Shoemaker -Reviewed-by: Damien Neil -TryBot-Result: Security TryBots -Reviewed-on: https://go-review.googlesource.com/c/net/+/514896 -Reviewed-by: Roland Shoemaker -TryBot-Result: Gopher Robot -Run-TryBot: Damien Neil ---- - -diff --git a/vendor/golang.org/x/net/html/render.go b/vendor/golang.org/x/net/html/render.go -index 8b28031..e8c1233 100644 ---- a/vendor/golang.org/x/net/html/render.go -+++ b/vendor/golang.org/x/net/html/render.go -@@ -194,9 +194,8 @@ - } - } - -- // Render any child nodes. -- switch n.Data { -- case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "xmp": -+ // Render any child nodes -+ if childTextNodesAreLiteral(n) { - for c := n.FirstChild; c != nil; c = c.NextSibling { - if c.Type == TextNode { - if _, err := w.WriteString(c.Data); err != nil { -@@ -213,7 +212,7 @@ - // last element in the file, with no closing tag. - return plaintextAbort - } -- default: -+ } else { - for c := n.FirstChild; c != nil; c = c.NextSibling { - if err := render1(w, c); err != nil { - return err -@@ -231,6 +230,27 @@ - return w.WriteByte('>') - } - -+func childTextNodesAreLiteral(n *Node) bool { -+ // Per WHATWG HTML 13.3, if the parent of the current node is a style, -+ // script, xmp, iframe, noembed, noframes, or plaintext element, and the -+ // current node is a text node, append the value of the node's data -+ // literally. The specification is not explicit about it, but we only -+ // enforce this if we are in the HTML namespace (i.e. when the namespace is -+ // ""). -+ // NOTE: we also always include noscript elements, although the -+ // specification states that they should only be rendered as such if -+ // scripting is enabled for the node (which is not something we track). -+ if n.Namespace != "" { -+ return false -+ } -+ switch n.Data { -+ case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "xmp": -+ return true -+ default: -+ return false -+ } -+} -+ - // writeQuoted writes s to w surrounded by quotes. Normally it will use double - // quotes, but if s contains a double quote, it will use single quotes. - // It is used for writing the identifiers in a doctype declaration. diff --git a/SPECS/multus/CVE-2023-44487.patch b/SPECS/multus/CVE-2023-44487.patch deleted file mode 100644 index 37d6dd702b..0000000000 --- a/SPECS/multus/CVE-2023-44487.patch +++ /dev/null @@ -1,71077 +0,0 @@ -From fcfccf7df38a19631c7a8740a2c4aee7688ad9c6 Mon Sep 17 00:00:00 2001 -From: xiaohongdeng <“worldsky86rough@gmail.com”> -Date: Tue, 26 Nov 2024 23:44:28 +0000 -Subject: [PATCH] upgrade golang.org/x/net to 0.17.0 and google.golang.org/grpc - 1.56.3 - ---- - go.mod | 26 +- - go.sum | 41 +- - vendor/github.com/cespare/xxhash/v2/README.md | 31 +- - .../github.com/cespare/xxhash/v2/testall.sh | 10 + - vendor/github.com/cespare/xxhash/v2/xxhash.go | 47 +- - .../cespare/xxhash/v2/xxhash_amd64.s | 336 +- - .../cespare/xxhash/v2/xxhash_arm64.s | 183 + - .../v2/{xxhash_amd64.go => xxhash_asm.go} | 2 + - .../cespare/xxhash/v2/xxhash_other.go | 22 +- - .../cespare/xxhash/v2/xxhash_safe.go | 1 + - .../cespare/xxhash/v2/xxhash_unsafe.go | 3 +- - .../golang/protobuf/jsonpb/decode.go | 530 ++ - .../golang/protobuf/jsonpb/encode.go | 559 ++ - .../github.com/golang/protobuf/jsonpb/json.go | 69 + - .../x/net/context/ctxhttp/ctxhttp.go | 71 - - vendor/golang.org/x/net/html/doc.go | 21 + - vendor/golang.org/x/net/html/escape.go | 81 + - vendor/golang.org/x/net/html/render.go | 2 +- - vendor/golang.org/x/net/html/token.go | 19 +- - vendor/golang.org/x/net/http2/Dockerfile | 51 - - vendor/golang.org/x/net/http2/Makefile | 3 - - vendor/golang.org/x/net/http2/pipe.go | 6 +- - vendor/golang.org/x/net/http2/server.go | 102 +- - vendor/golang.org/x/net/http2/transport.go | 81 +- - vendor/golang.org/x/net/http2/writesched.go | 3 +- - .../x/net/http2/writesched_roundrobin.go | 119 + - vendor/golang.org/x/net/idna/idna9.0.0.go | 2 +- - vendor/golang.org/x/net/idna/tables13.0.0.go | 2988 ++++--- - vendor/golang.org/x/net/idna/tables15.0.0.go | 5145 +++++++++++ - vendor/golang.org/x/net/idna/trie.go | 21 - - vendor/golang.org/x/net/idna/trie12.0.0.go | 31 + - vendor/golang.org/x/net/idna/trie13.0.0.go | 31 + - vendor/golang.org/x/oauth2/AUTHORS | 3 - - vendor/golang.org/x/oauth2/CONTRIBUTORS | 3 - - vendor/golang.org/x/oauth2/README.md | 12 +- - vendor/golang.org/x/oauth2/internal/token.go | 4 +- - vendor/golang.org/x/oauth2/oauth2.go | 33 +- - vendor/golang.org/x/oauth2/token.go | 14 +- - .../sys/internal/unsafeheader/unsafeheader.go | 30 - - vendor/golang.org/x/sys/unix/ioctl_signed.go | 70 + - .../sys/unix/{ioctl.go => ioctl_unsigned.go} | 21 +- - vendor/golang.org/x/sys/unix/ioctl_zos.go | 20 +- - vendor/golang.org/x/sys/unix/mkall.sh | 2 +- - vendor/golang.org/x/sys/unix/mkerrors.sh | 14 +- - vendor/golang.org/x/sys/unix/mmap_nomremap.go | 14 + - vendor/golang.org/x/sys/unix/mremap.go | 53 + - vendor/golang.org/x/sys/unix/syscall_aix.go | 24 +- - .../golang.org/x/sys/unix/syscall_aix_ppc.go | 1 - - .../x/sys/unix/syscall_aix_ppc64.go | 1 - - vendor/golang.org/x/sys/unix/syscall_bsd.go | 17 +- - .../golang.org/x/sys/unix/syscall_darwin.go | 251 +- - .../x/sys/unix/syscall_dragonfly.go | 200 +- - .../golang.org/x/sys/unix/syscall_freebsd.go | 236 +- - .../x/sys/unix/syscall_freebsd_386.go | 17 +- - .../x/sys/unix/syscall_freebsd_amd64.go | 17 +- - .../x/sys/unix/syscall_freebsd_arm.go | 15 +- - .../x/sys/unix/syscall_freebsd_arm64.go | 15 +- - .../x/sys/unix/syscall_freebsd_riscv64.go | 15 +- - vendor/golang.org/x/sys/unix/syscall_hurd.go | 8 + - vendor/golang.org/x/sys/unix/syscall_linux.go | 266 +- - .../x/sys/unix/syscall_linux_386.go | 27 - - .../x/sys/unix/syscall_linux_amd64.go | 3 +- - .../x/sys/unix/syscall_linux_arm.go | 27 - - .../x/sys/unix/syscall_linux_arm64.go | 12 +- - .../x/sys/unix/syscall_linux_loong64.go | 7 +- - .../x/sys/unix/syscall_linux_mips64x.go | 3 +- - .../x/sys/unix/syscall_linux_mipsx.go | 27 - - .../x/sys/unix/syscall_linux_ppc.go | 27 - - .../x/sys/unix/syscall_linux_ppc64x.go | 1 - - .../x/sys/unix/syscall_linux_riscv64.go | 14 +- - .../x/sys/unix/syscall_linux_s390x.go | 1 - - .../x/sys/unix/syscall_linux_sparc64.go | 1 - - .../golang.org/x/sys/unix/syscall_netbsd.go | 279 +- - .../golang.org/x/sys/unix/syscall_openbsd.go | 93 +- - .../golang.org/x/sys/unix/syscall_solaris.go | 68 +- - vendor/golang.org/x/sys/unix/syscall_unix.go | 18 + - .../x/sys/unix/syscall_zos_s390x.go | 21 +- - .../x/sys/unix/zerrors_darwin_amd64.go | 19 + - .../x/sys/unix/zerrors_darwin_arm64.go | 19 + - vendor/golang.org/x/sys/unix/zerrors_linux.go | 76 +- - .../x/sys/unix/zerrors_linux_386.go | 11 + - .../x/sys/unix/zerrors_linux_amd64.go | 11 + - .../x/sys/unix/zerrors_linux_arm.go | 11 + - .../x/sys/unix/zerrors_linux_arm64.go | 13 + - .../x/sys/unix/zerrors_linux_loong64.go | 13 + - .../x/sys/unix/zerrors_linux_mips.go | 11 + - .../x/sys/unix/zerrors_linux_mips64.go | 11 + - .../x/sys/unix/zerrors_linux_mips64le.go | 11 + - .../x/sys/unix/zerrors_linux_mipsle.go | 11 + - .../x/sys/unix/zerrors_linux_ppc.go | 11 + - .../x/sys/unix/zerrors_linux_ppc64.go | 11 + - .../x/sys/unix/zerrors_linux_ppc64le.go | 11 + - .../x/sys/unix/zerrors_linux_riscv64.go | 11 + - .../x/sys/unix/zerrors_linux_s390x.go | 11 + - .../x/sys/unix/zerrors_linux_sparc64.go | 59 + - .../x/sys/unix/zptrace_armnn_linux.go | 8 +- - .../x/sys/unix/zptrace_linux_arm64.go | 4 +- - .../x/sys/unix/zptrace_mipsnn_linux.go | 8 +- - .../x/sys/unix/zptrace_mipsnnle_linux.go | 8 +- - .../x/sys/unix/zptrace_x86_linux.go | 8 +- - .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 45 +- - .../x/sys/unix/zsyscall_aix_ppc64.go | 46 +- - .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 17 +- - .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 18 +- - .../x/sys/unix/zsyscall_darwin_amd64.go | 71 +- - .../x/sys/unix/zsyscall_darwin_amd64.s | 160 +- - .../x/sys/unix/zsyscall_darwin_arm64.go | 71 +- - .../x/sys/unix/zsyscall_darwin_arm64.s | 160 +- - .../x/sys/unix/zsyscall_dragonfly_amd64.go | 42 +- - .../x/sys/unix/zsyscall_freebsd_386.go | 52 +- - .../x/sys/unix/zsyscall_freebsd_amd64.go | 52 +- - .../x/sys/unix/zsyscall_freebsd_arm.go | 52 +- - .../x/sys/unix/zsyscall_freebsd_arm64.go | 52 +- - .../x/sys/unix/zsyscall_freebsd_riscv64.go | 52 +- - .../x/sys/unix/zsyscall_illumos_amd64.go | 10 +- - .../golang.org/x/sys/unix/zsyscall_linux.go | 89 +- - .../x/sys/unix/zsyscall_linux_386.go | 10 - - .../x/sys/unix/zsyscall_linux_amd64.go | 10 - - .../x/sys/unix/zsyscall_linux_arm.go | 10 - - .../x/sys/unix/zsyscall_linux_arm64.go | 10 - - .../x/sys/unix/zsyscall_linux_mips.go | 10 - - .../x/sys/unix/zsyscall_linux_mips64.go | 10 - - .../x/sys/unix/zsyscall_linux_mips64le.go | 10 - - .../x/sys/unix/zsyscall_linux_mipsle.go | 10 - - .../x/sys/unix/zsyscall_linux_ppc.go | 10 - - .../x/sys/unix/zsyscall_linux_ppc64.go | 10 - - .../x/sys/unix/zsyscall_linux_ppc64le.go | 10 - - .../x/sys/unix/zsyscall_linux_riscv64.go | 26 +- - .../x/sys/unix/zsyscall_linux_s390x.go | 10 - - .../x/sys/unix/zsyscall_linux_sparc64.go | 10 - - .../x/sys/unix/zsyscall_netbsd_386.go | 49 +- - .../x/sys/unix/zsyscall_netbsd_amd64.go | 49 +- - .../x/sys/unix/zsyscall_netbsd_arm.go | 49 +- - .../x/sys/unix/zsyscall_netbsd_arm64.go | 49 +- - .../x/sys/unix/zsyscall_openbsd_386.go | 68 +- - .../x/sys/unix/zsyscall_openbsd_386.s | 15 +- - .../x/sys/unix/zsyscall_openbsd_amd64.go | 68 +- - .../x/sys/unix/zsyscall_openbsd_amd64.s | 15 +- - .../x/sys/unix/zsyscall_openbsd_arm.go | 68 +- - .../x/sys/unix/zsyscall_openbsd_arm.s | 15 +- - .../x/sys/unix/zsyscall_openbsd_arm64.go | 68 +- - .../x/sys/unix/zsyscall_openbsd_arm64.s | 15 +- - .../x/sys/unix/zsyscall_openbsd_mips64.go | 68 +- - .../x/sys/unix/zsyscall_openbsd_mips64.s | 15 +- - .../x/sys/unix/zsyscall_openbsd_ppc64.go | 68 +- - .../x/sys/unix/zsyscall_openbsd_ppc64.s | 18 +- - .../x/sys/unix/zsyscall_openbsd_riscv64.go | 68 +- - .../x/sys/unix/zsyscall_openbsd_riscv64.s | 15 +- - .../x/sys/unix/zsyscall_solaris_amd64.go | 280 +- - .../x/sys/unix/zsyscall_zos_s390x.go | 23 +- - .../x/sys/unix/zsysnum_linux_386.go | 1 + - .../x/sys/unix/zsysnum_linux_amd64.go | 1 + - .../x/sys/unix/zsysnum_linux_arm.go | 1 + - .../x/sys/unix/zsysnum_linux_arm64.go | 1 + - .../x/sys/unix/zsysnum_linux_loong64.go | 1 + - .../x/sys/unix/zsysnum_linux_mips.go | 1 + - .../x/sys/unix/zsysnum_linux_mips64.go | 1 + - .../x/sys/unix/zsysnum_linux_mips64le.go | 1 + - .../x/sys/unix/zsysnum_linux_mipsle.go | 1 + - .../x/sys/unix/zsysnum_linux_ppc.go | 1 + - .../x/sys/unix/zsysnum_linux_ppc64.go | 1 + - .../x/sys/unix/zsysnum_linux_ppc64le.go | 1 + - .../x/sys/unix/zsysnum_linux_riscv64.go | 3 + - .../x/sys/unix/zsysnum_linux_s390x.go | 2 + - .../x/sys/unix/zsysnum_linux_sparc64.go | 1 + - .../x/sys/unix/ztypes_darwin_amd64.go | 11 + - .../x/sys/unix/ztypes_darwin_arm64.go | 11 + - .../x/sys/unix/ztypes_freebsd_386.go | 2 +- - .../x/sys/unix/ztypes_freebsd_amd64.go | 2 +- - .../x/sys/unix/ztypes_freebsd_arm.go | 2 +- - .../x/sys/unix/ztypes_freebsd_arm64.go | 2 +- - .../x/sys/unix/ztypes_freebsd_riscv64.go | 2 +- - vendor/golang.org/x/sys/unix/ztypes_linux.go | 225 +- - .../golang.org/x/sys/unix/ztypes_linux_386.go | 4 +- - .../x/sys/unix/ztypes_linux_amd64.go | 4 +- - .../golang.org/x/sys/unix/ztypes_linux_arm.go | 4 +- - .../x/sys/unix/ztypes_linux_arm64.go | 4 +- - .../x/sys/unix/ztypes_linux_loong64.go | 4 +- - .../x/sys/unix/ztypes_linux_mips.go | 4 +- - .../x/sys/unix/ztypes_linux_mips64.go | 4 +- - .../x/sys/unix/ztypes_linux_mips64le.go | 4 +- - .../x/sys/unix/ztypes_linux_mipsle.go | 4 +- - .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 4 +- - .../x/sys/unix/ztypes_linux_ppc64.go | 4 +- - .../x/sys/unix/ztypes_linux_ppc64le.go | 4 +- - .../x/sys/unix/ztypes_linux_riscv64.go | 31 +- - .../x/sys/unix/ztypes_linux_s390x.go | 4 +- - .../x/sys/unix/ztypes_linux_sparc64.go | 4 +- - .../golang.org/x/sys/windows/env_windows.go | 6 +- - .../golang.org/x/sys/windows/exec_windows.go | 92 +- - .../x/sys/windows/security_windows.go | 21 +- - vendor/golang.org/x/sys/windows/service.go | 11 + - .../x/sys/windows/syscall_windows.go | 76 +- - .../golang.org/x/sys/windows/types_windows.go | 102 +- - .../x/sys/windows/zsyscall_windows.go | 98 +- - vendor/golang.org/x/term/term_unix.go | 2 +- - .../x/text/encoding/internal/internal.go | 2 +- - .../text/internal/language/compact/tables.go | 356 +- - .../x/text/internal/language/tables.go | 4686 +++++----- - vendor/golang.org/x/text/language/match.go | 2 +- - vendor/golang.org/x/text/language/tables.go | 138 +- - .../x/text/unicode/bidi/tables13.0.0.go | 4 +- - .../x/text/unicode/bidi/tables15.0.0.go | 2043 +++++ - .../x/text/unicode/norm/forminfo.go | 2 +- - .../x/text/unicode/norm/tables13.0.0.go | 4 +- - .../x/text/unicode/norm/tables15.0.0.go | 7908 +++++++++++++++++ - vendor/golang.org/x/text/unicode/norm/trie.go | 2 +- - .../googleapis/rpc/status/status.pb.go | 10 +- - vendor/google.golang.org/grpc/CONTRIBUTING.md | 32 +- - vendor/google.golang.org/grpc/MAINTAINERS.md | 5 +- - vendor/google.golang.org/grpc/Makefile | 2 - - vendor/google.golang.org/grpc/NOTICE.txt | 13 + - .../grpc/attributes/attributes.go | 109 +- - vendor/google.golang.org/grpc/backoff.go | 2 +- - .../grpc/balancer/balancer.go | 142 +- - .../grpc/balancer/base/balancer.go | 88 +- - .../grpc/balancer/conn_state_evaluator.go | 74 + - .../grpc/balancer/grpclb/state/state.go | 2 +- - .../grpc/balancer/roundrobin/roundrobin.go | 20 +- - .../grpc/balancer_conn_wrappers.go | 488 +- - .../grpc_binarylog_v1/binarylog.pb.go | 22 +- - vendor/google.golang.org/grpc/call.go | 5 + - .../grpc/channelz/channelz.go | 36 + - vendor/google.golang.org/grpc/clientconn.go | 1327 +-- - .../grpc/codes/code_string.go | 51 +- - .../grpc/connectivity/connectivity.go | 35 +- - .../grpc/credentials/credentials.go | 45 +- - .../grpc/credentials/go12.go | 30 - - .../grpc/credentials/insecure/insecure.go | 34 +- - .../google.golang.org/grpc/credentials/tls.go | 9 +- - vendor/google.golang.org/grpc/dialoptions.go | 212 +- - .../grpc/encoding/encoding.go | 9 +- - .../grpc/grpclog/loggerv2.go | 103 +- - vendor/google.golang.org/grpc/idle.go | 287 + - vendor/google.golang.org/grpc/install_gae.sh | 6 - - vendor/google.golang.org/grpc/interceptor.go | 9 +- - .../balancer/gracefulswitch/gracefulswitch.go | 384 + - .../grpc/internal/binarylog/binarylog.go | 118 +- - .../grpc/internal/binarylog/env_config.go | 26 +- - .../grpc/internal/binarylog/method_logger.go | 161 +- - .../grpc/internal/binarylog/sink.go | 12 +- - .../grpc/internal/buffer/unbounded.go | 26 +- - .../grpc/internal/channelz/funcs.go | 240 +- - .../grpc/internal/channelz/id.go | 75 + - .../grpc/internal/channelz/logging.go | 91 +- - .../grpc/internal/channelz/types.go | 39 +- - .../grpc/internal/channelz/types_linux.go | 2 - - .../grpc/internal/channelz/types_nonlinux.go | 5 +- - .../grpc/internal/channelz/util_linux.go | 2 - - .../grpc/internal/channelz/util_nonlinux.go | 3 +- - .../grpc/internal/credentials/spiffe.go | 2 - - .../grpc/internal/credentials/syscallconn.go | 2 - - .../grpc/internal/credentials/util.go | 4 +- - .../grpc/internal/envconfig/envconfig.go | 46 +- - .../grpc/internal/envconfig/observability.go | 42 + - .../grpc/internal/envconfig/xds.go | 95 + - .../grpc/internal/grpclog/grpclog.go | 10 +- - .../grpc/internal/grpclog/prefixLogger.go | 12 + - .../grpc/internal/grpcrand/grpcrand.go | 21 + - .../internal/grpcsync/callback_serializer.go | 119 + - .../oncefunc.go} | 19 +- - .../grpc/internal/grpcutil/compressor.go | 47 + - .../grpcutil.go} | 16 +- - .../grpc/internal/grpcutil/method.go | 6 +- - .../dns/go113.go => grpcutil/regex.go} | 22 +- - .../grpc/internal/grpcutil/target.go | 89 - - .../grpc/internal/internal.go | 114 +- - .../grpc/internal/metadata/metadata.go | 88 +- - .../grpc/internal/pretty/pretty.go | 82 + - .../grpc/internal/resolver/config_selector.go | 9 +- - .../internal/resolver/dns/dns_resolver.go | 15 +- - .../resolver/passthrough/passthrough.go | 11 +- - .../grpc/internal/resolver/unix/unix.go | 21 +- - .../grpc/internal/serviceconfig/duration.go | 130 + - .../internal/serviceconfig/serviceconfig.go | 12 +- - .../grpc/internal/status/status.go | 10 + - .../grpc/internal/syscall/syscall_linux.go | 2 - - .../grpc/internal/syscall/syscall_nonlinux.go | 21 +- - .../grpc/internal/transport/controlbuf.go | 145 +- - .../grpc/internal/transport/defaults.go | 6 + - .../grpc/internal/transport/flowcontrol.go | 4 +- - .../grpc/internal/transport/handler_server.go | 80 +- - .../grpc/internal/transport/http2_client.go | 500 +- - .../grpc/internal/transport/http2_server.go | 477 +- - .../grpc/internal/transport/http_util.go | 60 +- - .../grpc/internal/transport/logging.go | 40 + - .../transport/networktype/networktype.go | 2 +- - .../grpc/internal/transport/proxy.go | 4 +- - .../grpc/internal/transport/transport.go | 62 +- - .../grpc/internal/xds_handshake_cluster.go | 2 +- - .../grpc/metadata/metadata.go | 82 +- - .../google.golang.org/grpc/picker_wrapper.go | 77 +- - vendor/google.golang.org/grpc/pickfirst.go | 181 +- - vendor/google.golang.org/grpc/preloader.go | 2 +- - vendor/google.golang.org/grpc/regenerate.sh | 44 +- - vendor/google.golang.org/grpc/resolver/map.go | 138 + - .../grpc/resolver/resolver.go | 110 +- - .../grpc/resolver_conn_wrapper.go | 238 +- - vendor/google.golang.org/grpc/rpc_util.go | 121 +- - vendor/google.golang.org/grpc/server.go | 658 +- - .../google.golang.org/grpc/service_config.go | 95 +- - .../grpc/serviceconfig/serviceconfig.go | 2 +- - vendor/google.golang.org/grpc/stats/stats.go | 29 +- - .../google.golang.org/grpc/status/status.go | 83 +- - vendor/google.golang.org/grpc/stream.go | 617 +- - vendor/google.golang.org/grpc/tap/tap.go | 2 +- - vendor/google.golang.org/grpc/version.go | 2 +- - vendor/google.golang.org/grpc/vet.sh | 47 +- - vendor/google.golang.org/protobuf/AUTHORS | 3 - - .../google.golang.org/protobuf/CONTRIBUTORS | 3 - - .../protobuf/encoding/protojson/decode.go | 665 ++ - .../protobuf/encoding/protojson/doc.go | 11 + - .../protobuf/encoding/protojson/encode.go | 343 + - .../encoding/protojson/well_known_types.go | 895 ++ - .../protobuf/encoding/prototext/decode.go | 116 +- - .../protobuf/encoding/prototext/encode.go | 39 +- - .../protobuf/encoding/protowire/wire.go | 12 +- - .../protobuf/internal/descfmt/stringer.go | 66 +- - .../internal/encoding/defval/default.go | 78 +- - .../protobuf/internal/encoding/json/decode.go | 340 + - .../internal/encoding/json/decode_number.go | 254 + - .../internal/encoding/json/decode_string.go | 91 + - .../internal/encoding/json/decode_token.go | 192 + - .../protobuf/internal/encoding/json/encode.go | 276 + - .../encoding/messageset/messageset.go | 7 +- - .../protobuf/internal/encoding/tag/tag.go | 96 +- - .../protobuf/internal/encoding/text/decode.go | 35 +- - .../internal/encoding/text/decode_number.go | 49 +- - .../protobuf/internal/encoding/text/doc.go | 4 +- - .../protobuf/internal/filedesc/build.go | 19 +- - .../protobuf/internal/filedesc/desc.go | 380 +- - .../protobuf/internal/filedesc/desc_init.go | 36 +- - .../protobuf/internal/filedesc/desc_lazy.go | 80 +- - .../protobuf/internal/filedesc/desc_list.go | 167 +- - .../protobuf/internal/filedesc/placeholder.go | 136 +- - .../protobuf/internal/filetype/build.go | 87 +- - .../protobuf/internal/genid/descriptor_gen.go | 90 +- - .../protobuf/internal/impl/api_export.go | 42 +- - .../protobuf/internal/impl/checkinit.go | 12 +- - .../protobuf/internal/impl/codec_extension.go | 36 +- - .../protobuf/internal/impl/codec_field.go | 90 +- - .../protobuf/internal/impl/codec_map.go | 20 +- - .../protobuf/internal/impl/codec_message.go | 30 +- - .../protobuf/internal/impl/codec_tables.go | 290 +- - .../protobuf/internal/impl/convert.go | 229 +- - .../protobuf/internal/impl/convert_list.go | 42 +- - .../protobuf/internal/impl/convert_map.go | 32 +- - .../protobuf/internal/impl/decode.go | 21 +- - .../protobuf/internal/impl/enum.go | 10 +- - .../protobuf/internal/impl/extension.go | 26 +- - .../protobuf/internal/impl/legacy_enum.go | 57 +- - .../protobuf/internal/impl/legacy_export.go | 18 +- - .../internal/impl/legacy_extension.go | 100 +- - .../protobuf/internal/impl/legacy_message.go | 122 +- - .../protobuf/internal/impl/merge.go | 32 +- - .../protobuf/internal/impl/message.go | 41 +- - .../protobuf/internal/impl/message_reflect.go | 74 +- - .../internal/impl/message_reflect_field.go | 118 +- - .../protobuf/internal/impl/validate.go | 50 +- - .../protobuf/internal/impl/weak.go | 16 +- - .../protobuf/internal/order/order.go | 16 +- - .../protobuf/internal/order/range.go | 22 +- - .../protobuf/internal/strs/strings_unsafe.go | 8 +- - .../protobuf/internal/version/version.go | 54 +- - .../protobuf/proto/decode.go | 3 +- - .../google.golang.org/protobuf/proto/doc.go | 24 +- - .../protobuf/proto/encode.go | 5 +- - .../google.golang.org/protobuf/proto/equal.go | 178 +- - .../reflect/protodesc/desc_resolve.go | 6 +- - .../protobuf/reflect/protoreflect/proto.go | 32 +- - .../protobuf/reflect/protoreflect/source.go | 1 + - .../reflect/protoreflect/source_gen.go | 14 + - .../protobuf/reflect/protoreflect/type.go | 1 + - .../protobuf/reflect/protoreflect/value.go | 2 +- - .../reflect/protoreflect/value_equal.go | 168 + - .../reflect/protoreflect/value_union.go | 6 +- - .../reflect/protoregistry/registry.go | 4 +- - .../protobuf/runtime/protoimpl/version.go | 8 +- - .../types/descriptorpb/descriptor.pb.go | 1547 ++-- - .../protobuf/types/known/anypb/any.pb.go | 135 +- - .../types/known/durationpb/duration.pb.go | 63 +- - .../types/known/timestamppb/timestamp.pb.go | 61 +- - vendor/k8s.io/client-go/pkg/version/base.go | 4 +- - vendor/modules.txt | 34 +- - 384 files changed, 36193 insertions(+), 12803 deletions(-) - create mode 100644 vendor/github.com/cespare/xxhash/v2/testall.sh - create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s - rename vendor/github.com/cespare/xxhash/v2/{xxhash_amd64.go => xxhash_asm.go} (73%) - create mode 100644 vendor/github.com/golang/protobuf/jsonpb/decode.go - create mode 100644 vendor/github.com/golang/protobuf/jsonpb/encode.go - create mode 100644 vendor/github.com/golang/protobuf/jsonpb/json.go - delete mode 100644 vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go - delete mode 100644 vendor/golang.org/x/net/http2/Dockerfile - delete mode 100644 vendor/golang.org/x/net/http2/Makefile - create mode 100644 vendor/golang.org/x/net/http2/writesched_roundrobin.go - create mode 100644 vendor/golang.org/x/net/idna/tables15.0.0.go - create mode 100644 vendor/golang.org/x/net/idna/trie12.0.0.go - create mode 100644 vendor/golang.org/x/net/idna/trie13.0.0.go - delete mode 100644 vendor/golang.org/x/oauth2/AUTHORS - delete mode 100644 vendor/golang.org/x/oauth2/CONTRIBUTORS - delete mode 100644 vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go - create mode 100644 vendor/golang.org/x/sys/unix/ioctl_signed.go - rename vendor/golang.org/x/sys/unix/{ioctl.go => ioctl_unsigned.go} (76%) - create mode 100644 vendor/golang.org/x/sys/unix/mmap_nomremap.go - create mode 100644 vendor/golang.org/x/sys/unix/mremap.go - create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go - create mode 100644 vendor/golang.org/x/text/unicode/norm/tables15.0.0.go - create mode 100644 vendor/google.golang.org/grpc/NOTICE.txt - create mode 100644 vendor/google.golang.org/grpc/balancer/conn_state_evaluator.go - create mode 100644 vendor/google.golang.org/grpc/channelz/channelz.go - delete mode 100644 vendor/google.golang.org/grpc/credentials/go12.go - create mode 100644 vendor/google.golang.org/grpc/idle.go - delete mode 100644 vendor/google.golang.org/grpc/install_gae.sh - create mode 100644 vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go - create mode 100644 vendor/google.golang.org/grpc/internal/channelz/id.go - create mode 100644 vendor/google.golang.org/grpc/internal/envconfig/observability.go - create mode 100644 vendor/google.golang.org/grpc/internal/envconfig/xds.go - create mode 100644 vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go - rename vendor/google.golang.org/grpc/internal/{credentials/spiffe_appengine.go => grpcsync/oncefunc.go} (67%) - create mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/compressor.go - rename vendor/google.golang.org/grpc/internal/{credentials/syscallconn_appengine.go => grpcutil/grpcutil.go} (72%) - rename vendor/google.golang.org/grpc/internal/{resolver/dns/go113.go => grpcutil/regex.go} (63%) - delete mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/target.go - create mode 100644 vendor/google.golang.org/grpc/internal/pretty/pretty.go - create mode 100644 vendor/google.golang.org/grpc/internal/serviceconfig/duration.go - create mode 100644 vendor/google.golang.org/grpc/internal/transport/logging.go - create mode 100644 vendor/google.golang.org/grpc/resolver/map.go - delete mode 100644 vendor/google.golang.org/protobuf/AUTHORS - delete mode 100644 vendor/google.golang.org/protobuf/CONTRIBUTORS - create mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/decode.go - create mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/doc.go - create mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/encode.go - create mode 100644 vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go - create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode.go - create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go - create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go - create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go - create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/json/encode.go - create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go - -diff --git a/go.mod b/go.mod -index c731104..192b65c 100644 ---- a/go.mod -+++ b/go.mod -@@ -13,9 +13,9 @@ require ( - github.com/onsi/gomega v1.24.0 - github.com/pkg/errors v0.9.1 // indirect - github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 -- golang.org/x/net v0.7.0 -- golang.org/x/sys v0.5.0 -- google.golang.org/grpc v1.40.0 -+ golang.org/x/net v0.17.0 -+ golang.org/x/sys v0.13.0 -+ google.golang.org/grpc v1.56.3 - gopkg.in/natefinch/lumberjack.v2 v2.0.0 - k8s.io/api v0.22.8 - k8s.io/apimachinery v0.22.8 -@@ -27,16 +27,19 @@ require ( - sigs.k8s.io/yaml v1.3.0 // indirect - ) - --require github.com/prometheus/client_golang v1.12.2 -+require ( -+ github.com/prometheus/client_golang v1.12.2 -+ github.com/spf13/pflag v1.0.5 -+) - - require ( - github.com/beorn7/perks v1.0.1 // indirect -- github.com/cespare/xxhash/v2 v2.1.2 // indirect -+ github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect -- github.com/golang/protobuf v1.5.2 // indirect -+ github.com/golang/protobuf v1.5.3 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/googleapis/gnostic v0.5.5 // indirect -@@ -48,15 +51,14 @@ require ( - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect -- github.com/spf13/pflag v1.0.5 // indirect - github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f // indirect -- golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f // indirect -- golang.org/x/term v0.5.0 // indirect -- golang.org/x/text v0.7.0 // indirect -+ golang.org/x/oauth2 v0.7.0 // indirect -+ golang.org/x/term v0.13.0 // indirect -+ golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect - google.golang.org/appengine v1.6.7 // indirect -- google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 // indirect -- google.golang.org/protobuf v1.28.0 // indirect -+ google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect -+ google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -diff --git a/go.sum b/go.sum -index 1b9825d..0dabda6 100644 ---- a/go.sum -+++ b/go.sum -@@ -70,15 +70,15 @@ github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb - github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= - github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= - github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= --github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= - github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= - github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= - github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= - github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= - github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= - github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= - github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= --github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= - github.com/containernetworking/cni v1.1.2 h1:wtRGZVv7olUHMOqouPpn3cXJWpJgM6+EUl31EQbXALQ= - github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= - github.com/containernetworking/plugins v1.1.0 h1:kTIldaDo9SlbQsjhUKvDx0v9q7zyIFJH/Rm9F4xRBro= -@@ -104,7 +104,6 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m - github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= - github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= - github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= --github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= - github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= - github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= - github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -@@ -168,8 +167,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD - github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= - github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= - github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= --github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= - github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= - github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= - github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= - github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -@@ -501,16 +501,16 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b - golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= - golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= - golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= --golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= --golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= - golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= - golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= - golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= - golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= - golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= - golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= --golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw= --golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -+golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -+golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= - golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= - golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= - golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -@@ -576,13 +576,13 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc - golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= - golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= - golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= --golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= --golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= - golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= - golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= - golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= --golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= --golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -+golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -+golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= - golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= - golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= - golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -@@ -590,8 +590,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= - golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= - golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= - golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= --golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= --golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= - golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= - golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= - golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -@@ -704,8 +704,8 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D - google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= - google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= - google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= --google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 h1:Et6SkiuvnBn+SgrSYXs/BrUpGB4mbdwt4R3vaPIlicA= --google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -+google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -+google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= - google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= - google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= - google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -@@ -722,8 +722,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp - google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= - google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= - google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= --google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= --google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -+google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -+google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= - google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= - google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= - google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -@@ -736,9 +736,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj - google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= - google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= - google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= --google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= --google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= --google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -+google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= - gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= - gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= - gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -diff --git a/vendor/github.com/cespare/xxhash/v2/README.md b/vendor/github.com/cespare/xxhash/v2/README.md -index 792b4a6..8bf0e5b 100644 ---- a/vendor/github.com/cespare/xxhash/v2/README.md -+++ b/vendor/github.com/cespare/xxhash/v2/README.md -@@ -3,8 +3,7 @@ - [![Go Reference](https://pkg.go.dev/badge/github.com/cespare/xxhash/v2.svg)](https://pkg.go.dev/github.com/cespare/xxhash/v2) - [![Test](https://github.com/cespare/xxhash/actions/workflows/test.yml/badge.svg)](https://github.com/cespare/xxhash/actions/workflows/test.yml) - --xxhash is a Go implementation of the 64-bit --[xxHash](http://cyan4973.github.io/xxHash/) algorithm, XXH64. This is a -+xxhash is a Go implementation of the 64-bit [xxHash] algorithm, XXH64. This is a - high-quality hashing algorithm that is much faster than anything in the Go - standard library. - -@@ -25,8 +24,11 @@ func (*Digest) WriteString(string) (int, error) - func (*Digest) Sum64() uint64 - ``` - --This implementation provides a fast pure-Go implementation and an even faster --assembly implementation for amd64. -+The package is written with optimized pure Go and also contains even faster -+assembly implementations for amd64 and arm64. If desired, the `purego` build tag -+opts into using the Go code even on those architectures. -+ -+[xxHash]: http://cyan4973.github.io/xxHash/ - - ## Compatibility - -@@ -45,19 +47,20 @@ I recommend using the latest release of Go. - Here are some quick benchmarks comparing the pure-Go and assembly - implementations of Sum64. - --| input size | purego | asm | --| --- | --- | --- | --| 5 B | 979.66 MB/s | 1291.17 MB/s | --| 100 B | 7475.26 MB/s | 7973.40 MB/s | --| 4 KB | 17573.46 MB/s | 17602.65 MB/s | --| 10 MB | 17131.46 MB/s | 17142.16 MB/s | -+| input size | purego | asm | -+| ---------- | --------- | --------- | -+| 4 B | 1.3 GB/s | 1.2 GB/s | -+| 16 B | 2.9 GB/s | 3.5 GB/s | -+| 100 B | 6.9 GB/s | 8.1 GB/s | -+| 4 KB | 11.7 GB/s | 16.7 GB/s | -+| 10 MB | 12.0 GB/s | 17.3 GB/s | - --These numbers were generated on Ubuntu 18.04 with an Intel i7-8700K CPU using --the following commands under Go 1.11.2: -+These numbers were generated on Ubuntu 20.04 with an Intel Xeon Platinum 8252C -+CPU using the following commands under Go 1.19.2: - - ``` --$ go test -tags purego -benchtime 10s -bench '/xxhash,direct,bytes' --$ go test -benchtime 10s -bench '/xxhash,direct,bytes' -+benchstat <(go test -tags purego -benchtime 500ms -count 15 -bench 'Sum64$') -+benchstat <(go test -benchtime 500ms -count 15 -bench 'Sum64$') - ``` - - ## Projects using this package -diff --git a/vendor/github.com/cespare/xxhash/v2/testall.sh b/vendor/github.com/cespare/xxhash/v2/testall.sh -new file mode 100644 -index 0000000..94b9c44 ---- /dev/null -+++ b/vendor/github.com/cespare/xxhash/v2/testall.sh -@@ -0,0 +1,10 @@ -+#!/bin/bash -+set -eu -o pipefail -+ -+# Small convenience script for running the tests with various combinations of -+# arch/tags. This assumes we're running on amd64 and have qemu available. -+ -+go test ./... -+go test -tags purego ./... -+GOARCH=arm64 go test -+GOARCH=arm64 go test -tags purego -diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash.go b/vendor/github.com/cespare/xxhash/v2/xxhash.go -index 15c835d..a9e0d45 100644 ---- a/vendor/github.com/cespare/xxhash/v2/xxhash.go -+++ b/vendor/github.com/cespare/xxhash/v2/xxhash.go -@@ -16,19 +16,11 @@ const ( - prime5 uint64 = 2870177450012600261 - ) - --// NOTE(caleb): I'm using both consts and vars of the primes. Using consts where --// possible in the Go code is worth a small (but measurable) performance boost --// by avoiding some MOVQs. Vars are needed for the asm and also are useful for --// convenience in the Go code in a few places where we need to intentionally --// avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the --// result overflows a uint64). --var ( -- prime1v = prime1 -- prime2v = prime2 -- prime3v = prime3 -- prime4v = prime4 -- prime5v = prime5 --) -+// Store the primes in an array as well. -+// -+// The consts are used when possible in Go code to avoid MOVs but we need a -+// contiguous array of the assembly code. -+var primes = [...]uint64{prime1, prime2, prime3, prime4, prime5} - - // Digest implements hash.Hash64. - type Digest struct { -@@ -50,10 +42,10 @@ func New() *Digest { - - // Reset clears the Digest's state so that it can be reused. - func (d *Digest) Reset() { -- d.v1 = prime1v + prime2 -+ d.v1 = primes[0] + prime2 - d.v2 = prime2 - d.v3 = 0 -- d.v4 = -prime1v -+ d.v4 = -primes[0] - d.total = 0 - d.n = 0 - } -@@ -69,21 +61,23 @@ func (d *Digest) Write(b []byte) (n int, err error) { - n = len(b) - d.total += uint64(n) - -+ memleft := d.mem[d.n&(len(d.mem)-1):] -+ - if d.n+n < 32 { - // This new data doesn't even fill the current block. -- copy(d.mem[d.n:], b) -+ copy(memleft, b) - d.n += n - return - } - - if d.n > 0 { - // Finish off the partial block. -- copy(d.mem[d.n:], b) -+ c := copy(memleft, b) - d.v1 = round(d.v1, u64(d.mem[0:8])) - d.v2 = round(d.v2, u64(d.mem[8:16])) - d.v3 = round(d.v3, u64(d.mem[16:24])) - d.v4 = round(d.v4, u64(d.mem[24:32])) -- b = b[32-d.n:] -+ b = b[c:] - d.n = 0 - } - -@@ -133,21 +127,20 @@ func (d *Digest) Sum64() uint64 { - - h += d.total - -- i, end := 0, d.n -- for ; i+8 <= end; i += 8 { -- k1 := round(0, u64(d.mem[i:i+8])) -+ b := d.mem[:d.n&(len(d.mem)-1)] -+ for ; len(b) >= 8; b = b[8:] { -+ k1 := round(0, u64(b[:8])) - h ^= k1 - h = rol27(h)*prime1 + prime4 - } -- if i+4 <= end { -- h ^= uint64(u32(d.mem[i:i+4])) * prime1 -+ if len(b) >= 4 { -+ h ^= uint64(u32(b[:4])) * prime1 - h = rol23(h)*prime2 + prime3 -- i += 4 -+ b = b[4:] - } -- for i < end { -- h ^= uint64(d.mem[i]) * prime5 -+ for ; len(b) > 0; b = b[1:] { -+ h ^= uint64(b[0]) * prime5 - h = rol11(h) * prime1 -- i++ - } - - h ^= h >> 33 -diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s b/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s -index be8db5b..3e8b132 100644 ---- a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s -+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s -@@ -1,215 +1,209 @@ -+//go:build !appengine && gc && !purego - // +build !appengine - // +build gc - // +build !purego - - #include "textflag.h" - --// Register allocation: --// AX h --// SI pointer to advance through b --// DX n --// BX loop end --// R8 v1, k1 --// R9 v2 --// R10 v3 --// R11 v4 --// R12 tmp --// R13 prime1v --// R14 prime2v --// DI prime4v -- --// round reads from and advances the buffer pointer in SI. --// It assumes that R13 has prime1v and R14 has prime2v. --#define round(r) \ -- MOVQ (SI), R12 \ -- ADDQ $8, SI \ -- IMULQ R14, R12 \ -- ADDQ R12, r \ -- ROLQ $31, r \ -- IMULQ R13, r -- --// mergeRound applies a merge round on the two registers acc and val. --// It assumes that R13 has prime1v, R14 has prime2v, and DI has prime4v. --#define mergeRound(acc, val) \ -- IMULQ R14, val \ -- ROLQ $31, val \ -- IMULQ R13, val \ -- XORQ val, acc \ -- IMULQ R13, acc \ -- ADDQ DI, acc -+// Registers: -+#define h AX -+#define d AX -+#define p SI // pointer to advance through b -+#define n DX -+#define end BX // loop end -+#define v1 R8 -+#define v2 R9 -+#define v3 R10 -+#define v4 R11 -+#define x R12 -+#define prime1 R13 -+#define prime2 R14 -+#define prime4 DI -+ -+#define round(acc, x) \ -+ IMULQ prime2, x \ -+ ADDQ x, acc \ -+ ROLQ $31, acc \ -+ IMULQ prime1, acc -+ -+// round0 performs the operation x = round(0, x). -+#define round0(x) \ -+ IMULQ prime2, x \ -+ ROLQ $31, x \ -+ IMULQ prime1, x -+ -+// mergeRound applies a merge round on the two registers acc and x. -+// It assumes that prime1, prime2, and prime4 have been loaded. -+#define mergeRound(acc, x) \ -+ round0(x) \ -+ XORQ x, acc \ -+ IMULQ prime1, acc \ -+ ADDQ prime4, acc -+ -+// blockLoop processes as many 32-byte blocks as possible, -+// updating v1, v2, v3, and v4. It assumes that there is at least one block -+// to process. -+#define blockLoop() \ -+loop: \ -+ MOVQ +0(p), x \ -+ round(v1, x) \ -+ MOVQ +8(p), x \ -+ round(v2, x) \ -+ MOVQ +16(p), x \ -+ round(v3, x) \ -+ MOVQ +24(p), x \ -+ round(v4, x) \ -+ ADDQ $32, p \ -+ CMPQ p, end \ -+ JLE loop - - // func Sum64(b []byte) uint64 --TEXT ·Sum64(SB), NOSPLIT, $0-32 -+TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32 - // Load fixed primes. -- MOVQ ·prime1v(SB), R13 -- MOVQ ·prime2v(SB), R14 -- MOVQ ·prime4v(SB), DI -+ MOVQ ·primes+0(SB), prime1 -+ MOVQ ·primes+8(SB), prime2 -+ MOVQ ·primes+24(SB), prime4 - - // Load slice. -- MOVQ b_base+0(FP), SI -- MOVQ b_len+8(FP), DX -- LEAQ (SI)(DX*1), BX -+ MOVQ b_base+0(FP), p -+ MOVQ b_len+8(FP), n -+ LEAQ (p)(n*1), end - - // The first loop limit will be len(b)-32. -- SUBQ $32, BX -+ SUBQ $32, end - - // Check whether we have at least one block. -- CMPQ DX, $32 -+ CMPQ n, $32 - JLT noBlocks - - // Set up initial state (v1, v2, v3, v4). -- MOVQ R13, R8 -- ADDQ R14, R8 -- MOVQ R14, R9 -- XORQ R10, R10 -- XORQ R11, R11 -- SUBQ R13, R11 -- -- // Loop until SI > BX. --blockLoop: -- round(R8) -- round(R9) -- round(R10) -- round(R11) -- -- CMPQ SI, BX -- JLE blockLoop -- -- MOVQ R8, AX -- ROLQ $1, AX -- MOVQ R9, R12 -- ROLQ $7, R12 -- ADDQ R12, AX -- MOVQ R10, R12 -- ROLQ $12, R12 -- ADDQ R12, AX -- MOVQ R11, R12 -- ROLQ $18, R12 -- ADDQ R12, AX -- -- mergeRound(AX, R8) -- mergeRound(AX, R9) -- mergeRound(AX, R10) -- mergeRound(AX, R11) -+ MOVQ prime1, v1 -+ ADDQ prime2, v1 -+ MOVQ prime2, v2 -+ XORQ v3, v3 -+ XORQ v4, v4 -+ SUBQ prime1, v4 -+ -+ blockLoop() -+ -+ MOVQ v1, h -+ ROLQ $1, h -+ MOVQ v2, x -+ ROLQ $7, x -+ ADDQ x, h -+ MOVQ v3, x -+ ROLQ $12, x -+ ADDQ x, h -+ MOVQ v4, x -+ ROLQ $18, x -+ ADDQ x, h -+ -+ mergeRound(h, v1) -+ mergeRound(h, v2) -+ mergeRound(h, v3) -+ mergeRound(h, v4) - - JMP afterBlocks - - noBlocks: -- MOVQ ·prime5v(SB), AX -+ MOVQ ·primes+32(SB), h - - afterBlocks: -- ADDQ DX, AX -- -- // Right now BX has len(b)-32, and we want to loop until SI > len(b)-8. -- ADDQ $24, BX -- -- CMPQ SI, BX -- JG fourByte -- --wordLoop: -- // Calculate k1. -- MOVQ (SI), R8 -- ADDQ $8, SI -- IMULQ R14, R8 -- ROLQ $31, R8 -- IMULQ R13, R8 -- -- XORQ R8, AX -- ROLQ $27, AX -- IMULQ R13, AX -- ADDQ DI, AX -- -- CMPQ SI, BX -- JLE wordLoop -- --fourByte: -- ADDQ $4, BX -- CMPQ SI, BX -- JG singles -- -- MOVL (SI), R8 -- ADDQ $4, SI -- IMULQ R13, R8 -- XORQ R8, AX -- -- ROLQ $23, AX -- IMULQ R14, AX -- ADDQ ·prime3v(SB), AX -- --singles: -- ADDQ $4, BX -- CMPQ SI, BX -+ ADDQ n, h -+ -+ ADDQ $24, end -+ CMPQ p, end -+ JG try4 -+ -+loop8: -+ MOVQ (p), x -+ ADDQ $8, p -+ round0(x) -+ XORQ x, h -+ ROLQ $27, h -+ IMULQ prime1, h -+ ADDQ prime4, h -+ -+ CMPQ p, end -+ JLE loop8 -+ -+try4: -+ ADDQ $4, end -+ CMPQ p, end -+ JG try1 -+ -+ MOVL (p), x -+ ADDQ $4, p -+ IMULQ prime1, x -+ XORQ x, h -+ -+ ROLQ $23, h -+ IMULQ prime2, h -+ ADDQ ·primes+16(SB), h -+ -+try1: -+ ADDQ $4, end -+ CMPQ p, end - JGE finalize - --singlesLoop: -- MOVBQZX (SI), R12 -- ADDQ $1, SI -- IMULQ ·prime5v(SB), R12 -- XORQ R12, AX -+loop1: -+ MOVBQZX (p), x -+ ADDQ $1, p -+ IMULQ ·primes+32(SB), x -+ XORQ x, h -+ ROLQ $11, h -+ IMULQ prime1, h - -- ROLQ $11, AX -- IMULQ R13, AX -- -- CMPQ SI, BX -- JL singlesLoop -+ CMPQ p, end -+ JL loop1 - - finalize: -- MOVQ AX, R12 -- SHRQ $33, R12 -- XORQ R12, AX -- IMULQ R14, AX -- MOVQ AX, R12 -- SHRQ $29, R12 -- XORQ R12, AX -- IMULQ ·prime3v(SB), AX -- MOVQ AX, R12 -- SHRQ $32, R12 -- XORQ R12, AX -- -- MOVQ AX, ret+24(FP) -+ MOVQ h, x -+ SHRQ $33, x -+ XORQ x, h -+ IMULQ prime2, h -+ MOVQ h, x -+ SHRQ $29, x -+ XORQ x, h -+ IMULQ ·primes+16(SB), h -+ MOVQ h, x -+ SHRQ $32, x -+ XORQ x, h -+ -+ MOVQ h, ret+24(FP) - RET - --// writeBlocks uses the same registers as above except that it uses AX to store --// the d pointer. -- - // func writeBlocks(d *Digest, b []byte) int --TEXT ·writeBlocks(SB), NOSPLIT, $0-40 -+TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40 - // Load fixed primes needed for round. -- MOVQ ·prime1v(SB), R13 -- MOVQ ·prime2v(SB), R14 -+ MOVQ ·primes+0(SB), prime1 -+ MOVQ ·primes+8(SB), prime2 - - // Load slice. -- MOVQ b_base+8(FP), SI -- MOVQ b_len+16(FP), DX -- LEAQ (SI)(DX*1), BX -- SUBQ $32, BX -+ MOVQ b_base+8(FP), p -+ MOVQ b_len+16(FP), n -+ LEAQ (p)(n*1), end -+ SUBQ $32, end - - // Load vN from d. -- MOVQ d+0(FP), AX -- MOVQ 0(AX), R8 // v1 -- MOVQ 8(AX), R9 // v2 -- MOVQ 16(AX), R10 // v3 -- MOVQ 24(AX), R11 // v4 -+ MOVQ s+0(FP), d -+ MOVQ 0(d), v1 -+ MOVQ 8(d), v2 -+ MOVQ 16(d), v3 -+ MOVQ 24(d), v4 - - // We don't need to check the loop condition here; this function is - // always called with at least one block of data to process. --blockLoop: -- round(R8) -- round(R9) -- round(R10) -- round(R11) -- -- CMPQ SI, BX -- JLE blockLoop -+ blockLoop() - - // Copy vN back to d. -- MOVQ R8, 0(AX) -- MOVQ R9, 8(AX) -- MOVQ R10, 16(AX) -- MOVQ R11, 24(AX) -- -- // The number of bytes written is SI minus the old base pointer. -- SUBQ b_base+8(FP), SI -- MOVQ SI, ret+32(FP) -+ MOVQ v1, 0(d) -+ MOVQ v2, 8(d) -+ MOVQ v3, 16(d) -+ MOVQ v4, 24(d) -+ -+ // The number of bytes written is p minus the old base pointer. -+ SUBQ b_base+8(FP), p -+ MOVQ p, ret+32(FP) - - RET -diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s b/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s -new file mode 100644 -index 0000000..7e3145a ---- /dev/null -+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s -@@ -0,0 +1,183 @@ -+//go:build !appengine && gc && !purego -+// +build !appengine -+// +build gc -+// +build !purego -+ -+#include "textflag.h" -+ -+// Registers: -+#define digest R1 -+#define h R2 // return value -+#define p R3 // input pointer -+#define n R4 // input length -+#define nblocks R5 // n / 32 -+#define prime1 R7 -+#define prime2 R8 -+#define prime3 R9 -+#define prime4 R10 -+#define prime5 R11 -+#define v1 R12 -+#define v2 R13 -+#define v3 R14 -+#define v4 R15 -+#define x1 R20 -+#define x2 R21 -+#define x3 R22 -+#define x4 R23 -+ -+#define round(acc, x) \ -+ MADD prime2, acc, x, acc \ -+ ROR $64-31, acc \ -+ MUL prime1, acc -+ -+// round0 performs the operation x = round(0, x). -+#define round0(x) \ -+ MUL prime2, x \ -+ ROR $64-31, x \ -+ MUL prime1, x -+ -+#define mergeRound(acc, x) \ -+ round0(x) \ -+ EOR x, acc \ -+ MADD acc, prime4, prime1, acc -+ -+// blockLoop processes as many 32-byte blocks as possible, -+// updating v1, v2, v3, and v4. It assumes that n >= 32. -+#define blockLoop() \ -+ LSR $5, n, nblocks \ -+ PCALIGN $16 \ -+ loop: \ -+ LDP.P 16(p), (x1, x2) \ -+ LDP.P 16(p), (x3, x4) \ -+ round(v1, x1) \ -+ round(v2, x2) \ -+ round(v3, x3) \ -+ round(v4, x4) \ -+ SUB $1, nblocks \ -+ CBNZ nblocks, loop -+ -+// func Sum64(b []byte) uint64 -+TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32 -+ LDP b_base+0(FP), (p, n) -+ -+ LDP ·primes+0(SB), (prime1, prime2) -+ LDP ·primes+16(SB), (prime3, prime4) -+ MOVD ·primes+32(SB), prime5 -+ -+ CMP $32, n -+ CSEL LT, prime5, ZR, h // if n < 32 { h = prime5 } else { h = 0 } -+ BLT afterLoop -+ -+ ADD prime1, prime2, v1 -+ MOVD prime2, v2 -+ MOVD $0, v3 -+ NEG prime1, v4 -+ -+ blockLoop() -+ -+ ROR $64-1, v1, x1 -+ ROR $64-7, v2, x2 -+ ADD x1, x2 -+ ROR $64-12, v3, x3 -+ ROR $64-18, v4, x4 -+ ADD x3, x4 -+ ADD x2, x4, h -+ -+ mergeRound(h, v1) -+ mergeRound(h, v2) -+ mergeRound(h, v3) -+ mergeRound(h, v4) -+ -+afterLoop: -+ ADD n, h -+ -+ TBZ $4, n, try8 -+ LDP.P 16(p), (x1, x2) -+ -+ round0(x1) -+ -+ // NOTE: here and below, sequencing the EOR after the ROR (using a -+ // rotated register) is worth a small but measurable speedup for small -+ // inputs. -+ ROR $64-27, h -+ EOR x1 @> 64-27, h, h -+ MADD h, prime4, prime1, h -+ -+ round0(x2) -+ ROR $64-27, h -+ EOR x2 @> 64-27, h, h -+ MADD h, prime4, prime1, h -+ -+try8: -+ TBZ $3, n, try4 -+ MOVD.P 8(p), x1 -+ -+ round0(x1) -+ ROR $64-27, h -+ EOR x1 @> 64-27, h, h -+ MADD h, prime4, prime1, h -+ -+try4: -+ TBZ $2, n, try2 -+ MOVWU.P 4(p), x2 -+ -+ MUL prime1, x2 -+ ROR $64-23, h -+ EOR x2 @> 64-23, h, h -+ MADD h, prime3, prime2, h -+ -+try2: -+ TBZ $1, n, try1 -+ MOVHU.P 2(p), x3 -+ AND $255, x3, x1 -+ LSR $8, x3, x2 -+ -+ MUL prime5, x1 -+ ROR $64-11, h -+ EOR x1 @> 64-11, h, h -+ MUL prime1, h -+ -+ MUL prime5, x2 -+ ROR $64-11, h -+ EOR x2 @> 64-11, h, h -+ MUL prime1, h -+ -+try1: -+ TBZ $0, n, finalize -+ MOVBU (p), x4 -+ -+ MUL prime5, x4 -+ ROR $64-11, h -+ EOR x4 @> 64-11, h, h -+ MUL prime1, h -+ -+finalize: -+ EOR h >> 33, h -+ MUL prime2, h -+ EOR h >> 29, h -+ MUL prime3, h -+ EOR h >> 32, h -+ -+ MOVD h, ret+24(FP) -+ RET -+ -+// func writeBlocks(d *Digest, b []byte) int -+TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40 -+ LDP ·primes+0(SB), (prime1, prime2) -+ -+ // Load state. Assume v[1-4] are stored contiguously. -+ MOVD d+0(FP), digest -+ LDP 0(digest), (v1, v2) -+ LDP 16(digest), (v3, v4) -+ -+ LDP b_base+8(FP), (p, n) -+ -+ blockLoop() -+ -+ // Store updated state. -+ STP (v1, v2), 0(digest) -+ STP (v3, v4), 16(digest) -+ -+ BIC $31, n -+ MOVD n, ret+32(FP) -+ RET -diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go b/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go -similarity index 73% -rename from vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go -rename to vendor/github.com/cespare/xxhash/v2/xxhash_asm.go -index ad14b80..9216e0a 100644 ---- a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go -+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go -@@ -1,3 +1,5 @@ -+//go:build (amd64 || arm64) && !appengine && gc && !purego -+// +build amd64 arm64 - // +build !appengine - // +build gc - // +build !purego -diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_other.go b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go -index 4a5a821..26df13b 100644 ---- a/vendor/github.com/cespare/xxhash/v2/xxhash_other.go -+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go -@@ -1,4 +1,5 @@ --// +build !amd64 appengine !gc purego -+//go:build (!amd64 && !arm64) || appengine || !gc || purego -+// +build !amd64,!arm64 appengine !gc purego - - package xxhash - -@@ -14,10 +15,10 @@ func Sum64(b []byte) uint64 { - var h uint64 - - if n >= 32 { -- v1 := prime1v + prime2 -+ v1 := primes[0] + prime2 - v2 := prime2 - v3 := uint64(0) -- v4 := -prime1v -+ v4 := -primes[0] - for len(b) >= 32 { - v1 = round(v1, u64(b[0:8:len(b)])) - v2 = round(v2, u64(b[8:16:len(b)])) -@@ -36,19 +37,18 @@ func Sum64(b []byte) uint64 { - - h += uint64(n) - -- i, end := 0, len(b) -- for ; i+8 <= end; i += 8 { -- k1 := round(0, u64(b[i:i+8:len(b)])) -+ for ; len(b) >= 8; b = b[8:] { -+ k1 := round(0, u64(b[:8])) - h ^= k1 - h = rol27(h)*prime1 + prime4 - } -- if i+4 <= end { -- h ^= uint64(u32(b[i:i+4:len(b)])) * prime1 -+ if len(b) >= 4 { -+ h ^= uint64(u32(b[:4])) * prime1 - h = rol23(h)*prime2 + prime3 -- i += 4 -+ b = b[4:] - } -- for ; i < end; i++ { -- h ^= uint64(b[i]) * prime5 -+ for ; len(b) > 0; b = b[1:] { -+ h ^= uint64(b[0]) * prime5 - h = rol11(h) * prime1 - } - -diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go -index fc9bea7..e86f1b5 100644 ---- a/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go -+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go -@@ -1,3 +1,4 @@ -+//go:build appengine - // +build appengine - - // This file contains the safe implementations of otherwise unsafe-using code. -diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go -index 376e0ca..1c1638f 100644 ---- a/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go -+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go -@@ -1,3 +1,4 @@ -+//go:build !appengine - // +build !appengine - - // This file encapsulates usage of unsafe. -@@ -11,7 +12,7 @@ import ( - - // In the future it's possible that compiler optimizations will make these - // XxxString functions unnecessary by realizing that calls such as --// Sum64([]byte(s)) don't need to copy s. See https://golang.org/issue/2205. -+// Sum64([]byte(s)) don't need to copy s. See https://go.dev/issue/2205. - // If that happens, even if we keep these functions they can be replaced with - // the trivial safe code. - -diff --git a/vendor/github.com/golang/protobuf/jsonpb/decode.go b/vendor/github.com/golang/protobuf/jsonpb/decode.go -new file mode 100644 -index 0000000..6c16c25 ---- /dev/null -+++ b/vendor/github.com/golang/protobuf/jsonpb/decode.go -@@ -0,0 +1,530 @@ -+// Copyright 2015 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+package jsonpb -+ -+import ( -+ "encoding/json" -+ "errors" -+ "fmt" -+ "io" -+ "math" -+ "reflect" -+ "strconv" -+ "strings" -+ "time" -+ -+ "github.com/golang/protobuf/proto" -+ "google.golang.org/protobuf/encoding/protojson" -+ protoV2 "google.golang.org/protobuf/proto" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoregistry" -+) -+ -+const wrapJSONUnmarshalV2 = false -+ -+// UnmarshalNext unmarshals the next JSON object from d into m. -+func UnmarshalNext(d *json.Decoder, m proto.Message) error { -+ return new(Unmarshaler).UnmarshalNext(d, m) -+} -+ -+// Unmarshal unmarshals a JSON object from r into m. -+func Unmarshal(r io.Reader, m proto.Message) error { -+ return new(Unmarshaler).Unmarshal(r, m) -+} -+ -+// UnmarshalString unmarshals a JSON object from s into m. -+func UnmarshalString(s string, m proto.Message) error { -+ return new(Unmarshaler).Unmarshal(strings.NewReader(s), m) -+} -+ -+// Unmarshaler is a configurable object for converting from a JSON -+// representation to a protocol buffer object. -+type Unmarshaler struct { -+ // AllowUnknownFields specifies whether to allow messages to contain -+ // unknown JSON fields, as opposed to failing to unmarshal. -+ AllowUnknownFields bool -+ -+ // AnyResolver is used to resolve the google.protobuf.Any well-known type. -+ // If unset, the global registry is used by default. -+ AnyResolver AnyResolver -+} -+ -+// JSONPBUnmarshaler is implemented by protobuf messages that customize the way -+// they are unmarshaled from JSON. Messages that implement this should also -+// implement JSONPBMarshaler so that the custom format can be produced. -+// -+// The JSON unmarshaling must follow the JSON to proto specification: -+// https://developers.google.com/protocol-buffers/docs/proto3#json -+// -+// Deprecated: Custom types should implement protobuf reflection instead. -+type JSONPBUnmarshaler interface { -+ UnmarshalJSONPB(*Unmarshaler, []byte) error -+} -+ -+// Unmarshal unmarshals a JSON object from r into m. -+func (u *Unmarshaler) Unmarshal(r io.Reader, m proto.Message) error { -+ return u.UnmarshalNext(json.NewDecoder(r), m) -+} -+ -+// UnmarshalNext unmarshals the next JSON object from d into m. -+func (u *Unmarshaler) UnmarshalNext(d *json.Decoder, m proto.Message) error { -+ if m == nil { -+ return errors.New("invalid nil message") -+ } -+ -+ // Parse the next JSON object from the stream. -+ raw := json.RawMessage{} -+ if err := d.Decode(&raw); err != nil { -+ return err -+ } -+ -+ // Check for custom unmarshalers first since they may not properly -+ // implement protobuf reflection that the logic below relies on. -+ if jsu, ok := m.(JSONPBUnmarshaler); ok { -+ return jsu.UnmarshalJSONPB(u, raw) -+ } -+ -+ mr := proto.MessageReflect(m) -+ -+ // NOTE: For historical reasons, a top-level null is treated as a noop. -+ // This is incorrect, but kept for compatibility. -+ if string(raw) == "null" && mr.Descriptor().FullName() != "google.protobuf.Value" { -+ return nil -+ } -+ -+ if wrapJSONUnmarshalV2 { -+ // NOTE: If input message is non-empty, we need to preserve merge semantics -+ // of the old jsonpb implementation. These semantics are not supported by -+ // the protobuf JSON specification. -+ isEmpty := true -+ mr.Range(func(protoreflect.FieldDescriptor, protoreflect.Value) bool { -+ isEmpty = false // at least one iteration implies non-empty -+ return false -+ }) -+ if !isEmpty { -+ // Perform unmarshaling into a newly allocated, empty message. -+ mr = mr.New() -+ -+ // Use a defer to copy all unmarshaled fields into the original message. -+ dst := proto.MessageReflect(m) -+ defer mr.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { -+ dst.Set(fd, v) -+ return true -+ }) -+ } -+ -+ // Unmarshal using the v2 JSON unmarshaler. -+ opts := protojson.UnmarshalOptions{ -+ DiscardUnknown: u.AllowUnknownFields, -+ } -+ if u.AnyResolver != nil { -+ opts.Resolver = anyResolver{u.AnyResolver} -+ } -+ return opts.Unmarshal(raw, mr.Interface()) -+ } else { -+ if err := u.unmarshalMessage(mr, raw); err != nil { -+ return err -+ } -+ return protoV2.CheckInitialized(mr.Interface()) -+ } -+} -+ -+func (u *Unmarshaler) unmarshalMessage(m protoreflect.Message, in []byte) error { -+ md := m.Descriptor() -+ fds := md.Fields() -+ -+ if jsu, ok := proto.MessageV1(m.Interface()).(JSONPBUnmarshaler); ok { -+ return jsu.UnmarshalJSONPB(u, in) -+ } -+ -+ if string(in) == "null" && md.FullName() != "google.protobuf.Value" { -+ return nil -+ } -+ -+ switch wellKnownType(md.FullName()) { -+ case "Any": -+ var jsonObject map[string]json.RawMessage -+ if err := json.Unmarshal(in, &jsonObject); err != nil { -+ return err -+ } -+ -+ rawTypeURL, ok := jsonObject["@type"] -+ if !ok { -+ return errors.New("Any JSON doesn't have '@type'") -+ } -+ typeURL, err := unquoteString(string(rawTypeURL)) -+ if err != nil { -+ return fmt.Errorf("can't unmarshal Any's '@type': %q", rawTypeURL) -+ } -+ m.Set(fds.ByNumber(1), protoreflect.ValueOfString(typeURL)) -+ -+ var m2 protoreflect.Message -+ if u.AnyResolver != nil { -+ mi, err := u.AnyResolver.Resolve(typeURL) -+ if err != nil { -+ return err -+ } -+ m2 = proto.MessageReflect(mi) -+ } else { -+ mt, err := protoregistry.GlobalTypes.FindMessageByURL(typeURL) -+ if err != nil { -+ if err == protoregistry.NotFound { -+ return fmt.Errorf("could not resolve Any message type: %v", typeURL) -+ } -+ return err -+ } -+ m2 = mt.New() -+ } -+ -+ if wellKnownType(m2.Descriptor().FullName()) != "" { -+ rawValue, ok := jsonObject["value"] -+ if !ok { -+ return errors.New("Any JSON doesn't have 'value'") -+ } -+ if err := u.unmarshalMessage(m2, rawValue); err != nil { -+ return fmt.Errorf("can't unmarshal Any nested proto %v: %v", typeURL, err) -+ } -+ } else { -+ delete(jsonObject, "@type") -+ rawJSON, err := json.Marshal(jsonObject) -+ if err != nil { -+ return fmt.Errorf("can't generate JSON for Any's nested proto to be unmarshaled: %v", err) -+ } -+ if err = u.unmarshalMessage(m2, rawJSON); err != nil { -+ return fmt.Errorf("can't unmarshal Any nested proto %v: %v", typeURL, err) -+ } -+ } -+ -+ rawWire, err := protoV2.Marshal(m2.Interface()) -+ if err != nil { -+ return fmt.Errorf("can't marshal proto %v into Any.Value: %v", typeURL, err) -+ } -+ m.Set(fds.ByNumber(2), protoreflect.ValueOfBytes(rawWire)) -+ return nil -+ case "BoolValue", "BytesValue", "StringValue", -+ "Int32Value", "UInt32Value", "FloatValue", -+ "Int64Value", "UInt64Value", "DoubleValue": -+ fd := fds.ByNumber(1) -+ v, err := u.unmarshalValue(m.NewField(fd), in, fd) -+ if err != nil { -+ return err -+ } -+ m.Set(fd, v) -+ return nil -+ case "Duration": -+ v, err := unquoteString(string(in)) -+ if err != nil { -+ return err -+ } -+ d, err := time.ParseDuration(v) -+ if err != nil { -+ return fmt.Errorf("bad Duration: %v", err) -+ } -+ -+ sec := d.Nanoseconds() / 1e9 -+ nsec := d.Nanoseconds() % 1e9 -+ m.Set(fds.ByNumber(1), protoreflect.ValueOfInt64(int64(sec))) -+ m.Set(fds.ByNumber(2), protoreflect.ValueOfInt32(int32(nsec))) -+ return nil -+ case "Timestamp": -+ v, err := unquoteString(string(in)) -+ if err != nil { -+ return err -+ } -+ t, err := time.Parse(time.RFC3339Nano, v) -+ if err != nil { -+ return fmt.Errorf("bad Timestamp: %v", err) -+ } -+ -+ sec := t.Unix() -+ nsec := t.Nanosecond() -+ m.Set(fds.ByNumber(1), protoreflect.ValueOfInt64(int64(sec))) -+ m.Set(fds.ByNumber(2), protoreflect.ValueOfInt32(int32(nsec))) -+ return nil -+ case "Value": -+ switch { -+ case string(in) == "null": -+ m.Set(fds.ByNumber(1), protoreflect.ValueOfEnum(0)) -+ case string(in) == "true": -+ m.Set(fds.ByNumber(4), protoreflect.ValueOfBool(true)) -+ case string(in) == "false": -+ m.Set(fds.ByNumber(4), protoreflect.ValueOfBool(false)) -+ case hasPrefixAndSuffix('"', in, '"'): -+ s, err := unquoteString(string(in)) -+ if err != nil { -+ return fmt.Errorf("unrecognized type for Value %q", in) -+ } -+ m.Set(fds.ByNumber(3), protoreflect.ValueOfString(s)) -+ case hasPrefixAndSuffix('[', in, ']'): -+ v := m.Mutable(fds.ByNumber(6)) -+ return u.unmarshalMessage(v.Message(), in) -+ case hasPrefixAndSuffix('{', in, '}'): -+ v := m.Mutable(fds.ByNumber(5)) -+ return u.unmarshalMessage(v.Message(), in) -+ default: -+ f, err := strconv.ParseFloat(string(in), 0) -+ if err != nil { -+ return fmt.Errorf("unrecognized type for Value %q", in) -+ } -+ m.Set(fds.ByNumber(2), protoreflect.ValueOfFloat64(f)) -+ } -+ return nil -+ case "ListValue": -+ var jsonArray []json.RawMessage -+ if err := json.Unmarshal(in, &jsonArray); err != nil { -+ return fmt.Errorf("bad ListValue: %v", err) -+ } -+ -+ lv := m.Mutable(fds.ByNumber(1)).List() -+ for _, raw := range jsonArray { -+ ve := lv.NewElement() -+ if err := u.unmarshalMessage(ve.Message(), raw); err != nil { -+ return err -+ } -+ lv.Append(ve) -+ } -+ return nil -+ case "Struct": -+ var jsonObject map[string]json.RawMessage -+ if err := json.Unmarshal(in, &jsonObject); err != nil { -+ return fmt.Errorf("bad StructValue: %v", err) -+ } -+ -+ mv := m.Mutable(fds.ByNumber(1)).Map() -+ for key, raw := range jsonObject { -+ kv := protoreflect.ValueOf(key).MapKey() -+ vv := mv.NewValue() -+ if err := u.unmarshalMessage(vv.Message(), raw); err != nil { -+ return fmt.Errorf("bad value in StructValue for key %q: %v", key, err) -+ } -+ mv.Set(kv, vv) -+ } -+ return nil -+ } -+ -+ var jsonObject map[string]json.RawMessage -+ if err := json.Unmarshal(in, &jsonObject); err != nil { -+ return err -+ } -+ -+ // Handle known fields. -+ for i := 0; i < fds.Len(); i++ { -+ fd := fds.Get(i) -+ if fd.IsWeak() && fd.Message().IsPlaceholder() { -+ continue // weak reference is not linked in -+ } -+ -+ // Search for any raw JSON value associated with this field. -+ var raw json.RawMessage -+ name := string(fd.Name()) -+ if fd.Kind() == protoreflect.GroupKind { -+ name = string(fd.Message().Name()) -+ } -+ if v, ok := jsonObject[name]; ok { -+ delete(jsonObject, name) -+ raw = v -+ } -+ name = string(fd.JSONName()) -+ if v, ok := jsonObject[name]; ok { -+ delete(jsonObject, name) -+ raw = v -+ } -+ -+ field := m.NewField(fd) -+ // Unmarshal the field value. -+ if raw == nil || (string(raw) == "null" && !isSingularWellKnownValue(fd) && !isSingularJSONPBUnmarshaler(field, fd)) { -+ continue -+ } -+ v, err := u.unmarshalValue(field, raw, fd) -+ if err != nil { -+ return err -+ } -+ m.Set(fd, v) -+ } -+ -+ // Handle extension fields. -+ for name, raw := range jsonObject { -+ if !strings.HasPrefix(name, "[") || !strings.HasSuffix(name, "]") { -+ continue -+ } -+ -+ // Resolve the extension field by name. -+ xname := protoreflect.FullName(name[len("[") : len(name)-len("]")]) -+ xt, _ := protoregistry.GlobalTypes.FindExtensionByName(xname) -+ if xt == nil && isMessageSet(md) { -+ xt, _ = protoregistry.GlobalTypes.FindExtensionByName(xname.Append("message_set_extension")) -+ } -+ if xt == nil { -+ continue -+ } -+ delete(jsonObject, name) -+ fd := xt.TypeDescriptor() -+ if fd.ContainingMessage().FullName() != m.Descriptor().FullName() { -+ return fmt.Errorf("extension field %q does not extend message %q", xname, m.Descriptor().FullName()) -+ } -+ -+ field := m.NewField(fd) -+ // Unmarshal the field value. -+ if raw == nil || (string(raw) == "null" && !isSingularWellKnownValue(fd) && !isSingularJSONPBUnmarshaler(field, fd)) { -+ continue -+ } -+ v, err := u.unmarshalValue(field, raw, fd) -+ if err != nil { -+ return err -+ } -+ m.Set(fd, v) -+ } -+ -+ if !u.AllowUnknownFields && len(jsonObject) > 0 { -+ for name := range jsonObject { -+ return fmt.Errorf("unknown field %q in %v", name, md.FullName()) -+ } -+ } -+ return nil -+} -+ -+func isSingularWellKnownValue(fd protoreflect.FieldDescriptor) bool { -+ if fd.Cardinality() == protoreflect.Repeated { -+ return false -+ } -+ if md := fd.Message(); md != nil { -+ return md.FullName() == "google.protobuf.Value" -+ } -+ if ed := fd.Enum(); ed != nil { -+ return ed.FullName() == "google.protobuf.NullValue" -+ } -+ return false -+} -+ -+func isSingularJSONPBUnmarshaler(v protoreflect.Value, fd protoreflect.FieldDescriptor) bool { -+ if fd.Message() != nil && fd.Cardinality() != protoreflect.Repeated { -+ _, ok := proto.MessageV1(v.Interface()).(JSONPBUnmarshaler) -+ return ok -+ } -+ return false -+} -+ -+func (u *Unmarshaler) unmarshalValue(v protoreflect.Value, in []byte, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { -+ switch { -+ case fd.IsList(): -+ var jsonArray []json.RawMessage -+ if err := json.Unmarshal(in, &jsonArray); err != nil { -+ return v, err -+ } -+ lv := v.List() -+ for _, raw := range jsonArray { -+ ve, err := u.unmarshalSingularValue(lv.NewElement(), raw, fd) -+ if err != nil { -+ return v, err -+ } -+ lv.Append(ve) -+ } -+ return v, nil -+ case fd.IsMap(): -+ var jsonObject map[string]json.RawMessage -+ if err := json.Unmarshal(in, &jsonObject); err != nil { -+ return v, err -+ } -+ kfd := fd.MapKey() -+ vfd := fd.MapValue() -+ mv := v.Map() -+ for key, raw := range jsonObject { -+ var kv protoreflect.MapKey -+ if kfd.Kind() == protoreflect.StringKind { -+ kv = protoreflect.ValueOf(key).MapKey() -+ } else { -+ v, err := u.unmarshalSingularValue(kfd.Default(), []byte(key), kfd) -+ if err != nil { -+ return v, err -+ } -+ kv = v.MapKey() -+ } -+ -+ vv, err := u.unmarshalSingularValue(mv.NewValue(), raw, vfd) -+ if err != nil { -+ return v, err -+ } -+ mv.Set(kv, vv) -+ } -+ return v, nil -+ default: -+ return u.unmarshalSingularValue(v, in, fd) -+ } -+} -+ -+var nonFinite = map[string]float64{ -+ `"NaN"`: math.NaN(), -+ `"Infinity"`: math.Inf(+1), -+ `"-Infinity"`: math.Inf(-1), -+} -+ -+func (u *Unmarshaler) unmarshalSingularValue(v protoreflect.Value, in []byte, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { -+ switch fd.Kind() { -+ case protoreflect.BoolKind: -+ return unmarshalValue(in, new(bool)) -+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: -+ return unmarshalValue(trimQuote(in), new(int32)) -+ case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: -+ return unmarshalValue(trimQuote(in), new(int64)) -+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: -+ return unmarshalValue(trimQuote(in), new(uint32)) -+ case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: -+ return unmarshalValue(trimQuote(in), new(uint64)) -+ case protoreflect.FloatKind: -+ if f, ok := nonFinite[string(in)]; ok { -+ return protoreflect.ValueOfFloat32(float32(f)), nil -+ } -+ return unmarshalValue(trimQuote(in), new(float32)) -+ case protoreflect.DoubleKind: -+ if f, ok := nonFinite[string(in)]; ok { -+ return protoreflect.ValueOfFloat64(float64(f)), nil -+ } -+ return unmarshalValue(trimQuote(in), new(float64)) -+ case protoreflect.StringKind: -+ return unmarshalValue(in, new(string)) -+ case protoreflect.BytesKind: -+ return unmarshalValue(in, new([]byte)) -+ case protoreflect.EnumKind: -+ if hasPrefixAndSuffix('"', in, '"') { -+ vd := fd.Enum().Values().ByName(protoreflect.Name(trimQuote(in))) -+ if vd == nil { -+ return v, fmt.Errorf("unknown value %q for enum %s", in, fd.Enum().FullName()) -+ } -+ return protoreflect.ValueOfEnum(vd.Number()), nil -+ } -+ return unmarshalValue(in, new(protoreflect.EnumNumber)) -+ case protoreflect.MessageKind, protoreflect.GroupKind: -+ err := u.unmarshalMessage(v.Message(), in) -+ return v, err -+ default: -+ panic(fmt.Sprintf("invalid kind %v", fd.Kind())) -+ } -+} -+ -+func unmarshalValue(in []byte, v interface{}) (protoreflect.Value, error) { -+ err := json.Unmarshal(in, v) -+ return protoreflect.ValueOf(reflect.ValueOf(v).Elem().Interface()), err -+} -+ -+func unquoteString(in string) (out string, err error) { -+ err = json.Unmarshal([]byte(in), &out) -+ return out, err -+} -+ -+func hasPrefixAndSuffix(prefix byte, in []byte, suffix byte) bool { -+ if len(in) >= 2 && in[0] == prefix && in[len(in)-1] == suffix { -+ return true -+ } -+ return false -+} -+ -+// trimQuote is like unquoteString but simply strips surrounding quotes. -+// This is incorrect, but is behavior done by the legacy implementation. -+func trimQuote(in []byte) []byte { -+ if len(in) >= 2 && in[0] == '"' && in[len(in)-1] == '"' { -+ in = in[1 : len(in)-1] -+ } -+ return in -+} -diff --git a/vendor/github.com/golang/protobuf/jsonpb/encode.go b/vendor/github.com/golang/protobuf/jsonpb/encode.go -new file mode 100644 -index 0000000..685c80a ---- /dev/null -+++ b/vendor/github.com/golang/protobuf/jsonpb/encode.go -@@ -0,0 +1,559 @@ -+// Copyright 2015 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+package jsonpb -+ -+import ( -+ "encoding/json" -+ "errors" -+ "fmt" -+ "io" -+ "math" -+ "reflect" -+ "sort" -+ "strconv" -+ "strings" -+ "time" -+ -+ "github.com/golang/protobuf/proto" -+ "google.golang.org/protobuf/encoding/protojson" -+ protoV2 "google.golang.org/protobuf/proto" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoregistry" -+) -+ -+const wrapJSONMarshalV2 = false -+ -+// Marshaler is a configurable object for marshaling protocol buffer messages -+// to the specified JSON representation. -+type Marshaler struct { -+ // OrigName specifies whether to use the original protobuf name for fields. -+ OrigName bool -+ -+ // EnumsAsInts specifies whether to render enum values as integers, -+ // as opposed to string values. -+ EnumsAsInts bool -+ -+ // EmitDefaults specifies whether to render fields with zero values. -+ EmitDefaults bool -+ -+ // Indent controls whether the output is compact or not. -+ // If empty, the output is compact JSON. Otherwise, every JSON object -+ // entry and JSON array value will be on its own line. -+ // Each line will be preceded by repeated copies of Indent, where the -+ // number of copies is the current indentation depth. -+ Indent string -+ -+ // AnyResolver is used to resolve the google.protobuf.Any well-known type. -+ // If unset, the global registry is used by default. -+ AnyResolver AnyResolver -+} -+ -+// JSONPBMarshaler is implemented by protobuf messages that customize the -+// way they are marshaled to JSON. Messages that implement this should also -+// implement JSONPBUnmarshaler so that the custom format can be parsed. -+// -+// The JSON marshaling must follow the proto to JSON specification: -+// https://developers.google.com/protocol-buffers/docs/proto3#json -+// -+// Deprecated: Custom types should implement protobuf reflection instead. -+type JSONPBMarshaler interface { -+ MarshalJSONPB(*Marshaler) ([]byte, error) -+} -+ -+// Marshal serializes a protobuf message as JSON into w. -+func (jm *Marshaler) Marshal(w io.Writer, m proto.Message) error { -+ b, err := jm.marshal(m) -+ if len(b) > 0 { -+ if _, err := w.Write(b); err != nil { -+ return err -+ } -+ } -+ return err -+} -+ -+// MarshalToString serializes a protobuf message as JSON in string form. -+func (jm *Marshaler) MarshalToString(m proto.Message) (string, error) { -+ b, err := jm.marshal(m) -+ if err != nil { -+ return "", err -+ } -+ return string(b), nil -+} -+ -+func (jm *Marshaler) marshal(m proto.Message) ([]byte, error) { -+ v := reflect.ValueOf(m) -+ if m == nil || (v.Kind() == reflect.Ptr && v.IsNil()) { -+ return nil, errors.New("Marshal called with nil") -+ } -+ -+ // Check for custom marshalers first since they may not properly -+ // implement protobuf reflection that the logic below relies on. -+ if jsm, ok := m.(JSONPBMarshaler); ok { -+ return jsm.MarshalJSONPB(jm) -+ } -+ -+ if wrapJSONMarshalV2 { -+ opts := protojson.MarshalOptions{ -+ UseProtoNames: jm.OrigName, -+ UseEnumNumbers: jm.EnumsAsInts, -+ EmitUnpopulated: jm.EmitDefaults, -+ Indent: jm.Indent, -+ } -+ if jm.AnyResolver != nil { -+ opts.Resolver = anyResolver{jm.AnyResolver} -+ } -+ return opts.Marshal(proto.MessageReflect(m).Interface()) -+ } else { -+ // Check for unpopulated required fields first. -+ m2 := proto.MessageReflect(m) -+ if err := protoV2.CheckInitialized(m2.Interface()); err != nil { -+ return nil, err -+ } -+ -+ w := jsonWriter{Marshaler: jm} -+ err := w.marshalMessage(m2, "", "") -+ return w.buf, err -+ } -+} -+ -+type jsonWriter struct { -+ *Marshaler -+ buf []byte -+} -+ -+func (w *jsonWriter) write(s string) { -+ w.buf = append(w.buf, s...) -+} -+ -+func (w *jsonWriter) marshalMessage(m protoreflect.Message, indent, typeURL string) error { -+ if jsm, ok := proto.MessageV1(m.Interface()).(JSONPBMarshaler); ok { -+ b, err := jsm.MarshalJSONPB(w.Marshaler) -+ if err != nil { -+ return err -+ } -+ if typeURL != "" { -+ // we are marshaling this object to an Any type -+ var js map[string]*json.RawMessage -+ if err = json.Unmarshal(b, &js); err != nil { -+ return fmt.Errorf("type %T produced invalid JSON: %v", m.Interface(), err) -+ } -+ turl, err := json.Marshal(typeURL) -+ if err != nil { -+ return fmt.Errorf("failed to marshal type URL %q to JSON: %v", typeURL, err) -+ } -+ js["@type"] = (*json.RawMessage)(&turl) -+ if b, err = json.Marshal(js); err != nil { -+ return err -+ } -+ } -+ w.write(string(b)) -+ return nil -+ } -+ -+ md := m.Descriptor() -+ fds := md.Fields() -+ -+ // Handle well-known types. -+ const secondInNanos = int64(time.Second / time.Nanosecond) -+ switch wellKnownType(md.FullName()) { -+ case "Any": -+ return w.marshalAny(m, indent) -+ case "BoolValue", "BytesValue", "StringValue", -+ "Int32Value", "UInt32Value", "FloatValue", -+ "Int64Value", "UInt64Value", "DoubleValue": -+ fd := fds.ByNumber(1) -+ return w.marshalValue(fd, m.Get(fd), indent) -+ case "Duration": -+ const maxSecondsInDuration = 315576000000 -+ // "Generated output always contains 0, 3, 6, or 9 fractional digits, -+ // depending on required precision." -+ s := m.Get(fds.ByNumber(1)).Int() -+ ns := m.Get(fds.ByNumber(2)).Int() -+ if s < -maxSecondsInDuration || s > maxSecondsInDuration { -+ return fmt.Errorf("seconds out of range %v", s) -+ } -+ if ns <= -secondInNanos || ns >= secondInNanos { -+ return fmt.Errorf("ns out of range (%v, %v)", -secondInNanos, secondInNanos) -+ } -+ if (s > 0 && ns < 0) || (s < 0 && ns > 0) { -+ return errors.New("signs of seconds and nanos do not match") -+ } -+ var sign string -+ if s < 0 || ns < 0 { -+ sign, s, ns = "-", -1*s, -1*ns -+ } -+ x := fmt.Sprintf("%s%d.%09d", sign, s, ns) -+ x = strings.TrimSuffix(x, "000") -+ x = strings.TrimSuffix(x, "000") -+ x = strings.TrimSuffix(x, ".000") -+ w.write(fmt.Sprintf(`"%vs"`, x)) -+ return nil -+ case "Timestamp": -+ // "RFC 3339, where generated output will always be Z-normalized -+ // and uses 0, 3, 6 or 9 fractional digits." -+ s := m.Get(fds.ByNumber(1)).Int() -+ ns := m.Get(fds.ByNumber(2)).Int() -+ if ns < 0 || ns >= secondInNanos { -+ return fmt.Errorf("ns out of range [0, %v)", secondInNanos) -+ } -+ t := time.Unix(s, ns).UTC() -+ // time.RFC3339Nano isn't exactly right (we need to get 3/6/9 fractional digits). -+ x := t.Format("2006-01-02T15:04:05.000000000") -+ x = strings.TrimSuffix(x, "000") -+ x = strings.TrimSuffix(x, "000") -+ x = strings.TrimSuffix(x, ".000") -+ w.write(fmt.Sprintf(`"%vZ"`, x)) -+ return nil -+ case "Value": -+ // JSON value; which is a null, number, string, bool, object, or array. -+ od := md.Oneofs().Get(0) -+ fd := m.WhichOneof(od) -+ if fd == nil { -+ return errors.New("nil Value") -+ } -+ return w.marshalValue(fd, m.Get(fd), indent) -+ case "Struct", "ListValue": -+ // JSON object or array. -+ fd := fds.ByNumber(1) -+ return w.marshalValue(fd, m.Get(fd), indent) -+ } -+ -+ w.write("{") -+ if w.Indent != "" { -+ w.write("\n") -+ } -+ -+ firstField := true -+ if typeURL != "" { -+ if err := w.marshalTypeURL(indent, typeURL); err != nil { -+ return err -+ } -+ firstField = false -+ } -+ -+ for i := 0; i < fds.Len(); { -+ fd := fds.Get(i) -+ if od := fd.ContainingOneof(); od != nil { -+ fd = m.WhichOneof(od) -+ i += od.Fields().Len() -+ if fd == nil { -+ continue -+ } -+ } else { -+ i++ -+ } -+ -+ v := m.Get(fd) -+ -+ if !m.Has(fd) { -+ if !w.EmitDefaults || fd.ContainingOneof() != nil { -+ continue -+ } -+ if fd.Cardinality() != protoreflect.Repeated && (fd.Message() != nil || fd.Syntax() == protoreflect.Proto2) { -+ v = protoreflect.Value{} // use "null" for singular messages or proto2 scalars -+ } -+ } -+ -+ if !firstField { -+ w.writeComma() -+ } -+ if err := w.marshalField(fd, v, indent); err != nil { -+ return err -+ } -+ firstField = false -+ } -+ -+ // Handle proto2 extensions. -+ if md.ExtensionRanges().Len() > 0 { -+ // Collect a sorted list of all extension descriptor and values. -+ type ext struct { -+ desc protoreflect.FieldDescriptor -+ val protoreflect.Value -+ } -+ var exts []ext -+ m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { -+ if fd.IsExtension() { -+ exts = append(exts, ext{fd, v}) -+ } -+ return true -+ }) -+ sort.Slice(exts, func(i, j int) bool { -+ return exts[i].desc.Number() < exts[j].desc.Number() -+ }) -+ -+ for _, ext := range exts { -+ if !firstField { -+ w.writeComma() -+ } -+ if err := w.marshalField(ext.desc, ext.val, indent); err != nil { -+ return err -+ } -+ firstField = false -+ } -+ } -+ -+ if w.Indent != "" { -+ w.write("\n") -+ w.write(indent) -+ } -+ w.write("}") -+ return nil -+} -+ -+func (w *jsonWriter) writeComma() { -+ if w.Indent != "" { -+ w.write(",\n") -+ } else { -+ w.write(",") -+ } -+} -+ -+func (w *jsonWriter) marshalAny(m protoreflect.Message, indent string) error { -+ // "If the Any contains a value that has a special JSON mapping, -+ // it will be converted as follows: {"@type": xxx, "value": yyy}. -+ // Otherwise, the value will be converted into a JSON object, -+ // and the "@type" field will be inserted to indicate the actual data type." -+ md := m.Descriptor() -+ typeURL := m.Get(md.Fields().ByNumber(1)).String() -+ rawVal := m.Get(md.Fields().ByNumber(2)).Bytes() -+ -+ var m2 protoreflect.Message -+ if w.AnyResolver != nil { -+ mi, err := w.AnyResolver.Resolve(typeURL) -+ if err != nil { -+ return err -+ } -+ m2 = proto.MessageReflect(mi) -+ } else { -+ mt, err := protoregistry.GlobalTypes.FindMessageByURL(typeURL) -+ if err != nil { -+ return err -+ } -+ m2 = mt.New() -+ } -+ -+ if err := protoV2.Unmarshal(rawVal, m2.Interface()); err != nil { -+ return err -+ } -+ -+ if wellKnownType(m2.Descriptor().FullName()) == "" { -+ return w.marshalMessage(m2, indent, typeURL) -+ } -+ -+ w.write("{") -+ if w.Indent != "" { -+ w.write("\n") -+ } -+ if err := w.marshalTypeURL(indent, typeURL); err != nil { -+ return err -+ } -+ w.writeComma() -+ if w.Indent != "" { -+ w.write(indent) -+ w.write(w.Indent) -+ w.write(`"value": `) -+ } else { -+ w.write(`"value":`) -+ } -+ if err := w.marshalMessage(m2, indent+w.Indent, ""); err != nil { -+ return err -+ } -+ if w.Indent != "" { -+ w.write("\n") -+ w.write(indent) -+ } -+ w.write("}") -+ return nil -+} -+ -+func (w *jsonWriter) marshalTypeURL(indent, typeURL string) error { -+ if w.Indent != "" { -+ w.write(indent) -+ w.write(w.Indent) -+ } -+ w.write(`"@type":`) -+ if w.Indent != "" { -+ w.write(" ") -+ } -+ b, err := json.Marshal(typeURL) -+ if err != nil { -+ return err -+ } -+ w.write(string(b)) -+ return nil -+} -+ -+// marshalField writes field description and value to the Writer. -+func (w *jsonWriter) marshalField(fd protoreflect.FieldDescriptor, v protoreflect.Value, indent string) error { -+ if w.Indent != "" { -+ w.write(indent) -+ w.write(w.Indent) -+ } -+ w.write(`"`) -+ switch { -+ case fd.IsExtension(): -+ // For message set, use the fname of the message as the extension name. -+ name := string(fd.FullName()) -+ if isMessageSet(fd.ContainingMessage()) { -+ name = strings.TrimSuffix(name, ".message_set_extension") -+ } -+ -+ w.write("[" + name + "]") -+ case w.OrigName: -+ name := string(fd.Name()) -+ if fd.Kind() == protoreflect.GroupKind { -+ name = string(fd.Message().Name()) -+ } -+ w.write(name) -+ default: -+ w.write(string(fd.JSONName())) -+ } -+ w.write(`":`) -+ if w.Indent != "" { -+ w.write(" ") -+ } -+ return w.marshalValue(fd, v, indent) -+} -+ -+func (w *jsonWriter) marshalValue(fd protoreflect.FieldDescriptor, v protoreflect.Value, indent string) error { -+ switch { -+ case fd.IsList(): -+ w.write("[") -+ comma := "" -+ lv := v.List() -+ for i := 0; i < lv.Len(); i++ { -+ w.write(comma) -+ if w.Indent != "" { -+ w.write("\n") -+ w.write(indent) -+ w.write(w.Indent) -+ w.write(w.Indent) -+ } -+ if err := w.marshalSingularValue(fd, lv.Get(i), indent+w.Indent); err != nil { -+ return err -+ } -+ comma = "," -+ } -+ if w.Indent != "" { -+ w.write("\n") -+ w.write(indent) -+ w.write(w.Indent) -+ } -+ w.write("]") -+ return nil -+ case fd.IsMap(): -+ kfd := fd.MapKey() -+ vfd := fd.MapValue() -+ mv := v.Map() -+ -+ // Collect a sorted list of all map keys and values. -+ type entry struct{ key, val protoreflect.Value } -+ var entries []entry -+ mv.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool { -+ entries = append(entries, entry{k.Value(), v}) -+ return true -+ }) -+ sort.Slice(entries, func(i, j int) bool { -+ switch kfd.Kind() { -+ case protoreflect.BoolKind: -+ return !entries[i].key.Bool() && entries[j].key.Bool() -+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: -+ return entries[i].key.Int() < entries[j].key.Int() -+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind: -+ return entries[i].key.Uint() < entries[j].key.Uint() -+ case protoreflect.StringKind: -+ return entries[i].key.String() < entries[j].key.String() -+ default: -+ panic("invalid kind") -+ } -+ }) -+ -+ w.write(`{`) -+ comma := "" -+ for _, entry := range entries { -+ w.write(comma) -+ if w.Indent != "" { -+ w.write("\n") -+ w.write(indent) -+ w.write(w.Indent) -+ w.write(w.Indent) -+ } -+ -+ s := fmt.Sprint(entry.key.Interface()) -+ b, err := json.Marshal(s) -+ if err != nil { -+ return err -+ } -+ w.write(string(b)) -+ -+ w.write(`:`) -+ if w.Indent != "" { -+ w.write(` `) -+ } -+ -+ if err := w.marshalSingularValue(vfd, entry.val, indent+w.Indent); err != nil { -+ return err -+ } -+ comma = "," -+ } -+ if w.Indent != "" { -+ w.write("\n") -+ w.write(indent) -+ w.write(w.Indent) -+ } -+ w.write(`}`) -+ return nil -+ default: -+ return w.marshalSingularValue(fd, v, indent) -+ } -+} -+ -+func (w *jsonWriter) marshalSingularValue(fd protoreflect.FieldDescriptor, v protoreflect.Value, indent string) error { -+ switch { -+ case !v.IsValid(): -+ w.write("null") -+ return nil -+ case fd.Message() != nil: -+ return w.marshalMessage(v.Message(), indent+w.Indent, "") -+ case fd.Enum() != nil: -+ if fd.Enum().FullName() == "google.protobuf.NullValue" { -+ w.write("null") -+ return nil -+ } -+ -+ vd := fd.Enum().Values().ByNumber(v.Enum()) -+ if vd == nil || w.EnumsAsInts { -+ w.write(strconv.Itoa(int(v.Enum()))) -+ } else { -+ w.write(`"` + string(vd.Name()) + `"`) -+ } -+ return nil -+ default: -+ switch v.Interface().(type) { -+ case float32, float64: -+ switch { -+ case math.IsInf(v.Float(), +1): -+ w.write(`"Infinity"`) -+ return nil -+ case math.IsInf(v.Float(), -1): -+ w.write(`"-Infinity"`) -+ return nil -+ case math.IsNaN(v.Float()): -+ w.write(`"NaN"`) -+ return nil -+ } -+ case int64, uint64: -+ w.write(fmt.Sprintf(`"%d"`, v.Interface())) -+ return nil -+ } -+ -+ b, err := json.Marshal(v.Interface()) -+ if err != nil { -+ return err -+ } -+ w.write(string(b)) -+ return nil -+ } -+} -diff --git a/vendor/github.com/golang/protobuf/jsonpb/json.go b/vendor/github.com/golang/protobuf/jsonpb/json.go -new file mode 100644 -index 0000000..480e244 ---- /dev/null -+++ b/vendor/github.com/golang/protobuf/jsonpb/json.go -@@ -0,0 +1,69 @@ -+// Copyright 2015 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+// Package jsonpb provides functionality to marshal and unmarshal between a -+// protocol buffer message and JSON. It follows the specification at -+// https://developers.google.com/protocol-buffers/docs/proto3#json. -+// -+// Do not rely on the default behavior of the standard encoding/json package -+// when called on generated message types as it does not operate correctly. -+// -+// Deprecated: Use the "google.golang.org/protobuf/encoding/protojson" -+// package instead. -+package jsonpb -+ -+import ( -+ "github.com/golang/protobuf/proto" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoregistry" -+ "google.golang.org/protobuf/runtime/protoimpl" -+) -+ -+// AnyResolver takes a type URL, present in an Any message, -+// and resolves it into an instance of the associated message. -+type AnyResolver interface { -+ Resolve(typeURL string) (proto.Message, error) -+} -+ -+type anyResolver struct{ AnyResolver } -+ -+func (r anyResolver) FindMessageByName(message protoreflect.FullName) (protoreflect.MessageType, error) { -+ return r.FindMessageByURL(string(message)) -+} -+ -+func (r anyResolver) FindMessageByURL(url string) (protoreflect.MessageType, error) { -+ m, err := r.Resolve(url) -+ if err != nil { -+ return nil, err -+ } -+ return protoimpl.X.MessageTypeOf(m), nil -+} -+ -+func (r anyResolver) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) { -+ return protoregistry.GlobalTypes.FindExtensionByName(field) -+} -+ -+func (r anyResolver) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) { -+ return protoregistry.GlobalTypes.FindExtensionByNumber(message, field) -+} -+ -+func wellKnownType(s protoreflect.FullName) string { -+ if s.Parent() == "google.protobuf" { -+ switch s.Name() { -+ case "Empty", "Any", -+ "BoolValue", "BytesValue", "StringValue", -+ "Int32Value", "UInt32Value", "FloatValue", -+ "Int64Value", "UInt64Value", "DoubleValue", -+ "Duration", "Timestamp", -+ "NullValue", "Struct", "Value", "ListValue": -+ return string(s.Name()) -+ } -+ } -+ return "" -+} -+ -+func isMessageSet(md protoreflect.MessageDescriptor) bool { -+ ms, ok := md.(interface{ IsMessageSet() bool }) -+ return ok && ms.IsMessageSet() -+} -diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go -deleted file mode 100644 -index 37dc0cf..0000000 ---- a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go -+++ /dev/null -@@ -1,71 +0,0 @@ --// Copyright 2016 The Go Authors. All rights reserved. --// Use of this source code is governed by a BSD-style --// license that can be found in the LICENSE file. -- --// Package ctxhttp provides helper functions for performing context-aware HTTP requests. --package ctxhttp // import "golang.org/x/net/context/ctxhttp" -- --import ( -- "context" -- "io" -- "net/http" -- "net/url" -- "strings" --) -- --// Do sends an HTTP request with the provided http.Client and returns --// an HTTP response. --// --// If the client is nil, http.DefaultClient is used. --// --// The provided ctx must be non-nil. If it is canceled or times out, --// ctx.Err() will be returned. --func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { -- if client == nil { -- client = http.DefaultClient -- } -- resp, err := client.Do(req.WithContext(ctx)) -- // If we got an error, and the context has been canceled, -- // the context's error is probably more useful. -- if err != nil { -- select { -- case <-ctx.Done(): -- err = ctx.Err() -- default: -- } -- } -- return resp, err --} -- --// Get issues a GET request via the Do function. --func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) { -- req, err := http.NewRequest("GET", url, nil) -- if err != nil { -- return nil, err -- } -- return Do(ctx, client, req) --} -- --// Head issues a HEAD request via the Do function. --func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) { -- req, err := http.NewRequest("HEAD", url, nil) -- if err != nil { -- return nil, err -- } -- return Do(ctx, client, req) --} -- --// Post issues a POST request via the Do function. --func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) { -- req, err := http.NewRequest("POST", url, body) -- if err != nil { -- return nil, err -- } -- req.Header.Set("Content-Type", bodyType) -- return Do(ctx, client, req) --} -- --// PostForm issues a POST request via the Do function. --func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) { -- return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) --} -diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go -index 822ed42..2466ae3 100644 ---- a/vendor/golang.org/x/net/html/doc.go -+++ b/vendor/golang.org/x/net/html/doc.go -@@ -92,6 +92,27 @@ example, to process each anchor node in depth-first order: - The relevant specifications include: - https://html.spec.whatwg.org/multipage/syntax.html and - https://html.spec.whatwg.org/multipage/syntax.html#tokenization -+ -+# Security Considerations -+ -+Care should be taken when parsing and interpreting HTML, whether full documents -+or fragments, within the framework of the HTML specification, especially with -+regard to untrusted inputs. -+ -+This package provides both a tokenizer and a parser, which implement the -+tokenization, and tokenization and tree construction stages of the WHATWG HTML -+parsing specification respectively. While the tokenizer parses and normalizes -+individual HTML tokens, only the parser constructs the DOM tree from the -+tokenized HTML, as described in the tree construction stage of the -+specification, dynamically modifying or extending the docuemnt's DOM tree. -+ -+If your use case requires semantically well-formed HTML documents, as defined by -+the WHATWG specification, the parser should be used rather than the tokenizer. -+ -+In security contexts, if trust decisions are being made using the tokenized or -+parsed content, the input must be re-serialized (for instance by using Render or -+Token.String) in order for those trust decisions to hold, as the process of -+tokenization or parsing may alter the content. - */ - package html // import "golang.org/x/net/html" - -diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go -index d856139..04c6bec 100644 ---- a/vendor/golang.org/x/net/html/escape.go -+++ b/vendor/golang.org/x/net/html/escape.go -@@ -193,6 +193,87 @@ func lower(b []byte) []byte { - return b - } - -+// escapeComment is like func escape but escapes its input bytes less often. -+// Per https://github.com/golang/go/issues/58246 some HTML comments are (1) -+// meaningful and (2) contain angle brackets that we'd like to avoid escaping -+// unless we have to. -+// -+// "We have to" includes the '&' byte, since that introduces other escapes. -+// -+// It also includes those bytes (not including EOF) that would otherwise end -+// the comment. Per the summary table at the bottom of comment_test.go, this is -+// the '>' byte that, per above, we'd like to avoid escaping unless we have to. -+// -+// Studying the summary table (and T actions in its '>' column) closely, we -+// only need to escape in states 43, 44, 49, 51 and 52. State 43 is at the -+// start of the comment data. State 52 is after a '!'. The other three states -+// are after a '-'. -+// -+// Our algorithm is thus to escape every '&' and to escape '>' if and only if: -+// - The '>' is after a '!' or '-' (in the unescaped data) or -+// - The '>' is at the start of the comment data (after the opening ""); err != nil { -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index 50f7c6a..de67f93 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -110,7 +110,7 @@ func (t Token) String() string { - case SelfClosingTagToken: - return "<" + t.tagString() + "/>" - case CommentToken: -- return "" -+ return "" - case DoctypeToken: - return "" - } -@@ -598,10 +598,10 @@ scriptDataDoubleEscapeEnd: - // readComment reads the next comment token starting with " balancer) calls are guaranteed to execute in a -+ // mutually exclusive manner as they are scheduled in the serializer. Fields -+ // accessed *only* in these serializer callbacks, can therefore be accessed -+ // without a mutex. -+ balancer *gracefulswitch.Balancer -+ curBalancerName string -+ -+ // mu guards access to the below fields. Access to the serializer and its -+ // cancel function needs to be mutex protected because they are overwritten -+ // when the wrapper exits idle mode. -+ mu sync.Mutex -+ serializer *grpcsync.CallbackSerializer // To serialize all outoing calls. -+ serializerCancel context.CancelFunc // To close the seralizer at close/enterIdle time. -+ mode ccbMode // Tracks the current mode of the wrapper. - } - --func newCCBalancerWrapper(cc *ClientConn, b balancer.Builder, bopts balancer.BuildOptions) *ccBalancerWrapper { -+// newCCBalancerWrapper creates a new balancer wrapper. The underlying balancer -+// is not created until the switchTo() method is invoked. -+func newCCBalancerWrapper(cc *ClientConn, bopts balancer.BuildOptions) *ccBalancerWrapper { -+ ctx, cancel := context.WithCancel(context.Background()) - ccb := &ccBalancerWrapper{ -- cc: cc, -- updateCh: buffer.NewUnbounded(), -- closed: grpcsync.NewEvent(), -- done: grpcsync.NewEvent(), -- subConns: make(map[*acBalancerWrapper]struct{}), -+ cc: cc, -+ opts: bopts, -+ serializer: grpcsync.NewCallbackSerializer(ctx), -+ serializerCancel: cancel, - } -- go ccb.watcher() -- ccb.balancer = b.Build(ccb, bopts) -+ ccb.balancer = gracefulswitch.NewBalancer(ccb, bopts) - return ccb - } - --// watcher balancer functions sequentially, so the balancer can be implemented --// lock-free. --func (ccb *ccBalancerWrapper) watcher() { -- for { -- select { -- case t := <-ccb.updateCh.Get(): -- ccb.updateCh.Load() -- if ccb.closed.HasFired() { -- break -- } -- switch u := t.(type) { -- case *scStateUpdate: -- ccb.balancerMu.Lock() -- ccb.balancer.UpdateSubConnState(u.sc, balancer.SubConnState{ConnectivityState: u.state, ConnectionError: u.err}) -- ccb.balancerMu.Unlock() -- case *acBalancerWrapper: -- ccb.mu.Lock() -- if ccb.subConns != nil { -- delete(ccb.subConns, u) -- ccb.cc.removeAddrConn(u.getAddrConn(), errConnDrain) -+// updateClientConnState is invoked by grpc to push a ClientConnState update to -+// the underlying balancer. -+func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnState) error { -+ ccb.mu.Lock() -+ errCh := make(chan error, 1) -+ // Here and everywhere else where Schedule() is called, it is done with the -+ // lock held. But the lock guards only the scheduling part. The actual -+ // callback is called asynchronously without the lock being held. -+ ok := ccb.serializer.Schedule(func(_ context.Context) { -+ // If the addresses specified in the update contain addresses of type -+ // "grpclb" and the selected LB policy is not "grpclb", these addresses -+ // will be filtered out and ccs will be modified with the updated -+ // address list. -+ if ccb.curBalancerName != grpclbName { -+ var addrs []resolver.Address -+ for _, addr := range ccs.ResolverState.Addresses { -+ if addr.Type == resolver.GRPCLB { -+ continue - } -- ccb.mu.Unlock() -- default: -- logger.Errorf("ccBalancerWrapper.watcher: unknown update %+v, type %T", t, t) -+ addrs = append(addrs, addr) - } -- case <-ccb.closed.Done(): -+ ccs.ResolverState.Addresses = addrs - } -+ errCh <- ccb.balancer.UpdateClientConnState(*ccs) -+ }) -+ if !ok { -+ // If we are unable to schedule a function with the serializer, it -+ // indicates that it has been closed. A serializer is only closed when -+ // the wrapper is closed or is in idle. -+ ccb.mu.Unlock() -+ return fmt.Errorf("grpc: cannot send state update to a closed or idle balancer") -+ } -+ ccb.mu.Unlock() - -- if ccb.closed.HasFired() { -- ccb.balancerMu.Lock() -- ccb.balancer.Close() -- ccb.balancerMu.Unlock() -- ccb.mu.Lock() -- scs := ccb.subConns -- ccb.subConns = nil -- ccb.mu.Unlock() -- ccb.UpdateState(balancer.State{ConnectivityState: connectivity.Connecting, Picker: nil}) -- ccb.done.Fire() -- // Fire done before removing the addr conns. We can safely unblock -- // ccb.close and allow the removeAddrConns to happen -- // asynchronously. -- for acbw := range scs { -- ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain) -- } -+ // We get here only if the above call to Schedule succeeds, in which case it -+ // is guaranteed that the scheduled function will run. Therefore it is safe -+ // to block on this channel. -+ err := <-errCh -+ if logger.V(2) && err != nil { -+ logger.Infof("error from balancer.UpdateClientConnState: %v", err) -+ } -+ return err -+} -+ -+// updateSubConnState is invoked by grpc to push a subConn state update to the -+// underlying balancer. -+func (ccb *ccBalancerWrapper) updateSubConnState(sc balancer.SubConn, s connectivity.State, err error) { -+ ccb.mu.Lock() -+ ccb.serializer.Schedule(func(_ context.Context) { -+ ccb.balancer.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: s, ConnectionError: err}) -+ }) -+ ccb.mu.Unlock() -+} -+ -+func (ccb *ccBalancerWrapper) resolverError(err error) { -+ ccb.mu.Lock() -+ ccb.serializer.Schedule(func(_ context.Context) { -+ ccb.balancer.ResolverError(err) -+ }) -+ ccb.mu.Unlock() -+} -+ -+// switchTo is invoked by grpc to instruct the balancer wrapper to switch to the -+// LB policy identified by name. -+// -+// ClientConn calls newCCBalancerWrapper() at creation time. Upon receipt of the -+// first good update from the name resolver, it determines the LB policy to use -+// and invokes the switchTo() method. Upon receipt of every subsequent update -+// from the name resolver, it invokes this method. -+// -+// the ccBalancerWrapper keeps track of the current LB policy name, and skips -+// the graceful balancer switching process if the name does not change. -+func (ccb *ccBalancerWrapper) switchTo(name string) { -+ ccb.mu.Lock() -+ ccb.serializer.Schedule(func(_ context.Context) { -+ // TODO: Other languages use case-sensitive balancer registries. We should -+ // switch as well. See: https://github.com/grpc/grpc-go/issues/5288. -+ if strings.EqualFold(ccb.curBalancerName, name) { - return - } -+ ccb.buildLoadBalancingPolicy(name) -+ }) -+ ccb.mu.Unlock() -+} -+ -+// buildLoadBalancingPolicy performs the following: -+// - retrieve a balancer builder for the given name. Use the default LB -+// policy, pick_first, if no LB policy with name is found in the registry. -+// - instruct the gracefulswitch balancer to switch to the above builder. This -+// will actually build the new balancer. -+// - update the `curBalancerName` field -+// -+// Must be called from a serializer callback. -+func (ccb *ccBalancerWrapper) buildLoadBalancingPolicy(name string) { -+ builder := balancer.Get(name) -+ if builder == nil { -+ channelz.Warningf(logger, ccb.cc.channelzID, "Channel switches to new LB policy %q, since the specified LB policy %q was not registered", PickFirstBalancerName, name) -+ builder = newPickfirstBuilder() -+ } else { -+ channelz.Infof(logger, ccb.cc.channelzID, "Channel switches to new LB policy %q", name) - } -+ -+ if err := ccb.balancer.SwitchTo(builder); err != nil { -+ channelz.Errorf(logger, ccb.cc.channelzID, "Channel failed to build new LB policy %q: %v", name, err) -+ return -+ } -+ ccb.curBalancerName = builder.Name() - } - - func (ccb *ccBalancerWrapper) close() { -- ccb.closed.Fire() -- <-ccb.done.Done() -+ channelz.Info(logger, ccb.cc.channelzID, "ccBalancerWrapper: closing") -+ ccb.closeBalancer(ccbModeClosed) - } - --func (ccb *ccBalancerWrapper) handleSubConnStateChange(sc balancer.SubConn, s connectivity.State, err error) { -- // When updating addresses for a SubConn, if the address in use is not in -- // the new addresses, the old ac will be tearDown() and a new ac will be -- // created. tearDown() generates a state change with Shutdown state, we -- // don't want the balancer to receive this state change. So before -- // tearDown() on the old ac, ac.acbw (acWrapper) will be set to nil, and -- // this function will be called with (nil, Shutdown). We don't need to call -- // balancer method in this case. -- if sc == nil { -+// enterIdleMode is invoked by grpc when the channel enters idle mode upon -+// expiry of idle_timeout. This call blocks until the balancer is closed. -+func (ccb *ccBalancerWrapper) enterIdleMode() { -+ channelz.Info(logger, ccb.cc.channelzID, "ccBalancerWrapper: entering idle mode") -+ ccb.closeBalancer(ccbModeIdle) -+} -+ -+// closeBalancer is invoked when the channel is being closed or when it enters -+// idle mode upon expiry of idle_timeout. -+func (ccb *ccBalancerWrapper) closeBalancer(m ccbMode) { -+ ccb.mu.Lock() -+ if ccb.mode == ccbModeClosed || ccb.mode == ccbModeIdle { -+ ccb.mu.Unlock() - return - } -- ccb.updateCh.Put(&scStateUpdate{ -- sc: sc, -- state: s, -- err: err, -+ -+ ccb.mode = m -+ done := ccb.serializer.Done -+ b := ccb.balancer -+ ok := ccb.serializer.Schedule(func(_ context.Context) { -+ // Close the serializer to ensure that no more calls from gRPC are sent -+ // to the balancer. -+ ccb.serializerCancel() -+ // Empty the current balancer name because we don't have a balancer -+ // anymore and also so that we act on the next call to switchTo by -+ // creating a new balancer specified by the new resolver. -+ ccb.curBalancerName = "" - }) -+ if !ok { -+ ccb.mu.Unlock() -+ return -+ } -+ ccb.mu.Unlock() -+ -+ // Give enqueued callbacks a chance to finish. -+ <-done -+ // Spawn a goroutine to close the balancer (since it may block trying to -+ // cleanup all allocated resources) and return early. -+ go b.Close() - } - --func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnState) error { -- ccb.balancerMu.Lock() -- defer ccb.balancerMu.Unlock() -- return ccb.balancer.UpdateClientConnState(*ccs) -+// exitIdleMode is invoked by grpc when the channel exits idle mode either -+// because of an RPC or because of an invocation of the Connect() API. This -+// recreates the balancer that was closed previously when entering idle mode. -+// -+// If the channel is not in idle mode, we know for a fact that we are here as a -+// result of the user calling the Connect() method on the ClientConn. In this -+// case, we can simply forward the call to the underlying balancer, instructing -+// it to reconnect to the backends. -+func (ccb *ccBalancerWrapper) exitIdleMode() { -+ ccb.mu.Lock() -+ if ccb.mode == ccbModeClosed { -+ // Request to exit idle is a no-op when wrapper is already closed. -+ ccb.mu.Unlock() -+ return -+ } -+ -+ if ccb.mode == ccbModeIdle { -+ // Recreate the serializer which was closed when we entered idle. -+ ctx, cancel := context.WithCancel(context.Background()) -+ ccb.serializer = grpcsync.NewCallbackSerializer(ctx) -+ ccb.serializerCancel = cancel -+ } -+ -+ // The ClientConn guarantees that mutual exclusion between close() and -+ // exitIdleMode(), and since we just created a new serializer, we can be -+ // sure that the below function will be scheduled. -+ done := make(chan struct{}) -+ ccb.serializer.Schedule(func(_ context.Context) { -+ defer close(done) -+ -+ ccb.mu.Lock() -+ defer ccb.mu.Unlock() -+ -+ if ccb.mode != ccbModeIdle { -+ ccb.balancer.ExitIdle() -+ return -+ } -+ -+ // Gracefulswitch balancer does not support a switchTo operation after -+ // being closed. Hence we need to create a new one here. -+ ccb.balancer = gracefulswitch.NewBalancer(ccb, ccb.opts) -+ ccb.mode = ccbModeActive -+ channelz.Info(logger, ccb.cc.channelzID, "ccBalancerWrapper: exiting idle mode") -+ -+ }) -+ ccb.mu.Unlock() -+ -+ <-done - } - --func (ccb *ccBalancerWrapper) resolverError(err error) { -- ccb.balancerMu.Lock() -- ccb.balancer.ResolverError(err) -- ccb.balancerMu.Unlock() -+func (ccb *ccBalancerWrapper) isIdleOrClosed() bool { -+ ccb.mu.Lock() -+ defer ccb.mu.Unlock() -+ return ccb.mode == ccbModeIdle || ccb.mode == ccbModeClosed - } - - func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) { -- if len(addrs) <= 0 { -- return nil, fmt.Errorf("grpc: cannot create SubConn with empty address list") -+ if ccb.isIdleOrClosed() { -+ return nil, fmt.Errorf("grpc: cannot create SubConn when balancer is closed or idle") - } -- ccb.mu.Lock() -- defer ccb.mu.Unlock() -- if ccb.subConns == nil { -- return nil, fmt.Errorf("grpc: ClientConn balancer wrapper was closed") -+ -+ if len(addrs) == 0 { -+ return nil, fmt.Errorf("grpc: cannot create SubConn with empty address list") - } - ac, err := ccb.cc.newAddrConn(addrs, opts) - if err != nil { -+ channelz.Warningf(logger, ccb.cc.channelzID, "acBalancerWrapper: NewSubConn: failed to newAddrConn: %v", err) - return nil, err - } -- acbw := &acBalancerWrapper{ac: ac} -- acbw.ac.mu.Lock() -+ acbw := &acBalancerWrapper{ac: ac, producers: make(map[balancer.ProducerBuilder]*refCountedProducer)} - ac.acbw = acbw -- acbw.ac.mu.Unlock() -- ccb.subConns[acbw] = struct{}{} - return acbw, nil - } - - func (ccb *ccBalancerWrapper) RemoveSubConn(sc balancer.SubConn) { -- // The RemoveSubConn() is handled in the run() goroutine, to avoid deadlock -- // during switchBalancer() if the old balancer calls RemoveSubConn() in its -- // Close(). -- ccb.updateCh.Put(sc) -+ if ccb.isIdleOrClosed() { -+ // It it safe to ignore this call when the balancer is closed or in idle -+ // because the ClientConn takes care of closing the connections. -+ // -+ // Not returning early from here when the balancer is closed or in idle -+ // leads to a deadlock though, because of the following sequence of -+ // calls when holding cc.mu: -+ // cc.exitIdleMode --> ccb.enterIdleMode --> gsw.Close --> -+ // ccb.RemoveAddrConn --> cc.removeAddrConn -+ return -+ } -+ -+ acbw, ok := sc.(*acBalancerWrapper) -+ if !ok { -+ return -+ } -+ ccb.cc.removeAddrConn(acbw.ac, errConnDrain) - } - - func (ccb *ccBalancerWrapper) UpdateAddresses(sc balancer.SubConn, addrs []resolver.Address) { -+ if ccb.isIdleOrClosed() { -+ return -+ } -+ - acbw, ok := sc.(*acBalancerWrapper) - if !ok { - return -@@ -185,11 +352,10 @@ func (ccb *ccBalancerWrapper) UpdateAddresses(sc balancer.SubConn, addrs []resol - } - - func (ccb *ccBalancerWrapper) UpdateState(s balancer.State) { -- ccb.mu.Lock() -- defer ccb.mu.Unlock() -- if ccb.subConns == nil { -+ if ccb.isIdleOrClosed() { - return - } -+ - // Update picker before updating state. Even though the ordering here does - // not matter, it can lead to multiple calls of Pick in the common start-up - // case where we wait for ready and then perform an RPC. If the picker is -@@ -200,6 +366,10 @@ func (ccb *ccBalancerWrapper) UpdateState(s balancer.State) { - } - - func (ccb *ccBalancerWrapper) ResolveNow(o resolver.ResolveNowOptions) { -+ if ccb.isIdleOrClosed() { -+ return -+ } -+ - ccb.cc.resolveNow(o) - } - -@@ -210,58 +380,80 @@ func (ccb *ccBalancerWrapper) Target() string { - // acBalancerWrapper is a wrapper on top of ac for balancers. - // It implements balancer.SubConn interface. - type acBalancerWrapper struct { -- mu sync.Mutex -- ac *addrConn -+ ac *addrConn // read-only -+ -+ mu sync.Mutex -+ producers map[balancer.ProducerBuilder]*refCountedProducer -+} -+ -+func (acbw *acBalancerWrapper) String() string { -+ return fmt.Sprintf("SubConn(id:%d)", acbw.ac.channelzID.Int()) - } - - func (acbw *acBalancerWrapper) UpdateAddresses(addrs []resolver.Address) { -- acbw.mu.Lock() -- defer acbw.mu.Unlock() -- if len(addrs) <= 0 { -- acbw.ac.cc.removeAddrConn(acbw.ac, errConnDrain) -- return -+ acbw.ac.updateAddrs(addrs) -+} -+ -+func (acbw *acBalancerWrapper) Connect() { -+ go acbw.ac.connect() -+} -+ -+// NewStream begins a streaming RPC on the addrConn. If the addrConn is not -+// ready, blocks until it is or ctx expires. Returns an error when the context -+// expires or the addrConn is shut down. -+func (acbw *acBalancerWrapper) NewStream(ctx context.Context, desc *StreamDesc, method string, opts ...CallOption) (ClientStream, error) { -+ transport, err := acbw.ac.getTransport(ctx) -+ if err != nil { -+ return nil, err - } -- if !acbw.ac.tryUpdateAddrs(addrs) { -- cc := acbw.ac.cc -- opts := acbw.ac.scopts -- acbw.ac.mu.Lock() -- // Set old ac.acbw to nil so the Shutdown state update will be ignored -- // by balancer. -- // -- // TODO(bar) the state transition could be wrong when tearDown() old ac -- // and creating new ac, fix the transition. -- acbw.ac.acbw = nil -- acbw.ac.mu.Unlock() -- acState := acbw.ac.getState() -- acbw.ac.cc.removeAddrConn(acbw.ac, errConnDrain) -- -- if acState == connectivity.Shutdown { -- return -- } -+ return newNonRetryClientStream(ctx, desc, method, transport, acbw.ac, opts...) -+} - -- ac, err := cc.newAddrConn(addrs, opts) -- if err != nil { -- channelz.Warningf(logger, acbw.ac.channelzID, "acBalancerWrapper: UpdateAddresses: failed to newAddrConn: %v", err) -- return -- } -- acbw.ac = ac -- ac.mu.Lock() -- ac.acbw = acbw -- ac.mu.Unlock() -- if acState != connectivity.Idle { -- ac.connect() -- } -+// Invoke performs a unary RPC. If the addrConn is not ready, returns -+// errSubConnNotReady. -+func (acbw *acBalancerWrapper) Invoke(ctx context.Context, method string, args interface{}, reply interface{}, opts ...CallOption) error { -+ cs, err := acbw.NewStream(ctx, unaryStreamDesc, method, opts...) -+ if err != nil { -+ return err - } -+ if err := cs.SendMsg(args); err != nil { -+ return err -+ } -+ return cs.RecvMsg(reply) - } - --func (acbw *acBalancerWrapper) Connect() { -- acbw.mu.Lock() -- defer acbw.mu.Unlock() -- acbw.ac.connect() -+type refCountedProducer struct { -+ producer balancer.Producer -+ refs int // number of current refs to the producer -+ close func() // underlying producer's close function - } - --func (acbw *acBalancerWrapper) getAddrConn() *addrConn { -+func (acbw *acBalancerWrapper) GetOrBuildProducer(pb balancer.ProducerBuilder) (balancer.Producer, func()) { - acbw.mu.Lock() - defer acbw.mu.Unlock() -- return acbw.ac -+ -+ // Look up existing producer from this builder. -+ pData := acbw.producers[pb] -+ if pData == nil { -+ // Not found; create a new one and add it to the producers map. -+ p, close := pb.Build(acbw) -+ pData = &refCountedProducer{producer: p, close: close} -+ acbw.producers[pb] = pData -+ } -+ // Account for this new reference. -+ pData.refs++ -+ -+ // Return a cleanup function wrapped in a OnceFunc to remove this reference -+ // and delete the refCountedProducer from the map if the total reference -+ // count goes to zero. -+ unref := func() { -+ acbw.mu.Lock() -+ pData.refs-- -+ if pData.refs == 0 { -+ defer pData.close() // Run outside the acbw mutex -+ delete(acbw.producers, pb) -+ } -+ acbw.mu.Unlock() -+ } -+ return pData.producer, grpcsync.OnceFunc(unref) - } -diff --git a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go -index ed75290..ec2c2fa 100644 ---- a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go -+++ b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go -@@ -18,14 +18,13 @@ - - // Code generated by protoc-gen-go. DO NOT EDIT. - // versions: --// protoc-gen-go v1.25.0 --// protoc v3.14.0 -+// protoc-gen-go v1.30.0 -+// protoc v4.22.0 - // source: grpc/binlog/v1/binarylog.proto - - package grpc_binarylog_v1 - - import ( -- proto "github.com/golang/protobuf/proto" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - durationpb "google.golang.org/protobuf/types/known/durationpb" -@@ -41,10 +40,6 @@ const ( - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) - ) - --// This is a compile-time assertion that a sufficiently up-to-date version --// of the legacy proto package is being used. --const _ = proto.ProtoPackageIsVersion4 -- - // Enumerates the type of event - // Note the terminology is different from the RPC semantics - // definition, but the same meaning is expressed here. -@@ -261,6 +256,7 @@ type GrpcLogEntry struct { - // according to the type of the log entry. - // - // Types that are assignable to Payload: -+ // - // *GrpcLogEntry_ClientHeader - // *GrpcLogEntry_ServerHeader - // *GrpcLogEntry_Message -@@ -694,12 +690,12 @@ func (x *Message) GetData() []byte { - // Header keys added by gRPC are omitted. To be more specific, - // implementations will not log the following entries, and this is - // not to be treated as a truncation: --// - entries handled by grpc that are not user visible, such as those --// that begin with 'grpc-' (with exception of grpc-trace-bin) --// or keys like 'lb-token' --// - transport specific entries, including but not limited to: --// ':path', ':authority', 'content-encoding', 'user-agent', 'te', etc --// - entries added for call credentials -+// - entries handled by grpc that are not user visible, such as those -+// that begin with 'grpc-' (with exception of grpc-trace-bin) -+// or keys like 'lb-token' -+// - transport specific entries, including but not limited to: -+// ':path', ':authority', 'content-encoding', 'user-agent', 'te', etc -+// - entries added for call credentials - // - // Implementations must always log grpc-trace-bin if it is present. - // Practically speaking it will only be visible on server side because -diff --git a/vendor/google.golang.org/grpc/call.go b/vendor/google.golang.org/grpc/call.go -index 9e20e4d..e6a1dc5 100644 ---- a/vendor/google.golang.org/grpc/call.go -+++ b/vendor/google.golang.org/grpc/call.go -@@ -27,6 +27,11 @@ import ( - // - // All errors returned by Invoke are compatible with the status package. - func (cc *ClientConn) Invoke(ctx context.Context, method string, args, reply interface{}, opts ...CallOption) error { -+ if err := cc.idlenessMgr.onCallBegin(); err != nil { -+ return err -+ } -+ defer cc.idlenessMgr.onCallEnd() -+ - // allow interceptor to see all applicable call options, which means those - // configured as defaults from dial option as well as per-call options - opts = combine(cc.dopts.callOptions, opts) -diff --git a/vendor/google.golang.org/grpc/channelz/channelz.go b/vendor/google.golang.org/grpc/channelz/channelz.go -new file mode 100644 -index 0000000..32b7fa5 ---- /dev/null -+++ b/vendor/google.golang.org/grpc/channelz/channelz.go -@@ -0,0 +1,36 @@ -+/* -+ * -+ * Copyright 2020 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+// Package channelz exports internals of the channelz implementation as required -+// by other gRPC packages. -+// -+// The implementation of the channelz spec as defined in -+// https://github.com/grpc/proposal/blob/master/A14-channelz.md, is provided by -+// the `internal/channelz` package. -+// -+// # Experimental -+// -+// Notice: All APIs in this package are experimental and may be removed in a -+// later release. -+package channelz -+ -+import "google.golang.org/grpc/internal/channelz" -+ -+// Identifier is an opaque identifier which uniquely identifies an entity in the -+// channelz database. -+type Identifier = channelz.Identifier -diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go -index b2bccfe..95a7459 100644 ---- a/vendor/google.golang.org/grpc/clientconn.go -+++ b/vendor/google.golang.org/grpc/clientconn.go -@@ -23,7 +23,7 @@ import ( - "errors" - "fmt" - "math" -- "reflect" -+ "net/url" - "strings" - "sync" - "sync/atomic" -@@ -37,7 +37,6 @@ import ( - "google.golang.org/grpc/internal/backoff" - "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/grpcsync" -- "google.golang.org/grpc/internal/grpcutil" - iresolver "google.golang.org/grpc/internal/resolver" - "google.golang.org/grpc/internal/transport" - "google.golang.org/grpc/keepalive" -@@ -69,6 +68,9 @@ var ( - errConnDrain = errors.New("grpc: the connection is drained") - // errConnClosing indicates that the connection is closing. - errConnClosing = errors.New("grpc: the connection is closing") -+ // errConnIdling indicates the the connection is being closed as the channel -+ // is moving to an idle mode due to inactivity. -+ errConnIdling = errors.New("grpc: the connection is closing due to channel idleness") - // invalidDefaultServiceConfigErrPrefix is used to prefix the json parsing error for the default - // service config. - invalidDefaultServiceConfigErrPrefix = "grpc: the provided default service config is invalid" -@@ -79,17 +81,17 @@ var ( - // errNoTransportSecurity indicates that there is no transport security - // being set for ClientConn. Users should either set one or explicitly - // call WithInsecure DialOption to disable security. -- errNoTransportSecurity = errors.New("grpc: no transport security set (use grpc.WithInsecure() explicitly or set credentials)") -+ errNoTransportSecurity = errors.New("grpc: no transport security set (use grpc.WithTransportCredentials(insecure.NewCredentials()) explicitly or set credentials)") - // errTransportCredsAndBundle indicates that creds bundle is used together - // with other individual Transport Credentials. - errTransportCredsAndBundle = errors.New("grpc: credentials.Bundle may not be used with individual TransportCredentials") -- // errTransportCredentialsMissing indicates that users want to transmit security -- // information (e.g., OAuth2 token) which requires secure connection on an insecure -- // connection. -+ // errNoTransportCredsInBundle indicated that the configured creds bundle -+ // returned a transport credentials which was nil. -+ errNoTransportCredsInBundle = errors.New("grpc: credentials.Bundle must return non-nil transport credentials") -+ // errTransportCredentialsMissing indicates that users want to transmit -+ // security information (e.g., OAuth2 token) which requires secure -+ // connection on an insecure connection. - errTransportCredentialsMissing = errors.New("grpc: the credentials require transport level security (use grpc.WithTransportCredentials() to set)") -- // errCredentialsConflict indicates that grpc.WithTransportCredentials() -- // and grpc.WithInsecure() are both called for a connection. -- errCredentialsConflict = errors.New("grpc: transport credentials are set for an insecure connection (grpc.WithTransportCredentials() and grpc.WithInsecure() are both called)") - ) - - const ( -@@ -134,17 +136,43 @@ func (dcs *defaultConfigSelector) SelectConfig(rpcInfo iresolver.RPCInfo) (*ires - // e.g. to use dns resolver, a "dns:///" prefix should be applied to the target. - func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error) { - cc := &ClientConn{ -- target: target, -- csMgr: &connectivityStateManager{}, -- conns: make(map[*addrConn]struct{}), -- dopts: defaultDialOptions(), -- blockingpicker: newPickerWrapper(), -- czData: new(channelzData), -- firstResolveEvent: grpcsync.NewEvent(), -- } -+ target: target, -+ csMgr: &connectivityStateManager{}, -+ conns: make(map[*addrConn]struct{}), -+ dopts: defaultDialOptions(), -+ czData: new(channelzData), -+ } -+ -+ // We start the channel off in idle mode, but kick it out of idle at the end -+ // of this method, instead of waiting for the first RPC. Other gRPC -+ // implementations do wait for the first RPC to kick the channel out of -+ // idle. But doing so would be a major behavior change for our users who are -+ // used to seeing the channel active after Dial. -+ // -+ // Taking this approach of kicking it out of idle at the end of this method -+ // allows us to share the code between channel creation and exiting idle -+ // mode. This will also make it easy for us to switch to starting the -+ // channel off in idle, if at all we ever get to do that. -+ cc.idlenessState = ccIdlenessStateIdle -+ - cc.retryThrottler.Store((*retryThrottler)(nil)) - cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{nil}) - cc.ctx, cc.cancel = context.WithCancel(context.Background()) -+ cc.exitIdleCond = sync.NewCond(&cc.mu) -+ -+ disableGlobalOpts := false -+ for _, opt := range opts { -+ if _, ok := opt.(*disableGlobalDialOptions); ok { -+ disableGlobalOpts = true -+ break -+ } -+ } -+ -+ if !disableGlobalOpts { -+ for _, opt := range globalDialOptions { -+ opt.apply(&cc.dopts) -+ } -+ } - - for _, opt := range opts { - opt.apply(&cc.dopts) -@@ -159,40 +187,11 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * - } - }() - -- if channelz.IsOn() { -- if cc.dopts.channelzParentID != 0 { -- cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, cc.dopts.channelzParentID, target) -- channelz.AddTraceEvent(logger, cc.channelzID, 0, &channelz.TraceEventDesc{ -- Desc: "Channel Created", -- Severity: channelz.CtInfo, -- Parent: &channelz.TraceEventDesc{ -- Desc: fmt.Sprintf("Nested Channel(id:%d) created", cc.channelzID), -- Severity: channelz.CtInfo, -- }, -- }) -- } else { -- cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, 0, target) -- channelz.Info(logger, cc.channelzID, "Channel Created") -- } -- cc.csMgr.channelzID = cc.channelzID -- } -+ // Register ClientConn with channelz. -+ cc.channelzRegistration(target) - -- if !cc.dopts.insecure { -- if cc.dopts.copts.TransportCredentials == nil && cc.dopts.copts.CredsBundle == nil { -- return nil, errNoTransportSecurity -- } -- if cc.dopts.copts.TransportCredentials != nil && cc.dopts.copts.CredsBundle != nil { -- return nil, errTransportCredsAndBundle -- } -- } else { -- if cc.dopts.copts.TransportCredentials != nil || cc.dopts.copts.CredsBundle != nil { -- return nil, errCredentialsConflict -- } -- for _, cd := range cc.dopts.copts.PerRPCCredentials { -- if cd.RequireTransportSecurity() { -- return nil, errTransportCredentialsMissing -- } -- } -+ if err := cc.validateTransportCredentials(); err != nil { -+ return nil, err - } - - if cc.dopts.defaultServiceConfigRawJSON != nil { -@@ -230,58 +229,19 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * - } - }() - -- scSet := false -- if cc.dopts.scChan != nil { -- // Try to get an initial service config. -- select { -- case sc, ok := <-cc.dopts.scChan: -- if ok { -- cc.sc = &sc -- cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{&sc}) -- scSet = true -- } -- default: -- } -- } - if cc.dopts.bs == nil { - cc.dopts.bs = backoff.DefaultExponential - } - - // Determine the resolver to use. -- cc.parsedTarget = grpcutil.ParseTarget(cc.target, cc.dopts.copts.Dialer != nil) -- channelz.Infof(logger, cc.channelzID, "parsed scheme: %q", cc.parsedTarget.Scheme) -- resolverBuilder := cc.getResolver(cc.parsedTarget.Scheme) -- if resolverBuilder == nil { -- // If resolver builder is still nil, the parsed target's scheme is -- // not registered. Fallback to default resolver and set Endpoint to -- // the original target. -- channelz.Infof(logger, cc.channelzID, "scheme %q not registered, fallback to default scheme", cc.parsedTarget.Scheme) -- cc.parsedTarget = resolver.Target{ -- Scheme: resolver.GetDefaultScheme(), -- Endpoint: target, -- } -- resolverBuilder = cc.getResolver(cc.parsedTarget.Scheme) -- if resolverBuilder == nil { -- return nil, fmt.Errorf("could not get resolver for default scheme: %q", cc.parsedTarget.Scheme) -- } -+ if err := cc.parseTargetAndFindResolver(); err != nil { -+ return nil, err - } -- -- creds := cc.dopts.copts.TransportCredentials -- if creds != nil && creds.Info().ServerName != "" { -- cc.authority = creds.Info().ServerName -- } else if cc.dopts.insecure && cc.dopts.authority != "" { -- cc.authority = cc.dopts.authority -- } else if strings.HasPrefix(cc.target, "unix:") || strings.HasPrefix(cc.target, "unix-abstract:") { -- cc.authority = "localhost" -- } else if strings.HasPrefix(cc.parsedTarget.Endpoint, ":") { -- cc.authority = "localhost" + cc.parsedTarget.Endpoint -- } else { -- // Use endpoint from "scheme://authority/endpoint" as the default -- // authority for ClientConn. -- cc.authority = cc.parsedTarget.Endpoint -+ if err = cc.determineAuthority(); err != nil { -+ return nil, err - } - -- if cc.dopts.scChan != nil && !scSet { -+ if cc.dopts.scChan != nil { - // Blocking wait for the initial service config. - select { - case sc, ok := <-cc.dopts.scChan: -@@ -297,55 +257,224 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * - go cc.scWatcher() - } - -+ // This creates the name resolver, load balancer, blocking picker etc. -+ if err := cc.exitIdleMode(); err != nil { -+ return nil, err -+ } -+ -+ // Configure idleness support with configured idle timeout or default idle -+ // timeout duration. Idleness can be explicitly disabled by the user, by -+ // setting the dial option to 0. -+ cc.idlenessMgr = newIdlenessManager(cc, cc.dopts.idleTimeout) -+ -+ // Return early for non-blocking dials. -+ if !cc.dopts.block { -+ return cc, nil -+ } -+ -+ // A blocking dial blocks until the clientConn is ready. -+ for { -+ s := cc.GetState() -+ if s == connectivity.Idle { -+ cc.Connect() -+ } -+ if s == connectivity.Ready { -+ return cc, nil -+ } else if cc.dopts.copts.FailOnNonTempDialError && s == connectivity.TransientFailure { -+ if err = cc.connectionError(); err != nil { -+ terr, ok := err.(interface { -+ Temporary() bool -+ }) -+ if ok && !terr.Temporary() { -+ return nil, err -+ } -+ } -+ } -+ if !cc.WaitForStateChange(ctx, s) { -+ // ctx got timeout or canceled. -+ if err = cc.connectionError(); err != nil && cc.dopts.returnLastError { -+ return nil, err -+ } -+ return nil, ctx.Err() -+ } -+ } -+} -+ -+// addTraceEvent is a helper method to add a trace event on the channel. If the -+// channel is a nested one, the same event is also added on the parent channel. -+func (cc *ClientConn) addTraceEvent(msg string) { -+ ted := &channelz.TraceEventDesc{ -+ Desc: fmt.Sprintf("Channel %s", msg), -+ Severity: channelz.CtInfo, -+ } -+ if cc.dopts.channelzParentID != nil { -+ ted.Parent = &channelz.TraceEventDesc{ -+ Desc: fmt.Sprintf("Nested channel(id:%d) %s", cc.channelzID.Int(), msg), -+ Severity: channelz.CtInfo, -+ } -+ } -+ channelz.AddTraceEvent(logger, cc.channelzID, 0, ted) -+} -+ -+// exitIdleMode moves the channel out of idle mode by recreating the name -+// resolver and load balancer. -+func (cc *ClientConn) exitIdleMode() error { -+ cc.mu.Lock() -+ if cc.conns == nil { -+ cc.mu.Unlock() -+ return errConnClosing -+ } -+ if cc.idlenessState != ccIdlenessStateIdle { -+ cc.mu.Unlock() -+ logger.Info("ClientConn asked to exit idle mode when not in idle mode") -+ return nil -+ } -+ -+ defer func() { -+ // When Close() and exitIdleMode() race against each other, one of the -+ // following two can happen: -+ // - Close() wins the race and runs first. exitIdleMode() runs after, and -+ // sees that the ClientConn is already closed and hence returns early. -+ // - exitIdleMode() wins the race and runs first and recreates the balancer -+ // and releases the lock before recreating the resolver. If Close() runs -+ // in this window, it will wait for exitIdleMode to complete. -+ // -+ // We achieve this synchronization using the below condition variable. -+ cc.mu.Lock() -+ cc.idlenessState = ccIdlenessStateActive -+ cc.exitIdleCond.Signal() -+ cc.mu.Unlock() -+ }() -+ -+ cc.idlenessState = ccIdlenessStateExitingIdle -+ exitedIdle := false -+ if cc.blockingpicker == nil { -+ cc.blockingpicker = newPickerWrapper() -+ } else { -+ cc.blockingpicker.exitIdleMode() -+ exitedIdle = true -+ } -+ - var credsClone credentials.TransportCredentials - if creds := cc.dopts.copts.TransportCredentials; creds != nil { - credsClone = creds.Clone() - } -- cc.balancerBuildOpts = balancer.BuildOptions{ -- DialCreds: credsClone, -- CredsBundle: cc.dopts.copts.CredsBundle, -- Dialer: cc.dopts.copts.Dialer, -- CustomUserAgent: cc.dopts.copts.UserAgent, -- ChannelzParentID: cc.channelzID, -- Target: cc.parsedTarget, -+ if cc.balancerWrapper == nil { -+ cc.balancerWrapper = newCCBalancerWrapper(cc, balancer.BuildOptions{ -+ DialCreds: credsClone, -+ CredsBundle: cc.dopts.copts.CredsBundle, -+ Dialer: cc.dopts.copts.Dialer, -+ Authority: cc.authority, -+ CustomUserAgent: cc.dopts.copts.UserAgent, -+ ChannelzParentID: cc.channelzID, -+ Target: cc.parsedTarget, -+ }) -+ } else { -+ cc.balancerWrapper.exitIdleMode() - } -+ cc.firstResolveEvent = grpcsync.NewEvent() -+ cc.mu.Unlock() - -- // Build the resolver. -- rWrapper, err := newCCResolverWrapper(cc, resolverBuilder) -- if err != nil { -- return nil, fmt.Errorf("failed to build resolver: %v", err) -+ // This needs to be called without cc.mu because this builds a new resolver -+ // which might update state or report error inline which needs to be handled -+ // by cc.updateResolverState() which also grabs cc.mu. -+ if err := cc.initResolverWrapper(credsClone); err != nil { -+ return err -+ } -+ -+ if exitedIdle { -+ cc.addTraceEvent("exiting idle mode") - } -+ return nil -+} -+ -+// enterIdleMode puts the channel in idle mode, and as part of it shuts down the -+// name resolver, load balancer and any subchannels. -+func (cc *ClientConn) enterIdleMode() error { - cc.mu.Lock() -- cc.resolverWrapper = rWrapper -+ if cc.conns == nil { -+ cc.mu.Unlock() -+ return ErrClientConnClosing -+ } -+ if cc.idlenessState != ccIdlenessStateActive { -+ logger.Error("ClientConn asked to enter idle mode when not active") -+ return nil -+ } -+ -+ // cc.conns == nil is a proxy for the ClientConn being closed. So, instead -+ // of setting it to nil here, we recreate the map. This also means that we -+ // don't have to do this when exiting idle mode. -+ conns := cc.conns -+ cc.conns = make(map[*addrConn]struct{}) -+ -+ // TODO: Currently, we close the resolver wrapper upon entering idle mode -+ // and create a new one upon exiting idle mode. This means that the -+ // `cc.resolverWrapper` field would be overwritten everytime we exit idle -+ // mode. While this means that we need to hold `cc.mu` when accessing -+ // `cc.resolverWrapper`, it makes the code simpler in the wrapper. We should -+ // try to do the same for the balancer and picker wrappers too. -+ cc.resolverWrapper.close() -+ cc.blockingpicker.enterIdleMode() -+ cc.balancerWrapper.enterIdleMode() -+ cc.csMgr.updateState(connectivity.Idle) -+ cc.idlenessState = ccIdlenessStateIdle - cc.mu.Unlock() - -- // A blocking dial blocks until the clientConn is ready. -- if cc.dopts.block { -- for { -- s := cc.GetState() -- if s == connectivity.Ready { -- break -- } else if cc.dopts.copts.FailOnNonTempDialError && s == connectivity.TransientFailure { -- if err = cc.connectionError(); err != nil { -- terr, ok := err.(interface { -- Temporary() bool -- }) -- if ok && !terr.Temporary() { -- return nil, err -- } -- } -- } -- if !cc.WaitForStateChange(ctx, s) { -- // ctx got timeout or canceled. -- if err = cc.connectionError(); err != nil && cc.dopts.returnLastError { -- return nil, err -- } -- return nil, ctx.Err() -+ go func() { -+ cc.addTraceEvent("entering idle mode") -+ for ac := range conns { -+ ac.tearDown(errConnIdling) -+ } -+ }() -+ return nil -+} -+ -+// validateTransportCredentials performs a series of checks on the configured -+// transport credentials. It returns a non-nil error if any of these conditions -+// are met: -+// - no transport creds and no creds bundle is configured -+// - both transport creds and creds bundle are configured -+// - creds bundle is configured, but it lacks a transport credentials -+// - insecure transport creds configured alongside call creds that require -+// transport level security -+// -+// If none of the above conditions are met, the configured credentials are -+// deemed valid and a nil error is returned. -+func (cc *ClientConn) validateTransportCredentials() error { -+ if cc.dopts.copts.TransportCredentials == nil && cc.dopts.copts.CredsBundle == nil { -+ return errNoTransportSecurity -+ } -+ if cc.dopts.copts.TransportCredentials != nil && cc.dopts.copts.CredsBundle != nil { -+ return errTransportCredsAndBundle -+ } -+ if cc.dopts.copts.CredsBundle != nil && cc.dopts.copts.CredsBundle.TransportCredentials() == nil { -+ return errNoTransportCredsInBundle -+ } -+ transportCreds := cc.dopts.copts.TransportCredentials -+ if transportCreds == nil { -+ transportCreds = cc.dopts.copts.CredsBundle.TransportCredentials() -+ } -+ if transportCreds.Info().SecurityProtocol == "insecure" { -+ for _, cd := range cc.dopts.copts.PerRPCCredentials { -+ if cd.RequireTransportSecurity() { -+ return errTransportCredentialsMissing - } - } - } -+ return nil -+} - -- return cc, nil -+// channelzRegistration registers the newly created ClientConn with channelz and -+// stores the returned identifier in `cc.channelzID` and `cc.csMgr.channelzID`. -+// A channelz trace event is emitted for ClientConn creation. If the newly -+// created ClientConn is a nested one, i.e a valid parent ClientConn ID is -+// specified via a dial option, the trace event is also added to the parent. -+// -+// Doesn't grab cc.mu as this method is expected to be called only at Dial time. -+func (cc *ClientConn) channelzRegistration(target string) { -+ cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, cc.dopts.channelzParentID, target) -+ cc.addTraceEvent("created") -+ cc.csMgr.channelzID = cc.channelzID - } - - // chainUnaryClientInterceptors chains all unary client interceptors into one. -@@ -416,7 +545,7 @@ type connectivityStateManager struct { - mu sync.Mutex - state connectivity.State - notifyChan chan struct{} -- channelzID int64 -+ channelzID *channelz.Identifier - } - - // updateState updates the connectivity.State of ClientConn. -@@ -482,43 +611,67 @@ var _ ClientConnInterface = (*ClientConn)(nil) - // handshakes. It also handles errors on established connections by - // re-resolving the name and reconnecting. - type ClientConn struct { -- ctx context.Context -- cancel context.CancelFunc -- -- target string -- parsedTarget resolver.Target -- authority string -- dopts dialOptions -- csMgr *connectivityStateManager -- -- balancerBuildOpts balancer.BuildOptions -- blockingpicker *pickerWrapper -- -+ ctx context.Context // Initialized using the background context at dial time. -+ cancel context.CancelFunc // Cancelled on close. -+ -+ // The following are initialized at dial time, and are read-only after that. -+ target string // User's dial target. -+ parsedTarget resolver.Target // See parseTargetAndFindResolver(). -+ authority string // See determineAuthority(). -+ dopts dialOptions // Default and user specified dial options. -+ channelzID *channelz.Identifier // Channelz identifier for the channel. -+ resolverBuilder resolver.Builder // See parseTargetAndFindResolver(). -+ balancerWrapper *ccBalancerWrapper // Uses gracefulswitch.balancer underneath. -+ idlenessMgr idlenessManager -+ -+ // The following provide their own synchronization, and therefore don't -+ // require cc.mu to be held to access them. -+ csMgr *connectivityStateManager -+ blockingpicker *pickerWrapper - safeConfigSelector iresolver.SafeConfigSelector -+ czData *channelzData -+ retryThrottler atomic.Value // Updated from service config. - -- mu sync.RWMutex -- resolverWrapper *ccResolverWrapper -- sc *ServiceConfig -- conns map[*addrConn]struct{} -- // Keepalive parameter can be updated if a GoAway is received. -- mkp keepalive.ClientParameters -- curBalancerName string -- balancerWrapper *ccBalancerWrapper -- retryThrottler atomic.Value -- -+ // firstResolveEvent is used to track whether the name resolver sent us at -+ // least one update. RPCs block on this event. - firstResolveEvent *grpcsync.Event - -- channelzID int64 // channelz unique identification number -- czData *channelzData -+ // mu protects the following fields. -+ // TODO: split mu so the same mutex isn't used for everything. -+ mu sync.RWMutex -+ resolverWrapper *ccResolverWrapper // Initialized in Dial; cleared in Close. -+ sc *ServiceConfig // Latest service config received from the resolver. -+ conns map[*addrConn]struct{} // Set to nil on close. -+ mkp keepalive.ClientParameters // May be updated upon receipt of a GoAway. -+ idlenessState ccIdlenessState // Tracks idleness state of the channel. -+ exitIdleCond *sync.Cond // Signalled when channel exits idle. - - lceMu sync.Mutex // protects lastConnectionError - lastConnectionError error - } - -+// ccIdlenessState tracks the idleness state of the channel. -+// -+// Channels start off in `active` and move to `idle` after a period of -+// inactivity. When moving back to `active` upon an incoming RPC, they -+// transition through `exiting_idle`. This state is useful for synchronization -+// with Close(). -+// -+// This state tracking is mostly for self-protection. The idlenessManager is -+// expected to keep track of the state as well, and is expected not to call into -+// the ClientConn unnecessarily. -+type ccIdlenessState int8 -+ -+const ( -+ ccIdlenessStateActive ccIdlenessState = iota -+ ccIdlenessStateIdle -+ ccIdlenessStateExitingIdle -+) -+ - // WaitForStateChange waits until the connectivity.State of ClientConn changes from sourceState or - // ctx expires. A true value is returned in former case and false in latter. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -537,14 +690,29 @@ func (cc *ClientConn) WaitForStateChange(ctx context.Context, sourceState connec - - // GetState returns the connectivity.State of ClientConn. - // --// Experimental -+// # Experimental - // --// Notice: This API is EXPERIMENTAL and may be changed or removed in a --// later release. -+// Notice: This API is EXPERIMENTAL and may be changed or removed in a later -+// release. - func (cc *ClientConn) GetState() connectivity.State { - return cc.csMgr.getState() - } - -+// Connect causes all subchannels in the ClientConn to attempt to connect if -+// the channel is idle. Does not wait for the connection attempts to begin -+// before returning. -+// -+// # Experimental -+// -+// Notice: This API is EXPERIMENTAL and may be changed or removed in a later -+// release. -+func (cc *ClientConn) Connect() { -+ cc.exitIdleMode() -+ // If the ClientConn was not in idle mode, we need to call ExitIdle on the -+ // LB policy so that connections can be created. -+ cc.balancerWrapper.exitIdleMode() -+} -+ - func (cc *ClientConn) scWatcher() { - for { - select { -@@ -622,9 +790,7 @@ func (cc *ClientConn) updateResolverState(s resolver.State, err error) error { - // with the new addresses. - cc.maybeApplyDefaultServiceConfig(nil) - -- if cc.balancerWrapper != nil { -- cc.balancerWrapper.resolverError(err) -- } -+ cc.balancerWrapper.resolverError(err) - - // No addresses are valid with err set; return early. - cc.mu.Unlock() -@@ -632,7 +798,10 @@ func (cc *ClientConn) updateResolverState(s resolver.State, err error) error { - } - - var ret error -- if cc.dopts.disableServiceConfig || s.ServiceConfig == nil { -+ if cc.dopts.disableServiceConfig { -+ channelz.Infof(logger, cc.channelzID, "ignoring service config from resolver (%v) and applying the default because service config is disabled", s.ServiceConfig) -+ cc.maybeApplyDefaultServiceConfig(s.Addresses) -+ } else if s.ServiceConfig == nil { - cc.maybeApplyDefaultServiceConfig(s.Addresses) - // TODO: do we need to apply a failing LB policy if there is no - // default, per the error handling design? -@@ -649,16 +818,10 @@ func (cc *ClientConn) updateResolverState(s resolver.State, err error) error { - cc.applyServiceConfigAndBalancer(sc, configSelector, s.Addresses) - } else { - ret = balancer.ErrBadResolverState -- if cc.balancerWrapper == nil { -- var err error -- if s.ServiceConfig.Err != nil { -- err = status.Errorf(codes.Unavailable, "error parsing service config: %v", s.ServiceConfig.Err) -- } else { -- err = status.Errorf(codes.Unavailable, "illegal service config type: %T", s.ServiceConfig.Config) -- } -- cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{cc.sc}) -- cc.blockingpicker.updatePicker(base.NewErrPicker(err)) -- cc.csMgr.updateState(connectivity.TransientFailure) -+ if cc.sc == nil { -+ // Apply the failing LB only if we haven't received valid service config -+ // from the name resolver in the past. -+ cc.applyFailingLB(s.ServiceConfig) - cc.mu.Unlock() - return ret - } -@@ -666,24 +829,12 @@ func (cc *ClientConn) updateResolverState(s resolver.State, err error) error { - } - - var balCfg serviceconfig.LoadBalancingConfig -- if cc.dopts.balancerBuilder == nil && cc.sc != nil && cc.sc.lbConfig != nil { -+ if cc.sc != nil && cc.sc.lbConfig != nil { - balCfg = cc.sc.lbConfig.cfg - } -- -- cbn := cc.curBalancerName - bw := cc.balancerWrapper - cc.mu.Unlock() -- if cbn != grpclbName { -- // Filter any grpclb addresses since we don't have the grpclb balancer. -- for i := 0; i < len(s.Addresses); { -- if s.Addresses[i].Type == resolver.GRPCLB { -- copy(s.Addresses[i:], s.Addresses[i+1:]) -- s.Addresses = s.Addresses[:len(s.Addresses)-1] -- continue -- } -- i++ -- } -- } -+ - uccsErr := bw.updateClientConnState(&balancer.ClientConnState{ResolverState: s, BalancerConfig: balCfg}) - if ret == nil { - ret = uccsErr // prefer ErrBadResolver state since any other error is -@@ -692,56 +843,28 @@ func (cc *ClientConn) updateResolverState(s resolver.State, err error) error { - return ret - } - --// switchBalancer starts the switching from current balancer to the balancer --// with the given name. --// --// It will NOT send the current address list to the new balancer. If needed, --// caller of this function should send address list to the new balancer after --// this function returns. -+// applyFailingLB is akin to configuring an LB policy on the channel which -+// always fails RPCs. Here, an actual LB policy is not configured, but an always -+// erroring picker is configured, which returns errors with information about -+// what was invalid in the received service config. A config selector with no -+// service config is configured, and the connectivity state of the channel is -+// set to TransientFailure. - // - // Caller must hold cc.mu. --func (cc *ClientConn) switchBalancer(name string) { -- if strings.EqualFold(cc.curBalancerName, name) { -- return -- } -- -- channelz.Infof(logger, cc.channelzID, "ClientConn switching balancer to %q", name) -- if cc.dopts.balancerBuilder != nil { -- channelz.Info(logger, cc.channelzID, "ignoring balancer switching: Balancer DialOption used instead") -- return -- } -- if cc.balancerWrapper != nil { -- // Don't hold cc.mu while closing the balancers. The balancers may call -- // methods that require cc.mu (e.g. cc.NewSubConn()). Holding the mutex -- // would cause a deadlock in that case. -- cc.mu.Unlock() -- cc.balancerWrapper.close() -- cc.mu.Lock() -- } -- -- builder := balancer.Get(name) -- if builder == nil { -- channelz.Warningf(logger, cc.channelzID, "Channel switches to new LB policy %q due to fallback from invalid balancer name", PickFirstBalancerName) -- channelz.Infof(logger, cc.channelzID, "failed to get balancer builder for: %v, using pick_first instead", name) -- builder = newPickfirstBuilder() -+func (cc *ClientConn) applyFailingLB(sc *serviceconfig.ParseResult) { -+ var err error -+ if sc.Err != nil { -+ err = status.Errorf(codes.Unavailable, "error parsing service config: %v", sc.Err) - } else { -- channelz.Infof(logger, cc.channelzID, "Channel switches to new LB policy %q", name) -+ err = status.Errorf(codes.Unavailable, "illegal service config type: %T", sc.Config) - } -- -- cc.curBalancerName = builder.Name() -- cc.balancerWrapper = newCCBalancerWrapper(cc, builder, cc.balancerBuildOpts) -+ cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{nil}) -+ cc.blockingpicker.updatePicker(base.NewErrPicker(err)) -+ cc.csMgr.updateState(connectivity.TransientFailure) - } - - func (cc *ClientConn) handleSubConnStateChange(sc balancer.SubConn, s connectivity.State, err error) { -- cc.mu.Lock() -- if cc.conns == nil { -- cc.mu.Unlock() -- return -- } -- // TODO(bar switching) send updates to all balancer wrappers when balancer -- // gracefully switching is supported. -- cc.balancerWrapper.handleSubConnStateChange(sc, s, err) -- cc.mu.Unlock() -+ cc.balancerWrapper.updateSubConnState(sc, s, err) - } - - // newAddrConn creates an addrConn for addrs and adds it to cc.conns. -@@ -756,27 +879,31 @@ func (cc *ClientConn) newAddrConn(addrs []resolver.Address, opts balancer.NewSub - dopts: cc.dopts, - czData: new(channelzData), - resetBackoff: make(chan struct{}), -+ stateChan: make(chan struct{}), - } - ac.ctx, ac.cancel = context.WithCancel(cc.ctx) - // Track ac in cc. This needs to be done before any getTransport(...) is called. - cc.mu.Lock() -+ defer cc.mu.Unlock() - if cc.conns == nil { -- cc.mu.Unlock() - return nil, ErrClientConnClosing - } -- if channelz.IsOn() { -- ac.channelzID = channelz.RegisterSubChannel(ac, cc.channelzID, "") -- channelz.AddTraceEvent(logger, ac.channelzID, 0, &channelz.TraceEventDesc{ -- Desc: "Subchannel Created", -- Severity: channelz.CtInfo, -- Parent: &channelz.TraceEventDesc{ -- Desc: fmt.Sprintf("Subchannel(id:%d) created", ac.channelzID), -- Severity: channelz.CtInfo, -- }, -- }) -+ -+ var err error -+ ac.channelzID, err = channelz.RegisterSubChannel(ac, cc.channelzID, "") -+ if err != nil { -+ return nil, err - } -+ channelz.AddTraceEvent(logger, ac.channelzID, 0, &channelz.TraceEventDesc{ -+ Desc: "Subchannel created", -+ Severity: channelz.CtInfo, -+ Parent: &channelz.TraceEventDesc{ -+ Desc: fmt.Sprintf("Subchannel(id:%d) created", ac.channelzID.Int()), -+ Severity: channelz.CtInfo, -+ }, -+ }) -+ - cc.conns[ac] = struct{}{} -- cc.mu.Unlock() - return ac, nil - } - -@@ -806,7 +933,7 @@ func (cc *ClientConn) channelzMetric() *channelz.ChannelInternalMetric { - - // Target returns the target string of the ClientConn. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -833,67 +960,113 @@ func (cc *ClientConn) incrCallsFailed() { - func (ac *addrConn) connect() error { - ac.mu.Lock() - if ac.state == connectivity.Shutdown { -+ if logger.V(2) { -+ logger.Infof("connect called on shutdown addrConn; ignoring.") -+ } - ac.mu.Unlock() - return errConnClosing - } - if ac.state != connectivity.Idle { -+ if logger.V(2) { -+ logger.Infof("connect called on addrConn in non-idle state (%v); ignoring.", ac.state) -+ } - ac.mu.Unlock() - return nil - } -- // Update connectivity state within the lock to prevent subsequent or -- // concurrent calls from resetting the transport more than once. -- ac.updateConnectivityState(connectivity.Connecting, nil) - ac.mu.Unlock() - -- // Start a goroutine connecting to the server asynchronously. -- go ac.resetTransport() -+ ac.resetTransport() - return nil - } - --// tryUpdateAddrs tries to update ac.addrs with the new addresses list. --// --// If ac is Connecting, it returns false. The caller should tear down the ac and --// create a new one. Note that the backoff will be reset when this happens. --// --// If ac is TransientFailure, it updates ac.addrs and returns true. The updated --// addresses will be picked up by retry in the next iteration after backoff. --// --// If ac is Shutdown or Idle, it updates ac.addrs and returns true. --// --// If ac is Ready, it checks whether current connected address of ac is in the --// new addrs list. --// - If true, it updates ac.addrs and returns true. The ac will keep using --// the existing connection. --// - If false, it does nothing and returns false. --func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool { -+func equalAddresses(a, b []resolver.Address) bool { -+ if len(a) != len(b) { -+ return false -+ } -+ for i, v := range a { -+ if !v.Equal(b[i]) { -+ return false -+ } -+ } -+ return true -+} -+ -+// updateAddrs updates ac.addrs with the new addresses list and handles active -+// connections or connection attempts. -+func (ac *addrConn) updateAddrs(addrs []resolver.Address) { - ac.mu.Lock() -- defer ac.mu.Unlock() -- channelz.Infof(logger, ac.channelzID, "addrConn: tryUpdateAddrs curAddr: %v, addrs: %v", ac.curAddr, addrs) -+ channelz.Infof(logger, ac.channelzID, "addrConn: updateAddrs curAddr: %v, addrs: %v", ac.curAddr, addrs) -+ -+ if equalAddresses(ac.addrs, addrs) { -+ ac.mu.Unlock() -+ return -+ } -+ -+ ac.addrs = addrs -+ - if ac.state == connectivity.Shutdown || - ac.state == connectivity.TransientFailure || - ac.state == connectivity.Idle { -- ac.addrs = addrs -- return true -+ // We were not connecting, so do nothing but update the addresses. -+ ac.mu.Unlock() -+ return - } - -- if ac.state == connectivity.Connecting { -- return false -+ if ac.state == connectivity.Ready { -+ // Try to find the connected address. -+ for _, a := range addrs { -+ a.ServerName = ac.cc.getServerName(a) -+ if a.Equal(ac.curAddr) { -+ // We are connected to a valid address, so do nothing but -+ // update the addresses. -+ ac.mu.Unlock() -+ return -+ } -+ } - } - -- // ac.state is Ready, try to find the connected address. -- var curAddrFound bool -- for _, a := range addrs { -- if reflect.DeepEqual(ac.curAddr, a) { -- curAddrFound = true -- break -- } -+ // We are either connected to the wrong address or currently connecting. -+ // Stop the current iteration and restart. -+ -+ ac.cancel() -+ ac.ctx, ac.cancel = context.WithCancel(ac.cc.ctx) -+ -+ // We have to defer here because GracefulClose => Close => onClose, which -+ // requires locking ac.mu. -+ if ac.transport != nil { -+ defer ac.transport.GracefulClose() -+ ac.transport = nil - } -- channelz.Infof(logger, ac.channelzID, "addrConn: tryUpdateAddrs curAddrFound: %v", curAddrFound) -- if curAddrFound { -- ac.addrs = addrs -+ -+ if len(addrs) == 0 { -+ ac.updateConnectivityState(connectivity.Idle, nil) - } - -- return curAddrFound -+ ac.mu.Unlock() -+ -+ // Since we were connecting/connected, we should start a new connection -+ // attempt. -+ go ac.resetTransport() -+} -+ -+// getServerName determines the serverName to be used in the connection -+// handshake. The default value for the serverName is the authority on the -+// ClientConn, which either comes from the user's dial target or through an -+// authority override specified using the WithAuthority dial option. Name -+// resolvers can specify a per-address override for the serverName through the -+// resolver.Address.ServerName field which is used only if the WithAuthority -+// dial option was not used. The rationale is that per-address authority -+// overrides specified by the name resolver can represent a security risk, while -+// an override specified by the user is more dependable since they probably know -+// what they are doing. -+func (cc *ClientConn) getServerName(addr resolver.Address) string { -+ if cc.dopts.authority != "" { -+ return cc.dopts.authority -+ } -+ if addr.ServerName != "" { -+ return addr.ServerName -+ } -+ return cc.authority - } - - func getMethodConfig(sc *ServiceConfig, method string) MethodConfig { -@@ -934,15 +1107,11 @@ func (cc *ClientConn) healthCheckConfig() *healthCheckConfig { - return cc.sc.healthCheckConfig - } - --func (cc *ClientConn) getTransport(ctx context.Context, failfast bool, method string) (transport.ClientTransport, func(balancer.DoneInfo), error) { -- t, done, err := cc.blockingpicker.pick(ctx, failfast, balancer.PickInfo{ -+func (cc *ClientConn) getTransport(ctx context.Context, failfast bool, method string) (transport.ClientTransport, balancer.PickResult, error) { -+ return cc.blockingpicker.pick(ctx, failfast, balancer.PickInfo{ - Ctx: ctx, - FullMethodName: method, - }) -- if err != nil { -- return nil, nil, toRPCErr(err) -- } -- return t, done, nil - } - - func (cc *ClientConn) applyServiceConfigAndBalancer(sc *ServiceConfig, configSelector iresolver.ConfigSelector, addrs []resolver.Address) { -@@ -967,35 +1136,26 @@ func (cc *ClientConn) applyServiceConfigAndBalancer(sc *ServiceConfig, configSel - cc.retryThrottler.Store((*retryThrottler)(nil)) - } - -- if cc.dopts.balancerBuilder == nil { -- // Only look at balancer types and switch balancer if balancer dial -- // option is not set. -- var newBalancerName string -- if cc.sc != nil && cc.sc.lbConfig != nil { -- newBalancerName = cc.sc.lbConfig.name -- } else { -- var isGRPCLB bool -- for _, a := range addrs { -- if a.Type == resolver.GRPCLB { -- isGRPCLB = true -- break -- } -- } -- if isGRPCLB { -- newBalancerName = grpclbName -- } else if cc.sc != nil && cc.sc.LB != nil { -- newBalancerName = *cc.sc.LB -- } else { -- newBalancerName = PickFirstBalancerName -+ var newBalancerName string -+ if cc.sc != nil && cc.sc.lbConfig != nil { -+ newBalancerName = cc.sc.lbConfig.name -+ } else { -+ var isGRPCLB bool -+ for _, a := range addrs { -+ if a.Type == resolver.GRPCLB { -+ isGRPCLB = true -+ break - } - } -- cc.switchBalancer(newBalancerName) -- } else if cc.balancerWrapper == nil { -- // Balancer dial option was set, and this is the first time handling -- // resolved addresses. Build a balancer with dopts.balancerBuilder. -- cc.curBalancerName = cc.dopts.balancerBuilder.Name() -- cc.balancerWrapper = newCCBalancerWrapper(cc, cc.dopts.balancerBuilder, cc.balancerBuildOpts) -+ if isGRPCLB { -+ newBalancerName = grpclbName -+ } else if cc.sc != nil && cc.sc.LB != nil { -+ newBalancerName = *cc.sc.LB -+ } else { -+ newBalancerName = PickFirstBalancerName -+ } - } -+ cc.balancerWrapper.switchTo(newBalancerName) - } - - func (cc *ClientConn) resolveNow(o resolver.ResolveNowOptions) { -@@ -1017,7 +1177,7 @@ func (cc *ClientConn) resolveNow(o resolver.ResolveNowOptions) { - // However, if a previously unavailable network becomes available, this may be - // used to trigger an immediate reconnect. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -1039,44 +1199,45 @@ func (cc *ClientConn) Close() error { - cc.mu.Unlock() - return ErrClientConnClosing - } -+ -+ for cc.idlenessState == ccIdlenessStateExitingIdle { -+ cc.exitIdleCond.Wait() -+ } -+ - conns := cc.conns - cc.conns = nil - cc.csMgr.updateState(connectivity.Shutdown) - -+ pWrapper := cc.blockingpicker - rWrapper := cc.resolverWrapper -- cc.resolverWrapper = nil - bWrapper := cc.balancerWrapper -- cc.balancerWrapper = nil -+ idlenessMgr := cc.idlenessMgr - cc.mu.Unlock() - -- cc.blockingpicker.close() -- -+ // The order of closing matters here since the balancer wrapper assumes the -+ // picker is closed before it is closed. -+ if pWrapper != nil { -+ pWrapper.close() -+ } - if bWrapper != nil { - bWrapper.close() - } - if rWrapper != nil { - rWrapper.close() - } -+ if idlenessMgr != nil { -+ idlenessMgr.close() -+ } - - for ac := range conns { - ac.tearDown(ErrClientConnClosing) - } -- if channelz.IsOn() { -- ted := &channelz.TraceEventDesc{ -- Desc: "Channel Deleted", -- Severity: channelz.CtInfo, -- } -- if cc.dopts.channelzParentID != 0 { -- ted.Parent = &channelz.TraceEventDesc{ -- Desc: fmt.Sprintf("Nested channel(id:%d) deleted", cc.channelzID), -- Severity: channelz.CtInfo, -- } -- } -- channelz.AddTraceEvent(logger, cc.channelzID, 0, ted) -- // TraceEvent needs to be called before RemoveEntry, as TraceEvent may add trace reference to -- // the entity being deleted, and thus prevent it from being deleted right away. -- channelz.RemoveEntry(cc.channelzID) -- } -+ cc.addTraceEvent("deleted") -+ // TraceEvent needs to be called before RemoveEntry, as TraceEvent may add -+ // trace reference to the entity being deleted, and thus prevent it from being -+ // deleted right away. -+ channelz.RemoveEntry(cc.channelzID) -+ - return nil - } - -@@ -1101,12 +1262,13 @@ type addrConn struct { - addrs []resolver.Address // All addresses that the resolver resolved to. - - // Use updateConnectivityState for updating addrConn's connectivity state. -- state connectivity.State -+ state connectivity.State -+ stateChan chan struct{} // closed and recreated on every state change. - - backoffIdx int // Needs to be stateful for resetConnectBackoff. - resetBackoff chan struct{} - -- channelzID int64 // channelz unique identification number. -+ channelzID *channelz.Identifier - czData *channelzData - } - -@@ -1115,8 +1277,15 @@ func (ac *addrConn) updateConnectivityState(s connectivity.State, lastErr error) - if ac.state == s { - return - } -+ // When changing states, reset the state change channel. -+ close(ac.stateChan) -+ ac.stateChan = make(chan struct{}) - ac.state = s -- channelz.Infof(logger, ac.channelzID, "Subchannel Connectivity change to %v", s) -+ if lastErr == nil { -+ channelz.Infof(logger, ac.channelzID, "Subchannel Connectivity change to %v", s) -+ } else { -+ channelz.Infof(logger, ac.channelzID, "Subchannel Connectivity change to %v, last error: %s", s, lastErr) -+ } - ac.cc.handleSubConnStateChange(ac.acbw, s, lastErr) - } - -@@ -1135,113 +1304,86 @@ func (ac *addrConn) adjustParams(r transport.GoAwayReason) { - } - - func (ac *addrConn) resetTransport() { -- for i := 0; ; i++ { -- if i > 0 { -- ac.cc.resolveNow(resolver.ResolveNowOptions{}) -- } -+ ac.mu.Lock() -+ acCtx := ac.ctx -+ if acCtx.Err() != nil { -+ ac.mu.Unlock() -+ return -+ } - -- ac.mu.Lock() -- if ac.state == connectivity.Shutdown { -- ac.mu.Unlock() -- return -- } -+ addrs := ac.addrs -+ backoffFor := ac.dopts.bs.Backoff(ac.backoffIdx) -+ // This will be the duration that dial gets to finish. -+ dialDuration := minConnectTimeout -+ if ac.dopts.minConnectTimeout != nil { -+ dialDuration = ac.dopts.minConnectTimeout() -+ } - -- addrs := ac.addrs -- backoffFor := ac.dopts.bs.Backoff(ac.backoffIdx) -- // This will be the duration that dial gets to finish. -- dialDuration := minConnectTimeout -- if ac.dopts.minConnectTimeout != nil { -- dialDuration = ac.dopts.minConnectTimeout() -- } -+ if dialDuration < backoffFor { -+ // Give dial more time as we keep failing to connect. -+ dialDuration = backoffFor -+ } -+ // We can potentially spend all the time trying the first address, and -+ // if the server accepts the connection and then hangs, the following -+ // addresses will never be tried. -+ // -+ // The spec doesn't mention what should be done for multiple addresses. -+ // https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md#proposed-backoff-algorithm -+ connectDeadline := time.Now().Add(dialDuration) - -- if dialDuration < backoffFor { -- // Give dial more time as we keep failing to connect. -- dialDuration = backoffFor -+ ac.updateConnectivityState(connectivity.Connecting, nil) -+ ac.mu.Unlock() -+ -+ if err := ac.tryAllAddrs(acCtx, addrs, connectDeadline); err != nil { -+ ac.cc.resolveNow(resolver.ResolveNowOptions{}) -+ // After exhausting all addresses, the addrConn enters -+ // TRANSIENT_FAILURE. -+ if acCtx.Err() != nil { -+ return - } -- // We can potentially spend all the time trying the first address, and -- // if the server accepts the connection and then hangs, the following -- // addresses will never be tried. -- // -- // The spec doesn't mention what should be done for multiple addresses. -- // https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md#proposed-backoff-algorithm -- connectDeadline := time.Now().Add(dialDuration) -+ ac.mu.Lock() -+ ac.updateConnectivityState(connectivity.TransientFailure, err) - -- ac.updateConnectivityState(connectivity.Connecting, nil) -- ac.transport = nil -+ // Backoff. -+ b := ac.resetBackoff - ac.mu.Unlock() - -- newTr, addr, reconnect, err := ac.tryAllAddrs(addrs, connectDeadline) -- if err != nil { -- // After exhausting all addresses, the addrConn enters -- // TRANSIENT_FAILURE. -+ timer := time.NewTimer(backoffFor) -+ select { -+ case <-timer.C: - ac.mu.Lock() -- if ac.state == connectivity.Shutdown { -- ac.mu.Unlock() -- return -- } -- ac.updateConnectivityState(connectivity.TransientFailure, err) -- -- // Backoff. -- b := ac.resetBackoff -+ ac.backoffIdx++ - ac.mu.Unlock() -- -- timer := time.NewTimer(backoffFor) -- select { -- case <-timer.C: -- ac.mu.Lock() -- ac.backoffIdx++ -- ac.mu.Unlock() -- case <-b: -- timer.Stop() -- case <-ac.ctx.Done(): -- timer.Stop() -- return -- } -- continue -+ case <-b: -+ timer.Stop() -+ case <-acCtx.Done(): -+ timer.Stop() -+ return - } - - ac.mu.Lock() -- if ac.state == connectivity.Shutdown { -- ac.mu.Unlock() -- newTr.Close(fmt.Errorf("reached connectivity state: SHUTDOWN")) -- return -+ if acCtx.Err() == nil { -+ ac.updateConnectivityState(connectivity.Idle, err) - } -- ac.curAddr = addr -- ac.transport = newTr -- ac.backoffIdx = 0 -- -- hctx, hcancel := context.WithCancel(ac.ctx) -- ac.startHealthCheck(hctx) - ac.mu.Unlock() -- -- // Block until the created transport is down. And when this happens, -- // we restart from the top of the addr list. -- <-reconnect.Done() -- hcancel() -- // restart connecting - the top of the loop will set state to -- // CONNECTING. This is against the current connectivity semantics doc, -- // however it allows for graceful behavior for RPCs not yet dispatched -- // - unfortunate timing would otherwise lead to the RPC failing even -- // though the TRANSIENT_FAILURE state (called for by the doc) would be -- // instantaneous. -- // -- // Ideally we should transition to Idle here and block until there is -- // RPC activity that leads to the balancer requesting a reconnect of -- // the associated SubConn. -+ return - } -+ // Success; reset backoff. -+ ac.mu.Lock() -+ ac.backoffIdx = 0 -+ ac.mu.Unlock() - } - --// tryAllAddrs tries to creates a connection to the addresses, and stop when at the --// first successful one. It returns the transport, the address and a Event in --// the successful case. The Event fires when the returned transport disconnects. --func (ac *addrConn) tryAllAddrs(addrs []resolver.Address, connectDeadline time.Time) (transport.ClientTransport, resolver.Address, *grpcsync.Event, error) { -+// tryAllAddrs tries to creates a connection to the addresses, and stop when at -+// the first successful one. It returns an error if no address was successfully -+// connected, or updates ac appropriately with the new transport. -+func (ac *addrConn) tryAllAddrs(ctx context.Context, addrs []resolver.Address, connectDeadline time.Time) error { - var firstConnErr error - for _, addr := range addrs { -- ac.mu.Lock() -- if ac.state == connectivity.Shutdown { -- ac.mu.Unlock() -- return nil, resolver.Address{}, nil, errConnClosing -+ if ctx.Err() != nil { -+ return errConnClosing - } -+ ac.mu.Lock() - - ac.cc.mu.RLock() - ac.dopts.copts.KeepaliveParams = ac.cc.mkp -@@ -1255,9 +1397,9 @@ func (ac *addrConn) tryAllAddrs(addrs []resolver.Address, connectDeadline time.T - - channelz.Infof(logger, ac.channelzID, "Subchannel picks a new address %q to connect", addr.Addr) - -- newTr, reconnect, err := ac.createTransport(addr, copts, connectDeadline) -+ err := ac.createTransport(ctx, addr, copts, connectDeadline) - if err == nil { -- return newTr, addr, reconnect, nil -+ return nil - } - if firstConnErr == nil { - firstConnErr = err -@@ -1266,86 +1408,90 @@ func (ac *addrConn) tryAllAddrs(addrs []resolver.Address, connectDeadline time.T - } - - // Couldn't connect to any address. -- return nil, resolver.Address{}, nil, firstConnErr -+ return firstConnErr - } - --// createTransport creates a connection to addr. It returns the transport and a --// Event in the successful case. The Event fires when the returned transport --// disconnects. --func (ac *addrConn) createTransport(addr resolver.Address, copts transport.ConnectOptions, connectDeadline time.Time) (transport.ClientTransport, *grpcsync.Event, error) { -- prefaceReceived := make(chan struct{}) -- onCloseCalled := make(chan struct{}) -- reconnect := grpcsync.NewEvent() -- -- // addr.ServerName takes precedent over ClientConn authority, if present. -- if addr.ServerName == "" { -- addr.ServerName = ac.cc.authority -- } -+// createTransport creates a connection to addr. It returns an error if the -+// address was not successfully connected, or updates ac appropriately with the -+// new transport. -+func (ac *addrConn) createTransport(ctx context.Context, addr resolver.Address, copts transport.ConnectOptions, connectDeadline time.Time) error { -+ addr.ServerName = ac.cc.getServerName(addr) -+ hctx, hcancel := context.WithCancel(ctx) - -- once := sync.Once{} -- onGoAway := func(r transport.GoAwayReason) { -+ onClose := func(r transport.GoAwayReason) { - ac.mu.Lock() -+ defer ac.mu.Unlock() -+ // adjust params based on GoAwayReason - ac.adjustParams(r) -- once.Do(func() { -- if ac.state == connectivity.Ready { -- // Prevent this SubConn from being used for new RPCs by setting its -- // state to Connecting. -- // -- // TODO: this should be Idle when grpc-go properly supports it. -- ac.updateConnectivityState(connectivity.Connecting, nil) -- } -- }) -- ac.mu.Unlock() -- reconnect.Fire() -- } -- -- onClose := func() { -- ac.mu.Lock() -- once.Do(func() { -- if ac.state == connectivity.Ready { -- // Prevent this SubConn from being used for new RPCs by setting its -- // state to Connecting. -- // -- // TODO: this should be Idle when grpc-go properly supports it. -- ac.updateConnectivityState(connectivity.Connecting, nil) -- } -- }) -- ac.mu.Unlock() -- close(onCloseCalled) -- reconnect.Fire() -- } -- -- onPrefaceReceipt := func() { -- close(prefaceReceived) -+ if ctx.Err() != nil { -+ // Already shut down or connection attempt canceled. tearDown() or -+ // updateAddrs() already cleared the transport and canceled hctx -+ // via ac.ctx, and we expected this connection to be closed, so do -+ // nothing here. -+ return -+ } -+ hcancel() -+ if ac.transport == nil { -+ // We're still connecting to this address, which could error. Do -+ // not update the connectivity state or resolve; these will happen -+ // at the end of the tryAllAddrs connection loop in the event of an -+ // error. -+ return -+ } -+ ac.transport = nil -+ // Refresh the name resolver on any connection loss. -+ ac.cc.resolveNow(resolver.ResolveNowOptions{}) -+ // Always go idle and wait for the LB policy to initiate a new -+ // connection attempt. -+ ac.updateConnectivityState(connectivity.Idle, nil) - } - -- connectCtx, cancel := context.WithDeadline(ac.ctx, connectDeadline) -+ connectCtx, cancel := context.WithDeadline(ctx, connectDeadline) - defer cancel() -- if channelz.IsOn() { -- copts.ChannelzParentID = ac.channelzID -- } -+ copts.ChannelzParentID = ac.channelzID - -- newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, addr, copts, onPrefaceReceipt, onGoAway, onClose) -+ newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, addr, copts, onClose) - if err != nil { -+ if logger.V(2) { -+ logger.Infof("Creating new client transport to %q: %v", addr, err) -+ } - // newTr is either nil, or closed. -- channelz.Warningf(logger, ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v. Err: %v. Reconnecting...", addr, err) -- return nil, nil, err -+ hcancel() -+ channelz.Warningf(logger, ac.channelzID, "grpc: addrConn.createTransport failed to connect to %s. Err: %v", addr, err) -+ return err - } - -- select { -- case <-time.After(time.Until(connectDeadline)): -- // We didn't get the preface in time. -- newTr.Close(fmt.Errorf("failed to receive server preface within timeout")) -- channelz.Warningf(logger, ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v: didn't receive server preface in time. Reconnecting...", addr) -- return nil, nil, errors.New("timed out waiting for server handshake") -- case <-prefaceReceived: -- // We got the preface - huzzah! things are good. -- case <-onCloseCalled: -- // The transport has already closed - noop. -- return nil, nil, errors.New("connection closed") -- // TODO(deklerk) this should bail on ac.ctx.Done(). Add a test and fix. -+ ac.mu.Lock() -+ defer ac.mu.Unlock() -+ if ctx.Err() != nil { -+ // This can happen if the subConn was removed while in `Connecting` -+ // state. tearDown() would have set the state to `Shutdown`, but -+ // would not have closed the transport since ac.transport would not -+ // have been set at that point. -+ // -+ // We run this in a goroutine because newTr.Close() calls onClose() -+ // inline, which requires locking ac.mu. -+ // -+ // The error we pass to Close() is immaterial since there are no open -+ // streams at this point, so no trailers with error details will be sent -+ // out. We just need to pass a non-nil error. -+ // -+ // This can also happen when updateAddrs is called during a connection -+ // attempt. -+ go newTr.Close(transport.ErrConnClosing) -+ return nil - } -- return newTr, reconnect, nil -+ if hctx.Err() != nil { -+ // onClose was already called for this connection, but the connection -+ // was successfully established first. Consider it a success and set -+ // the new state to Idle. -+ ac.updateConnectivityState(connectivity.Idle, nil) -+ return nil -+ } -+ ac.curAddr = addr -+ ac.transport = newTr -+ ac.startHealthCheck(hctx) // Will set state to READY if appropriate. -+ return nil - } - - // startHealthCheck starts the health checking stream (RPC) to watch the health -@@ -1415,7 +1561,7 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) { - if status.Code(err) == codes.Unimplemented { - channelz.Error(logger, ac.channelzID, "Subchannel health check is unimplemented at server side, thus health check is disabled") - } else { -- channelz.Errorf(logger, ac.channelzID, "HealthCheckFunc exits with unexpected error %v", err) -+ channelz.Errorf(logger, ac.channelzID, "Health checking failed: %v", err) - } - } - }() -@@ -1439,6 +1585,29 @@ func (ac *addrConn) getReadyTransport() transport.ClientTransport { - return nil - } - -+// getTransport waits until the addrconn is ready and returns the transport. -+// If the context expires first, returns an appropriate status. If the -+// addrConn is stopped first, returns an Unavailable status error. -+func (ac *addrConn) getTransport(ctx context.Context) (transport.ClientTransport, error) { -+ for ctx.Err() == nil { -+ ac.mu.Lock() -+ t, state, sc := ac.transport, ac.state, ac.stateChan -+ ac.mu.Unlock() -+ if state == connectivity.Ready { -+ return t, nil -+ } -+ if state == connectivity.Shutdown { -+ return nil, status.Errorf(codes.Unavailable, "SubConn shutting down") -+ } -+ -+ select { -+ case <-ctx.Done(): -+ case <-sc: -+ } -+ } -+ return nil, status.FromContextError(ctx.Err()).Err() -+} -+ - // tearDown starts to tear down the addrConn. - // - // Note that tearDown doesn't remove ac from ac.cc.conns, so the addrConn struct -@@ -1466,19 +1635,18 @@ func (ac *addrConn) tearDown(err error) { - curTr.GracefulClose() - ac.mu.Lock() - } -- if channelz.IsOn() { -- channelz.AddTraceEvent(logger, ac.channelzID, 0, &channelz.TraceEventDesc{ -- Desc: "Subchannel Deleted", -+ channelz.AddTraceEvent(logger, ac.channelzID, 0, &channelz.TraceEventDesc{ -+ Desc: "Subchannel deleted", -+ Severity: channelz.CtInfo, -+ Parent: &channelz.TraceEventDesc{ -+ Desc: fmt.Sprintf("Subchannel(id:%d) deleted", ac.channelzID.Int()), - Severity: channelz.CtInfo, -- Parent: &channelz.TraceEventDesc{ -- Desc: fmt.Sprintf("Subchanel(id:%d) deleted", ac.channelzID), -- Severity: channelz.CtInfo, -- }, -- }) -- // TraceEvent needs to be called before RemoveEntry, as TraceEvent may add trace reference to -- // the entity being deleted, and thus prevent it from being deleted right away. -- channelz.RemoveEntry(ac.channelzID) -- } -+ }, -+ }) -+ // TraceEvent needs to be called before RemoveEntry, as TraceEvent may add -+ // trace reference to the entity being deleted, and thus prevent it from -+ // being deleted right away. -+ channelz.RemoveEntry(ac.channelzID) - ac.mu.Unlock() - } - -@@ -1567,6 +1735,9 @@ func (c *channelzChannel) ChannelzMetric() *channelz.ChannelInternalMetric { - // referenced by users. - var ErrClientConnTimeout = errors.New("grpc: timed out when dialing") - -+// getResolver finds the scheme in the cc's resolvers or the global registry. -+// scheme should always be lowercase (typically by virtue of url.Parse() -+// performing proper RFC3986 behavior). - func (cc *ClientConn) getResolver(scheme string) resolver.Builder { - for _, rb := range cc.dopts.resolvers { - if scheme == rb.Scheme() { -@@ -1587,3 +1758,151 @@ func (cc *ClientConn) connectionError() error { - defer cc.lceMu.Unlock() - return cc.lastConnectionError - } -+ -+// parseTargetAndFindResolver parses the user's dial target and stores the -+// parsed target in `cc.parsedTarget`. -+// -+// The resolver to use is determined based on the scheme in the parsed target -+// and the same is stored in `cc.resolverBuilder`. -+// -+// Doesn't grab cc.mu as this method is expected to be called only at Dial time. -+func (cc *ClientConn) parseTargetAndFindResolver() error { -+ channelz.Infof(logger, cc.channelzID, "original dial target is: %q", cc.target) -+ -+ var rb resolver.Builder -+ parsedTarget, err := parseTarget(cc.target) -+ if err != nil { -+ channelz.Infof(logger, cc.channelzID, "dial target %q parse failed: %v", cc.target, err) -+ } else { -+ channelz.Infof(logger, cc.channelzID, "parsed dial target is: %+v", parsedTarget) -+ rb = cc.getResolver(parsedTarget.URL.Scheme) -+ if rb != nil { -+ cc.parsedTarget = parsedTarget -+ cc.resolverBuilder = rb -+ return nil -+ } -+ } -+ -+ // We are here because the user's dial target did not contain a scheme or -+ // specified an unregistered scheme. We should fallback to the default -+ // scheme, except when a custom dialer is specified in which case, we should -+ // always use passthrough scheme. -+ defScheme := resolver.GetDefaultScheme() -+ channelz.Infof(logger, cc.channelzID, "fallback to scheme %q", defScheme) -+ canonicalTarget := defScheme + ":///" + cc.target -+ -+ parsedTarget, err = parseTarget(canonicalTarget) -+ if err != nil { -+ channelz.Infof(logger, cc.channelzID, "dial target %q parse failed: %v", canonicalTarget, err) -+ return err -+ } -+ channelz.Infof(logger, cc.channelzID, "parsed dial target is: %+v", parsedTarget) -+ rb = cc.getResolver(parsedTarget.URL.Scheme) -+ if rb == nil { -+ return fmt.Errorf("could not get resolver for default scheme: %q", parsedTarget.URL.Scheme) -+ } -+ cc.parsedTarget = parsedTarget -+ cc.resolverBuilder = rb -+ return nil -+} -+ -+// parseTarget uses RFC 3986 semantics to parse the given target into a -+// resolver.Target struct containing scheme, authority and url. Query -+// params are stripped from the endpoint. -+func parseTarget(target string) (resolver.Target, error) { -+ u, err := url.Parse(target) -+ if err != nil { -+ return resolver.Target{}, err -+ } -+ -+ return resolver.Target{ -+ Scheme: u.Scheme, -+ Authority: u.Host, -+ URL: *u, -+ }, nil -+} -+ -+// Determine channel authority. The order of precedence is as follows: -+// - user specified authority override using `WithAuthority` dial option -+// - creds' notion of server name for the authentication handshake -+// - endpoint from dial target of the form "scheme://[authority]/endpoint" -+// -+// Stores the determined authority in `cc.authority`. -+// -+// Returns a non-nil error if the authority returned by the transport -+// credentials do not match the authority configured through the dial option. -+// -+// Doesn't grab cc.mu as this method is expected to be called only at Dial time. -+func (cc *ClientConn) determineAuthority() error { -+ dopts := cc.dopts -+ // Historically, we had two options for users to specify the serverName or -+ // authority for a channel. One was through the transport credentials -+ // (either in its constructor, or through the OverrideServerName() method). -+ // The other option (for cases where WithInsecure() dial option was used) -+ // was to use the WithAuthority() dial option. -+ // -+ // A few things have changed since: -+ // - `insecure` package with an implementation of the `TransportCredentials` -+ // interface for the insecure case -+ // - WithAuthority() dial option support for secure credentials -+ authorityFromCreds := "" -+ if creds := dopts.copts.TransportCredentials; creds != nil && creds.Info().ServerName != "" { -+ authorityFromCreds = creds.Info().ServerName -+ } -+ authorityFromDialOption := dopts.authority -+ if (authorityFromCreds != "" && authorityFromDialOption != "") && authorityFromCreds != authorityFromDialOption { -+ return fmt.Errorf("ClientConn's authority from transport creds %q and dial option %q don't match", authorityFromCreds, authorityFromDialOption) -+ } -+ -+ endpoint := cc.parsedTarget.Endpoint() -+ target := cc.target -+ switch { -+ case authorityFromDialOption != "": -+ cc.authority = authorityFromDialOption -+ case authorityFromCreds != "": -+ cc.authority = authorityFromCreds -+ case strings.HasPrefix(target, "unix:") || strings.HasPrefix(target, "unix-abstract:"): -+ // TODO: remove when the unix resolver implements optional interface to -+ // return channel authority. -+ cc.authority = "localhost" -+ case strings.HasPrefix(endpoint, ":"): -+ cc.authority = "localhost" + endpoint -+ default: -+ // TODO: Define an optional interface on the resolver builder to return -+ // the channel authority given the user's dial target. For resolvers -+ // which don't implement this interface, we will use the endpoint from -+ // "scheme://authority/endpoint" as the default authority. -+ cc.authority = endpoint -+ } -+ channelz.Infof(logger, cc.channelzID, "Channel authority set to %q", cc.authority) -+ return nil -+} -+ -+// initResolverWrapper creates a ccResolverWrapper, which builds the name -+// resolver. This method grabs the lock to assign the newly built resolver -+// wrapper to the cc.resolverWrapper field. -+func (cc *ClientConn) initResolverWrapper(creds credentials.TransportCredentials) error { -+ rw, err := newCCResolverWrapper(cc, ccResolverWrapperOpts{ -+ target: cc.parsedTarget, -+ builder: cc.resolverBuilder, -+ bOpts: resolver.BuildOptions{ -+ DisableServiceConfig: cc.dopts.disableServiceConfig, -+ DialCreds: creds, -+ CredsBundle: cc.dopts.copts.CredsBundle, -+ Dialer: cc.dopts.copts.Dialer, -+ }, -+ channelzID: cc.channelzID, -+ }) -+ if err != nil { -+ return fmt.Errorf("failed to build resolver: %v", err) -+ } -+ // Resolver implementations may report state update or error inline when -+ // built (or right after), and this is handled in cc.updateResolverState. -+ // Also, an error from the resolver might lead to a re-resolution request -+ // from the balancer, which is handled in resolveNow() where -+ // `cc.resolverWrapper` is accessed. Hence, we need to hold the lock here. -+ cc.mu.Lock() -+ cc.resolverWrapper = rw -+ cc.mu.Unlock() -+ return nil -+} -diff --git a/vendor/google.golang.org/grpc/codes/code_string.go b/vendor/google.golang.org/grpc/codes/code_string.go -index 0b206a5..934fac2 100644 ---- a/vendor/google.golang.org/grpc/codes/code_string.go -+++ b/vendor/google.golang.org/grpc/codes/code_string.go -@@ -18,7 +18,15 @@ - - package codes - --import "strconv" -+import ( -+ "strconv" -+ -+ "google.golang.org/grpc/internal" -+) -+ -+func init() { -+ internal.CanonicalString = canonicalString -+} - - func (c Code) String() string { - switch c { -@@ -60,3 +68,44 @@ func (c Code) String() string { - return "Code(" + strconv.FormatInt(int64(c), 10) + ")" - } - } -+ -+func canonicalString(c Code) string { -+ switch c { -+ case OK: -+ return "OK" -+ case Canceled: -+ return "CANCELLED" -+ case Unknown: -+ return "UNKNOWN" -+ case InvalidArgument: -+ return "INVALID_ARGUMENT" -+ case DeadlineExceeded: -+ return "DEADLINE_EXCEEDED" -+ case NotFound: -+ return "NOT_FOUND" -+ case AlreadyExists: -+ return "ALREADY_EXISTS" -+ case PermissionDenied: -+ return "PERMISSION_DENIED" -+ case ResourceExhausted: -+ return "RESOURCE_EXHAUSTED" -+ case FailedPrecondition: -+ return "FAILED_PRECONDITION" -+ case Aborted: -+ return "ABORTED" -+ case OutOfRange: -+ return "OUT_OF_RANGE" -+ case Unimplemented: -+ return "UNIMPLEMENTED" -+ case Internal: -+ return "INTERNAL" -+ case Unavailable: -+ return "UNAVAILABLE" -+ case DataLoss: -+ return "DATA_LOSS" -+ case Unauthenticated: -+ return "UNAUTHENTICATED" -+ default: -+ return "CODE(" + strconv.FormatInt(int64(c), 10) + ")" -+ } -+} -diff --git a/vendor/google.golang.org/grpc/connectivity/connectivity.go b/vendor/google.golang.org/grpc/connectivity/connectivity.go -index 0101562..4a89926 100644 ---- a/vendor/google.golang.org/grpc/connectivity/connectivity.go -+++ b/vendor/google.golang.org/grpc/connectivity/connectivity.go -@@ -18,7 +18,6 @@ - - // Package connectivity defines connectivity semantics. - // For details, see https://github.com/grpc/grpc/blob/master/doc/connectivity-semantics-and-api.md. --// All APIs in this package are experimental. - package connectivity - - import ( -@@ -45,7 +44,7 @@ func (s State) String() string { - return "SHUTDOWN" - default: - logger.Errorf("unknown connectivity state: %d", s) -- return "Invalid-State" -+ return "INVALID_STATE" - } - } - -@@ -61,3 +60,35 @@ const ( - // Shutdown indicates the ClientConn has started shutting down. - Shutdown - ) -+ -+// ServingMode indicates the current mode of operation of the server. -+// -+// Only xDS enabled gRPC servers currently report their serving mode. -+type ServingMode int -+ -+const ( -+ // ServingModeStarting indicates that the server is starting up. -+ ServingModeStarting ServingMode = iota -+ // ServingModeServing indicates that the server contains all required -+ // configuration and is serving RPCs. -+ ServingModeServing -+ // ServingModeNotServing indicates that the server is not accepting new -+ // connections. Existing connections will be closed gracefully, allowing -+ // in-progress RPCs to complete. A server enters this mode when it does not -+ // contain the required configuration to serve RPCs. -+ ServingModeNotServing -+) -+ -+func (s ServingMode) String() string { -+ switch s { -+ case ServingModeStarting: -+ return "STARTING" -+ case ServingModeServing: -+ return "SERVING" -+ case ServingModeNotServing: -+ return "NOT_SERVING" -+ default: -+ logger.Errorf("unknown serving mode: %d", s) -+ return "INVALID_MODE" -+ } -+} -diff --git a/vendor/google.golang.org/grpc/credentials/credentials.go b/vendor/google.golang.org/grpc/credentials/credentials.go -index 7eee7e4..5feac3a 100644 ---- a/vendor/google.golang.org/grpc/credentials/credentials.go -+++ b/vendor/google.golang.org/grpc/credentials/credentials.go -@@ -36,16 +36,16 @@ import ( - // PerRPCCredentials defines the common interface for the credentials which need to - // attach security information to every RPC (e.g., oauth2). - type PerRPCCredentials interface { -- // GetRequestMetadata gets the current request metadata, refreshing -- // tokens if required. This should be called by the transport layer on -- // each request, and the data should be populated in headers or other -- // context. If a status code is returned, it will be used as the status -- // for the RPC. uri is the URI of the entry point for the request. -- // When supported by the underlying implementation, ctx can be used for -- // timeout and cancellation. Additionally, RequestInfo data will be -- // available via ctx to this call. -- // TODO(zhaoq): Define the set of the qualified keys instead of leaving -- // it as an arbitrary string. -+ // GetRequestMetadata gets the current request metadata, refreshing tokens -+ // if required. This should be called by the transport layer on each -+ // request, and the data should be populated in headers or other -+ // context. If a status code is returned, it will be used as the status for -+ // the RPC (restricted to an allowable set of codes as defined by gRFC -+ // A54). uri is the URI of the entry point for the request. When supported -+ // by the underlying implementation, ctx can be used for timeout and -+ // cancellation. Additionally, RequestInfo data will be available via ctx -+ // to this call. TODO(zhaoq): Define the set of the qualified keys instead -+ // of leaving it as an arbitrary string. - GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) - // RequireTransportSecurity indicates whether the credentials requires - // transport security. -@@ -140,6 +140,11 @@ type TransportCredentials interface { - // Additionally, ClientHandshakeInfo data will be available via the context - // passed to this call. - // -+ // The second argument to this method is the `:authority` header value used -+ // while creating new streams on this connection after authentication -+ // succeeds. Implementations must use this as the server name during the -+ // authentication handshake. -+ // - // If the returned net.Conn is closed, it MUST close the net.Conn provided. - ClientHandshake(context.Context, string, net.Conn) (net.Conn, AuthInfo, error) - // ServerHandshake does the authentication handshake for servers. It returns -@@ -153,9 +158,13 @@ type TransportCredentials interface { - Info() ProtocolInfo - // Clone makes a copy of this TransportCredentials. - Clone() TransportCredentials -- // OverrideServerName overrides the server name used to verify the hostname on the returned certificates from the server. -- // gRPC internals also use it to override the virtual hosting name if it is set. -- // It must be called before dialing. Currently, this is only used by grpclb. -+ // OverrideServerName specifies the value used for the following: -+ // - verifying the hostname on the returned certificates -+ // - as SNI in the client's handshake to support virtual hosting -+ // - as the value for `:authority` header at stream creation time -+ // -+ // Deprecated: use grpc.WithAuthority instead. Will be supported -+ // throughout 1.x. - OverrideServerName(string) error - } - -@@ -169,8 +178,18 @@ type TransportCredentials interface { - // - // This API is experimental. - type Bundle interface { -+ // TransportCredentials returns the transport credentials from the Bundle. -+ // -+ // Implementations must return non-nil transport credentials. If transport -+ // security is not needed by the Bundle, implementations may choose to -+ // return insecure.NewCredentials(). - TransportCredentials() TransportCredentials -+ -+ // PerRPCCredentials returns the per-RPC credentials from the Bundle. -+ // -+ // May be nil if per-RPC credentials are not needed. - PerRPCCredentials() PerRPCCredentials -+ - // NewWithMode should make a copy of Bundle, and switch mode. Modifying the - // existing Bundle may cause races. - // -diff --git a/vendor/google.golang.org/grpc/credentials/go12.go b/vendor/google.golang.org/grpc/credentials/go12.go -deleted file mode 100644 -index ccbf35b..0000000 ---- a/vendor/google.golang.org/grpc/credentials/go12.go -+++ /dev/null -@@ -1,30 +0,0 @@ --// +build go1.12 -- --/* -- * -- * Copyright 2019 gRPC authors. -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- * -- */ -- --package credentials -- --import "crypto/tls" -- --// This init function adds cipher suite constants only defined in Go 1.12. --func init() { -- cipherSuiteLookup[tls.TLS_AES_128_GCM_SHA256] = "TLS_AES_128_GCM_SHA256" -- cipherSuiteLookup[tls.TLS_AES_256_GCM_SHA384] = "TLS_AES_256_GCM_SHA384" -- cipherSuiteLookup[tls.TLS_CHACHA20_POLY1305_SHA256] = "TLS_CHACHA20_POLY1305_SHA256" --} -diff --git a/vendor/google.golang.org/grpc/credentials/insecure/insecure.go b/vendor/google.golang.org/grpc/credentials/insecure/insecure.go -index c4fa27c..82bee14 100644 ---- a/vendor/google.golang.org/grpc/credentials/insecure/insecure.go -+++ b/vendor/google.golang.org/grpc/credentials/insecure/insecure.go -@@ -18,11 +18,6 @@ - - // Package insecure provides an implementation of the - // credentials.TransportCredentials interface which disables transport security. --// --// Experimental --// --// Notice: This package is EXPERIMENTAL and may be changed or removed in a --// later release. - package insecure - - import ( -@@ -33,6 +28,9 @@ import ( - ) - - // NewCredentials returns a credentials which disables transport security. -+// -+// Note that using this credentials with per-RPC credentials which require -+// transport security is incompatible and will cause grpc.Dial() to fail. - func NewCredentials() credentials.TransportCredentials { - return insecureTC{} - } -@@ -72,3 +70,29 @@ type info struct { - func (info) AuthType() string { - return "insecure" - } -+ -+// insecureBundle implements an insecure bundle. -+// An insecure bundle provides a thin wrapper around insecureTC to support -+// the credentials.Bundle interface. -+type insecureBundle struct{} -+ -+// NewBundle returns a bundle with disabled transport security and no per rpc credential. -+func NewBundle() credentials.Bundle { -+ return insecureBundle{} -+} -+ -+// NewWithMode returns a new insecure Bundle. The mode is ignored. -+func (insecureBundle) NewWithMode(string) (credentials.Bundle, error) { -+ return insecureBundle{}, nil -+} -+ -+// PerRPCCredentials returns an nil implementation as insecure -+// bundle does not support a per rpc credential. -+func (insecureBundle) PerRPCCredentials() credentials.PerRPCCredentials { -+ return nil -+} -+ -+// TransportCredentials returns the underlying insecure transport credential. -+func (insecureBundle) TransportCredentials() credentials.TransportCredentials { -+ return NewCredentials() -+} -diff --git a/vendor/google.golang.org/grpc/credentials/tls.go b/vendor/google.golang.org/grpc/credentials/tls.go -index 8ee7124..877b7cd 100644 ---- a/vendor/google.golang.org/grpc/credentials/tls.go -+++ b/vendor/google.golang.org/grpc/credentials/tls.go -@@ -23,9 +23,9 @@ import ( - "crypto/tls" - "crypto/x509" - "fmt" -- "io/ioutil" - "net" - "net/url" -+ "os" - - credinternal "google.golang.org/grpc/internal/credentials" - ) -@@ -166,7 +166,7 @@ func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) Transpor - // it will override the virtual host name of authority (e.g. :authority header - // field) in requests. - func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredentials, error) { -- b, err := ioutil.ReadFile(certFile) -+ b, err := os.ReadFile(certFile) - if err != nil { - return nil, err - } -@@ -195,7 +195,7 @@ func NewServerTLSFromFile(certFile, keyFile string) (TransportCredentials, error - // TLSChannelzSecurityValue defines the struct that TLS protocol should return - // from GetSecurityValue(), containing security info like cipher and certificate used. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -230,4 +230,7 @@ var cipherSuiteLookup = map[uint16]string{ - tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256: "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", - tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305: "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305", - tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305: "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305", -+ tls.TLS_AES_128_GCM_SHA256: "TLS_AES_128_GCM_SHA256", -+ tls.TLS_AES_256_GCM_SHA384: "TLS_AES_256_GCM_SHA384", -+ tls.TLS_CHACHA20_POLY1305_SHA256: "TLS_CHACHA20_POLY1305_SHA256", - } -diff --git a/vendor/google.golang.org/grpc/dialoptions.go b/vendor/google.golang.org/grpc/dialoptions.go -index 7a49723..15a3d51 100644 ---- a/vendor/google.golang.org/grpc/dialoptions.go -+++ b/vendor/google.golang.org/grpc/dialoptions.go -@@ -20,22 +20,34 @@ package grpc - - import ( - "context" -- "fmt" - "net" - "time" - - "google.golang.org/grpc/backoff" -- "google.golang.org/grpc/balancer" -+ "google.golang.org/grpc/channelz" - "google.golang.org/grpc/credentials" -+ "google.golang.org/grpc/credentials/insecure" - "google.golang.org/grpc/internal" - internalbackoff "google.golang.org/grpc/internal/backoff" -- "google.golang.org/grpc/internal/envconfig" -+ "google.golang.org/grpc/internal/binarylog" - "google.golang.org/grpc/internal/transport" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/resolver" - "google.golang.org/grpc/stats" - ) - -+func init() { -+ internal.AddGlobalDialOptions = func(opt ...DialOption) { -+ globalDialOptions = append(globalDialOptions, opt...) -+ } -+ internal.ClearGlobalDialOptions = func() { -+ globalDialOptions = nil -+ } -+ internal.WithBinaryLogger = withBinaryLogger -+ internal.JoinDialOptions = newJoinDialOption -+ internal.DisableGlobalDialOptions = newDisableGlobalDialOptions -+} -+ - // dialOptions configure a Dial call. dialOptions are set by the DialOption - // values passed to Dial. - type dialOptions struct { -@@ -45,20 +57,18 @@ type dialOptions struct { - chainUnaryInts []UnaryClientInterceptor - chainStreamInts []StreamClientInterceptor - -- cp Compressor -- dc Decompressor -- bs internalbackoff.Strategy -- block bool -- returnLastError bool -- insecure bool -- timeout time.Duration -- scChan <-chan ServiceConfig -- authority string -- copts transport.ConnectOptions -- callOptions []CallOption -- // This is used by WithBalancerName dial option. -- balancerBuilder balancer.Builder -- channelzParentID int64 -+ cp Compressor -+ dc Decompressor -+ bs internalbackoff.Strategy -+ block bool -+ returnLastError bool -+ timeout time.Duration -+ scChan <-chan ServiceConfig -+ authority string -+ binaryLogger binarylog.Logger -+ copts transport.ConnectOptions -+ callOptions []CallOption -+ channelzParentID *channelz.Identifier - disableServiceConfig bool - disableRetry bool - disableHealthCheck bool -@@ -67,6 +77,7 @@ type dialOptions struct { - defaultServiceConfig *ServiceConfig // defaultServiceConfig is parsed from defaultServiceConfigRawJSON. - defaultServiceConfigRawJSON *string - resolvers []resolver.Builder -+ idleTimeout time.Duration - } - - // DialOption configures how we set up the connection. -@@ -74,10 +85,12 @@ type DialOption interface { - apply(*dialOptions) - } - -+var globalDialOptions []DialOption -+ - // EmptyDialOption does not alter the dial configuration. It can be embedded in - // another structure to build custom dial options. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -85,6 +98,16 @@ type EmptyDialOption struct{} - - func (EmptyDialOption) apply(*dialOptions) {} - -+type disableGlobalDialOptions struct{} -+ -+func (disableGlobalDialOptions) apply(*dialOptions) {} -+ -+// newDisableGlobalDialOptions returns a DialOption that prevents the ClientConn -+// from applying the global DialOptions (set via AddGlobalDialOptions). -+func newDisableGlobalDialOptions() DialOption { -+ return &disableGlobalDialOptions{} -+} -+ - // funcDialOption wraps a function that modifies dialOptions into an - // implementation of the DialOption interface. - type funcDialOption struct { -@@ -101,13 +124,28 @@ func newFuncDialOption(f func(*dialOptions)) *funcDialOption { - } - } - -+type joinDialOption struct { -+ opts []DialOption -+} -+ -+func (jdo *joinDialOption) apply(do *dialOptions) { -+ for _, opt := range jdo.opts { -+ opt.apply(do) -+ } -+} -+ -+func newJoinDialOption(opts ...DialOption) DialOption { -+ return &joinDialOption{opts: opts} -+} -+ - // WithWriteBufferSize determines how much data can be batched before doing a - // write on the wire. The corresponding memory allocation for this buffer will - // be twice the size to keep syscalls low. The default value for this buffer is - // 32KB. - // --// Zero will disable the write buffer such that each write will be on underlying --// connection. Note: A Send call may not directly translate to a write. -+// Zero or negative values will disable the write buffer such that each write -+// will be on underlying connection. Note: A Send call may not directly -+// translate to a write. - func WithWriteBufferSize(s int) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.copts.WriteBufferSize = s -@@ -117,8 +155,9 @@ func WithWriteBufferSize(s int) DialOption { - // WithReadBufferSize lets you set the size of read buffer, this determines how - // much data can be read at most for each read syscall. - // --// The default value for this buffer is 32KB. Zero will disable read buffer for --// a connection so data framer can access the underlying conn directly. -+// The default value for this buffer is 32KB. Zero or negative values will -+// disable read buffer for a connection so data framer can access the -+// underlying conn directly. - func WithReadBufferSize(s int) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.copts.ReadBufferSize = s -@@ -196,25 +235,6 @@ func WithDecompressor(dc Decompressor) DialOption { - }) - } - --// WithBalancerName sets the balancer that the ClientConn will be initialized --// with. Balancer registered with balancerName will be used. This function --// panics if no balancer was registered by balancerName. --// --// The balancer cannot be overridden by balancer option specified by service --// config. --// --// Deprecated: use WithDefaultServiceConfig and WithDisableServiceConfig --// instead. Will be removed in a future 1.x release. --func WithBalancerName(balancerName string) DialOption { -- builder := balancer.Get(balancerName) -- if builder == nil { -- panic(fmt.Sprintf("grpc.WithBalancerName: no balancer is registered for name %v", balancerName)) -- } -- return newFuncDialOption(func(o *dialOptions) { -- o.balancerBuilder = builder -- }) --} -- - // WithServiceConfig returns a DialOption which has a channel to read the - // service configuration. - // -@@ -228,18 +248,14 @@ func WithServiceConfig(c <-chan ServiceConfig) DialOption { - }) - } - --// WithConnectParams configures the dialer to use the provided ConnectParams. -+// WithConnectParams configures the ClientConn to use the provided ConnectParams -+// for creating and maintaining connections to servers. - // - // The backoff configuration specified as part of the ConnectParams overrides - // all defaults specified in - // https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md. Consider - // using the backoff.DefaultConfig as a base, in cases where you want to - // override only a subset of the backoff configuration. --// --// Experimental --// --// Notice: This API is EXPERIMENTAL and may be changed or removed in a --// later release. - func WithConnectParams(p ConnectParams) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.bs = internalbackoff.Exponential{Config: p.Backoff} -@@ -277,9 +293,12 @@ func withBackoff(bs internalbackoff.Strategy) DialOption { - }) - } - --// WithBlock returns a DialOption which makes caller of Dial blocks until the -+// WithBlock returns a DialOption which makes callers of Dial block until the - // underlying connection is up. Without this, Dial returns immediately and - // connecting the server happens in background. -+// -+// Use of this feature is not recommended. For more information, please see: -+// https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md - func WithBlock() DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.block = true -@@ -291,7 +310,10 @@ func WithBlock() DialOption { - // the context.DeadlineExceeded error. - // Implies WithBlock() - // --// Experimental -+// Use of this feature is not recommended. For more information, please see: -+// https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md -+// -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -303,18 +325,24 @@ func WithReturnConnectionError() DialOption { - } - - // WithInsecure returns a DialOption which disables transport security for this --// ClientConn. Note that transport security is required unless WithInsecure is --// set. -+// ClientConn. Under the hood, it uses insecure.NewCredentials(). -+// -+// Note that using this DialOption with per-RPC credentials (through -+// WithCredentialsBundle or WithPerRPCCredentials) which require transport -+// security is incompatible and will cause grpc.Dial() to fail. -+// -+// Deprecated: use WithTransportCredentials and insecure.NewCredentials() -+// instead. Will be supported throughout 1.x. - func WithInsecure() DialOption { - return newFuncDialOption(func(o *dialOptions) { -- o.insecure = true -+ o.copts.TransportCredentials = insecure.NewCredentials() - }) - } - - // WithNoProxy returns a DialOption which disables the use of proxies for this - // ClientConn. This is ignored if WithDialer or WithContextDialer are used. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -345,7 +373,7 @@ func WithPerRPCCredentials(creds credentials.PerRPCCredentials) DialOption { - // the ClientConn.WithCreds. This should not be used together with - // WithTransportCredentials. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -401,7 +429,21 @@ func WithDialer(f func(string, time.Duration) (net.Conn, error)) DialOption { - // all the RPCs and underlying network connections in this ClientConn. - func WithStatsHandler(h stats.Handler) DialOption { - return newFuncDialOption(func(o *dialOptions) { -- o.copts.StatsHandler = h -+ if h == nil { -+ logger.Error("ignoring nil parameter in grpc.WithStatsHandler ClientOption") -+ // Do not allow a nil stats handler, which would otherwise cause -+ // panics. -+ return -+ } -+ o.copts.StatsHandlers = append(o.copts.StatsHandlers, h) -+ }) -+} -+ -+// withBinaryLogger returns a DialOption that specifies the binary logger for -+// this ClientConn. -+func withBinaryLogger(bl binarylog.Logger) DialOption { -+ return newFuncDialOption(func(o *dialOptions) { -+ o.binaryLogger = bl - }) - } - -@@ -413,7 +455,10 @@ func WithStatsHandler(h stats.Handler) DialOption { - // FailOnNonTempDialError only affects the initial dial, and does not do - // anything useful unless you are also using WithBlock(). - // --// Experimental -+// Use of this feature is not recommended. For more information, please see: -+// https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md -+// -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -482,8 +527,7 @@ func WithChainStreamInterceptor(interceptors ...StreamClientInterceptor) DialOpt - } - - // WithAuthority returns a DialOption that specifies the value to be used as the --// :authority pseudo-header. This value only works with WithInsecure and has no --// effect if TransportCredentials are present. -+// :authority pseudo-header and as the server name in authentication handshake. - func WithAuthority(a string) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.authority = a -@@ -494,11 +538,11 @@ func WithAuthority(a string) DialOption { - // current ClientConn's parent. This function is used in nested channel creation - // (e.g. grpclb dial). - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. --func WithChannelzParentID(id int64) DialOption { -+func WithChannelzParentID(id *channelz.Identifier) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.channelzParentID = id - }) -@@ -519,14 +563,16 @@ func WithDisableServiceConfig() DialOption { - // WithDefaultServiceConfig returns a DialOption that configures the default - // service config, which will be used in cases where: - // --// 1. WithDisableServiceConfig is also used. --// 2. Resolver does not return a service config or if the resolver returns an --// invalid service config. -+// 1. WithDisableServiceConfig is also used, or - // --// Experimental -+// 2. The name resolver does not provide a service config or provides an -+// invalid service config. - // --// Notice: This API is EXPERIMENTAL and may be changed or removed in a --// later release. -+// The parameter s is the JSON representation of the default service config. -+// For more information about service configs, see: -+// https://github.com/grpc/grpc/blob/master/doc/service_config.md -+// For a simple example of usage, see: -+// examples/features/load_balancing/client/main.go - func WithDefaultServiceConfig(s string) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.defaultServiceConfigRawJSON = &s -@@ -537,15 +583,6 @@ func WithDefaultServiceConfig(s string) DialOption { - // service config enables them. This does not impact transparent retries, which - // will happen automatically if no data is written to the wire or if the RPC is - // unprocessed by the remote server. --// --// Retry support is currently disabled by default, but will be enabled by --// default in the future. Until then, it may be enabled by setting the --// environment variable "GRPC_GO_RETRY" to "on". --// --// Experimental --// --// Notice: This API is EXPERIMENTAL and may be changed or removed in a --// later release. - func WithDisableRetry() DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.disableRetry = true -@@ -563,7 +600,7 @@ func WithMaxHeaderListSize(s uint32) DialOption { - // WithDisableHealthCheck disables the LB channel health checking for all - // SubConns of this ClientConn. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -585,7 +622,6 @@ func withHealthCheckFunc(f internal.HealthChecker) DialOption { - - func defaultDialOptions() dialOptions { - return dialOptions{ -- disableRetry: !envconfig.Retry, - healthCheckFunc: internal.HealthCheckFunc, - copts: transport.ConnectOptions{ - WriteBufferSize: defaultWriteBufSize, -@@ -611,7 +647,7 @@ func withMinConnectDeadline(f func() time.Duration) DialOption { - // resolver.Register. They will be matched against the scheme used for the - // current Dial only, and will take precedence over the global registry. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -620,3 +656,23 @@ func WithResolvers(rs ...resolver.Builder) DialOption { - o.resolvers = append(o.resolvers, rs...) - }) - } -+ -+// WithIdleTimeout returns a DialOption that configures an idle timeout for the -+// channel. If the channel is idle for the configured timeout, i.e there are no -+// ongoing RPCs and no new RPCs are initiated, the channel will enter idle mode -+// and as a result the name resolver and load balancer will be shut down. The -+// channel will exit idle mode when the Connect() method is called or when an -+// RPC is initiated. -+// -+// By default this feature is disabled, which can also be explicitly configured -+// by passing zero to this function. -+// -+// # Experimental -+// -+// Notice: This API is EXPERIMENTAL and may be changed or removed in a -+// later release. -+func WithIdleTimeout(d time.Duration) DialOption { -+ return newFuncDialOption(func(o *dialOptions) { -+ o.idleTimeout = d -+ }) -+} -diff --git a/vendor/google.golang.org/grpc/encoding/encoding.go b/vendor/google.golang.org/grpc/encoding/encoding.go -index 6d84f74..07a5861 100644 ---- a/vendor/google.golang.org/grpc/encoding/encoding.go -+++ b/vendor/google.golang.org/grpc/encoding/encoding.go -@@ -19,7 +19,7 @@ - // Package encoding defines the interface for the compressor and codec, and - // functions to register and retrieve compressors and codecs. - // --// Experimental -+// # Experimental - // - // Notice: This package is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -28,6 +28,8 @@ package encoding - import ( - "io" - "strings" -+ -+ "google.golang.org/grpc/internal/grpcutil" - ) - - // Identity specifies the optional encoding for uncompressed streams. -@@ -73,6 +75,9 @@ var registeredCompressor = make(map[string]Compressor) - // registered with the same name, the one registered last will take effect. - func RegisterCompressor(c Compressor) { - registeredCompressor[c.Name()] = c -+ if !grpcutil.IsCompressorNameRegistered(c.Name()) { -+ grpcutil.RegisteredCompressorNames = append(grpcutil.RegisteredCompressorNames, c.Name()) -+ } - } - - // GetCompressor returns Compressor for the given compressor name. -@@ -108,7 +113,7 @@ var registeredCodecs = make(map[string]Codec) - // more details. - // - // NOTE: this function must only be called during initialization time (i.e. in --// an init() function), and is not thread-safe. If multiple Compressors are -+// an init() function), and is not thread-safe. If multiple Codecs are - // registered with the same name, the one registered last will take effect. - func RegisterCodec(codec Codec) { - if codec == nil { -diff --git a/vendor/google.golang.org/grpc/grpclog/loggerv2.go b/vendor/google.golang.org/grpc/grpclog/loggerv2.go -index 4ee3317..5de66e4 100644 ---- a/vendor/google.golang.org/grpc/grpclog/loggerv2.go -+++ b/vendor/google.golang.org/grpc/grpclog/loggerv2.go -@@ -19,11 +19,13 @@ - package grpclog - - import ( -+ "encoding/json" -+ "fmt" - "io" -- "io/ioutil" - "log" - "os" - "strconv" -+ "strings" - - "google.golang.org/grpc/internal/grpclog" - ) -@@ -95,8 +97,9 @@ var severityName = []string{ - - // loggerT is the default logger used by grpclog. - type loggerT struct { -- m []*log.Logger -- v int -+ m []*log.Logger -+ v int -+ jsonFormat bool - } - - // NewLoggerV2 creates a loggerV2 with the provided writers. -@@ -105,27 +108,40 @@ type loggerT struct { - // Warning logs will be written to warningW and infoW. - // Info logs will be written to infoW. - func NewLoggerV2(infoW, warningW, errorW io.Writer) LoggerV2 { -- return NewLoggerV2WithVerbosity(infoW, warningW, errorW, 0) -+ return newLoggerV2WithConfig(infoW, warningW, errorW, loggerV2Config{}) - } - - // NewLoggerV2WithVerbosity creates a loggerV2 with the provided writers and - // verbosity level. - func NewLoggerV2WithVerbosity(infoW, warningW, errorW io.Writer, v int) LoggerV2 { -+ return newLoggerV2WithConfig(infoW, warningW, errorW, loggerV2Config{verbose: v}) -+} -+ -+type loggerV2Config struct { -+ verbose int -+ jsonFormat bool -+} -+ -+func newLoggerV2WithConfig(infoW, warningW, errorW io.Writer, c loggerV2Config) LoggerV2 { - var m []*log.Logger -- m = append(m, log.New(infoW, severityName[infoLog]+": ", log.LstdFlags)) -- m = append(m, log.New(io.MultiWriter(infoW, warningW), severityName[warningLog]+": ", log.LstdFlags)) -+ flag := log.LstdFlags -+ if c.jsonFormat { -+ flag = 0 -+ } -+ m = append(m, log.New(infoW, "", flag)) -+ m = append(m, log.New(io.MultiWriter(infoW, warningW), "", flag)) - ew := io.MultiWriter(infoW, warningW, errorW) // ew will be used for error and fatal. -- m = append(m, log.New(ew, severityName[errorLog]+": ", log.LstdFlags)) -- m = append(m, log.New(ew, severityName[fatalLog]+": ", log.LstdFlags)) -- return &loggerT{m: m, v: v} -+ m = append(m, log.New(ew, "", flag)) -+ m = append(m, log.New(ew, "", flag)) -+ return &loggerT{m: m, v: c.verbose, jsonFormat: c.jsonFormat} - } - - // newLoggerV2 creates a loggerV2 to be used as default logger. - // All logs are written to stderr. - func newLoggerV2() LoggerV2 { -- errorW := ioutil.Discard -- warningW := ioutil.Discard -- infoW := ioutil.Discard -+ errorW := io.Discard -+ warningW := io.Discard -+ infoW := io.Discard - - logLevel := os.Getenv("GRPC_GO_LOG_SEVERITY_LEVEL") - switch logLevel { -@@ -142,58 +158,79 @@ func newLoggerV2() LoggerV2 { - if vl, err := strconv.Atoi(vLevel); err == nil { - v = vl - } -- return NewLoggerV2WithVerbosity(infoW, warningW, errorW, v) -+ -+ jsonFormat := strings.EqualFold(os.Getenv("GRPC_GO_LOG_FORMATTER"), "json") -+ -+ return newLoggerV2WithConfig(infoW, warningW, errorW, loggerV2Config{ -+ verbose: v, -+ jsonFormat: jsonFormat, -+ }) -+} -+ -+func (g *loggerT) output(severity int, s string) { -+ sevStr := severityName[severity] -+ if !g.jsonFormat { -+ g.m[severity].Output(2, fmt.Sprintf("%v: %v", sevStr, s)) -+ return -+ } -+ // TODO: we can also include the logging component, but that needs more -+ // (API) changes. -+ b, _ := json.Marshal(map[string]string{ -+ "severity": sevStr, -+ "message": s, -+ }) -+ g.m[severity].Output(2, string(b)) - } - - func (g *loggerT) Info(args ...interface{}) { -- g.m[infoLog].Print(args...) -+ g.output(infoLog, fmt.Sprint(args...)) - } - - func (g *loggerT) Infoln(args ...interface{}) { -- g.m[infoLog].Println(args...) -+ g.output(infoLog, fmt.Sprintln(args...)) - } - - func (g *loggerT) Infof(format string, args ...interface{}) { -- g.m[infoLog].Printf(format, args...) -+ g.output(infoLog, fmt.Sprintf(format, args...)) - } - - func (g *loggerT) Warning(args ...interface{}) { -- g.m[warningLog].Print(args...) -+ g.output(warningLog, fmt.Sprint(args...)) - } - - func (g *loggerT) Warningln(args ...interface{}) { -- g.m[warningLog].Println(args...) -+ g.output(warningLog, fmt.Sprintln(args...)) - } - - func (g *loggerT) Warningf(format string, args ...interface{}) { -- g.m[warningLog].Printf(format, args...) -+ g.output(warningLog, fmt.Sprintf(format, args...)) - } - - func (g *loggerT) Error(args ...interface{}) { -- g.m[errorLog].Print(args...) -+ g.output(errorLog, fmt.Sprint(args...)) - } - - func (g *loggerT) Errorln(args ...interface{}) { -- g.m[errorLog].Println(args...) -+ g.output(errorLog, fmt.Sprintln(args...)) - } - - func (g *loggerT) Errorf(format string, args ...interface{}) { -- g.m[errorLog].Printf(format, args...) -+ g.output(errorLog, fmt.Sprintf(format, args...)) - } - - func (g *loggerT) Fatal(args ...interface{}) { -- g.m[fatalLog].Fatal(args...) -- // No need to call os.Exit() again because log.Logger.Fatal() calls os.Exit(). -+ g.output(fatalLog, fmt.Sprint(args...)) -+ os.Exit(1) - } - - func (g *loggerT) Fatalln(args ...interface{}) { -- g.m[fatalLog].Fatalln(args...) -- // No need to call os.Exit() again because log.Logger.Fatal() calls os.Exit(). -+ g.output(fatalLog, fmt.Sprintln(args...)) -+ os.Exit(1) - } - - func (g *loggerT) Fatalf(format string, args ...interface{}) { -- g.m[fatalLog].Fatalf(format, args...) -- // No need to call os.Exit() again because log.Logger.Fatal() calls os.Exit(). -+ g.output(fatalLog, fmt.Sprintf(format, args...)) -+ os.Exit(1) - } - - func (g *loggerT) V(l int) bool { -@@ -204,18 +241,18 @@ func (g *loggerT) V(l int) bool { - // DepthLoggerV2, the below functions will be called with the appropriate stack - // depth set for trivial functions the logger may ignore. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. - type DepthLoggerV2 interface { - LoggerV2 -- // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Print. -+ // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Println. - InfoDepth(depth int, args ...interface{}) -- // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Print. -+ // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Println. - WarningDepth(depth int, args ...interface{}) -- // ErrorDetph logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Print. -+ // ErrorDepth logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Println. - ErrorDepth(depth int, args ...interface{}) -- // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Print. -+ // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Println. - FatalDepth(depth int, args ...interface{}) - } -diff --git a/vendor/google.golang.org/grpc/idle.go b/vendor/google.golang.org/grpc/idle.go -new file mode 100644 -index 0000000..dc3dc72 ---- /dev/null -+++ b/vendor/google.golang.org/grpc/idle.go -@@ -0,0 +1,287 @@ -+/* -+ * -+ * Copyright 2023 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+package grpc -+ -+import ( -+ "fmt" -+ "math" -+ "sync" -+ "sync/atomic" -+ "time" -+) -+ -+// For overriding in unit tests. -+var timeAfterFunc = func(d time.Duration, f func()) *time.Timer { -+ return time.AfterFunc(d, f) -+} -+ -+// idlenessEnforcer is the functionality provided by grpc.ClientConn to enter -+// and exit from idle mode. -+type idlenessEnforcer interface { -+ exitIdleMode() error -+ enterIdleMode() error -+} -+ -+// idlenessManager defines the functionality required to track RPC activity on a -+// channel. -+type idlenessManager interface { -+ onCallBegin() error -+ onCallEnd() -+ close() -+} -+ -+type noopIdlenessManager struct{} -+ -+func (noopIdlenessManager) onCallBegin() error { return nil } -+func (noopIdlenessManager) onCallEnd() {} -+func (noopIdlenessManager) close() {} -+ -+// idlenessManagerImpl implements the idlenessManager interface. It uses atomic -+// operations to synchronize access to shared state and a mutex to guarantee -+// mutual exclusion in a critical section. -+type idlenessManagerImpl struct { -+ // State accessed atomically. -+ lastCallEndTime int64 // Unix timestamp in nanos; time when the most recent RPC completed. -+ activeCallsCount int32 // Count of active RPCs; -math.MaxInt32 means channel is idle or is trying to get there. -+ activeSinceLastTimerCheck int32 // Boolean; True if there was an RPC since the last timer callback. -+ closed int32 // Boolean; True when the manager is closed. -+ -+ // Can be accessed without atomics or mutex since these are set at creation -+ // time and read-only after that. -+ enforcer idlenessEnforcer // Functionality provided by grpc.ClientConn. -+ timeout int64 // Idle timeout duration nanos stored as an int64. -+ -+ // idleMu is used to guarantee mutual exclusion in two scenarios: -+ // - Opposing intentions: -+ // - a: Idle timeout has fired and handleIdleTimeout() is trying to put -+ // the channel in idle mode because the channel has been inactive. -+ // - b: At the same time an RPC is made on the channel, and onCallBegin() -+ // is trying to prevent the channel from going idle. -+ // - Competing intentions: -+ // - The channel is in idle mode and there are multiple RPCs starting at -+ // the same time, all trying to move the channel out of idle. Only one -+ // of them should succeed in doing so, while the other RPCs should -+ // piggyback on the first one and be successfully handled. -+ idleMu sync.RWMutex -+ actuallyIdle bool -+ timer *time.Timer -+} -+ -+// newIdlenessManager creates a new idleness manager implementation for the -+// given idle timeout. -+func newIdlenessManager(enforcer idlenessEnforcer, idleTimeout time.Duration) idlenessManager { -+ if idleTimeout == 0 { -+ return noopIdlenessManager{} -+ } -+ -+ i := &idlenessManagerImpl{ -+ enforcer: enforcer, -+ timeout: int64(idleTimeout), -+ } -+ i.timer = timeAfterFunc(idleTimeout, i.handleIdleTimeout) -+ return i -+} -+ -+// resetIdleTimer resets the idle timer to the given duration. This method -+// should only be called from the timer callback. -+func (i *idlenessManagerImpl) resetIdleTimer(d time.Duration) { -+ i.idleMu.Lock() -+ defer i.idleMu.Unlock() -+ -+ if i.timer == nil { -+ // Only close sets timer to nil. We are done. -+ return -+ } -+ -+ // It is safe to ignore the return value from Reset() because this method is -+ // only ever called from the timer callback, which means the timer has -+ // already fired. -+ i.timer.Reset(d) -+} -+ -+// handleIdleTimeout is the timer callback that is invoked upon expiry of the -+// configured idle timeout. The channel is considered inactive if there are no -+// ongoing calls and no RPC activity since the last time the timer fired. -+func (i *idlenessManagerImpl) handleIdleTimeout() { -+ if i.isClosed() { -+ return -+ } -+ -+ if atomic.LoadInt32(&i.activeCallsCount) > 0 { -+ i.resetIdleTimer(time.Duration(i.timeout)) -+ return -+ } -+ -+ // There has been activity on the channel since we last got here. Reset the -+ // timer and return. -+ if atomic.LoadInt32(&i.activeSinceLastTimerCheck) == 1 { -+ // Set the timer to fire after a duration of idle timeout, calculated -+ // from the time the most recent RPC completed. -+ atomic.StoreInt32(&i.activeSinceLastTimerCheck, 0) -+ i.resetIdleTimer(time.Duration(atomic.LoadInt64(&i.lastCallEndTime) + i.timeout - time.Now().UnixNano())) -+ return -+ } -+ -+ // This CAS operation is extremely likely to succeed given that there has -+ // been no activity since the last time we were here. Setting the -+ // activeCallsCount to -math.MaxInt32 indicates to onCallBegin() that the -+ // channel is either in idle mode or is trying to get there. -+ if !atomic.CompareAndSwapInt32(&i.activeCallsCount, 0, -math.MaxInt32) { -+ // This CAS operation can fail if an RPC started after we checked for -+ // activity at the top of this method, or one was ongoing from before -+ // the last time we were here. In both case, reset the timer and return. -+ i.resetIdleTimer(time.Duration(i.timeout)) -+ return -+ } -+ -+ // Now that we've set the active calls count to -math.MaxInt32, it's time to -+ // actually move to idle mode. -+ if i.tryEnterIdleMode() { -+ // Successfully entered idle mode. No timer needed until we exit idle. -+ return -+ } -+ -+ // Failed to enter idle mode due to a concurrent RPC that kept the channel -+ // active, or because of an error from the channel. Undo the attempt to -+ // enter idle, and reset the timer to try again later. -+ atomic.AddInt32(&i.activeCallsCount, math.MaxInt32) -+ i.resetIdleTimer(time.Duration(i.timeout)) -+} -+ -+// tryEnterIdleMode instructs the channel to enter idle mode. But before -+// that, it performs a last minute check to ensure that no new RPC has come in, -+// making the channel active. -+// -+// Return value indicates whether or not the channel moved to idle mode. -+// -+// Holds idleMu which ensures mutual exclusion with exitIdleMode. -+func (i *idlenessManagerImpl) tryEnterIdleMode() bool { -+ i.idleMu.Lock() -+ defer i.idleMu.Unlock() -+ -+ if atomic.LoadInt32(&i.activeCallsCount) != -math.MaxInt32 { -+ // We raced and lost to a new RPC. Very rare, but stop entering idle. -+ return false -+ } -+ if atomic.LoadInt32(&i.activeSinceLastTimerCheck) == 1 { -+ // An very short RPC could have come in (and also finished) after we -+ // checked for calls count and activity in handleIdleTimeout(), but -+ // before the CAS operation. So, we need to check for activity again. -+ return false -+ } -+ -+ // No new RPCs have come in since we last set the active calls count value -+ // -math.MaxInt32 in the timer callback. And since we have the lock, it is -+ // safe to enter idle mode now. -+ if err := i.enforcer.enterIdleMode(); err != nil { -+ logger.Errorf("Failed to enter idle mode: %v", err) -+ return false -+ } -+ -+ // Successfully entered idle mode. -+ i.actuallyIdle = true -+ return true -+} -+ -+// onCallBegin is invoked at the start of every RPC. -+func (i *idlenessManagerImpl) onCallBegin() error { -+ if i.isClosed() { -+ return nil -+ } -+ -+ if atomic.AddInt32(&i.activeCallsCount, 1) > 0 { -+ // Channel is not idle now. Set the activity bit and allow the call. -+ atomic.StoreInt32(&i.activeSinceLastTimerCheck, 1) -+ return nil -+ } -+ -+ // Channel is either in idle mode or is in the process of moving to idle -+ // mode. Attempt to exit idle mode to allow this RPC. -+ if err := i.exitIdleMode(); err != nil { -+ // Undo the increment to calls count, and return an error causing the -+ // RPC to fail. -+ atomic.AddInt32(&i.activeCallsCount, -1) -+ return err -+ } -+ -+ atomic.StoreInt32(&i.activeSinceLastTimerCheck, 1) -+ return nil -+} -+ -+// exitIdleMode instructs the channel to exit idle mode. -+// -+// Holds idleMu which ensures mutual exclusion with tryEnterIdleMode. -+func (i *idlenessManagerImpl) exitIdleMode() error { -+ i.idleMu.Lock() -+ defer i.idleMu.Unlock() -+ -+ if !i.actuallyIdle { -+ // This can happen in two scenarios: -+ // - handleIdleTimeout() set the calls count to -math.MaxInt32 and called -+ // tryEnterIdleMode(). But before the latter could grab the lock, an RPC -+ // came in and onCallBegin() noticed that the calls count is negative. -+ // - Channel is in idle mode, and multiple new RPCs come in at the same -+ // time, all of them notice a negative calls count in onCallBegin and get -+ // here. The first one to get the lock would got the channel to exit idle. -+ // -+ // Either way, nothing to do here. -+ return nil -+ } -+ -+ if err := i.enforcer.exitIdleMode(); err != nil { -+ return fmt.Errorf("channel failed to exit idle mode: %v", err) -+ } -+ -+ // Undo the idle entry process. This also respects any new RPC attempts. -+ atomic.AddInt32(&i.activeCallsCount, math.MaxInt32) -+ i.actuallyIdle = false -+ -+ // Start a new timer to fire after the configured idle timeout. -+ i.timer = timeAfterFunc(time.Duration(i.timeout), i.handleIdleTimeout) -+ return nil -+} -+ -+// onCallEnd is invoked at the end of every RPC. -+func (i *idlenessManagerImpl) onCallEnd() { -+ if i.isClosed() { -+ return -+ } -+ -+ // Record the time at which the most recent call finished. -+ atomic.StoreInt64(&i.lastCallEndTime, time.Now().UnixNano()) -+ -+ // Decrement the active calls count. This count can temporarily go negative -+ // when the timer callback is in the process of moving the channel to idle -+ // mode, but one or more RPCs come in and complete before the timer callback -+ // can get done with the process of moving to idle mode. -+ atomic.AddInt32(&i.activeCallsCount, -1) -+} -+ -+func (i *idlenessManagerImpl) isClosed() bool { -+ return atomic.LoadInt32(&i.closed) == 1 -+} -+ -+func (i *idlenessManagerImpl) close() { -+ atomic.StoreInt32(&i.closed, 1) -+ -+ i.idleMu.Lock() -+ i.timer.Stop() -+ i.timer = nil -+ i.idleMu.Unlock() -+} -diff --git a/vendor/google.golang.org/grpc/install_gae.sh b/vendor/google.golang.org/grpc/install_gae.sh -deleted file mode 100644 -index 15ff9fa..0000000 ---- a/vendor/google.golang.org/grpc/install_gae.sh -+++ /dev/null -@@ -1,6 +0,0 @@ --#!/bin/bash -- --TMP=$(mktemp -d /tmp/sdk.XXX) \ --&& curl -o $TMP.zip "https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.68.zip" \ --&& unzip -q $TMP.zip -d $TMP \ --&& export PATH="$PATH:$TMP/go_appengine" -\ No newline at end of file -diff --git a/vendor/google.golang.org/grpc/interceptor.go b/vendor/google.golang.org/grpc/interceptor.go -index 668e0ad..bb96ef5 100644 ---- a/vendor/google.golang.org/grpc/interceptor.go -+++ b/vendor/google.golang.org/grpc/interceptor.go -@@ -72,9 +72,12 @@ type UnaryServerInfo struct { - } - - // UnaryHandler defines the handler invoked by UnaryServerInterceptor to complete the normal --// execution of a unary RPC. If a UnaryHandler returns an error, it should be produced by the --// status package, or else gRPC will use codes.Unknown as the status code and err.Error() as --// the status message of the RPC. -+// execution of a unary RPC. -+// -+// If a UnaryHandler returns an error, it should either be produced by the -+// status package, or be one of the context errors. Otherwise, gRPC will use -+// codes.Unknown as the status code and err.Error() as the status message of the -+// RPC. - type UnaryHandler func(ctx context.Context, req interface{}) (interface{}, error) - - // UnaryServerInterceptor provides a hook to intercept the execution of a unary RPC on the server. info -diff --git a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go -new file mode 100644 -index 0000000..08666f6 ---- /dev/null -+++ b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go -@@ -0,0 +1,384 @@ -+/* -+ * -+ * Copyright 2022 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+// Package gracefulswitch implements a graceful switch load balancer. -+package gracefulswitch -+ -+import ( -+ "errors" -+ "fmt" -+ "sync" -+ -+ "google.golang.org/grpc/balancer" -+ "google.golang.org/grpc/balancer/base" -+ "google.golang.org/grpc/connectivity" -+ "google.golang.org/grpc/resolver" -+) -+ -+var errBalancerClosed = errors.New("gracefulSwitchBalancer is closed") -+var _ balancer.Balancer = (*Balancer)(nil) -+ -+// NewBalancer returns a graceful switch Balancer. -+func NewBalancer(cc balancer.ClientConn, opts balancer.BuildOptions) *Balancer { -+ return &Balancer{ -+ cc: cc, -+ bOpts: opts, -+ } -+} -+ -+// Balancer is a utility to gracefully switch from one balancer to -+// a new balancer. It implements the balancer.Balancer interface. -+type Balancer struct { -+ bOpts balancer.BuildOptions -+ cc balancer.ClientConn -+ -+ // mu protects the following fields and all fields within balancerCurrent -+ // and balancerPending. mu does not need to be held when calling into the -+ // child balancers, as all calls into these children happen only as a direct -+ // result of a call into the gracefulSwitchBalancer, which are also -+ // guaranteed to be synchronous. There is one exception: an UpdateState call -+ // from a child balancer when current and pending are populated can lead to -+ // calling Close() on the current. To prevent that racing with an -+ // UpdateSubConnState from the channel, we hold currentMu during Close and -+ // UpdateSubConnState calls. -+ mu sync.Mutex -+ balancerCurrent *balancerWrapper -+ balancerPending *balancerWrapper -+ closed bool // set to true when this balancer is closed -+ -+ // currentMu must be locked before mu. This mutex guards against this -+ // sequence of events: UpdateSubConnState() called, finds the -+ // balancerCurrent, gives up lock, updateState comes in, causes Close() on -+ // balancerCurrent before the UpdateSubConnState is called on the -+ // balancerCurrent. -+ currentMu sync.Mutex -+} -+ -+// swap swaps out the current lb with the pending lb and updates the ClientConn. -+// The caller must hold gsb.mu. -+func (gsb *Balancer) swap() { -+ gsb.cc.UpdateState(gsb.balancerPending.lastState) -+ cur := gsb.balancerCurrent -+ gsb.balancerCurrent = gsb.balancerPending -+ gsb.balancerPending = nil -+ go func() { -+ gsb.currentMu.Lock() -+ defer gsb.currentMu.Unlock() -+ cur.Close() -+ }() -+} -+ -+// Helper function that checks if the balancer passed in is current or pending. -+// The caller must hold gsb.mu. -+func (gsb *Balancer) balancerCurrentOrPending(bw *balancerWrapper) bool { -+ return bw == gsb.balancerCurrent || bw == gsb.balancerPending -+} -+ -+// SwitchTo initializes the graceful switch process, which completes based on -+// connectivity state changes on the current/pending balancer. Thus, the switch -+// process is not complete when this method returns. This method must be called -+// synchronously alongside the rest of the balancer.Balancer methods this -+// Graceful Switch Balancer implements. -+func (gsb *Balancer) SwitchTo(builder balancer.Builder) error { -+ gsb.mu.Lock() -+ if gsb.closed { -+ gsb.mu.Unlock() -+ return errBalancerClosed -+ } -+ bw := &balancerWrapper{ -+ gsb: gsb, -+ lastState: balancer.State{ -+ ConnectivityState: connectivity.Connecting, -+ Picker: base.NewErrPicker(balancer.ErrNoSubConnAvailable), -+ }, -+ subconns: make(map[balancer.SubConn]bool), -+ } -+ balToClose := gsb.balancerPending // nil if there is no pending balancer -+ if gsb.balancerCurrent == nil { -+ gsb.balancerCurrent = bw -+ } else { -+ gsb.balancerPending = bw -+ } -+ gsb.mu.Unlock() -+ balToClose.Close() -+ // This function takes a builder instead of a balancer because builder.Build -+ // can call back inline, and this utility needs to handle the callbacks. -+ newBalancer := builder.Build(bw, gsb.bOpts) -+ if newBalancer == nil { -+ // This is illegal and should never happen; we clear the balancerWrapper -+ // we were constructing if it happens to avoid a potential panic. -+ gsb.mu.Lock() -+ if gsb.balancerPending != nil { -+ gsb.balancerPending = nil -+ } else { -+ gsb.balancerCurrent = nil -+ } -+ gsb.mu.Unlock() -+ return balancer.ErrBadResolverState -+ } -+ -+ // This write doesn't need to take gsb.mu because this field never gets read -+ // or written to on any calls from the current or pending. Calls from grpc -+ // to this balancer are guaranteed to be called synchronously, so this -+ // bw.Balancer field will never be forwarded to until this SwitchTo() -+ // function returns. -+ bw.Balancer = newBalancer -+ return nil -+} -+ -+// Returns nil if the graceful switch balancer is closed. -+func (gsb *Balancer) latestBalancer() *balancerWrapper { -+ gsb.mu.Lock() -+ defer gsb.mu.Unlock() -+ if gsb.balancerPending != nil { -+ return gsb.balancerPending -+ } -+ return gsb.balancerCurrent -+} -+ -+// UpdateClientConnState forwards the update to the latest balancer created. -+func (gsb *Balancer) UpdateClientConnState(state balancer.ClientConnState) error { -+ // The resolver data is only relevant to the most recent LB Policy. -+ balToUpdate := gsb.latestBalancer() -+ if balToUpdate == nil { -+ return errBalancerClosed -+ } -+ // Perform this call without gsb.mu to prevent deadlocks if the child calls -+ // back into the channel. The latest balancer can never be closed during a -+ // call from the channel, even without gsb.mu held. -+ return balToUpdate.UpdateClientConnState(state) -+} -+ -+// ResolverError forwards the error to the latest balancer created. -+func (gsb *Balancer) ResolverError(err error) { -+ // The resolver data is only relevant to the most recent LB Policy. -+ balToUpdate := gsb.latestBalancer() -+ if balToUpdate == nil { -+ return -+ } -+ // Perform this call without gsb.mu to prevent deadlocks if the child calls -+ // back into the channel. The latest balancer can never be closed during a -+ // call from the channel, even without gsb.mu held. -+ balToUpdate.ResolverError(err) -+} -+ -+// ExitIdle forwards the call to the latest balancer created. -+// -+// If the latest balancer does not support ExitIdle, the subConns are -+// re-connected to manually. -+func (gsb *Balancer) ExitIdle() { -+ balToUpdate := gsb.latestBalancer() -+ if balToUpdate == nil { -+ return -+ } -+ // There is no need to protect this read with a mutex, as the write to the -+ // Balancer field happens in SwitchTo, which completes before this can be -+ // called. -+ if ei, ok := balToUpdate.Balancer.(balancer.ExitIdler); ok { -+ ei.ExitIdle() -+ return -+ } -+ gsb.mu.Lock() -+ defer gsb.mu.Unlock() -+ for sc := range balToUpdate.subconns { -+ sc.Connect() -+ } -+} -+ -+// UpdateSubConnState forwards the update to the appropriate child. -+func (gsb *Balancer) UpdateSubConnState(sc balancer.SubConn, state balancer.SubConnState) { -+ gsb.currentMu.Lock() -+ defer gsb.currentMu.Unlock() -+ gsb.mu.Lock() -+ // Forward update to the appropriate child. Even if there is a pending -+ // balancer, the current balancer should continue to get SubConn updates to -+ // maintain the proper state while the pending is still connecting. -+ var balToUpdate *balancerWrapper -+ if gsb.balancerCurrent != nil && gsb.balancerCurrent.subconns[sc] { -+ balToUpdate = gsb.balancerCurrent -+ } else if gsb.balancerPending != nil && gsb.balancerPending.subconns[sc] { -+ balToUpdate = gsb.balancerPending -+ } -+ gsb.mu.Unlock() -+ if balToUpdate == nil { -+ // SubConn belonged to a stale lb policy that has not yet fully closed, -+ // or the balancer was already closed. -+ return -+ } -+ balToUpdate.UpdateSubConnState(sc, state) -+} -+ -+// Close closes any active child balancers. -+func (gsb *Balancer) Close() { -+ gsb.mu.Lock() -+ gsb.closed = true -+ currentBalancerToClose := gsb.balancerCurrent -+ gsb.balancerCurrent = nil -+ pendingBalancerToClose := gsb.balancerPending -+ gsb.balancerPending = nil -+ gsb.mu.Unlock() -+ -+ currentBalancerToClose.Close() -+ pendingBalancerToClose.Close() -+} -+ -+// balancerWrapper wraps a balancer.Balancer, and overrides some Balancer -+// methods to help cleanup SubConns created by the wrapped balancer. -+// -+// It implements the balancer.ClientConn interface and is passed down in that -+// capacity to the wrapped balancer. It maintains a set of subConns created by -+// the wrapped balancer and calls from the latter to create/update/remove -+// SubConns update this set before being forwarded to the parent ClientConn. -+// State updates from the wrapped balancer can result in invocation of the -+// graceful switch logic. -+type balancerWrapper struct { -+ balancer.Balancer -+ gsb *Balancer -+ -+ lastState balancer.State -+ subconns map[balancer.SubConn]bool // subconns created by this balancer -+} -+ -+func (bw *balancerWrapper) UpdateSubConnState(sc balancer.SubConn, state balancer.SubConnState) { -+ if state.ConnectivityState == connectivity.Shutdown { -+ bw.gsb.mu.Lock() -+ delete(bw.subconns, sc) -+ bw.gsb.mu.Unlock() -+ } -+ // There is no need to protect this read with a mutex, as the write to the -+ // Balancer field happens in SwitchTo, which completes before this can be -+ // called. -+ bw.Balancer.UpdateSubConnState(sc, state) -+} -+ -+// Close closes the underlying LB policy and removes the subconns it created. bw -+// must not be referenced via balancerCurrent or balancerPending in gsb when -+// called. gsb.mu must not be held. Does not panic with a nil receiver. -+func (bw *balancerWrapper) Close() { -+ // before Close is called. -+ if bw == nil { -+ return -+ } -+ // There is no need to protect this read with a mutex, as Close() is -+ // impossible to be called concurrently with the write in SwitchTo(). The -+ // callsites of Close() for this balancer in Graceful Switch Balancer will -+ // never be called until SwitchTo() returns. -+ bw.Balancer.Close() -+ bw.gsb.mu.Lock() -+ for sc := range bw.subconns { -+ bw.gsb.cc.RemoveSubConn(sc) -+ } -+ bw.gsb.mu.Unlock() -+} -+ -+func (bw *balancerWrapper) UpdateState(state balancer.State) { -+ // Hold the mutex for this entire call to ensure it cannot occur -+ // concurrently with other updateState() calls. This causes updates to -+ // lastState and calls to cc.UpdateState to happen atomically. -+ bw.gsb.mu.Lock() -+ defer bw.gsb.mu.Unlock() -+ bw.lastState = state -+ -+ if !bw.gsb.balancerCurrentOrPending(bw) { -+ return -+ } -+ -+ if bw == bw.gsb.balancerCurrent { -+ // In the case that the current balancer exits READY, and there is a pending -+ // balancer, you can forward the pending balancer's cached State up to -+ // ClientConn and swap the pending into the current. This is because there -+ // is no reason to gracefully switch from and keep using the old policy as -+ // the ClientConn is not connected to any backends. -+ if state.ConnectivityState != connectivity.Ready && bw.gsb.balancerPending != nil { -+ bw.gsb.swap() -+ return -+ } -+ // Even if there is a pending balancer waiting to be gracefully switched to, -+ // continue to forward current balancer updates to the Client Conn. Ignoring -+ // state + picker from the current would cause undefined behavior/cause the -+ // system to behave incorrectly from the current LB policies perspective. -+ // Also, the current LB is still being used by grpc to choose SubConns per -+ // RPC, and thus should use the most updated form of the current balancer. -+ bw.gsb.cc.UpdateState(state) -+ return -+ } -+ // This method is now dealing with a state update from the pending balancer. -+ // If the current balancer is currently in a state other than READY, the new -+ // policy can be swapped into place immediately. This is because there is no -+ // reason to gracefully switch from and keep using the old policy as the -+ // ClientConn is not connected to any backends. -+ if state.ConnectivityState != connectivity.Connecting || bw.gsb.balancerCurrent.lastState.ConnectivityState != connectivity.Ready { -+ bw.gsb.swap() -+ } -+} -+ -+func (bw *balancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) { -+ bw.gsb.mu.Lock() -+ if !bw.gsb.balancerCurrentOrPending(bw) { -+ bw.gsb.mu.Unlock() -+ return nil, fmt.Errorf("%T at address %p that called NewSubConn is deleted", bw, bw) -+ } -+ bw.gsb.mu.Unlock() -+ -+ sc, err := bw.gsb.cc.NewSubConn(addrs, opts) -+ if err != nil { -+ return nil, err -+ } -+ bw.gsb.mu.Lock() -+ if !bw.gsb.balancerCurrentOrPending(bw) { // balancer was closed during this call -+ bw.gsb.cc.RemoveSubConn(sc) -+ bw.gsb.mu.Unlock() -+ return nil, fmt.Errorf("%T at address %p that called NewSubConn is deleted", bw, bw) -+ } -+ bw.subconns[sc] = true -+ bw.gsb.mu.Unlock() -+ return sc, nil -+} -+ -+func (bw *balancerWrapper) ResolveNow(opts resolver.ResolveNowOptions) { -+ // Ignore ResolveNow requests from anything other than the most recent -+ // balancer, because older balancers were already removed from the config. -+ if bw != bw.gsb.latestBalancer() { -+ return -+ } -+ bw.gsb.cc.ResolveNow(opts) -+} -+ -+func (bw *balancerWrapper) RemoveSubConn(sc balancer.SubConn) { -+ bw.gsb.mu.Lock() -+ if !bw.gsb.balancerCurrentOrPending(bw) { -+ bw.gsb.mu.Unlock() -+ return -+ } -+ bw.gsb.mu.Unlock() -+ bw.gsb.cc.RemoveSubConn(sc) -+} -+ -+func (bw *balancerWrapper) UpdateAddresses(sc balancer.SubConn, addrs []resolver.Address) { -+ bw.gsb.mu.Lock() -+ if !bw.gsb.balancerCurrentOrPending(bw) { -+ bw.gsb.mu.Unlock() -+ return -+ } -+ bw.gsb.mu.Unlock() -+ bw.gsb.cc.UpdateAddresses(sc, addrs) -+} -+ -+func (bw *balancerWrapper) Target() string { -+ return bw.gsb.cc.Target() -+} -diff --git a/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go b/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go -index 5cc3aed..755fdeb 100644 ---- a/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go -+++ b/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go -@@ -28,38 +28,48 @@ import ( - "google.golang.org/grpc/internal/grpcutil" - ) - --// Logger is the global binary logger. It can be used to get binary logger for --// each method. -+var grpclogLogger = grpclog.Component("binarylog") -+ -+// Logger specifies MethodLoggers for method names with a Log call that -+// takes a context. -+// -+// This is used in the 1.0 release of gcp/observability, and thus must not be -+// deleted or changed. - type Logger interface { -- getMethodLogger(methodName string) *MethodLogger -+ GetMethodLogger(methodName string) MethodLogger - } - - // binLogger is the global binary logger for the binary. One of this should be - // built at init time from the configuration (environment variable or flags). - // --// It is used to get a methodLogger for each individual method. -+// It is used to get a MethodLogger for each individual method. - var binLogger Logger - --var grpclogLogger = grpclog.Component("binarylog") -- --// SetLogger sets the binarg logger. -+// SetLogger sets the binary logger. - // - // Only call this at init time. - func SetLogger(l Logger) { - binLogger = l - } - --// GetMethodLogger returns the methodLogger for the given methodName. -+// GetLogger gets the binary logger. -+// -+// Only call this at init time. -+func GetLogger() Logger { -+ return binLogger -+} -+ -+// GetMethodLogger returns the MethodLogger for the given methodName. - // - // methodName should be in the format of "/service/method". - // --// Each methodLogger returned by this method is a new instance. This is to -+// Each MethodLogger returned by this method is a new instance. This is to - // generate sequence id within the call. --func GetMethodLogger(methodName string) *MethodLogger { -+func GetMethodLogger(methodName string) MethodLogger { - if binLogger == nil { - return nil - } -- return binLogger.getMethodLogger(methodName) -+ return binLogger.GetMethodLogger(methodName) - } - - func init() { -@@ -68,17 +78,29 @@ func init() { - binLogger = NewLoggerFromConfigString(configStr) - } - --type methodLoggerConfig struct { -+// MethodLoggerConfig contains the setting for logging behavior of a method -+// logger. Currently, it contains the max length of header and message. -+type MethodLoggerConfig struct { - // Max length of header and message. -- hdr, msg uint64 -+ Header, Message uint64 -+} -+ -+// LoggerConfig contains the config for loggers to create method loggers. -+type LoggerConfig struct { -+ All *MethodLoggerConfig -+ Services map[string]*MethodLoggerConfig -+ Methods map[string]*MethodLoggerConfig -+ -+ Blacklist map[string]struct{} - } - - type logger struct { -- all *methodLoggerConfig -- services map[string]*methodLoggerConfig -- methods map[string]*methodLoggerConfig -+ config LoggerConfig -+} - -- blacklist map[string]struct{} -+// NewLoggerFromConfig builds a logger with the given LoggerConfig. -+func NewLoggerFromConfig(config LoggerConfig) Logger { -+ return &logger{config: config} - } - - // newEmptyLogger creates an empty logger. The map fields need to be filled in -@@ -88,83 +110,83 @@ func newEmptyLogger() *logger { - } - - // Set method logger for "*". --func (l *logger) setDefaultMethodLogger(ml *methodLoggerConfig) error { -- if l.all != nil { -+func (l *logger) setDefaultMethodLogger(ml *MethodLoggerConfig) error { -+ if l.config.All != nil { - return fmt.Errorf("conflicting global rules found") - } -- l.all = ml -+ l.config.All = ml - return nil - } - - // Set method logger for "service/*". - // --// New methodLogger with same service overrides the old one. --func (l *logger) setServiceMethodLogger(service string, ml *methodLoggerConfig) error { -- if _, ok := l.services[service]; ok { -+// New MethodLogger with same service overrides the old one. -+func (l *logger) setServiceMethodLogger(service string, ml *MethodLoggerConfig) error { -+ if _, ok := l.config.Services[service]; ok { - return fmt.Errorf("conflicting service rules for service %v found", service) - } -- if l.services == nil { -- l.services = make(map[string]*methodLoggerConfig) -+ if l.config.Services == nil { -+ l.config.Services = make(map[string]*MethodLoggerConfig) - } -- l.services[service] = ml -+ l.config.Services[service] = ml - return nil - } - - // Set method logger for "service/method". - // --// New methodLogger with same method overrides the old one. --func (l *logger) setMethodMethodLogger(method string, ml *methodLoggerConfig) error { -- if _, ok := l.blacklist[method]; ok { -+// New MethodLogger with same method overrides the old one. -+func (l *logger) setMethodMethodLogger(method string, ml *MethodLoggerConfig) error { -+ if _, ok := l.config.Blacklist[method]; ok { - return fmt.Errorf("conflicting blacklist rules for method %v found", method) - } -- if _, ok := l.methods[method]; ok { -+ if _, ok := l.config.Methods[method]; ok { - return fmt.Errorf("conflicting method rules for method %v found", method) - } -- if l.methods == nil { -- l.methods = make(map[string]*methodLoggerConfig) -+ if l.config.Methods == nil { -+ l.config.Methods = make(map[string]*MethodLoggerConfig) - } -- l.methods[method] = ml -+ l.config.Methods[method] = ml - return nil - } - - // Set blacklist method for "-service/method". - func (l *logger) setBlacklist(method string) error { -- if _, ok := l.blacklist[method]; ok { -+ if _, ok := l.config.Blacklist[method]; ok { - return fmt.Errorf("conflicting blacklist rules for method %v found", method) - } -- if _, ok := l.methods[method]; ok { -+ if _, ok := l.config.Methods[method]; ok { - return fmt.Errorf("conflicting method rules for method %v found", method) - } -- if l.blacklist == nil { -- l.blacklist = make(map[string]struct{}) -+ if l.config.Blacklist == nil { -+ l.config.Blacklist = make(map[string]struct{}) - } -- l.blacklist[method] = struct{}{} -+ l.config.Blacklist[method] = struct{}{} - return nil - } - --// getMethodLogger returns the methodLogger for the given methodName. -+// getMethodLogger returns the MethodLogger for the given methodName. - // - // methodName should be in the format of "/service/method". - // --// Each methodLogger returned by this method is a new instance. This is to -+// Each MethodLogger returned by this method is a new instance. This is to - // generate sequence id within the call. --func (l *logger) getMethodLogger(methodName string) *MethodLogger { -+func (l *logger) GetMethodLogger(methodName string) MethodLogger { - s, m, err := grpcutil.ParseMethod(methodName) - if err != nil { - grpclogLogger.Infof("binarylogging: failed to parse %q: %v", methodName, err) - return nil - } -- if ml, ok := l.methods[s+"/"+m]; ok { -- return newMethodLogger(ml.hdr, ml.msg) -+ if ml, ok := l.config.Methods[s+"/"+m]; ok { -+ return NewTruncatingMethodLogger(ml.Header, ml.Message) - } -- if _, ok := l.blacklist[s+"/"+m]; ok { -+ if _, ok := l.config.Blacklist[s+"/"+m]; ok { - return nil - } -- if ml, ok := l.services[s]; ok { -- return newMethodLogger(ml.hdr, ml.msg) -+ if ml, ok := l.config.Services[s]; ok { -+ return NewTruncatingMethodLogger(ml.Header, ml.Message) - } -- if l.all == nil { -+ if l.config.All == nil { - return nil - } -- return newMethodLogger(l.all.hdr, l.all.msg) -+ return NewTruncatingMethodLogger(l.config.All.Header, l.config.All.Message) - } -diff --git a/vendor/google.golang.org/grpc/internal/binarylog/env_config.go b/vendor/google.golang.org/grpc/internal/binarylog/env_config.go -index d8f4e76..f9e80e2 100644 ---- a/vendor/google.golang.org/grpc/internal/binarylog/env_config.go -+++ b/vendor/google.golang.org/grpc/internal/binarylog/env_config.go -@@ -30,15 +30,15 @@ import ( - // to build a new logger and assign it to binarylog.Logger. - // - // Example filter config strings: --// - "" Nothing will be logged --// - "*" All headers and messages will be fully logged. --// - "*{h}" Only headers will be logged. --// - "*{m:256}" Only the first 256 bytes of each message will be logged. --// - "Foo/*" Logs every method in service Foo --// - "Foo/*,-Foo/Bar" Logs every method in service Foo except method /Foo/Bar --// - "Foo/*,Foo/Bar{m:256}" Logs the first 256 bytes of each message in method --// /Foo/Bar, logs all headers and messages in every other method in service --// Foo. -+// - "" Nothing will be logged -+// - "*" All headers and messages will be fully logged. -+// - "*{h}" Only headers will be logged. -+// - "*{m:256}" Only the first 256 bytes of each message will be logged. -+// - "Foo/*" Logs every method in service Foo -+// - "Foo/*,-Foo/Bar" Logs every method in service Foo except method /Foo/Bar -+// - "Foo/*,Foo/Bar{m:256}" Logs the first 256 bytes of each message in method -+// /Foo/Bar, logs all headers and messages in every other method in service -+// Foo. - // - // If two configs exist for one certain method or service, the one specified - // later overrides the previous config. -@@ -57,7 +57,7 @@ func NewLoggerFromConfigString(s string) Logger { - return l - } - --// fillMethodLoggerWithConfigString parses config, creates methodLogger and adds -+// fillMethodLoggerWithConfigString parses config, creates TruncatingMethodLogger and adds - // it to the right map in the logger. - func (l *logger) fillMethodLoggerWithConfigString(config string) error { - // "" is invalid. -@@ -89,7 +89,7 @@ func (l *logger) fillMethodLoggerWithConfigString(config string) error { - if err != nil { - return fmt.Errorf("invalid config: %q, %v", config, err) - } -- if err := l.setDefaultMethodLogger(&methodLoggerConfig{hdr: hdr, msg: msg}); err != nil { -+ if err := l.setDefaultMethodLogger(&MethodLoggerConfig{Header: hdr, Message: msg}); err != nil { - return fmt.Errorf("invalid config: %v", err) - } - return nil -@@ -104,11 +104,11 @@ func (l *logger) fillMethodLoggerWithConfigString(config string) error { - return fmt.Errorf("invalid header/message length config: %q, %v", suffix, err) - } - if m == "*" { -- if err := l.setServiceMethodLogger(s, &methodLoggerConfig{hdr: hdr, msg: msg}); err != nil { -+ if err := l.setServiceMethodLogger(s, &MethodLoggerConfig{Header: hdr, Message: msg}); err != nil { - return fmt.Errorf("invalid config: %v", err) - } - } else { -- if err := l.setMethodMethodLogger(s+"/"+m, &methodLoggerConfig{hdr: hdr, msg: msg}); err != nil { -+ if err := l.setMethodMethodLogger(s+"/"+m, &MethodLoggerConfig{Header: hdr, Message: msg}); err != nil { - return fmt.Errorf("invalid config: %v", err) - } - } -diff --git a/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go -index 0cdb418..6c3f632 100644 ---- a/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go -+++ b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go -@@ -19,6 +19,7 @@ - package binarylog - - import ( -+ "context" - "net" - "strings" - "sync/atomic" -@@ -26,7 +27,7 @@ import ( - - "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes" -- pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1" -+ binlogpb "google.golang.org/grpc/binarylog/grpc_binarylog_v1" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" - ) -@@ -48,7 +49,16 @@ func (g *callIDGenerator) reset() { - var idGen callIDGenerator - - // MethodLogger is the sub-logger for each method. --type MethodLogger struct { -+// -+// This is used in the 1.0 release of gcp/observability, and thus must not be -+// deleted or changed. -+type MethodLogger interface { -+ Log(context.Context, LogEntryConfig) -+} -+ -+// TruncatingMethodLogger is a method logger that truncates headers and messages -+// based on configured fields. -+type TruncatingMethodLogger struct { - headerMaxLen, messageMaxLen uint64 - - callID uint64 -@@ -57,8 +67,12 @@ type MethodLogger struct { - sink Sink // TODO(blog): make this plugable. - } - --func newMethodLogger(h, m uint64) *MethodLogger { -- return &MethodLogger{ -+// NewTruncatingMethodLogger returns a new truncating method logger. -+// -+// This is used in the 1.0 release of gcp/observability, and thus must not be -+// deleted or changed. -+func NewTruncatingMethodLogger(h, m uint64) *TruncatingMethodLogger { -+ return &TruncatingMethodLogger{ - headerMaxLen: h, - messageMaxLen: m, - -@@ -69,8 +83,10 @@ func newMethodLogger(h, m uint64) *MethodLogger { - } - } - --// Log creates a proto binary log entry, and logs it to the sink. --func (ml *MethodLogger) Log(c LogEntryConfig) { -+// Build is an internal only method for building the proto message out of the -+// input event. It's made public to enable other library to reuse as much logic -+// in TruncatingMethodLogger as possible. -+func (ml *TruncatingMethodLogger) Build(c LogEntryConfig) *binlogpb.GrpcLogEntry { - m := c.toProto() - timestamp, _ := ptypes.TimestampProto(time.Now()) - m.Timestamp = timestamp -@@ -78,18 +94,22 @@ func (ml *MethodLogger) Log(c LogEntryConfig) { - m.SequenceIdWithinCall = ml.idWithinCallGen.next() - - switch pay := m.Payload.(type) { -- case *pb.GrpcLogEntry_ClientHeader: -+ case *binlogpb.GrpcLogEntry_ClientHeader: - m.PayloadTruncated = ml.truncateMetadata(pay.ClientHeader.GetMetadata()) -- case *pb.GrpcLogEntry_ServerHeader: -+ case *binlogpb.GrpcLogEntry_ServerHeader: - m.PayloadTruncated = ml.truncateMetadata(pay.ServerHeader.GetMetadata()) -- case *pb.GrpcLogEntry_Message: -+ case *binlogpb.GrpcLogEntry_Message: - m.PayloadTruncated = ml.truncateMessage(pay.Message) - } -+ return m -+} - -- ml.sink.Write(m) -+// Log creates a proto binary log entry, and logs it to the sink. -+func (ml *TruncatingMethodLogger) Log(ctx context.Context, c LogEntryConfig) { -+ ml.sink.Write(ml.Build(c)) - } - --func (ml *MethodLogger) truncateMetadata(mdPb *pb.Metadata) (truncated bool) { -+func (ml *TruncatingMethodLogger) truncateMetadata(mdPb *binlogpb.Metadata) (truncated bool) { - if ml.headerMaxLen == maxUInt { - return false - } -@@ -108,7 +128,7 @@ func (ml *MethodLogger) truncateMetadata(mdPb *pb.Metadata) (truncated bool) { - // but not counted towards the size limit. - continue - } -- currentEntryLen := uint64(len(entry.Value)) -+ currentEntryLen := uint64(len(entry.GetKey())) + uint64(len(entry.GetValue())) - if currentEntryLen > bytesLimit { - break - } -@@ -119,7 +139,7 @@ func (ml *MethodLogger) truncateMetadata(mdPb *pb.Metadata) (truncated bool) { - return truncated - } - --func (ml *MethodLogger) truncateMessage(msgPb *pb.Message) (truncated bool) { -+func (ml *TruncatingMethodLogger) truncateMessage(msgPb *binlogpb.Message) (truncated bool) { - if ml.messageMaxLen == maxUInt { - return false - } -@@ -131,8 +151,11 @@ func (ml *MethodLogger) truncateMessage(msgPb *pb.Message) (truncated bool) { - } - - // LogEntryConfig represents the configuration for binary log entry. -+// -+// This is used in the 1.0 release of gcp/observability, and thus must not be -+// deleted or changed. - type LogEntryConfig interface { -- toProto() *pb.GrpcLogEntry -+ toProto() *binlogpb.GrpcLogEntry - } - - // ClientHeader configs the binary log entry to be a ClientHeader entry. -@@ -146,10 +169,10 @@ type ClientHeader struct { - PeerAddr net.Addr - } - --func (c *ClientHeader) toProto() *pb.GrpcLogEntry { -+func (c *ClientHeader) toProto() *binlogpb.GrpcLogEntry { - // This function doesn't need to set all the fields (e.g. seq ID). The Log - // function will set the fields when necessary. -- clientHeader := &pb.ClientHeader{ -+ clientHeader := &binlogpb.ClientHeader{ - Metadata: mdToMetadataProto(c.Header), - MethodName: c.MethodName, - Authority: c.Authority, -@@ -157,16 +180,16 @@ func (c *ClientHeader) toProto() *pb.GrpcLogEntry { - if c.Timeout > 0 { - clientHeader.Timeout = ptypes.DurationProto(c.Timeout) - } -- ret := &pb.GrpcLogEntry{ -- Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_HEADER, -- Payload: &pb.GrpcLogEntry_ClientHeader{ -+ ret := &binlogpb.GrpcLogEntry{ -+ Type: binlogpb.GrpcLogEntry_EVENT_TYPE_CLIENT_HEADER, -+ Payload: &binlogpb.GrpcLogEntry_ClientHeader{ - ClientHeader: clientHeader, - }, - } - if c.OnClientSide { -- ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT - } else { -- ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER - } - if c.PeerAddr != nil { - ret.Peer = addrToProto(c.PeerAddr) -@@ -182,19 +205,19 @@ type ServerHeader struct { - PeerAddr net.Addr - } - --func (c *ServerHeader) toProto() *pb.GrpcLogEntry { -- ret := &pb.GrpcLogEntry{ -- Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_HEADER, -- Payload: &pb.GrpcLogEntry_ServerHeader{ -- ServerHeader: &pb.ServerHeader{ -+func (c *ServerHeader) toProto() *binlogpb.GrpcLogEntry { -+ ret := &binlogpb.GrpcLogEntry{ -+ Type: binlogpb.GrpcLogEntry_EVENT_TYPE_SERVER_HEADER, -+ Payload: &binlogpb.GrpcLogEntry_ServerHeader{ -+ ServerHeader: &binlogpb.ServerHeader{ - Metadata: mdToMetadataProto(c.Header), - }, - }, - } - if c.OnClientSide { -- ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT - } else { -- ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER - } - if c.PeerAddr != nil { - ret.Peer = addrToProto(c.PeerAddr) -@@ -210,7 +233,7 @@ type ClientMessage struct { - Message interface{} - } - --func (c *ClientMessage) toProto() *pb.GrpcLogEntry { -+func (c *ClientMessage) toProto() *binlogpb.GrpcLogEntry { - var ( - data []byte - err error -@@ -225,19 +248,19 @@ func (c *ClientMessage) toProto() *pb.GrpcLogEntry { - } else { - grpclogLogger.Infof("binarylogging: message to log is neither proto.message nor []byte") - } -- ret := &pb.GrpcLogEntry{ -- Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_MESSAGE, -- Payload: &pb.GrpcLogEntry_Message{ -- Message: &pb.Message{ -+ ret := &binlogpb.GrpcLogEntry{ -+ Type: binlogpb.GrpcLogEntry_EVENT_TYPE_CLIENT_MESSAGE, -+ Payload: &binlogpb.GrpcLogEntry_Message{ -+ Message: &binlogpb.Message{ - Length: uint32(len(data)), - Data: data, - }, - }, - } - if c.OnClientSide { -- ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT - } else { -- ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER - } - return ret - } -@@ -250,7 +273,7 @@ type ServerMessage struct { - Message interface{} - } - --func (c *ServerMessage) toProto() *pb.GrpcLogEntry { -+func (c *ServerMessage) toProto() *binlogpb.GrpcLogEntry { - var ( - data []byte - err error -@@ -265,19 +288,19 @@ func (c *ServerMessage) toProto() *pb.GrpcLogEntry { - } else { - grpclogLogger.Infof("binarylogging: message to log is neither proto.message nor []byte") - } -- ret := &pb.GrpcLogEntry{ -- Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_MESSAGE, -- Payload: &pb.GrpcLogEntry_Message{ -- Message: &pb.Message{ -+ ret := &binlogpb.GrpcLogEntry{ -+ Type: binlogpb.GrpcLogEntry_EVENT_TYPE_SERVER_MESSAGE, -+ Payload: &binlogpb.GrpcLogEntry_Message{ -+ Message: &binlogpb.Message{ - Length: uint32(len(data)), - Data: data, - }, - }, - } - if c.OnClientSide { -- ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT - } else { -- ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER - } - return ret - } -@@ -287,15 +310,15 @@ type ClientHalfClose struct { - OnClientSide bool - } - --func (c *ClientHalfClose) toProto() *pb.GrpcLogEntry { -- ret := &pb.GrpcLogEntry{ -- Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_HALF_CLOSE, -+func (c *ClientHalfClose) toProto() *binlogpb.GrpcLogEntry { -+ ret := &binlogpb.GrpcLogEntry{ -+ Type: binlogpb.GrpcLogEntry_EVENT_TYPE_CLIENT_HALF_CLOSE, - Payload: nil, // No payload here. - } - if c.OnClientSide { -- ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT - } else { -- ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER - } - return ret - } -@@ -311,7 +334,7 @@ type ServerTrailer struct { - PeerAddr net.Addr - } - --func (c *ServerTrailer) toProto() *pb.GrpcLogEntry { -+func (c *ServerTrailer) toProto() *binlogpb.GrpcLogEntry { - st, ok := status.FromError(c.Err) - if !ok { - grpclogLogger.Info("binarylogging: error in trailer is not a status error") -@@ -327,10 +350,10 @@ func (c *ServerTrailer) toProto() *pb.GrpcLogEntry { - grpclogLogger.Infof("binarylogging: failed to marshal status proto: %v", err) - } - } -- ret := &pb.GrpcLogEntry{ -- Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_TRAILER, -- Payload: &pb.GrpcLogEntry_Trailer{ -- Trailer: &pb.Trailer{ -+ ret := &binlogpb.GrpcLogEntry{ -+ Type: binlogpb.GrpcLogEntry_EVENT_TYPE_SERVER_TRAILER, -+ Payload: &binlogpb.GrpcLogEntry_Trailer{ -+ Trailer: &binlogpb.Trailer{ - Metadata: mdToMetadataProto(c.Trailer), - StatusCode: uint32(st.Code()), - StatusMessage: st.Message(), -@@ -339,9 +362,9 @@ func (c *ServerTrailer) toProto() *pb.GrpcLogEntry { - }, - } - if c.OnClientSide { -- ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT - } else { -- ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER - } - if c.PeerAddr != nil { - ret.Peer = addrToProto(c.PeerAddr) -@@ -354,15 +377,15 @@ type Cancel struct { - OnClientSide bool - } - --func (c *Cancel) toProto() *pb.GrpcLogEntry { -- ret := &pb.GrpcLogEntry{ -- Type: pb.GrpcLogEntry_EVENT_TYPE_CANCEL, -+func (c *Cancel) toProto() *binlogpb.GrpcLogEntry { -+ ret := &binlogpb.GrpcLogEntry{ -+ Type: binlogpb.GrpcLogEntry_EVENT_TYPE_CANCEL, - Payload: nil, - } - if c.OnClientSide { -- ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_CLIENT - } else { -- ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER -+ ret.Logger = binlogpb.GrpcLogEntry_LOGGER_SERVER - } - return ret - } -@@ -379,15 +402,15 @@ func metadataKeyOmit(key string) bool { - return strings.HasPrefix(key, "grpc-") - } - --func mdToMetadataProto(md metadata.MD) *pb.Metadata { -- ret := &pb.Metadata{} -+func mdToMetadataProto(md metadata.MD) *binlogpb.Metadata { -+ ret := &binlogpb.Metadata{} - for k, vv := range md { - if metadataKeyOmit(k) { - continue - } - for _, v := range vv { - ret.Entry = append(ret.Entry, -- &pb.MetadataEntry{ -+ &binlogpb.MetadataEntry{ - Key: k, - Value: []byte(v), - }, -@@ -397,26 +420,26 @@ func mdToMetadataProto(md metadata.MD) *pb.Metadata { - return ret - } - --func addrToProto(addr net.Addr) *pb.Address { -- ret := &pb.Address{} -+func addrToProto(addr net.Addr) *binlogpb.Address { -+ ret := &binlogpb.Address{} - switch a := addr.(type) { - case *net.TCPAddr: - if a.IP.To4() != nil { -- ret.Type = pb.Address_TYPE_IPV4 -+ ret.Type = binlogpb.Address_TYPE_IPV4 - } else if a.IP.To16() != nil { -- ret.Type = pb.Address_TYPE_IPV6 -+ ret.Type = binlogpb.Address_TYPE_IPV6 - } else { -- ret.Type = pb.Address_TYPE_UNKNOWN -+ ret.Type = binlogpb.Address_TYPE_UNKNOWN - // Do not set address and port fields. - break - } - ret.Address = a.IP.String() - ret.IpPort = uint32(a.Port) - case *net.UnixAddr: -- ret.Type = pb.Address_TYPE_UNIX -+ ret.Type = binlogpb.Address_TYPE_UNIX - ret.Address = a.String() - default: -- ret.Type = pb.Address_TYPE_UNKNOWN -+ ret.Type = binlogpb.Address_TYPE_UNKNOWN - } - return ret - } -diff --git a/vendor/google.golang.org/grpc/internal/binarylog/sink.go b/vendor/google.golang.org/grpc/internal/binarylog/sink.go -index c2fdd58..264de38 100644 ---- a/vendor/google.golang.org/grpc/internal/binarylog/sink.go -+++ b/vendor/google.golang.org/grpc/internal/binarylog/sink.go -@@ -26,7 +26,7 @@ import ( - "time" - - "github.com/golang/protobuf/proto" -- pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1" -+ binlogpb "google.golang.org/grpc/binarylog/grpc_binarylog_v1" - ) - - var ( -@@ -42,15 +42,15 @@ type Sink interface { - // Write will be called to write the log entry into the sink. - // - // It should be thread-safe so it can be called in parallel. -- Write(*pb.GrpcLogEntry) error -+ Write(*binlogpb.GrpcLogEntry) error - // Close will be called when the Sink is replaced by a new Sink. - Close() error - } - - type noopSink struct{} - --func (ns *noopSink) Write(*pb.GrpcLogEntry) error { return nil } --func (ns *noopSink) Close() error { return nil } -+func (ns *noopSink) Write(*binlogpb.GrpcLogEntry) error { return nil } -+func (ns *noopSink) Close() error { return nil } - - // newWriterSink creates a binary log sink with the given writer. - // -@@ -66,7 +66,7 @@ type writerSink struct { - out io.Writer - } - --func (ws *writerSink) Write(e *pb.GrpcLogEntry) error { -+func (ws *writerSink) Write(e *binlogpb.GrpcLogEntry) error { - b, err := proto.Marshal(e) - if err != nil { - grpclogLogger.Errorf("binary logging: failed to marshal proto message: %v", err) -@@ -96,7 +96,7 @@ type bufferedSink struct { - done chan struct{} - } - --func (fs *bufferedSink) Write(e *pb.GrpcLogEntry) error { -+func (fs *bufferedSink) Write(e *binlogpb.GrpcLogEntry) error { - fs.mu.Lock() - defer fs.mu.Unlock() - if !fs.flusherStarted { -diff --git a/vendor/google.golang.org/grpc/internal/buffer/unbounded.go b/vendor/google.golang.org/grpc/internal/buffer/unbounded.go -index 9f6a0c1..81c2f5f 100644 ---- a/vendor/google.golang.org/grpc/internal/buffer/unbounded.go -+++ b/vendor/google.golang.org/grpc/internal/buffer/unbounded.go -@@ -35,6 +35,7 @@ import "sync" - // internal/transport/transport.go for an example of this. - type Unbounded struct { - c chan interface{} -+ closed bool - mu sync.Mutex - backlog []interface{} - } -@@ -47,16 +48,18 @@ func NewUnbounded() *Unbounded { - // Put adds t to the unbounded buffer. - func (b *Unbounded) Put(t interface{}) { - b.mu.Lock() -+ defer b.mu.Unlock() -+ if b.closed { -+ return -+ } - if len(b.backlog) == 0 { - select { - case b.c <- t: -- b.mu.Unlock() - return - default: - } - } - b.backlog = append(b.backlog, t) -- b.mu.Unlock() - } - - // Load sends the earliest buffered data, if any, onto the read channel -@@ -64,6 +67,10 @@ func (b *Unbounded) Put(t interface{}) { - // value from the read channel. - func (b *Unbounded) Load() { - b.mu.Lock() -+ defer b.mu.Unlock() -+ if b.closed { -+ return -+ } - if len(b.backlog) > 0 { - select { - case b.c <- b.backlog[0]: -@@ -72,7 +79,6 @@ func (b *Unbounded) Load() { - default: - } - } -- b.mu.Unlock() - } - - // Get returns a read channel on which values added to the buffer, via Put(), -@@ -80,6 +86,20 @@ func (b *Unbounded) Load() { - // - // Upon reading a value from this channel, users are expected to call Load() to - // send the next buffered value onto the channel if there is any. -+// -+// If the unbounded buffer is closed, the read channel returned by this method -+// is closed. - func (b *Unbounded) Get() <-chan interface{} { - return b.c - } -+ -+// Close closes the unbounded buffer. -+func (b *Unbounded) Close() { -+ b.mu.Lock() -+ defer b.mu.Unlock() -+ if b.closed { -+ return -+ } -+ b.closed = true -+ close(b.c) -+} -diff --git a/vendor/google.golang.org/grpc/internal/channelz/funcs.go b/vendor/google.golang.org/grpc/internal/channelz/funcs.go -index f731413..777cbcd 100644 ---- a/vendor/google.golang.org/grpc/internal/channelz/funcs.go -+++ b/vendor/google.golang.org/grpc/internal/channelz/funcs.go -@@ -24,6 +24,8 @@ - package channelz - - import ( -+ "context" -+ "errors" - "fmt" - "sort" - "sync" -@@ -49,7 +51,8 @@ var ( - // TurnOn turns on channelz data collection. - func TurnOn() { - if !IsOn() { -- NewChannelzStorage() -+ db.set(newChannelMap()) -+ idGen.reset() - atomic.StoreInt32(&curState, 1) - } - } -@@ -94,46 +97,40 @@ func (d *dbWrapper) get() *channelMap { - return d.DB - } - --// NewChannelzStorage initializes channelz data storage and id generator. -+// NewChannelzStorageForTesting initializes channelz data storage and id -+// generator for testing purposes. - // --// This function returns a cleanup function to wait for all channelz state to be reset by the --// grpc goroutines when those entities get closed. By using this cleanup function, we make sure tests --// don't mess up each other, i.e. lingering goroutine from previous test doing entity removal happen --// to remove some entity just register by the new test, since the id space is the same. --// --// Note: This function is exported for testing purpose only. User should not call --// it in most cases. --func NewChannelzStorage() (cleanup func() error) { -- db.set(&channelMap{ -- topLevelChannels: make(map[int64]struct{}), -- channels: make(map[int64]*channel), -- listenSockets: make(map[int64]*listenSocket), -- normalSockets: make(map[int64]*normalSocket), -- servers: make(map[int64]*server), -- subChannels: make(map[int64]*subChannel), -- }) -+// Returns a cleanup function to be invoked by the test, which waits for up to -+// 10s for all channelz state to be reset by the grpc goroutines when those -+// entities get closed. This cleanup function helps with ensuring that tests -+// don't mess up each other. -+func NewChannelzStorageForTesting() (cleanup func() error) { -+ db.set(newChannelMap()) - idGen.reset() -+ - return func() error { -- var err error - cm := db.get() - if cm == nil { - return nil - } -- for i := 0; i < 1000; i++ { -- cm.mu.Lock() -- if len(cm.topLevelChannels) == 0 && len(cm.servers) == 0 && len(cm.channels) == 0 && len(cm.subChannels) == 0 && len(cm.listenSockets) == 0 && len(cm.normalSockets) == 0 { -- cm.mu.Unlock() -- // all things stored in the channelz map have been cleared. -+ -+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) -+ defer cancel() -+ ticker := time.NewTicker(10 * time.Millisecond) -+ defer ticker.Stop() -+ for { -+ cm.mu.RLock() -+ topLevelChannels, servers, channels, subChannels, listenSockets, normalSockets := len(cm.topLevelChannels), len(cm.servers), len(cm.channels), len(cm.subChannels), len(cm.listenSockets), len(cm.normalSockets) -+ cm.mu.RUnlock() -+ -+ if err := ctx.Err(); err != nil { -+ return fmt.Errorf("after 10s the channelz map has not been cleaned up yet, topchannels: %d, servers: %d, channels: %d, subchannels: %d, listen sockets: %d, normal sockets: %d", topLevelChannels, servers, channels, subChannels, listenSockets, normalSockets) -+ } -+ if topLevelChannels == 0 && servers == 0 && channels == 0 && subChannels == 0 && listenSockets == 0 && normalSockets == 0 { - return nil - } -- cm.mu.Unlock() -- time.Sleep(10 * time.Millisecond) -+ <-ticker.C - } -- -- cm.mu.Lock() -- err = fmt.Errorf("after 10s the channelz map has not been cleaned up yet, topchannels: %d, servers: %d, channels: %d, subchannels: %d, listen sockets: %d, normal sockets: %d", len(cm.topLevelChannels), len(cm.servers), len(cm.channels), len(cm.subChannels), len(cm.listenSockets), len(cm.normalSockets)) -- cm.mu.Unlock() -- return err - } - } - -@@ -188,54 +185,77 @@ func GetServer(id int64) *ServerMetric { - return db.get().GetServer(id) - } - --// RegisterChannel registers the given channel c in channelz database with ref --// as its reference name, and add it to the child list of its parent (identified --// by pid). pid = 0 means no parent. It returns the unique channelz tracking id --// assigned to this channel. --func RegisterChannel(c Channel, pid int64, ref string) int64 { -+// RegisterChannel registers the given channel c in the channelz database with -+// ref as its reference name, and adds it to the child list of its parent -+// (identified by pid). pid == nil means no parent. -+// -+// Returns a unique channelz identifier assigned to this channel. -+// -+// If channelz is not turned ON, the channelz database is not mutated. -+func RegisterChannel(c Channel, pid *Identifier, ref string) *Identifier { - id := idGen.genID() -+ var parent int64 -+ isTopChannel := true -+ if pid != nil { -+ isTopChannel = false -+ parent = pid.Int() -+ } -+ -+ if !IsOn() { -+ return newIdentifer(RefChannel, id, pid) -+ } -+ - cn := &channel{ - refName: ref, - c: c, - subChans: make(map[int64]string), - nestedChans: make(map[int64]string), - id: id, -- pid: pid, -+ pid: parent, - trace: &channelTrace{createdTime: time.Now(), events: make([]*TraceEvent, 0, getMaxTraceEntry())}, - } -- if pid == 0 { -- db.get().addChannel(id, cn, true, pid, ref) -- } else { -- db.get().addChannel(id, cn, false, pid, ref) -- } -- return id -+ db.get().addChannel(id, cn, isTopChannel, parent) -+ return newIdentifer(RefChannel, id, pid) - } - --// RegisterSubChannel registers the given channel c in channelz database with ref --// as its reference name, and add it to the child list of its parent (identified --// by pid). It returns the unique channelz tracking id assigned to this subchannel. --func RegisterSubChannel(c Channel, pid int64, ref string) int64 { -- if pid == 0 { -- logger.Error("a SubChannel's parent id cannot be 0") -- return 0 -+// RegisterSubChannel registers the given subChannel c in the channelz database -+// with ref as its reference name, and adds it to the child list of its parent -+// (identified by pid). -+// -+// Returns a unique channelz identifier assigned to this subChannel. -+// -+// If channelz is not turned ON, the channelz database is not mutated. -+func RegisterSubChannel(c Channel, pid *Identifier, ref string) (*Identifier, error) { -+ if pid == nil { -+ return nil, errors.New("a SubChannel's parent id cannot be nil") - } - id := idGen.genID() -+ if !IsOn() { -+ return newIdentifer(RefSubChannel, id, pid), nil -+ } -+ - sc := &subChannel{ - refName: ref, - c: c, - sockets: make(map[int64]string), - id: id, -- pid: pid, -+ pid: pid.Int(), - trace: &channelTrace{createdTime: time.Now(), events: make([]*TraceEvent, 0, getMaxTraceEntry())}, - } -- db.get().addSubChannel(id, sc, pid, ref) -- return id -+ db.get().addSubChannel(id, sc, pid.Int()) -+ return newIdentifer(RefSubChannel, id, pid), nil - } - - // RegisterServer registers the given server s in channelz database. It returns - // the unique channelz tracking id assigned to this server. --func RegisterServer(s Server, ref string) int64 { -+// -+// If channelz is not turned ON, the channelz database is not mutated. -+func RegisterServer(s Server, ref string) *Identifier { - id := idGen.genID() -+ if !IsOn() { -+ return newIdentifer(RefServer, id, nil) -+ } -+ - svr := &server{ - refName: ref, - s: s, -@@ -244,71 +264,92 @@ func RegisterServer(s Server, ref string) int64 { - id: id, - } - db.get().addServer(id, svr) -- return id -+ return newIdentifer(RefServer, id, nil) - } - - // RegisterListenSocket registers the given listen socket s in channelz database - // with ref as its reference name, and add it to the child list of its parent - // (identified by pid). It returns the unique channelz tracking id assigned to - // this listen socket. --func RegisterListenSocket(s Socket, pid int64, ref string) int64 { -- if pid == 0 { -- logger.Error("a ListenSocket's parent id cannot be 0") -- return 0 -+// -+// If channelz is not turned ON, the channelz database is not mutated. -+func RegisterListenSocket(s Socket, pid *Identifier, ref string) (*Identifier, error) { -+ if pid == nil { -+ return nil, errors.New("a ListenSocket's parent id cannot be 0") - } - id := idGen.genID() -- ls := &listenSocket{refName: ref, s: s, id: id, pid: pid} -- db.get().addListenSocket(id, ls, pid, ref) -- return id -+ if !IsOn() { -+ return newIdentifer(RefListenSocket, id, pid), nil -+ } -+ -+ ls := &listenSocket{refName: ref, s: s, id: id, pid: pid.Int()} -+ db.get().addListenSocket(id, ls, pid.Int()) -+ return newIdentifer(RefListenSocket, id, pid), nil - } - - // RegisterNormalSocket registers the given normal socket s in channelz database --// with ref as its reference name, and add it to the child list of its parent -+// with ref as its reference name, and adds it to the child list of its parent - // (identified by pid). It returns the unique channelz tracking id assigned to - // this normal socket. --func RegisterNormalSocket(s Socket, pid int64, ref string) int64 { -- if pid == 0 { -- logger.Error("a NormalSocket's parent id cannot be 0") -- return 0 -+// -+// If channelz is not turned ON, the channelz database is not mutated. -+func RegisterNormalSocket(s Socket, pid *Identifier, ref string) (*Identifier, error) { -+ if pid == nil { -+ return nil, errors.New("a NormalSocket's parent id cannot be 0") - } - id := idGen.genID() -- ns := &normalSocket{refName: ref, s: s, id: id, pid: pid} -- db.get().addNormalSocket(id, ns, pid, ref) -- return id -+ if !IsOn() { -+ return newIdentifer(RefNormalSocket, id, pid), nil -+ } -+ -+ ns := &normalSocket{refName: ref, s: s, id: id, pid: pid.Int()} -+ db.get().addNormalSocket(id, ns, pid.Int()) -+ return newIdentifer(RefNormalSocket, id, pid), nil - } - --// RemoveEntry removes an entry with unique channelz trakcing id to be id from -+// RemoveEntry removes an entry with unique channelz tracking id to be id from - // channelz database. --func RemoveEntry(id int64) { -- db.get().removeEntry(id) -+// -+// If channelz is not turned ON, this function is a no-op. -+func RemoveEntry(id *Identifier) { -+ if !IsOn() { -+ return -+ } -+ db.get().removeEntry(id.Int()) - } - --// TraceEventDesc is what the caller of AddTraceEvent should provide to describe the event to be added --// to the channel trace. --// The Parent field is optional. It is used for event that will be recorded in the entity's parent --// trace also. -+// TraceEventDesc is what the caller of AddTraceEvent should provide to describe -+// the event to be added to the channel trace. -+// -+// The Parent field is optional. It is used for an event that will be recorded -+// in the entity's parent trace. - type TraceEventDesc struct { - Desc string - Severity Severity - Parent *TraceEventDesc - } - --// AddTraceEvent adds trace related to the entity with specified id, using the provided TraceEventDesc. --func AddTraceEvent(l grpclog.DepthLoggerV2, id int64, depth int, desc *TraceEventDesc) { -- for d := desc; d != nil; d = d.Parent { -- switch d.Severity { -- case CtUnknown, CtInfo: -- l.InfoDepth(depth+1, d.Desc) -- case CtWarning: -- l.WarningDepth(depth+1, d.Desc) -- case CtError: -- l.ErrorDepth(depth+1, d.Desc) -- } -+// AddTraceEvent adds trace related to the entity with specified id, using the -+// provided TraceEventDesc. -+// -+// If channelz is not turned ON, this will simply log the event descriptions. -+func AddTraceEvent(l grpclog.DepthLoggerV2, id *Identifier, depth int, desc *TraceEventDesc) { -+ // Log only the trace description associated with the bottom most entity. -+ switch desc.Severity { -+ case CtUnknown, CtInfo: -+ l.InfoDepth(depth+1, withParens(id)+desc.Desc) -+ case CtWarning: -+ l.WarningDepth(depth+1, withParens(id)+desc.Desc) -+ case CtError: -+ l.ErrorDepth(depth+1, withParens(id)+desc.Desc) - } -+ - if getMaxTraceEntry() == 0 { - return - } -- db.get().traceEvent(id, desc) -+ if IsOn() { -+ db.get().traceEvent(id.Int(), desc) -+ } - } - - // channelMap is the storage data structure for channelz. -@@ -326,6 +367,17 @@ type channelMap struct { - normalSockets map[int64]*normalSocket - } - -+func newChannelMap() *channelMap { -+ return &channelMap{ -+ topLevelChannels: make(map[int64]struct{}), -+ channels: make(map[int64]*channel), -+ listenSockets: make(map[int64]*listenSocket), -+ normalSockets: make(map[int64]*normalSocket), -+ servers: make(map[int64]*server), -+ subChannels: make(map[int64]*subChannel), -+ } -+} -+ - func (c *channelMap) addServer(id int64, s *server) { - c.mu.Lock() - s.cm = c -@@ -333,7 +385,7 @@ func (c *channelMap) addServer(id int64, s *server) { - c.mu.Unlock() - } - --func (c *channelMap) addChannel(id int64, cn *channel, isTopChannel bool, pid int64, ref string) { -+func (c *channelMap) addChannel(id int64, cn *channel, isTopChannel bool, pid int64) { - c.mu.Lock() - cn.cm = c - cn.trace.cm = c -@@ -346,7 +398,7 @@ func (c *channelMap) addChannel(id int64, cn *channel, isTopChannel bool, pid in - c.mu.Unlock() - } - --func (c *channelMap) addSubChannel(id int64, sc *subChannel, pid int64, ref string) { -+func (c *channelMap) addSubChannel(id int64, sc *subChannel, pid int64) { - c.mu.Lock() - sc.cm = c - sc.trace.cm = c -@@ -355,7 +407,7 @@ func (c *channelMap) addSubChannel(id int64, sc *subChannel, pid int64, ref stri - c.mu.Unlock() - } - --func (c *channelMap) addListenSocket(id int64, ls *listenSocket, pid int64, ref string) { -+func (c *channelMap) addListenSocket(id int64, ls *listenSocket, pid int64) { - c.mu.Lock() - ls.cm = c - c.listenSockets[id] = ls -@@ -363,7 +415,7 @@ func (c *channelMap) addListenSocket(id int64, ls *listenSocket, pid int64, ref - c.mu.Unlock() - } - --func (c *channelMap) addNormalSocket(id int64, ns *normalSocket, pid int64, ref string) { -+func (c *channelMap) addNormalSocket(id int64, ns *normalSocket, pid int64) { - c.mu.Lock() - ns.cm = c - c.normalSockets[id] = ns -@@ -630,7 +682,7 @@ func (c *channelMap) GetServerSockets(id int64, startID int64, maxResults int64) - if count == 0 { - end = true - } -- var s []*SocketMetric -+ s := make([]*SocketMetric, 0, len(sks)) - for _, ns := range sks { - sm := &SocketMetric{} - sm.SocketData = ns.s.ChannelzMetric() -diff --git a/vendor/google.golang.org/grpc/internal/channelz/id.go b/vendor/google.golang.org/grpc/internal/channelz/id.go -new file mode 100644 -index 0000000..c9a27ac ---- /dev/null -+++ b/vendor/google.golang.org/grpc/internal/channelz/id.go -@@ -0,0 +1,75 @@ -+/* -+ * -+ * Copyright 2022 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+package channelz -+ -+import "fmt" -+ -+// Identifier is an opaque identifier which uniquely identifies an entity in the -+// channelz database. -+type Identifier struct { -+ typ RefChannelType -+ id int64 -+ str string -+ pid *Identifier -+} -+ -+// Type returns the entity type corresponding to id. -+func (id *Identifier) Type() RefChannelType { -+ return id.typ -+} -+ -+// Int returns the integer identifier corresponding to id. -+func (id *Identifier) Int() int64 { -+ return id.id -+} -+ -+// String returns a string representation of the entity corresponding to id. -+// -+// This includes some information about the parent as well. Examples: -+// Top-level channel: [Channel #channel-number] -+// Nested channel: [Channel #parent-channel-number Channel #channel-number] -+// Sub channel: [Channel #parent-channel SubChannel #subchannel-number] -+func (id *Identifier) String() string { -+ return id.str -+} -+ -+// Equal returns true if other is the same as id. -+func (id *Identifier) Equal(other *Identifier) bool { -+ if (id != nil) != (other != nil) { -+ return false -+ } -+ if id == nil && other == nil { -+ return true -+ } -+ return id.typ == other.typ && id.id == other.id && id.pid == other.pid -+} -+ -+// NewIdentifierForTesting returns a new opaque identifier to be used only for -+// testing purposes. -+func NewIdentifierForTesting(typ RefChannelType, id int64, pid *Identifier) *Identifier { -+ return newIdentifer(typ, id, pid) -+} -+ -+func newIdentifer(typ RefChannelType, id int64, pid *Identifier) *Identifier { -+ str := fmt.Sprintf("%s #%d", typ, id) -+ if pid != nil { -+ str = fmt.Sprintf("%s %s", pid, str) -+ } -+ return &Identifier{typ: typ, id: id, str: str, pid: pid} -+} -diff --git a/vendor/google.golang.org/grpc/internal/channelz/logging.go b/vendor/google.golang.org/grpc/internal/channelz/logging.go -index b0013f9..8e13a3d 100644 ---- a/vendor/google.golang.org/grpc/internal/channelz/logging.go -+++ b/vendor/google.golang.org/grpc/internal/channelz/logging.go -@@ -26,77 +26,54 @@ import ( - - var logger = grpclog.Component("channelz") - -+func withParens(id *Identifier) string { -+ return "[" + id.String() + "] " -+} -+ - // Info logs and adds a trace event if channelz is on. --func Info(l grpclog.DepthLoggerV2, id int64, args ...interface{}) { -- if IsOn() { -- AddTraceEvent(l, id, 1, &TraceEventDesc{ -- Desc: fmt.Sprint(args...), -- Severity: CtInfo, -- }) -- } else { -- l.InfoDepth(1, args...) -- } -+func Info(l grpclog.DepthLoggerV2, id *Identifier, args ...interface{}) { -+ AddTraceEvent(l, id, 1, &TraceEventDesc{ -+ Desc: fmt.Sprint(args...), -+ Severity: CtInfo, -+ }) - } - - // Infof logs and adds a trace event if channelz is on. --func Infof(l grpclog.DepthLoggerV2, id int64, format string, args ...interface{}) { -- msg := fmt.Sprintf(format, args...) -- if IsOn() { -- AddTraceEvent(l, id, 1, &TraceEventDesc{ -- Desc: msg, -- Severity: CtInfo, -- }) -- } else { -- l.InfoDepth(1, msg) -- } -+func Infof(l grpclog.DepthLoggerV2, id *Identifier, format string, args ...interface{}) { -+ AddTraceEvent(l, id, 1, &TraceEventDesc{ -+ Desc: fmt.Sprintf(format, args...), -+ Severity: CtInfo, -+ }) - } - - // Warning logs and adds a trace event if channelz is on. --func Warning(l grpclog.DepthLoggerV2, id int64, args ...interface{}) { -- if IsOn() { -- AddTraceEvent(l, id, 1, &TraceEventDesc{ -- Desc: fmt.Sprint(args...), -- Severity: CtWarning, -- }) -- } else { -- l.WarningDepth(1, args...) -- } -+func Warning(l grpclog.DepthLoggerV2, id *Identifier, args ...interface{}) { -+ AddTraceEvent(l, id, 1, &TraceEventDesc{ -+ Desc: fmt.Sprint(args...), -+ Severity: CtWarning, -+ }) - } - - // Warningf logs and adds a trace event if channelz is on. --func Warningf(l grpclog.DepthLoggerV2, id int64, format string, args ...interface{}) { -- msg := fmt.Sprintf(format, args...) -- if IsOn() { -- AddTraceEvent(l, id, 1, &TraceEventDesc{ -- Desc: msg, -- Severity: CtWarning, -- }) -- } else { -- l.WarningDepth(1, msg) -- } -+func Warningf(l grpclog.DepthLoggerV2, id *Identifier, format string, args ...interface{}) { -+ AddTraceEvent(l, id, 1, &TraceEventDesc{ -+ Desc: fmt.Sprintf(format, args...), -+ Severity: CtWarning, -+ }) - } - - // Error logs and adds a trace event if channelz is on. --func Error(l grpclog.DepthLoggerV2, id int64, args ...interface{}) { -- if IsOn() { -- AddTraceEvent(l, id, 1, &TraceEventDesc{ -- Desc: fmt.Sprint(args...), -- Severity: CtError, -- }) -- } else { -- l.ErrorDepth(1, args...) -- } -+func Error(l grpclog.DepthLoggerV2, id *Identifier, args ...interface{}) { -+ AddTraceEvent(l, id, 1, &TraceEventDesc{ -+ Desc: fmt.Sprint(args...), -+ Severity: CtError, -+ }) - } - - // Errorf logs and adds a trace event if channelz is on. --func Errorf(l grpclog.DepthLoggerV2, id int64, format string, args ...interface{}) { -- msg := fmt.Sprintf(format, args...) -- if IsOn() { -- AddTraceEvent(l, id, 1, &TraceEventDesc{ -- Desc: msg, -- Severity: CtError, -- }) -- } else { -- l.ErrorDepth(1, msg) -- } -+func Errorf(l grpclog.DepthLoggerV2, id *Identifier, format string, args ...interface{}) { -+ AddTraceEvent(l, id, 1, &TraceEventDesc{ -+ Desc: fmt.Sprintf(format, args...), -+ Severity: CtError, -+ }) - } -diff --git a/vendor/google.golang.org/grpc/internal/channelz/types.go b/vendor/google.golang.org/grpc/internal/channelz/types.go -index 3c595d1..7b2f350 100644 ---- a/vendor/google.golang.org/grpc/internal/channelz/types.go -+++ b/vendor/google.golang.org/grpc/internal/channelz/types.go -@@ -273,10 +273,10 @@ func (c *channel) deleteSelfFromMap() (delete bool) { - - // deleteSelfIfReady tries to delete the channel itself from the channelz database. - // The delete process includes two steps: --// 1. delete the channel from the entry relation tree, i.e. delete the channel reference from its --// parent's child list. --// 2. delete the channel from the map, i.e. delete the channel entirely from channelz. Lookup by id --// will return entry not found error. -+// 1. delete the channel from the entry relation tree, i.e. delete the channel reference from its -+// parent's child list. -+// 2. delete the channel from the map, i.e. delete the channel entirely from channelz. Lookup by id -+// will return entry not found error. - func (c *channel) deleteSelfIfReady() { - if !c.deleteSelfFromTree() { - return -@@ -381,10 +381,10 @@ func (sc *subChannel) deleteSelfFromMap() (delete bool) { - - // deleteSelfIfReady tries to delete the subchannel itself from the channelz database. - // The delete process includes two steps: --// 1. delete the subchannel from the entry relation tree, i.e. delete the subchannel reference from --// its parent's child list. --// 2. delete the subchannel from the map, i.e. delete the subchannel entirely from channelz. Lookup --// by id will return entry not found error. -+// 1. delete the subchannel from the entry relation tree, i.e. delete the subchannel reference from -+// its parent's child list. -+// 2. delete the subchannel from the map, i.e. delete the subchannel entirely from channelz. Lookup -+// by id will return entry not found error. - func (sc *subChannel) deleteSelfIfReady() { - if !sc.deleteSelfFromTree() { - return -@@ -686,12 +686,33 @@ const ( - type RefChannelType int - - const ( -+ // RefUnknown indicates an unknown entity type, the zero value for this type. -+ RefUnknown RefChannelType = iota - // RefChannel indicates the referenced entity is a Channel. -- RefChannel RefChannelType = iota -+ RefChannel - // RefSubChannel indicates the referenced entity is a SubChannel. - RefSubChannel -+ // RefServer indicates the referenced entity is a Server. -+ RefServer -+ // RefListenSocket indicates the referenced entity is a ListenSocket. -+ RefListenSocket -+ // RefNormalSocket indicates the referenced entity is a NormalSocket. -+ RefNormalSocket - ) - -+var refChannelTypeToString = map[RefChannelType]string{ -+ RefUnknown: "Unknown", -+ RefChannel: "Channel", -+ RefSubChannel: "SubChannel", -+ RefServer: "Server", -+ RefListenSocket: "ListenSocket", -+ RefNormalSocket: "NormalSocket", -+} -+ -+func (r RefChannelType) String() string { -+ return refChannelTypeToString[r] -+} -+ - func (c *channelTrace) dumpData() *ChannelTrace { - c.mu.Lock() - ct := &ChannelTrace{EventNum: c.eventCount, CreationTime: c.createdTime} -diff --git a/vendor/google.golang.org/grpc/internal/channelz/types_linux.go b/vendor/google.golang.org/grpc/internal/channelz/types_linux.go -index 692dd61..1b1c4cc 100644 ---- a/vendor/google.golang.org/grpc/internal/channelz/types_linux.go -+++ b/vendor/google.golang.org/grpc/internal/channelz/types_linux.go -@@ -1,5 +1,3 @@ --// +build !appengine -- - /* - * - * Copyright 2018 gRPC authors. -diff --git a/vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go b/vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go -index 19c2fc5..8b06eed 100644 ---- a/vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go -+++ b/vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go -@@ -1,4 +1,5 @@ --// +build !linux appengine -+//go:build !linux -+// +build !linux - - /* - * -@@ -37,6 +38,6 @@ type SocketOptionData struct { - // Windows OS doesn't support Socket Option - func (s *SocketOptionData) Getsockopt(fd uintptr) { - once.Do(func() { -- logger.Warning("Channelz: socket options are not supported on non-linux os and appengine.") -+ logger.Warning("Channelz: socket options are not supported on non-linux environments") - }) - } -diff --git a/vendor/google.golang.org/grpc/internal/channelz/util_linux.go b/vendor/google.golang.org/grpc/internal/channelz/util_linux.go -index fdf409d..8d194e4 100644 ---- a/vendor/google.golang.org/grpc/internal/channelz/util_linux.go -+++ b/vendor/google.golang.org/grpc/internal/channelz/util_linux.go -@@ -1,5 +1,3 @@ --// +build linux,!appengine -- - /* - * - * Copyright 2018 gRPC authors. -diff --git a/vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go b/vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go -index 8864a08..837ddc4 100644 ---- a/vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go -+++ b/vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go -@@ -1,4 +1,5 @@ --// +build !linux appengine -+//go:build !linux -+// +build !linux - - /* - * -diff --git a/vendor/google.golang.org/grpc/internal/credentials/spiffe.go b/vendor/google.golang.org/grpc/internal/credentials/spiffe.go -index be70b6c..25ade62 100644 ---- a/vendor/google.golang.org/grpc/internal/credentials/spiffe.go -+++ b/vendor/google.golang.org/grpc/internal/credentials/spiffe.go -@@ -1,5 +1,3 @@ --// +build !appengine -- - /* - * - * Copyright 2020 gRPC authors. -diff --git a/vendor/google.golang.org/grpc/internal/credentials/syscallconn.go b/vendor/google.golang.org/grpc/internal/credentials/syscallconn.go -index f499a61..2919632 100644 ---- a/vendor/google.golang.org/grpc/internal/credentials/syscallconn.go -+++ b/vendor/google.golang.org/grpc/internal/credentials/syscallconn.go -@@ -1,5 +1,3 @@ --// +build !appengine -- - /* - * - * Copyright 2018 gRPC authors. -diff --git a/vendor/google.golang.org/grpc/internal/credentials/util.go b/vendor/google.golang.org/grpc/internal/credentials/util.go -index 55664fa..f792fd2 100644 ---- a/vendor/google.golang.org/grpc/internal/credentials/util.go -+++ b/vendor/google.golang.org/grpc/internal/credentials/util.go -@@ -18,7 +18,9 @@ - - package credentials - --import "crypto/tls" -+import ( -+ "crypto/tls" -+) - - const alpnProtoStrH2 = "h2" - -diff --git a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go -index 73931a9..80fd5c7 100644 ---- a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go -+++ b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go -@@ -21,18 +21,46 @@ package envconfig - - import ( - "os" -+ "strconv" - "strings" - ) - --const ( -- prefix = "GRPC_GO_" -- retryStr = prefix + "RETRY" -- txtErrIgnoreStr = prefix + "IGNORE_TXT_ERRORS" --) -- - var ( -- // Retry is set if retry is explicitly enabled via "GRPC_GO_RETRY=on". -- Retry = strings.EqualFold(os.Getenv(retryStr), "on") - // TXTErrIgnore is set if TXT errors should be ignored ("GRPC_GO_IGNORE_TXT_ERRORS" is not "false"). -- TXTErrIgnore = !strings.EqualFold(os.Getenv(txtErrIgnoreStr), "false") -+ TXTErrIgnore = boolFromEnv("GRPC_GO_IGNORE_TXT_ERRORS", true) -+ // AdvertiseCompressors is set if registered compressor should be advertised -+ // ("GRPC_GO_ADVERTISE_COMPRESSORS" is not "false"). -+ AdvertiseCompressors = boolFromEnv("GRPC_GO_ADVERTISE_COMPRESSORS", true) -+ // RingHashCap indicates the maximum ring size which defaults to 4096 -+ // entries but may be overridden by setting the environment variable -+ // "GRPC_RING_HASH_CAP". This does not override the default bounds -+ // checking which NACKs configs specifying ring sizes > 8*1024*1024 (~8M). -+ RingHashCap = uint64FromEnv("GRPC_RING_HASH_CAP", 4096, 1, 8*1024*1024) -+ // PickFirstLBConfig is set if we should support configuration of the -+ // pick_first LB policy, which can be enabled by setting the environment -+ // variable "GRPC_EXPERIMENTAL_PICKFIRST_LB_CONFIG" to "true". -+ PickFirstLBConfig = boolFromEnv("GRPC_EXPERIMENTAL_PICKFIRST_LB_CONFIG", false) - ) -+ -+func boolFromEnv(envVar string, def bool) bool { -+ if def { -+ // The default is true; return true unless the variable is "false". -+ return !strings.EqualFold(os.Getenv(envVar), "false") -+ } -+ // The default is false; return false unless the variable is "true". -+ return strings.EqualFold(os.Getenv(envVar), "true") -+} -+ -+func uint64FromEnv(envVar string, def, min, max uint64) uint64 { -+ v, err := strconv.ParseUint(os.Getenv(envVar), 10, 64) -+ if err != nil { -+ return def -+ } -+ if v < min { -+ return min -+ } -+ if v > max { -+ return max -+ } -+ return v -+} -diff --git a/vendor/google.golang.org/grpc/internal/envconfig/observability.go b/vendor/google.golang.org/grpc/internal/envconfig/observability.go -new file mode 100644 -index 0000000..dd314cf ---- /dev/null -+++ b/vendor/google.golang.org/grpc/internal/envconfig/observability.go -@@ -0,0 +1,42 @@ -+/* -+ * -+ * Copyright 2022 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+package envconfig -+ -+import "os" -+ -+const ( -+ envObservabilityConfig = "GRPC_GCP_OBSERVABILITY_CONFIG" -+ envObservabilityConfigFile = "GRPC_GCP_OBSERVABILITY_CONFIG_FILE" -+) -+ -+var ( -+ // ObservabilityConfig is the json configuration for the gcp/observability -+ // package specified directly in the envObservabilityConfig env var. -+ // -+ // This is used in the 1.0 release of gcp/observability, and thus must not be -+ // deleted or changed. -+ ObservabilityConfig = os.Getenv(envObservabilityConfig) -+ // ObservabilityConfigFile is the json configuration for the -+ // gcp/observability specified in a file with the location specified in -+ // envObservabilityConfigFile env var. -+ // -+ // This is used in the 1.0 release of gcp/observability, and thus must not be -+ // deleted or changed. -+ ObservabilityConfigFile = os.Getenv(envObservabilityConfigFile) -+) -diff --git a/vendor/google.golang.org/grpc/internal/envconfig/xds.go b/vendor/google.golang.org/grpc/internal/envconfig/xds.go -new file mode 100644 -index 0000000..02b4b6a ---- /dev/null -+++ b/vendor/google.golang.org/grpc/internal/envconfig/xds.go -@@ -0,0 +1,95 @@ -+/* -+ * -+ * Copyright 2020 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+package envconfig -+ -+import ( -+ "os" -+) -+ -+const ( -+ // XDSBootstrapFileNameEnv is the env variable to set bootstrap file name. -+ // Do not use this and read from env directly. Its value is read and kept in -+ // variable XDSBootstrapFileName. -+ // -+ // When both bootstrap FileName and FileContent are set, FileName is used. -+ XDSBootstrapFileNameEnv = "GRPC_XDS_BOOTSTRAP" -+ // XDSBootstrapFileContentEnv is the env variable to set bootstrap file -+ // content. Do not use this and read from env directly. Its value is read -+ // and kept in variable XDSBootstrapFileContent. -+ // -+ // When both bootstrap FileName and FileContent are set, FileName is used. -+ XDSBootstrapFileContentEnv = "GRPC_XDS_BOOTSTRAP_CONFIG" -+) -+ -+var ( -+ // XDSBootstrapFileName holds the name of the file which contains xDS -+ // bootstrap configuration. Users can specify the location of the bootstrap -+ // file by setting the environment variable "GRPC_XDS_BOOTSTRAP". -+ // -+ // When both bootstrap FileName and FileContent are set, FileName is used. -+ XDSBootstrapFileName = os.Getenv(XDSBootstrapFileNameEnv) -+ // XDSBootstrapFileContent holds the content of the xDS bootstrap -+ // configuration. Users can specify the bootstrap config by setting the -+ // environment variable "GRPC_XDS_BOOTSTRAP_CONFIG". -+ // -+ // When both bootstrap FileName and FileContent are set, FileName is used. -+ XDSBootstrapFileContent = os.Getenv(XDSBootstrapFileContentEnv) -+ // XDSRingHash indicates whether ring hash support is enabled, which can be -+ // disabled by setting the environment variable -+ // "GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH" to "false". -+ XDSRingHash = boolFromEnv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", true) -+ // XDSClientSideSecurity is used to control processing of security -+ // configuration on the client-side. -+ // -+ // Note that there is no env var protection for the server-side because we -+ // have a brand new API on the server-side and users explicitly need to use -+ // the new API to get security integration on the server. -+ XDSClientSideSecurity = boolFromEnv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT", true) -+ // XDSAggregateAndDNS indicates whether processing of aggregated cluster and -+ // DNS cluster is enabled, which can be disabled by setting the environment -+ // variable "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER" -+ // to "false". -+ XDSAggregateAndDNS = boolFromEnv("GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER", true) -+ -+ // XDSRBAC indicates whether xDS configured RBAC HTTP Filter is enabled, -+ // which can be disabled by setting the environment variable -+ // "GRPC_XDS_EXPERIMENTAL_RBAC" to "false". -+ XDSRBAC = boolFromEnv("GRPC_XDS_EXPERIMENTAL_RBAC", true) -+ // XDSOutlierDetection indicates whether outlier detection support is -+ // enabled, which can be disabled by setting the environment variable -+ // "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION" to "false". -+ XDSOutlierDetection = boolFromEnv("GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION", true) -+ // XDSFederation indicates whether federation support is enabled, which can -+ // be enabled by setting the environment variable -+ // "GRPC_EXPERIMENTAL_XDS_FEDERATION" to "true". -+ XDSFederation = boolFromEnv("GRPC_EXPERIMENTAL_XDS_FEDERATION", true) -+ -+ // XDSRLS indicates whether processing of Cluster Specifier plugins and -+ // support for the RLS CLuster Specifier is enabled, which can be disabled by -+ // setting the environment variable "GRPC_EXPERIMENTAL_XDS_RLS_LB" to -+ // "false". -+ XDSRLS = boolFromEnv("GRPC_EXPERIMENTAL_XDS_RLS_LB", true) -+ -+ // C2PResolverTestOnlyTrafficDirectorURI is the TD URI for testing. -+ C2PResolverTestOnlyTrafficDirectorURI = os.Getenv("GRPC_TEST_ONLY_GOOGLE_C2P_RESOLVER_TRAFFIC_DIRECTOR_URI") -+ // XDSCustomLBPolicy indicates whether Custom LB Policies are enabled, which -+ // can be disabled by setting the environment variable -+ // "GRPC_EXPERIMENTAL_XDS_CUSTOM_LB_CONFIG" to "false". -+ XDSCustomLBPolicy = boolFromEnv("GRPC_EXPERIMENTAL_XDS_CUSTOM_LB_CONFIG", true) -+) -diff --git a/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go b/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go -index e6f975c..b68e26a 100644 ---- a/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go -+++ b/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go -@@ -110,17 +110,17 @@ type LoggerV2 interface { - // This is a copy of the DepthLoggerV2 defined in the external grpclog package. - // It is defined here to avoid a circular dependency. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. - type DepthLoggerV2 interface { -- // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Print. -+ // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Println. - InfoDepth(depth int, args ...interface{}) -- // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Print. -+ // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Println. - WarningDepth(depth int, args ...interface{}) -- // ErrorDetph logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Print. -+ // ErrorDepth logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Println. - ErrorDepth(depth int, args ...interface{}) -- // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Print. -+ // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Println. - FatalDepth(depth int, args ...interface{}) - } -diff --git a/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go b/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go -index 82af70e..02224b4 100644 ---- a/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go -+++ b/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go -@@ -63,6 +63,9 @@ func (pl *PrefixLogger) Errorf(format string, args ...interface{}) { - - // Debugf does info logging at verbose level 2. - func (pl *PrefixLogger) Debugf(format string, args ...interface{}) { -+ // TODO(6044): Refactor interfaces LoggerV2 and DepthLogger, and maybe -+ // rewrite PrefixLogger a little to ensure that we don't use the global -+ // `Logger` here, and instead use the `logger` field. - if !Logger.V(2) { - return - } -@@ -73,6 +76,15 @@ func (pl *PrefixLogger) Debugf(format string, args ...interface{}) { - return - } - InfoDepth(1, fmt.Sprintf(format, args...)) -+ -+} -+ -+// V reports whether verbosity level l is at least the requested verbose level. -+func (pl *PrefixLogger) V(l int) bool { -+ // TODO(6044): Refactor interfaces LoggerV2 and DepthLogger, and maybe -+ // rewrite PrefixLogger a little to ensure that we don't use the global -+ // `Logger` here, and instead use the `logger` field. -+ return Logger.V(l) - } - - // NewPrefixLogger creates a prefix logger with the given prefix. -diff --git a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go -index 740f83c..d08e3e9 100644 ---- a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go -+++ b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go -@@ -52,6 +52,13 @@ func Intn(n int) int { - return r.Intn(n) - } - -+// Int31n implements rand.Int31n on the grpcrand global source. -+func Int31n(n int32) int32 { -+ mu.Lock() -+ defer mu.Unlock() -+ return r.Int31n(n) -+} -+ - // Float64 implements rand.Float64 on the grpcrand global source. - func Float64() float64 { - mu.Lock() -@@ -65,3 +72,17 @@ func Uint64() uint64 { - defer mu.Unlock() - return r.Uint64() - } -+ -+// Uint32 implements rand.Uint32 on the grpcrand global source. -+func Uint32() uint32 { -+ mu.Lock() -+ defer mu.Unlock() -+ return r.Uint32() -+} -+ -+// Shuffle implements rand.Shuffle on the grpcrand global source. -+var Shuffle = func(n int, f func(int, int)) { -+ mu.Lock() -+ defer mu.Unlock() -+ r.Shuffle(n, f) -+} -diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go b/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go -new file mode 100644 -index 0000000..37b8d41 ---- /dev/null -+++ b/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go -@@ -0,0 +1,119 @@ -+/* -+ * -+ * Copyright 2022 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+package grpcsync -+ -+import ( -+ "context" -+ "sync" -+ -+ "google.golang.org/grpc/internal/buffer" -+) -+ -+// CallbackSerializer provides a mechanism to schedule callbacks in a -+// synchronized manner. It provides a FIFO guarantee on the order of execution -+// of scheduled callbacks. New callbacks can be scheduled by invoking the -+// Schedule() method. -+// -+// This type is safe for concurrent access. -+type CallbackSerializer struct { -+ // Done is closed once the serializer is shut down completely, i.e all -+ // scheduled callbacks are executed and the serializer has deallocated all -+ // its resources. -+ Done chan struct{} -+ -+ callbacks *buffer.Unbounded -+ closedMu sync.Mutex -+ closed bool -+} -+ -+// NewCallbackSerializer returns a new CallbackSerializer instance. The provided -+// context will be passed to the scheduled callbacks. Users should cancel the -+// provided context to shutdown the CallbackSerializer. It is guaranteed that no -+// callbacks will be added once this context is canceled, and any pending un-run -+// callbacks will be executed before the serializer is shut down. -+func NewCallbackSerializer(ctx context.Context) *CallbackSerializer { -+ t := &CallbackSerializer{ -+ Done: make(chan struct{}), -+ callbacks: buffer.NewUnbounded(), -+ } -+ go t.run(ctx) -+ return t -+} -+ -+// Schedule adds a callback to be scheduled after existing callbacks are run. -+// -+// Callbacks are expected to honor the context when performing any blocking -+// operations, and should return early when the context is canceled. -+// -+// Return value indicates if the callback was successfully added to the list of -+// callbacks to be executed by the serializer. It is not possible to add -+// callbacks once the context passed to NewCallbackSerializer is cancelled. -+func (t *CallbackSerializer) Schedule(f func(ctx context.Context)) bool { -+ t.closedMu.Lock() -+ defer t.closedMu.Unlock() -+ -+ if t.closed { -+ return false -+ } -+ t.callbacks.Put(f) -+ return true -+} -+ -+func (t *CallbackSerializer) run(ctx context.Context) { -+ var backlog []func(context.Context) -+ -+ defer close(t.Done) -+ for ctx.Err() == nil { -+ select { -+ case <-ctx.Done(): -+ // Do nothing here. Next iteration of the for loop will not happen, -+ // since ctx.Err() would be non-nil. -+ case callback, ok := <-t.callbacks.Get(): -+ if !ok { -+ return -+ } -+ t.callbacks.Load() -+ callback.(func(ctx context.Context))(ctx) -+ } -+ } -+ -+ // Fetch pending callbacks if any, and execute them before returning from -+ // this method and closing t.Done. -+ t.closedMu.Lock() -+ t.closed = true -+ backlog = t.fetchPendingCallbacks() -+ t.callbacks.Close() -+ t.closedMu.Unlock() -+ for _, b := range backlog { -+ b(ctx) -+ } -+} -+ -+func (t *CallbackSerializer) fetchPendingCallbacks() []func(context.Context) { -+ var backlog []func(context.Context) -+ for { -+ select { -+ case b := <-t.callbacks.Get(): -+ backlog = append(backlog, b.(func(context.Context))) -+ t.callbacks.Load() -+ default: -+ return backlog -+ } -+ } -+} -diff --git a/vendor/google.golang.org/grpc/internal/credentials/spiffe_appengine.go b/vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.go -similarity index 67% -rename from vendor/google.golang.org/grpc/internal/credentials/spiffe_appengine.go -rename to vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.go -index af6f577..6635f7b 100644 ---- a/vendor/google.golang.org/grpc/internal/credentials/spiffe_appengine.go -+++ b/vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.go -@@ -1,8 +1,6 @@ --// +build appengine -- - /* - * -- * Copyright 2020 gRPC authors. -+ * Copyright 2022 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -@@ -18,14 +16,17 @@ - * - */ - --package credentials -+package grpcsync - - import ( -- "crypto/tls" -- "net/url" -+ "sync" - ) - --// SPIFFEIDFromState is a no-op for appengine builds. --func SPIFFEIDFromState(state tls.ConnectionState) *url.URL { -- return nil -+// OnceFunc returns a function wrapping f which ensures f is only executed -+// once even if the returned function is executed multiple times. -+func OnceFunc(f func()) func() { -+ var once sync.Once -+ return func() { -+ once.Do(f) -+ } - } -diff --git a/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go b/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go -new file mode 100644 -index 0000000..9f40909 ---- /dev/null -+++ b/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go -@@ -0,0 +1,47 @@ -+/* -+ * -+ * Copyright 2022 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+package grpcutil -+ -+import ( -+ "strings" -+ -+ "google.golang.org/grpc/internal/envconfig" -+) -+ -+// RegisteredCompressorNames holds names of the registered compressors. -+var RegisteredCompressorNames []string -+ -+// IsCompressorNameRegistered returns true when name is available in registry. -+func IsCompressorNameRegistered(name string) bool { -+ for _, compressor := range RegisteredCompressorNames { -+ if compressor == name { -+ return true -+ } -+ } -+ return false -+} -+ -+// RegisteredCompressors returns a string of registered compressor names -+// separated by comma. -+func RegisteredCompressors() string { -+ if !envconfig.AdvertiseCompressors { -+ return "" -+ } -+ return strings.Join(RegisteredCompressorNames, ",") -+} -diff --git a/vendor/google.golang.org/grpc/internal/credentials/syscallconn_appengine.go b/vendor/google.golang.org/grpc/internal/grpcutil/grpcutil.go -similarity index 72% -rename from vendor/google.golang.org/grpc/internal/credentials/syscallconn_appengine.go -rename to vendor/google.golang.org/grpc/internal/grpcutil/grpcutil.go -index a6144cd..e2f948e 100644 ---- a/vendor/google.golang.org/grpc/internal/credentials/syscallconn_appengine.go -+++ b/vendor/google.golang.org/grpc/internal/grpcutil/grpcutil.go -@@ -1,8 +1,6 @@ --// +build appengine -- - /* - * -- * Copyright 2018 gRPC authors. -+ * Copyright 2021 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -@@ -18,13 +16,5 @@ - * - */ - --package credentials -- --import ( -- "net" --) -- --// WrapSyscallConn returns newConn on appengine. --func WrapSyscallConn(rawConn, newConn net.Conn) net.Conn { -- return newConn --} -+// Package grpcutil provides utility functions used across the gRPC codebase. -+package grpcutil -diff --git a/vendor/google.golang.org/grpc/internal/grpcutil/method.go b/vendor/google.golang.org/grpc/internal/grpcutil/method.go -index 4e74750..ec62b47 100644 ---- a/vendor/google.golang.org/grpc/internal/grpcutil/method.go -+++ b/vendor/google.golang.org/grpc/internal/grpcutil/method.go -@@ -25,7 +25,6 @@ import ( - - // ParseMethod splits service and method from the input. It expects format - // "/service/method". --// - func ParseMethod(methodName string) (service, method string, _ error) { - if !strings.HasPrefix(methodName, "/") { - return "", "", errors.New("invalid method name: should start with /") -@@ -39,6 +38,11 @@ func ParseMethod(methodName string) (service, method string, _ error) { - return methodName[:pos], methodName[pos+1:], nil - } - -+// baseContentType is the base content-type for gRPC. This is a valid -+// content-type on it's own, but can also include a content-subtype such as -+// "proto" as a suffix after "+" or ";". See -+// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests -+// for more details. - const baseContentType = "application/grpc" - - // ContentSubtype returns the content-subtype for the given content-type. The -diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/go113.go b/vendor/google.golang.org/grpc/internal/grpcutil/regex.go -similarity index 63% -rename from vendor/google.golang.org/grpc/internal/resolver/dns/go113.go -rename to vendor/google.golang.org/grpc/internal/grpcutil/regex.go -index 8783a8c..7a092b2 100644 ---- a/vendor/google.golang.org/grpc/internal/resolver/dns/go113.go -+++ b/vendor/google.golang.org/grpc/internal/grpcutil/regex.go -@@ -1,8 +1,6 @@ --// +build go1.13 -- - /* - * -- * Copyright 2019 gRPC authors. -+ * Copyright 2021 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -@@ -18,16 +16,16 @@ - * - */ - --package dns -+package grpcutil - --import "net" -+import "regexp" - --func init() { -- filterError = func(err error) error { -- if dnsErr, ok := err.(*net.DNSError); ok && dnsErr.IsNotFound { -- // The name does not exist; not an error. -- return nil -- } -- return err -+// FullMatchWithRegex returns whether the full text matches the regex provided. -+func FullMatchWithRegex(re *regexp.Regexp, text string) bool { -+ if len(text) == 0 { -+ return re.MatchString(text) - } -+ re.Longest() -+ rem := re.FindString(text) -+ return len(rem) == len(text) - } -diff --git a/vendor/google.golang.org/grpc/internal/grpcutil/target.go b/vendor/google.golang.org/grpc/internal/grpcutil/target.go -deleted file mode 100644 -index 8833021..0000000 ---- a/vendor/google.golang.org/grpc/internal/grpcutil/target.go -+++ /dev/null -@@ -1,89 +0,0 @@ --/* -- * -- * Copyright 2020 gRPC authors. -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- * -- */ -- --// Package grpcutil provides a bunch of utility functions to be used across the --// gRPC codebase. --package grpcutil -- --import ( -- "strings" -- -- "google.golang.org/grpc/resolver" --) -- --// split2 returns the values from strings.SplitN(s, sep, 2). --// If sep is not found, it returns ("", "", false) instead. --func split2(s, sep string) (string, string, bool) { -- spl := strings.SplitN(s, sep, 2) -- if len(spl) < 2 { -- return "", "", false -- } -- return spl[0], spl[1], true --} -- --// ParseTarget splits target into a resolver.Target struct containing scheme, --// authority and endpoint. skipUnixColonParsing indicates that the parse should --// not parse "unix:[path]" cases. This should be true in cases where a custom --// dialer is present, to prevent a behavior change. --// --// If target is not a valid scheme://authority/endpoint as specified in --// https://github.com/grpc/grpc/blob/master/doc/naming.md, --// it returns {Endpoint: target}. --func ParseTarget(target string, skipUnixColonParsing bool) (ret resolver.Target) { -- var ok bool -- if strings.HasPrefix(target, "unix-abstract:") { -- if strings.HasPrefix(target, "unix-abstract://") { -- // Maybe, with Authority specified, try to parse it -- var remain string -- ret.Scheme, remain, _ = split2(target, "://") -- ret.Authority, ret.Endpoint, ok = split2(remain, "/") -- if !ok { -- // No Authority, add the "//" back -- ret.Endpoint = "//" + remain -- } else { -- // Found Authority, add the "/" back -- ret.Endpoint = "/" + ret.Endpoint -- } -- } else { -- // Without Authority specified, split target on ":" -- ret.Scheme, ret.Endpoint, _ = split2(target, ":") -- } -- return ret -- } -- ret.Scheme, ret.Endpoint, ok = split2(target, "://") -- if !ok { -- if strings.HasPrefix(target, "unix:") && !skipUnixColonParsing { -- // Handle the "unix:[local/path]" and "unix:[/absolute/path]" cases, -- // because splitting on :// only handles the -- // "unix://[/absolute/path]" case. Only handle if the dialer is nil, -- // to avoid a behavior change with custom dialers. -- return resolver.Target{Scheme: "unix", Endpoint: target[len("unix:"):]} -- } -- return resolver.Target{Endpoint: target} -- } -- ret.Authority, ret.Endpoint, ok = split2(ret.Endpoint, "/") -- if !ok { -- return resolver.Target{Endpoint: target} -- } -- if ret.Scheme == "unix" { -- // Add the "/" back in the unix case, so the unix resolver receives the -- // actual endpoint in the "unix://[/absolute/path]" case. -- ret.Endpoint = "/" + ret.Endpoint -- } -- return ret --} -diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go -index 1b596bf..42ff39c 100644 ---- a/vendor/google.golang.org/grpc/internal/internal.go -+++ b/vendor/google.golang.org/grpc/internal/internal.go -@@ -38,11 +38,10 @@ var ( - // KeepaliveMinPingTime is the minimum ping interval. This must be 10s by - // default, but tests may wish to set it lower for convenience. - KeepaliveMinPingTime = 10 * time.Second -- // ParseServiceConfigForTesting is for creating a fake -- // ClientConn for resolver testing only -- ParseServiceConfigForTesting interface{} // func(string) *serviceconfig.ParseResult -+ // ParseServiceConfig parses a JSON representation of the service config. -+ ParseServiceConfig interface{} // func(string) *serviceconfig.ParseResult - // EqualServiceConfigForTesting is for testing service config generation and -- // parsing. Both a and b should be returned by ParseServiceConfigForTesting. -+ // parsing. Both a and b should be returned by ParseServiceConfig. - // This function compares the config without rawJSON stripped, in case the - // there's difference in white space. - EqualServiceConfigForTesting func(a, b serviceconfig.Config) bool -@@ -59,11 +58,112 @@ var ( - // gRPC server. An xDS-enabled server needs to know what type of credentials - // is configured on the underlying gRPC server. This is set by server.go. - GetServerCredentials interface{} // func (*grpc.Server) credentials.TransportCredentials -+ // CanonicalString returns the canonical string of the code defined here: -+ // https://github.com/grpc/grpc/blob/master/doc/statuscodes.md. -+ // -+ // This is used in the 1.0 release of gcp/observability, and thus must not be -+ // deleted or changed. -+ CanonicalString interface{} // func (codes.Code) string - // DrainServerTransports initiates a graceful close of existing connections - // on a gRPC server accepted on the provided listener address. An - // xDS-enabled server invokes this method on a grpc.Server when a particular - // listener moves to "not-serving" mode. - DrainServerTransports interface{} // func(*grpc.Server, string) -+ // AddGlobalServerOptions adds an array of ServerOption that will be -+ // effective globally for newly created servers. The priority will be: 1. -+ // user-provided; 2. this method; 3. default values. -+ // -+ // This is used in the 1.0 release of gcp/observability, and thus must not be -+ // deleted or changed. -+ AddGlobalServerOptions interface{} // func(opt ...ServerOption) -+ // ClearGlobalServerOptions clears the array of extra ServerOption. This -+ // method is useful in testing and benchmarking. -+ // -+ // This is used in the 1.0 release of gcp/observability, and thus must not be -+ // deleted or changed. -+ ClearGlobalServerOptions func() -+ // AddGlobalDialOptions adds an array of DialOption that will be effective -+ // globally for newly created client channels. The priority will be: 1. -+ // user-provided; 2. this method; 3. default values. -+ // -+ // This is used in the 1.0 release of gcp/observability, and thus must not be -+ // deleted or changed. -+ AddGlobalDialOptions interface{} // func(opt ...DialOption) -+ // DisableGlobalDialOptions returns a DialOption that prevents the -+ // ClientConn from applying the global DialOptions (set via -+ // AddGlobalDialOptions). -+ // -+ // This is used in the 1.0 release of gcp/observability, and thus must not be -+ // deleted or changed. -+ DisableGlobalDialOptions interface{} // func() grpc.DialOption -+ // ClearGlobalDialOptions clears the array of extra DialOption. This -+ // method is useful in testing and benchmarking. -+ // -+ // This is used in the 1.0 release of gcp/observability, and thus must not be -+ // deleted or changed. -+ ClearGlobalDialOptions func() -+ // JoinDialOptions combines the dial options passed as arguments into a -+ // single dial option. -+ JoinDialOptions interface{} // func(...grpc.DialOption) grpc.DialOption -+ // JoinServerOptions combines the server options passed as arguments into a -+ // single server option. -+ JoinServerOptions interface{} // func(...grpc.ServerOption) grpc.ServerOption -+ -+ // WithBinaryLogger returns a DialOption that specifies the binary logger -+ // for a ClientConn. -+ // -+ // This is used in the 1.0 release of gcp/observability, and thus must not be -+ // deleted or changed. -+ WithBinaryLogger interface{} // func(binarylog.Logger) grpc.DialOption -+ // BinaryLogger returns a ServerOption that can set the binary logger for a -+ // server. -+ // -+ // This is used in the 1.0 release of gcp/observability, and thus must not be -+ // deleted or changed. -+ BinaryLogger interface{} // func(binarylog.Logger) grpc.ServerOption -+ -+ // NewXDSResolverWithConfigForTesting creates a new xds resolver builder using -+ // the provided xds bootstrap config instead of the global configuration from -+ // the supported environment variables. The resolver.Builder is meant to be -+ // used in conjunction with the grpc.WithResolvers DialOption. -+ // -+ // Testing Only -+ // -+ // This function should ONLY be used for testing and may not work with some -+ // other features, including the CSDS service. -+ NewXDSResolverWithConfigForTesting interface{} // func([]byte) (resolver.Builder, error) -+ -+ // RegisterRLSClusterSpecifierPluginForTesting registers the RLS Cluster -+ // Specifier Plugin for testing purposes, regardless of the XDSRLS environment -+ // variable. -+ // -+ // TODO: Remove this function once the RLS env var is removed. -+ RegisterRLSClusterSpecifierPluginForTesting func() -+ -+ // UnregisterRLSClusterSpecifierPluginForTesting unregisters the RLS Cluster -+ // Specifier Plugin for testing purposes. This is needed because there is no way -+ // to unregister the RLS Cluster Specifier Plugin after registering it solely -+ // for testing purposes using RegisterRLSClusterSpecifierPluginForTesting(). -+ // -+ // TODO: Remove this function once the RLS env var is removed. -+ UnregisterRLSClusterSpecifierPluginForTesting func() -+ -+ // RegisterRBACHTTPFilterForTesting registers the RBAC HTTP Filter for testing -+ // purposes, regardless of the RBAC environment variable. -+ // -+ // TODO: Remove this function once the RBAC env var is removed. -+ RegisterRBACHTTPFilterForTesting func() -+ -+ // UnregisterRBACHTTPFilterForTesting unregisters the RBAC HTTP Filter for -+ // testing purposes. This is needed because there is no way to unregister the -+ // HTTP Filter after registering it solely for testing purposes using -+ // RegisterRBACHTTPFilterForTesting(). -+ // -+ // TODO: Remove this function once the RBAC env var is removed. -+ UnregisterRBACHTTPFilterForTesting func() -+ -+ // ORCAAllowAnyMinReportingInterval is for examples/orca use ONLY. -+ ORCAAllowAnyMinReportingInterval interface{} // func(so *orca.ServiceOptions) - ) - - // HealthChecker defines the signature of the client-side LB channel health checking function. -@@ -86,3 +186,9 @@ const ( - // that supports backend returned by grpclb balancer. - CredsBundleModeBackendFromBalancer = "backend-from-balancer" - ) -+ -+// RLSLoadBalancingPolicyName is the name of the RLS LB policy. -+// -+// It currently has an experimental suffix which would be removed once -+// end-to-end testing of the policy is completed. -+const RLSLoadBalancingPolicyName = "rls_experimental" -diff --git a/vendor/google.golang.org/grpc/internal/metadata/metadata.go b/vendor/google.golang.org/grpc/internal/metadata/metadata.go -index 3022626..c82e608 100644 ---- a/vendor/google.golang.org/grpc/internal/metadata/metadata.go -+++ b/vendor/google.golang.org/grpc/internal/metadata/metadata.go -@@ -22,6 +22,9 @@ - package metadata - - import ( -+ "fmt" -+ "strings" -+ - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/resolver" - ) -@@ -30,14 +33,38 @@ type mdKeyType string - - const mdKey = mdKeyType("grpc.internal.address.metadata") - -+type mdValue metadata.MD -+ -+func (m mdValue) Equal(o interface{}) bool { -+ om, ok := o.(mdValue) -+ if !ok { -+ return false -+ } -+ if len(m) != len(om) { -+ return false -+ } -+ for k, v := range m { -+ ov := om[k] -+ if len(ov) != len(v) { -+ return false -+ } -+ for i, ve := range v { -+ if ov[i] != ve { -+ return false -+ } -+ } -+ } -+ return true -+} -+ - // Get returns the metadata of addr. - func Get(addr resolver.Address) metadata.MD { - attrs := addr.Attributes - if attrs == nil { - return nil - } -- md, _ := attrs.Value(mdKey).(metadata.MD) -- return md -+ md, _ := attrs.Value(mdKey).(mdValue) -+ return metadata.MD(md) - } - - // Set sets (overrides) the metadata in addr. -@@ -45,6 +72,61 @@ func Get(addr resolver.Address) metadata.MD { - // When a SubConn is created with this address, the RPCs sent on it will all - // have this metadata. - func Set(addr resolver.Address, md metadata.MD) resolver.Address { -- addr.Attributes = addr.Attributes.WithValues(mdKey, md) -+ addr.Attributes = addr.Attributes.WithValue(mdKey, mdValue(md)) - return addr - } -+ -+// Validate validates every pair in md with ValidatePair. -+func Validate(md metadata.MD) error { -+ for k, vals := range md { -+ if err := ValidatePair(k, vals...); err != nil { -+ return err -+ } -+ } -+ return nil -+} -+ -+// hasNotPrintable return true if msg contains any characters which are not in %x20-%x7E -+func hasNotPrintable(msg string) bool { -+ // for i that saving a conversion if not using for range -+ for i := 0; i < len(msg); i++ { -+ if msg[i] < 0x20 || msg[i] > 0x7E { -+ return true -+ } -+ } -+ return false -+} -+ -+// ValidatePair validate a key-value pair with the following rules (the pseudo-header will be skipped) : -+// -+// - key must contain one or more characters. -+// - the characters in the key must be contained in [0-9 a-z _ - .]. -+// - if the key ends with a "-bin" suffix, no validation of the corresponding value is performed. -+// - the characters in the every value must be printable (in [%x20-%x7E]). -+func ValidatePair(key string, vals ...string) error { -+ // key should not be empty -+ if key == "" { -+ return fmt.Errorf("there is an empty key in the header") -+ } -+ // pseudo-header will be ignored -+ if key[0] == ':' { -+ return nil -+ } -+ // check key, for i that saving a conversion if not using for range -+ for i := 0; i < len(key); i++ { -+ r := key[i] -+ if !(r >= 'a' && r <= 'z') && !(r >= '0' && r <= '9') && r != '.' && r != '-' && r != '_' { -+ return fmt.Errorf("header key %q contains illegal characters not in [0-9a-z-_.]", key) -+ } -+ } -+ if strings.HasSuffix(key, "-bin") { -+ return nil -+ } -+ // check value -+ for _, val := range vals { -+ if hasNotPrintable(val) { -+ return fmt.Errorf("header key %q contains value with non-printable ASCII characters", key) -+ } -+ } -+ return nil -+} -diff --git a/vendor/google.golang.org/grpc/internal/pretty/pretty.go b/vendor/google.golang.org/grpc/internal/pretty/pretty.go -new file mode 100644 -index 0000000..0177af4 ---- /dev/null -+++ b/vendor/google.golang.org/grpc/internal/pretty/pretty.go -@@ -0,0 +1,82 @@ -+/* -+ * -+ * Copyright 2021 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+// Package pretty defines helper functions to pretty-print structs for logging. -+package pretty -+ -+import ( -+ "bytes" -+ "encoding/json" -+ "fmt" -+ -+ "github.com/golang/protobuf/jsonpb" -+ protov1 "github.com/golang/protobuf/proto" -+ "google.golang.org/protobuf/encoding/protojson" -+ protov2 "google.golang.org/protobuf/proto" -+) -+ -+const jsonIndent = " " -+ -+// ToJSON marshals the input into a json string. -+// -+// If marshal fails, it falls back to fmt.Sprintf("%+v"). -+func ToJSON(e interface{}) string { -+ switch ee := e.(type) { -+ case protov1.Message: -+ mm := jsonpb.Marshaler{Indent: jsonIndent} -+ ret, err := mm.MarshalToString(ee) -+ if err != nil { -+ // This may fail for proto.Anys, e.g. for xDS v2, LDS, the v2 -+ // messages are not imported, and this will fail because the message -+ // is not found. -+ return fmt.Sprintf("%+v", ee) -+ } -+ return ret -+ case protov2.Message: -+ mm := protojson.MarshalOptions{ -+ Multiline: true, -+ Indent: jsonIndent, -+ } -+ ret, err := mm.Marshal(ee) -+ if err != nil { -+ // This may fail for proto.Anys, e.g. for xDS v2, LDS, the v2 -+ // messages are not imported, and this will fail because the message -+ // is not found. -+ return fmt.Sprintf("%+v", ee) -+ } -+ return string(ret) -+ default: -+ ret, err := json.MarshalIndent(ee, "", jsonIndent) -+ if err != nil { -+ return fmt.Sprintf("%+v", ee) -+ } -+ return string(ret) -+ } -+} -+ -+// FormatJSON formats the input json bytes with indentation. -+// -+// If Indent fails, it returns the unchanged input as string. -+func FormatJSON(b []byte) string { -+ var out bytes.Buffer -+ err := json.Indent(&out, b, "", jsonIndent) -+ if err != nil { -+ return string(b) -+ } -+ return out.String() -+} -diff --git a/vendor/google.golang.org/grpc/internal/resolver/config_selector.go b/vendor/google.golang.org/grpc/internal/resolver/config_selector.go -index 5e7f367..c7a18a9 100644 ---- a/vendor/google.golang.org/grpc/internal/resolver/config_selector.go -+++ b/vendor/google.golang.org/grpc/internal/resolver/config_selector.go -@@ -117,9 +117,12 @@ type ClientInterceptor interface { - NewStream(ctx context.Context, ri RPCInfo, done func(), newStream func(ctx context.Context, done func()) (ClientStream, error)) (ClientStream, error) - } - --// ServerInterceptor is unimplementable; do not use. -+// ServerInterceptor is an interceptor for incoming RPC's on gRPC server side. - type ServerInterceptor interface { -- notDefined() -+ // AllowRPC checks if an incoming RPC is allowed to proceed based on -+ // information about connection RPC was received on, and HTTP Headers. This -+ // information will be piped into context. -+ AllowRPC(ctx context.Context) error // TODO: Make this a real interceptor for filters such as rate limiting. - } - - type csKeyType string -@@ -129,7 +132,7 @@ const csKey = csKeyType("grpc.internal.resolver.configSelector") - // SetConfigSelector sets the config selector in state and returns the new - // state. - func SetConfigSelector(state resolver.State, cs ConfigSelector) resolver.State { -- state.Attributes = state.Attributes.WithValues(csKey, cs) -+ state.Attributes = state.Attributes.WithValue(csKey, cs) - return state - } - -diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go -index 03825bb..09a667f 100644 ---- a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go -+++ b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go -@@ -116,7 +116,7 @@ type dnsBuilder struct{} - - // Build creates and starts a DNS resolver that watches the name resolution of the target. - func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { -- host, port, err := parseTarget(target.Endpoint, defaultPort) -+ host, port, err := parseTarget(target.Endpoint(), defaultPort) - if err != nil { - return nil, err - } -@@ -140,10 +140,10 @@ func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts - disableServiceConfig: opts.DisableServiceConfig, - } - -- if target.Authority == "" { -+ if target.URL.Host == "" { - d.resolver = defaultResolver - } else { -- d.resolver, err = customAuthorityResolver(target.Authority) -+ d.resolver, err = customAuthorityResolver(target.URL.Host) - if err != nil { - return nil, err - } -@@ -277,18 +277,13 @@ func (d *dnsResolver) lookupSRV() ([]resolver.Address, error) { - return newAddrs, nil - } - --var filterError = func(err error) error { -+func handleDNSError(err error, lookupType string) error { - if dnsErr, ok := err.(*net.DNSError); ok && !dnsErr.IsTimeout && !dnsErr.IsTemporary { - // Timeouts and temporary errors should be communicated to gRPC to - // attempt another DNS query (with backoff). Other errors should be - // suppressed (they may represent the absence of a TXT record). - return nil - } -- return err --} -- --func handleDNSError(err error, lookupType string) error { -- err = filterError(err) - if err != nil { - err = fmt.Errorf("dns: %v record lookup error: %v", lookupType, err) - logger.Info(err) -@@ -323,12 +318,12 @@ func (d *dnsResolver) lookupTXT() *serviceconfig.ParseResult { - } - - func (d *dnsResolver) lookupHost() ([]resolver.Address, error) { -- var newAddrs []resolver.Address - addrs, err := d.resolver.LookupHost(d.ctx, d.host) - if err != nil { - err = handleDNSError(err, "A") - return nil, err - } -+ newAddrs := make([]resolver.Address, 0, len(addrs)) - for _, a := range addrs { - ip, ok := formatIP(a) - if !ok { -diff --git a/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go b/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go -index 520d922..afac565 100644 ---- a/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go -+++ b/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go -@@ -20,13 +20,20 @@ - // name without scheme back to gRPC as resolved address. - package passthrough - --import "google.golang.org/grpc/resolver" -+import ( -+ "errors" -+ -+ "google.golang.org/grpc/resolver" -+) - - const scheme = "passthrough" - - type passthroughBuilder struct{} - - func (*passthroughBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { -+ if target.Endpoint() == "" && opts.Dialer == nil { -+ return nil, errors.New("passthrough: received empty target in Build()") -+ } - r := &passthroughResolver{ - target: target, - cc: cc, -@@ -45,7 +52,7 @@ type passthroughResolver struct { - } - - func (r *passthroughResolver) start() { -- r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: r.target.Endpoint}}}) -+ r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: r.target.Endpoint()}}}) - } - - func (*passthroughResolver) ResolveNow(o resolver.ResolveNowOptions) {} -diff --git a/vendor/google.golang.org/grpc/internal/resolver/unix/unix.go b/vendor/google.golang.org/grpc/internal/resolver/unix/unix.go -index 0d5a811..1609116 100644 ---- a/vendor/google.golang.org/grpc/internal/resolver/unix/unix.go -+++ b/vendor/google.golang.org/grpc/internal/resolver/unix/unix.go -@@ -34,13 +34,24 @@ type builder struct { - } - - func (b *builder) Build(target resolver.Target, cc resolver.ClientConn, _ resolver.BuildOptions) (resolver.Resolver, error) { -- if target.Authority != "" { -- return nil, fmt.Errorf("invalid (non-empty) authority: %v", target.Authority) -+ if target.URL.Host != "" { -+ return nil, fmt.Errorf("invalid (non-empty) authority: %v", target.URL.Host) - } -- addr := resolver.Address{Addr: target.Endpoint} -+ -+ // gRPC was parsing the dial target manually before PR #4817, and we -+ // switched to using url.Parse() in that PR. To avoid breaking existing -+ // resolver implementations we ended up stripping the leading "/" from the -+ // endpoint. This obviously does not work for the "unix" scheme. Hence we -+ // end up using the parsed URL instead. -+ endpoint := target.URL.Path -+ if endpoint == "" { -+ endpoint = target.URL.Opaque -+ } -+ addr := resolver.Address{Addr: endpoint} - if b.scheme == unixAbstractScheme { -- // prepend "\x00" to address for unix-abstract -- addr.Addr = "\x00" + addr.Addr -+ // We can not prepend \0 as c++ gRPC does, as in Golang '@' is used to signify we do -+ // not want trailing \0 in address. -+ addr.Addr = "@" + addr.Addr - } - cc.UpdateState(resolver.State{Addresses: []resolver.Address{networktype.Set(addr, "unix")}}) - return &nopResolver{}, nil -diff --git a/vendor/google.golang.org/grpc/internal/serviceconfig/duration.go b/vendor/google.golang.org/grpc/internal/serviceconfig/duration.go -new file mode 100644 -index 0000000..11d82af ---- /dev/null -+++ b/vendor/google.golang.org/grpc/internal/serviceconfig/duration.go -@@ -0,0 +1,130 @@ -+/* -+ * -+ * Copyright 2023 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+package serviceconfig -+ -+import ( -+ "encoding/json" -+ "fmt" -+ "math" -+ "strconv" -+ "strings" -+ "time" -+) -+ -+// Duration defines JSON marshal and unmarshal methods to conform to the -+// protobuf JSON spec defined [here]. -+// -+// [here]: https://protobuf.dev/reference/protobuf/google.protobuf/#duration -+type Duration time.Duration -+ -+func (d Duration) String() string { -+ return fmt.Sprint(time.Duration(d)) -+} -+ -+// MarshalJSON converts from d to a JSON string output. -+func (d Duration) MarshalJSON() ([]byte, error) { -+ ns := time.Duration(d).Nanoseconds() -+ sec := ns / int64(time.Second) -+ ns = ns % int64(time.Second) -+ -+ var sign string -+ if sec < 0 || ns < 0 { -+ sign, sec, ns = "-", -1*sec, -1*ns -+ } -+ -+ // Generated output always contains 0, 3, 6, or 9 fractional digits, -+ // depending on required precision. -+ str := fmt.Sprintf("%s%d.%09d", sign, sec, ns) -+ str = strings.TrimSuffix(str, "000") -+ str = strings.TrimSuffix(str, "000") -+ str = strings.TrimSuffix(str, ".000") -+ return []byte(fmt.Sprintf("\"%ss\"", str)), nil -+} -+ -+// UnmarshalJSON unmarshals b as a duration JSON string into d. -+func (d *Duration) UnmarshalJSON(b []byte) error { -+ var s string -+ if err := json.Unmarshal(b, &s); err != nil { -+ return err -+ } -+ if !strings.HasSuffix(s, "s") { -+ return fmt.Errorf("malformed duration %q: missing seconds unit", s) -+ } -+ neg := false -+ if s[0] == '-' { -+ neg = true -+ s = s[1:] -+ } -+ ss := strings.SplitN(s[:len(s)-1], ".", 3) -+ if len(ss) > 2 { -+ return fmt.Errorf("malformed duration %q: too many decimals", s) -+ } -+ // hasDigits is set if either the whole or fractional part of the number is -+ // present, since both are optional but one is required. -+ hasDigits := false -+ var sec, ns int64 -+ if len(ss[0]) > 0 { -+ var err error -+ if sec, err = strconv.ParseInt(ss[0], 10, 64); err != nil { -+ return fmt.Errorf("malformed duration %q: %v", s, err) -+ } -+ // Maximum seconds value per the durationpb spec. -+ const maxProtoSeconds = 315_576_000_000 -+ if sec > maxProtoSeconds { -+ return fmt.Errorf("out of range: %q", s) -+ } -+ hasDigits = true -+ } -+ if len(ss) == 2 && len(ss[1]) > 0 { -+ if len(ss[1]) > 9 { -+ return fmt.Errorf("malformed duration %q: too many digits after decimal", s) -+ } -+ var err error -+ if ns, err = strconv.ParseInt(ss[1], 10, 64); err != nil { -+ return fmt.Errorf("malformed duration %q: %v", s, err) -+ } -+ for i := 9; i > len(ss[1]); i-- { -+ ns *= 10 -+ } -+ hasDigits = true -+ } -+ if !hasDigits { -+ return fmt.Errorf("malformed duration %q: contains no numbers", s) -+ } -+ -+ if neg { -+ sec *= -1 -+ ns *= -1 -+ } -+ -+ // Maximum/minimum seconds/nanoseconds representable by Go's time.Duration. -+ const maxSeconds = math.MaxInt64 / int64(time.Second) -+ const maxNanosAtMaxSeconds = math.MaxInt64 % int64(time.Second) -+ const minSeconds = math.MinInt64 / int64(time.Second) -+ const minNanosAtMinSeconds = math.MinInt64 % int64(time.Second) -+ -+ if sec > maxSeconds || (sec == maxSeconds && ns >= maxNanosAtMaxSeconds) { -+ *d = Duration(math.MaxInt64) -+ } else if sec < minSeconds || (sec == minSeconds && ns <= minNanosAtMinSeconds) { -+ *d = Duration(math.MinInt64) -+ } else { -+ *d = Duration(sec*int64(time.Second) + ns) -+ } -+ return nil -+} -diff --git a/vendor/google.golang.org/grpc/internal/serviceconfig/serviceconfig.go b/vendor/google.golang.org/grpc/internal/serviceconfig/serviceconfig.go -index c0634d1..51e733e 100644 ---- a/vendor/google.golang.org/grpc/internal/serviceconfig/serviceconfig.go -+++ b/vendor/google.golang.org/grpc/internal/serviceconfig/serviceconfig.go -@@ -67,10 +67,10 @@ func (bc *BalancerConfig) MarshalJSON() ([]byte, error) { - // ServiceConfig contains a list of loadBalancingConfigs, each with a name and - // config. This method iterates through that list in order, and stops at the - // first policy that is supported. --// - If the config for the first supported policy is invalid, the whole service --// config is invalid. --// - If the list doesn't contain any supported policy, the whole service config --// is invalid. -+// - If the config for the first supported policy is invalid, the whole service -+// config is invalid. -+// - If the list doesn't contain any supported policy, the whole service config -+// is invalid. - func (bc *BalancerConfig) UnmarshalJSON(b []byte) error { - var ir intermediateBalancerConfig - err := json.Unmarshal(b, &ir) -@@ -78,6 +78,7 @@ func (bc *BalancerConfig) UnmarshalJSON(b []byte) error { - return err - } - -+ var names []string - for i, lbcfg := range ir { - if len(lbcfg) != 1 { - return fmt.Errorf("invalid loadBalancingConfig: entry %v does not contain exactly 1 policy/config pair: %q", i, lbcfg) -@@ -92,6 +93,7 @@ func (bc *BalancerConfig) UnmarshalJSON(b []byte) error { - for name, jsonCfg = range lbcfg { - } - -+ names = append(names, name) - builder := balancer.Get(name) - if builder == nil { - // If the balancer is not registered, move on to the next config. -@@ -120,7 +122,7 @@ func (bc *BalancerConfig) UnmarshalJSON(b []byte) error { - // return. This means we had a loadBalancingConfig slice but did not - // encounter a registered policy. The config is considered invalid in this - // case. -- return fmt.Errorf("invalid loadBalancingConfig: no supported policies found") -+ return fmt.Errorf("invalid loadBalancingConfig: no supported policies found in %v", names) - } - - // MethodConfig defines the configuration recommended by the service providers for a -diff --git a/vendor/google.golang.org/grpc/internal/status/status.go b/vendor/google.golang.org/grpc/internal/status/status.go -index e5c6513..b0ead4f 100644 ---- a/vendor/google.golang.org/grpc/internal/status/status.go -+++ b/vendor/google.golang.org/grpc/internal/status/status.go -@@ -164,3 +164,13 @@ func (e *Error) Is(target error) bool { - } - return proto.Equal(e.s.s, tse.s.s) - } -+ -+// IsRestrictedControlPlaneCode returns whether the status includes a code -+// restricted for control plane usage as defined by gRFC A54. -+func IsRestrictedControlPlaneCode(s *Status) bool { -+ switch s.Code() { -+ case codes.InvalidArgument, codes.NotFound, codes.AlreadyExists, codes.FailedPrecondition, codes.Aborted, codes.OutOfRange, codes.DataLoss: -+ return true -+ } -+ return false -+} -diff --git a/vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go b/vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go -index 4b2964f..b3a7227 100644 ---- a/vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go -+++ b/vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go -@@ -1,5 +1,3 @@ --// +build !appengine -- - /* - * - * Copyright 2018 gRPC authors. -diff --git a/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go b/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go -index 7913ef1..999f52c 100644 ---- a/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go -+++ b/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go -@@ -1,4 +1,5 @@ --// +build !linux appengine -+//go:build !linux -+// +build !linux - - /* - * -@@ -35,41 +36,41 @@ var logger = grpclog.Component("core") - - func log() { - once.Do(func() { -- logger.Info("CPU time info is unavailable on non-linux or appengine environment.") -+ logger.Info("CPU time info is unavailable on non-linux environments.") - }) - } - --// GetCPUTime returns the how much CPU time has passed since the start of this process. --// It always returns 0 under non-linux or appengine environment. -+// GetCPUTime returns the how much CPU time has passed since the start of this -+// process. It always returns 0 under non-linux environments. - func GetCPUTime() int64 { - log() - return 0 - } - --// Rusage is an empty struct under non-linux or appengine environment. -+// Rusage is an empty struct under non-linux environments. - type Rusage struct{} - --// GetRusage is a no-op function under non-linux or appengine environment. -+// GetRusage is a no-op function under non-linux environments. - func GetRusage() *Rusage { - log() - return nil - } - - // CPUTimeDiff returns the differences of user CPU time and system CPU time used --// between two Rusage structs. It a no-op function for non-linux or appengine environment. -+// between two Rusage structs. It a no-op function for non-linux environments. - func CPUTimeDiff(first *Rusage, latest *Rusage) (float64, float64) { - log() - return 0, 0 - } - --// SetTCPUserTimeout is a no-op function under non-linux or appengine environments -+// SetTCPUserTimeout is a no-op function under non-linux environments. - func SetTCPUserTimeout(conn net.Conn, timeout time.Duration) error { - log() - return nil - } - --// GetTCPUserTimeout is a no-op function under non-linux or appengine environments --// a negative return value indicates the operation is not supported -+// GetTCPUserTimeout is a no-op function under non-linux environments. -+// A negative return value indicates the operation is not supported - func GetTCPUserTimeout(conn net.Conn) (int, error) { - log() - return -1, nil -diff --git a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go -index 45532f8..be5a9c8 100644 ---- a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go -+++ b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go -@@ -22,6 +22,7 @@ import ( - "bytes" - "errors" - "fmt" -+ "net" - "runtime" - "strconv" - "sync" -@@ -29,6 +30,7 @@ import ( - - "golang.org/x/net/http2" - "golang.org/x/net/http2/hpack" -+ "google.golang.org/grpc/internal/grpclog" - "google.golang.org/grpc/internal/grpcutil" - "google.golang.org/grpc/status" - ) -@@ -133,9 +135,11 @@ type cleanupStream struct { - func (c *cleanupStream) isTransportResponseFrame() bool { return c.rst } // Results in a RST_STREAM - - type earlyAbortStream struct { -+ httpStatus uint32 - streamID uint32 - contentSubtype string - status *status.Status -+ rst bool - } - - func (*earlyAbortStream) isTransportResponseFrame() bool { return false } -@@ -189,7 +193,7 @@ type goAway struct { - code http2.ErrCode - debugData []byte - headsUp bool -- closeConn bool -+ closeConn error // if set, loopyWriter will exit, resulting in conn closure - } - - func (*goAway) isTransportResponseFrame() bool { return false } -@@ -207,6 +211,14 @@ type outFlowControlSizeRequest struct { - - func (*outFlowControlSizeRequest) isTransportResponseFrame() bool { return false } - -+// closeConnection is an instruction to tell the loopy writer to flush the -+// framer and exit, which will cause the transport's connection to be closed -+// (by the client or server). The transport itself will close after the reader -+// encounters the EOF caused by the connection closure. -+type closeConnection struct{} -+ -+func (closeConnection) isTransportResponseFrame() bool { return false } -+ - type outStreamState int - - const ( -@@ -406,7 +418,7 @@ func (c *controlBuffer) get(block bool) (interface{}, error) { - select { - case <-c.ch: - case <-c.done: -- return nil, ErrConnClosing -+ return nil, errors.New("transport closed by client") - } - } - } -@@ -476,12 +488,14 @@ type loopyWriter struct { - hEnc *hpack.Encoder // HPACK encoder. - bdpEst *bdpEstimator - draining bool -+ conn net.Conn -+ logger *grpclog.PrefixLogger - - // Side-specific handlers - ssGoAwayHandler func(*goAway) (bool, error) - } - --func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimator) *loopyWriter { -+func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimator, conn net.Conn, logger *grpclog.PrefixLogger) *loopyWriter { - var buf bytes.Buffer - l := &loopyWriter{ - side: s, -@@ -494,6 +508,8 @@ func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimato - hBuf: &buf, - hEnc: hpack.NewEncoder(&buf), - bdpEst: bdpEst, -+ conn: conn, -+ logger: logger, - } - return l - } -@@ -511,23 +527,26 @@ const minBatchSize = 1000 - // 2. Stream level flow control quota available. - // - // In each iteration of run loop, other than processing the incoming control --// frame, loopy calls processData, which processes one node from the activeStreams linked-list. --// This results in writing of HTTP2 frames into an underlying write buffer. --// When there's no more control frames to read from controlBuf, loopy flushes the write buffer. --// As an optimization, to increase the batch size for each flush, loopy yields the processor, once --// if the batch size is too low to give stream goroutines a chance to fill it up. -+// frame, loopy calls processData, which processes one node from the -+// activeStreams linked-list. This results in writing of HTTP2 frames into an -+// underlying write buffer. When there's no more control frames to read from -+// controlBuf, loopy flushes the write buffer. As an optimization, to increase -+// the batch size for each flush, loopy yields the processor, once if the batch -+// size is too low to give stream goroutines a chance to fill it up. -+// -+// Upon exiting, if the error causing the exit is not an I/O error, run() -+// flushes and closes the underlying connection. Otherwise, the connection is -+// left open to allow the I/O error to be encountered by the reader instead. - func (l *loopyWriter) run() (err error) { - defer func() { -- if err == ErrConnClosing { -- // Don't log ErrConnClosing as error since it happens -- // 1. When the connection is closed by some other known issue. -- // 2. User closed the connection. -- // 3. A graceful close of connection. -- if logger.V(logLevel) { -- logger.Infof("transport: loopyWriter.run returning. %v", err) -- } -- err = nil -+ if l.logger.V(logLevel) { -+ l.logger.Infof("loopyWriter exiting with error: %v", err) - } -+ if !isIOError(err) { -+ l.framer.writer.Flush() -+ l.conn.Close() -+ } -+ l.cbuf.finish() - }() - for { - it, err := l.cbuf.get(true) -@@ -572,7 +591,6 @@ func (l *loopyWriter) run() (err error) { - } - l.framer.writer.Flush() - break hasdata -- - } - } - } -@@ -581,11 +599,11 @@ func (l *loopyWriter) outgoingWindowUpdateHandler(w *outgoingWindowUpdate) error - return l.framer.fr.WriteWindowUpdate(w.streamID, w.increment) - } - --func (l *loopyWriter) incomingWindowUpdateHandler(w *incomingWindowUpdate) error { -+func (l *loopyWriter) incomingWindowUpdateHandler(w *incomingWindowUpdate) { - // Otherwise update the quota. - if w.streamID == 0 { - l.sendQuota += w.increment -- return nil -+ return - } - // Find the stream and update it. - if str, ok := l.estdStreams[w.streamID]; ok { -@@ -593,10 +611,9 @@ func (l *loopyWriter) incomingWindowUpdateHandler(w *incomingWindowUpdate) error - if strQuota := int(l.oiws) - str.bytesOutStanding; strQuota > 0 && str.state == waitingOnStreamQuota { - str.state = active - l.activeStreams.enqueue(str) -- return nil -+ return - } - } -- return nil - } - - func (l *loopyWriter) outgoingSettingsHandler(s *outgoingSettings) error { -@@ -604,13 +621,11 @@ func (l *loopyWriter) outgoingSettingsHandler(s *outgoingSettings) error { - } - - func (l *loopyWriter) incomingSettingsHandler(s *incomingSettings) error { -- if err := l.applySettings(s.ss); err != nil { -- return err -- } -+ l.applySettings(s.ss) - return l.framer.fr.WriteSettingsAck() - } - --func (l *loopyWriter) registerStreamHandler(h *registerStream) error { -+func (l *loopyWriter) registerStreamHandler(h *registerStream) { - str := &outStream{ - id: h.streamID, - state: empty, -@@ -618,15 +633,14 @@ func (l *loopyWriter) registerStreamHandler(h *registerStream) error { - wq: h.wq, - } - l.estdStreams[h.streamID] = str -- return nil - } - - func (l *loopyWriter) headerHandler(h *headerFrame) error { - if l.side == serverSide { - str, ok := l.estdStreams[h.streamID] - if !ok { -- if logger.V(logLevel) { -- logger.Warningf("transport: loopy doesn't recognize the stream: %d", h.streamID) -+ if l.logger.V(logLevel) { -+ l.logger.Infof("Unrecognized streamID %d in loopyWriter", h.streamID) - } - return nil - } -@@ -653,19 +667,20 @@ func (l *loopyWriter) headerHandler(h *headerFrame) error { - itl: &itemList{}, - wq: h.wq, - } -- str.itl.enqueue(h) -- return l.originateStream(str) -+ return l.originateStream(str, h) - } - --func (l *loopyWriter) originateStream(str *outStream) error { -- hdr := str.itl.dequeue().(*headerFrame) -- if err := hdr.initStream(str.id); err != nil { -- if err == ErrConnClosing { -- return err -- } -- // Other errors(errStreamDrain) need not close transport. -+func (l *loopyWriter) originateStream(str *outStream, hdr *headerFrame) error { -+ // l.draining is set when handling GoAway. In which case, we want to avoid -+ // creating new streams. -+ if l.draining { -+ // TODO: provide a better error with the reason we are in draining. -+ hdr.onOrphaned(errStreamDrain) - return nil - } -+ if err := hdr.initStream(str.id); err != nil { -+ return err -+ } - if err := l.writeHeader(str.id, hdr.endStream, hdr.hf, hdr.onWrite); err != nil { - return err - } -@@ -680,8 +695,8 @@ func (l *loopyWriter) writeHeader(streamID uint32, endStream bool, hf []hpack.He - l.hBuf.Reset() - for _, f := range hf { - if err := l.hEnc.WriteField(f); err != nil { -- if logger.V(logLevel) { -- logger.Warningf("transport: loopyWriter.writeHeader encountered error while encoding headers: %v", err) -+ if l.logger.V(logLevel) { -+ l.logger.Warningf("Encountered error while encoding headers: %v", err) - } - } - } -@@ -719,10 +734,10 @@ func (l *loopyWriter) writeHeader(streamID uint32, endStream bool, hf []hpack.He - return nil - } - --func (l *loopyWriter) preprocessData(df *dataFrame) error { -+func (l *loopyWriter) preprocessData(df *dataFrame) { - str, ok := l.estdStreams[df.streamID] - if !ok { -- return nil -+ return - } - // If we got data for a stream it means that - // stream was originated and the headers were sent out. -@@ -731,7 +746,6 @@ func (l *loopyWriter) preprocessData(df *dataFrame) error { - str.state = active - l.activeStreams.enqueue(str) - } -- return nil - } - - func (l *loopyWriter) pingHandler(p *ping) error { -@@ -742,9 +756,8 @@ func (l *loopyWriter) pingHandler(p *ping) error { - - } - --func (l *loopyWriter) outFlowControlSizeRequestHandler(o *outFlowControlSizeRequest) error { -+func (l *loopyWriter) outFlowControlSizeRequestHandler(o *outFlowControlSizeRequest) { - o.resp <- l.sendQuota -- return nil - } - - func (l *loopyWriter) cleanupStreamHandler(c *cleanupStream) error { -@@ -761,8 +774,9 @@ func (l *loopyWriter) cleanupStreamHandler(c *cleanupStream) error { - return err - } - } -- if l.side == clientSide && l.draining && len(l.estdStreams) == 0 { -- return ErrConnClosing -+ if l.draining && len(l.estdStreams) == 0 { -+ // Flush and close the connection; we are done with it. -+ return errors.New("finished processing active streams while in draining mode") - } - return nil - } -@@ -771,9 +785,12 @@ func (l *loopyWriter) earlyAbortStreamHandler(eas *earlyAbortStream) error { - if l.side == clientSide { - return errors.New("earlyAbortStream not handled on client") - } -- -+ // In case the caller forgets to set the http status, default to 200. -+ if eas.httpStatus == 0 { -+ eas.httpStatus = 200 -+ } - headerFields := []hpack.HeaderField{ -- {Name: ":status", Value: "200"}, -+ {Name: ":status", Value: strconv.Itoa(int(eas.httpStatus))}, - {Name: "content-type", Value: grpcutil.ContentType(eas.contentSubtype)}, - {Name: "grpc-status", Value: strconv.Itoa(int(eas.status.Code()))}, - {Name: "grpc-message", Value: encodeGrpcMessage(eas.status.Message())}, -@@ -782,6 +799,11 @@ func (l *loopyWriter) earlyAbortStreamHandler(eas *earlyAbortStream) error { - if err := l.writeHeader(eas.streamID, true, headerFields, nil); err != nil { - return err - } -+ if eas.rst { -+ if err := l.framer.fr.WriteRSTStream(eas.streamID, http2.ErrCodeNo); err != nil { -+ return err -+ } -+ } - return nil - } - -@@ -789,7 +811,8 @@ func (l *loopyWriter) incomingGoAwayHandler(*incomingGoAway) error { - if l.side == clientSide { - l.draining = true - if len(l.estdStreams) == 0 { -- return ErrConnClosing -+ // Flush and close the connection; we are done with it. -+ return errors.New("received GOAWAY with no active streams") - } - } - return nil -@@ -810,7 +833,7 @@ func (l *loopyWriter) goAwayHandler(g *goAway) error { - func (l *loopyWriter) handle(i interface{}) error { - switch i := i.(type) { - case *incomingWindowUpdate: -- return l.incomingWindowUpdateHandler(i) -+ l.incomingWindowUpdateHandler(i) - case *outgoingWindowUpdate: - return l.outgoingWindowUpdateHandler(i) - case *incomingSettings: -@@ -820,7 +843,7 @@ func (l *loopyWriter) handle(i interface{}) error { - case *headerFrame: - return l.headerHandler(i) - case *registerStream: -- return l.registerStreamHandler(i) -+ l.registerStreamHandler(i) - case *cleanupStream: - return l.cleanupStreamHandler(i) - case *earlyAbortStream: -@@ -828,19 +851,24 @@ func (l *loopyWriter) handle(i interface{}) error { - case *incomingGoAway: - return l.incomingGoAwayHandler(i) - case *dataFrame: -- return l.preprocessData(i) -+ l.preprocessData(i) - case *ping: - return l.pingHandler(i) - case *goAway: - return l.goAwayHandler(i) - case *outFlowControlSizeRequest: -- return l.outFlowControlSizeRequestHandler(i) -+ l.outFlowControlSizeRequestHandler(i) -+ case closeConnection: -+ // Just return a non-I/O error and run() will flush and close the -+ // connection. -+ return ErrConnClosing - default: - return fmt.Errorf("transport: unknown control message type %T", i) - } -+ return nil - } - --func (l *loopyWriter) applySettings(ss []http2.Setting) error { -+func (l *loopyWriter) applySettings(ss []http2.Setting) { - for _, s := range ss { - switch s.ID { - case http2.SettingInitialWindowSize: -@@ -859,7 +887,6 @@ func (l *loopyWriter) applySettings(ss []http2.Setting) error { - updateHeaderTblSize(l.hEnc, s.Val) - } - } -- return nil - } - - // processData removes the first stream from active streams, writes out at most 16KB -@@ -876,9 +903,9 @@ func (l *loopyWriter) processData() (bool, error) { - dataItem := str.itl.peek().(*dataFrame) // Peek at the first data item this stream. - // A data item is represented by a dataFrame, since it later translates into - // multiple HTTP2 data frames. -- // Every dataFrame has two buffers; h that keeps grpc-message header and d that is acutal data. -+ // Every dataFrame has two buffers; h that keeps grpc-message header and d that is actual data. - // As an optimization to keep wire traffic low, data from d is copied to h to make as big as the -- // maximum possilbe HTTP2 frame size. -+ // maximum possible HTTP2 frame size. - - if len(dataItem.h) == 0 && len(dataItem.d) == 0 { // Empty data frame - // Client sends out empty data frame with endStream = true -@@ -893,7 +920,7 @@ func (l *loopyWriter) processData() (bool, error) { - return false, err - } - if err := l.cleanupStreamHandler(trailer.cleanup); err != nil { -- return false, nil -+ return false, err - } - } else { - l.activeStreams.enqueue(str) -diff --git a/vendor/google.golang.org/grpc/internal/transport/defaults.go b/vendor/google.golang.org/grpc/internal/transport/defaults.go -index 9fa306b..bc8ee07 100644 ---- a/vendor/google.golang.org/grpc/internal/transport/defaults.go -+++ b/vendor/google.golang.org/grpc/internal/transport/defaults.go -@@ -47,3 +47,9 @@ const ( - defaultClientMaxHeaderListSize = uint32(16 << 20) - defaultServerMaxHeaderListSize = uint32(16 << 20) - ) -+ -+// MaxStreamID is the upper bound for the stream ID before the current -+// transport gracefully closes and new transport is created for subsequent RPCs. -+// This is set to 75% of 2^31-1. Streams are identified with an unsigned 31-bit -+// integer. It's exported so that tests can override it. -+var MaxStreamID = uint32(math.MaxInt32 * 3 / 4) -diff --git a/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go -index f262edd..97198c5 100644 ---- a/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go -+++ b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go -@@ -136,12 +136,10 @@ type inFlow struct { - - // newLimit updates the inflow window to a new value n. - // It assumes that n is always greater than the old limit. --func (f *inFlow) newLimit(n uint32) uint32 { -+func (f *inFlow) newLimit(n uint32) { - f.mu.Lock() -- d := n - f.limit - f.limit = n - f.mu.Unlock() -- return d - } - - func (f *inFlow) maybeAdjust(n uint32) uint32 { -diff --git a/vendor/google.golang.org/grpc/internal/transport/handler_server.go b/vendor/google.golang.org/grpc/internal/transport/handler_server.go -index 1c3459c..98f80e3 100644 ---- a/vendor/google.golang.org/grpc/internal/transport/handler_server.go -+++ b/vendor/google.golang.org/grpc/internal/transport/handler_server.go -@@ -39,6 +39,7 @@ import ( - "golang.org/x/net/http2" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" -+ "google.golang.org/grpc/internal/grpclog" - "google.golang.org/grpc/internal/grpcutil" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/peer" -@@ -46,24 +47,32 @@ import ( - "google.golang.org/grpc/status" - ) - --// NewServerHandlerTransport returns a ServerTransport handling gRPC --// from inside an http.Handler. It requires that the http Server --// supports HTTP/2. --func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats stats.Handler) (ServerTransport, error) { -+// NewServerHandlerTransport returns a ServerTransport handling gRPC from -+// inside an http.Handler, or writes an HTTP error to w and returns an error. -+// It requires that the http Server supports HTTP/2. -+func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []stats.Handler) (ServerTransport, error) { - if r.ProtoMajor != 2 { -- return nil, errors.New("gRPC requires HTTP/2") -+ msg := "gRPC requires HTTP/2" -+ http.Error(w, msg, http.StatusBadRequest) -+ return nil, errors.New(msg) - } - if r.Method != "POST" { -- return nil, errors.New("invalid gRPC request method") -+ msg := fmt.Sprintf("invalid gRPC request method %q", r.Method) -+ http.Error(w, msg, http.StatusBadRequest) -+ return nil, errors.New(msg) - } - contentType := r.Header.Get("Content-Type") - // TODO: do we assume contentType is lowercase? we did before - contentSubtype, validContentType := grpcutil.ContentSubtype(contentType) - if !validContentType { -- return nil, errors.New("invalid gRPC request content-type") -+ msg := fmt.Sprintf("invalid gRPC request content-type %q", contentType) -+ http.Error(w, msg, http.StatusUnsupportedMediaType) -+ return nil, errors.New(msg) - } - if _, ok := w.(http.Flusher); !ok { -- return nil, errors.New("gRPC requires a ResponseWriter supporting http.Flusher") -+ msg := "gRPC requires a ResponseWriter supporting http.Flusher" -+ http.Error(w, msg, http.StatusInternalServerError) -+ return nil, errors.New(msg) - } - - st := &serverHandlerTransport{ -@@ -75,11 +84,14 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats sta - contentSubtype: contentSubtype, - stats: stats, - } -+ st.logger = prefixLoggerForServerHandlerTransport(st) - - if v := r.Header.Get("grpc-timeout"); v != "" { - to, err := decodeTimeout(v) - if err != nil { -- return nil, status.Errorf(codes.Internal, "malformed time-out: %v", err) -+ msg := fmt.Sprintf("malformed grpc-timeout: %v", err) -+ http.Error(w, msg, http.StatusBadRequest) -+ return nil, status.Error(codes.Internal, msg) - } - st.timeoutSet = true - st.timeout = to -@@ -97,7 +109,9 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats sta - for _, v := range vv { - v, err := decodeMetadataHeader(k, v) - if err != nil { -- return nil, status.Errorf(codes.Internal, "malformed binary metadata: %v", err) -+ msg := fmt.Sprintf("malformed binary metadata %q in header %q: %v", v, k, err) -+ http.Error(w, msg, http.StatusBadRequest) -+ return nil, status.Error(codes.Internal, msg) - } - metakv = append(metakv, k, v) - } -@@ -138,15 +152,19 @@ type serverHandlerTransport struct { - // TODO make sure this is consistent across handler_server and http2_server - contentSubtype string - -- stats stats.Handler -+ stats []stats.Handler -+ logger *grpclog.PrefixLogger - } - --func (ht *serverHandlerTransport) Close() { -- ht.closeOnce.Do(ht.closeCloseChanOnce) -+func (ht *serverHandlerTransport) Close(err error) { -+ ht.closeOnce.Do(func() { -+ if ht.logger.V(logLevel) { -+ ht.logger.Infof("Closing: %v", err) -+ } -+ close(ht.closedCh) -+ }) - } - --func (ht *serverHandlerTransport) closeCloseChanOnce() { close(ht.closedCh) } -- - func (ht *serverHandlerTransport) RemoteAddr() net.Addr { return strAddr(ht.req.RemoteAddr) } - - // strAddr is a net.Addr backed by either a TCP "ip:port" string, or -@@ -228,15 +246,15 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) erro - }) - - if err == nil { // transport has not been closed -- if ht.stats != nil { -- // Note: The trailer fields are compressed with hpack after this call returns. -- // No WireLength field is set here. -- ht.stats.HandleRPC(s.Context(), &stats.OutTrailer{ -+ // Note: The trailer fields are compressed with hpack after this call returns. -+ // No WireLength field is set here. -+ for _, sh := range ht.stats { -+ sh.HandleRPC(s.Context(), &stats.OutTrailer{ - Trailer: s.trailer.Copy(), - }) - } - } -- ht.Close() -+ ht.Close(errors.New("finished writing status")) - return err - } - -@@ -314,10 +332,10 @@ func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error { - }) - - if err == nil { -- if ht.stats != nil { -+ for _, sh := range ht.stats { - // Note: The header fields are compressed with hpack after this call returns. - // No WireLength field is set here. -- ht.stats.HandleRPC(s.Context(), &stats.OutHeader{ -+ sh.HandleRPC(s.Context(), &stats.OutHeader{ - Header: md.Copy(), - Compression: s.sendCompress, - }) -@@ -346,7 +364,7 @@ func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream), trace - case <-ht.req.Context().Done(): - } - cancel() -- ht.Close() -+ ht.Close(errors.New("request is done processing")) - }() - - req := ht.req -@@ -369,14 +387,14 @@ func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream), trace - } - ctx = metadata.NewIncomingContext(ctx, ht.headerMD) - s.ctx = peer.NewContext(ctx, pr) -- if ht.stats != nil { -- s.ctx = ht.stats.TagRPC(s.ctx, &stats.RPCTagInfo{FullMethodName: s.method}) -+ for _, sh := range ht.stats { -+ s.ctx = sh.TagRPC(s.ctx, &stats.RPCTagInfo{FullMethodName: s.method}) - inHeader := &stats.InHeader{ - FullMethod: s.method, - RemoteAddr: ht.RemoteAddr(), - Compression: s.recvCompress, - } -- ht.stats.HandleRPC(s.ctx, inHeader) -+ sh.HandleRPC(s.ctx, inHeader) - } - s.trReader = &transportReader{ - reader: &recvBufferReader{ctx: s.ctx, ctxDone: s.ctx.Done(), recv: s.buf, freeBuffer: func(*bytes.Buffer) {}}, -@@ -435,17 +453,17 @@ func (ht *serverHandlerTransport) IncrMsgSent() {} - - func (ht *serverHandlerTransport) IncrMsgRecv() {} - --func (ht *serverHandlerTransport) Drain() { -+func (ht *serverHandlerTransport) Drain(debugData string) { - panic("Drain() is not implemented") - } - - // mapRecvMsgError returns the non-nil err into the appropriate - // error value as expected by callers of *grpc.parser.recvMsg. - // In particular, in can only be: --// * io.EOF --// * io.ErrUnexpectedEOF --// * of type transport.ConnectionError --// * an error from the status package -+// - io.EOF -+// - io.ErrUnexpectedEOF -+// - of type transport.ConnectionError -+// - an error from the status package - func mapRecvMsgError(err error) error { - if err == io.EOF || err == io.ErrUnexpectedEOF { - return err -diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_client.go b/vendor/google.golang.org/grpc/internal/transport/http2_client.go -index 0cd6da1..326bf08 100644 ---- a/vendor/google.golang.org/grpc/internal/transport/http2_client.go -+++ b/vendor/google.golang.org/grpc/internal/transport/http2_client.go -@@ -25,6 +25,7 @@ import ( - "math" - "net" - "net/http" -+ "path/filepath" - "strconv" - "strings" - "sync" -@@ -37,8 +38,11 @@ import ( - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/internal/channelz" - icredentials "google.golang.org/grpc/internal/credentials" -+ "google.golang.org/grpc/internal/grpclog" -+ "google.golang.org/grpc/internal/grpcsync" - "google.golang.org/grpc/internal/grpcutil" - imetadata "google.golang.org/grpc/internal/metadata" -+ istatus "google.golang.org/grpc/internal/status" - "google.golang.org/grpc/internal/syscall" - "google.golang.org/grpc/internal/transport/networktype" - "google.golang.org/grpc/keepalive" -@@ -56,11 +60,15 @@ var clientConnectionCounter uint64 - - // http2Client implements the ClientTransport interface with HTTP2. - type http2Client struct { -- lastRead int64 // Keep this field 64-bit aligned. Accessed atomically. -- ctx context.Context -- cancel context.CancelFunc -- ctxDone <-chan struct{} // Cache the ctx.Done() chan. -- userAgent string -+ lastRead int64 // Keep this field 64-bit aligned. Accessed atomically. -+ ctx context.Context -+ cancel context.CancelFunc -+ ctxDone <-chan struct{} // Cache the ctx.Done() chan. -+ userAgent string -+ // address contains the resolver returned address for this transport. -+ // If the `ServerName` field is set, it takes precedence over `CallHdr.Host` -+ // passed to `NewStream`, when determining the :authority header. -+ address resolver.Address - md metadata.MD - conn net.Conn // underlying communication channel - loopy *loopyWriter -@@ -77,6 +85,7 @@ type http2Client struct { - framer *framer - // controlBuf delivers all the control related tasks (e.g., window - // updates, reset streams, and various settings) to the controller. -+ // Do not access controlBuf with mu held. - controlBuf *controlBuffer - fc *trInFlow - // The scheme used: https if TLS is on, http otherwise. -@@ -89,7 +98,7 @@ type http2Client struct { - kp keepalive.ClientParameters - keepaliveEnabled bool - -- statsHandler stats.Handler -+ statsHandlers []stats.Handler - - initialWindowSize int32 - -@@ -97,17 +106,15 @@ type http2Client struct { - maxSendHeaderListSize *uint32 - - bdpEst *bdpEstimator -- // onPrefaceReceipt is a callback that client transport calls upon -- // receiving server preface to signal that a succefull HTTP2 -- // connection was established. -- onPrefaceReceipt func() - - maxConcurrentStreams uint32 - streamQuota int64 - streamsQuotaAvailable chan struct{} - waitingStreams uint32 - nextID uint32 -+ registeredCompressors string - -+ // Do not access controlBuf with mu held. - mu sync.Mutex // guard the following variables - state transportState - activeStreams map[uint32]*Stream -@@ -131,28 +138,35 @@ type http2Client struct { - kpDormant bool - - // Fields below are for channelz metric collection. -- channelzID int64 // channelz unique identification number -+ channelzID *channelz.Identifier - czData *channelzData - -- onGoAway func(GoAwayReason) -- onClose func() -+ onClose func(GoAwayReason) - - bufferPool *bufferPool - - connectionID uint64 -+ logger *grpclog.PrefixLogger - } - - func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error), addr resolver.Address, useProxy bool, grpcUA string) (net.Conn, error) { - address := addr.Addr - networkType, ok := networktype.Get(addr) - if fn != nil { -+ // Special handling for unix scheme with custom dialer. Back in the day, -+ // we did not have a unix resolver and therefore targets with a unix -+ // scheme would end up using the passthrough resolver. So, user's used a -+ // custom dialer in this case and expected the original dial target to -+ // be passed to the custom dialer. Now, we have a unix resolver. But if -+ // a custom dialer is specified, we want to retain the old behavior in -+ // terms of the address being passed to the custom dialer. - if networkType == "unix" && !strings.HasPrefix(address, "\x00") { -- // For backward compatibility, if the user dialed "unix:///path", -- // the passthrough resolver would be used and the user's custom -- // dialer would see "unix:///path". Since the unix resolver is used -- // and the address is now "/path", prepend "unix://" so the user's -- // custom dialer sees the same address. -- return fn(ctx, "unix://"+address) -+ // Supported unix targets are either "unix://absolute-path" or -+ // "unix:relative-path". -+ if filepath.IsAbs(address) { -+ return fn(ctx, "unix://"+address) -+ } -+ return fn(ctx, "unix:"+address) - } - return fn(ctx, address) - } -@@ -184,7 +198,7 @@ func isTemporary(err error) bool { - // newHTTP2Client constructs a connected ClientTransport to addr based on HTTP2 - // and starts to receive messages on it. Non-nil error returns if construction - // fails. --func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onPrefaceReceipt func(), onGoAway func(GoAwayReason), onClose func()) (_ *http2Client, err error) { -+func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (_ *http2Client, err error) { - scheme := "http" - ctx, cancel := context.WithCancel(ctx) - defer func() { -@@ -193,19 +207,51 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts - } - }() - -+ // gRPC, resolver, balancer etc. can specify arbitrary data in the -+ // Attributes field of resolver.Address, which is shoved into connectCtx -+ // and passed to the dialer and credential handshaker. This makes it possible for -+ // address specific arbitrary data to reach custom dialers and credential handshakers. -+ connectCtx = icredentials.NewClientHandshakeInfoContext(connectCtx, credentials.ClientHandshakeInfo{Attributes: addr.Attributes}) -+ - conn, err := dial(connectCtx, opts.Dialer, addr, opts.UseProxy, opts.UserAgent) - if err != nil { - if opts.FailOnNonTempDialError { - return nil, connectionErrorf(isTemporary(err), err, "transport: error while dialing: %v", err) - } -- return nil, connectionErrorf(true, err, "transport: Error while dialing %v", err) -+ return nil, connectionErrorf(true, err, "transport: Error while dialing: %v", err) - } -+ - // Any further errors will close the underlying connection - defer func(conn net.Conn) { - if err != nil { - conn.Close() - } - }(conn) -+ -+ // The following defer and goroutine monitor the connectCtx for cancelation -+ // and deadline. On context expiration, the connection is hard closed and -+ // this function will naturally fail as a result. Otherwise, the defer -+ // waits for the goroutine to exit to prevent the context from being -+ // monitored (and to prevent the connection from ever being closed) after -+ // returning from this function. -+ ctxMonitorDone := grpcsync.NewEvent() -+ newClientCtx, newClientDone := context.WithCancel(connectCtx) -+ defer func() { -+ newClientDone() // Awaken the goroutine below if connectCtx hasn't expired. -+ <-ctxMonitorDone.Done() // Wait for the goroutine below to exit. -+ }() -+ go func(conn net.Conn) { -+ defer ctxMonitorDone.Fire() // Signal this goroutine has exited. -+ <-newClientCtx.Done() // Block until connectCtx expires or the defer above executes. -+ if err := connectCtx.Err(); err != nil { -+ // connectCtx expired before exiting the function. Hard close the connection. -+ if logger.V(logLevel) { -+ logger.Infof("Aborting due to connect deadline expiring: %v", err) -+ } -+ conn.Close() -+ } -+ }(conn) -+ - kp := opts.KeepaliveParams - // Validate keepalive parameters. - if kp.Time == 0 { -@@ -237,20 +283,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts - } - } - if transportCreds != nil { -- // gRPC, resolver, balancer etc. can specify arbitrary data in the -- // Attributes field of resolver.Address, which is shoved into connectCtx -- // and passed to the credential handshaker. This makes it possible for -- // address specific arbitrary data to reach the credential handshaker. -- connectCtx = icredentials.NewClientHandshakeInfoContext(connectCtx, credentials.ClientHandshakeInfo{Attributes: addr.Attributes}) -- rawConn := conn -- // Pull the deadline from the connectCtx, which will be used for -- // timeouts in the authentication protocol handshake. Can ignore the -- // boolean as the deadline will return the zero value, which will make -- // the conn not timeout on I/O operations. -- deadline, _ := connectCtx.Deadline() -- rawConn.SetDeadline(deadline) -- conn, authInfo, err = transportCreds.ClientHandshake(connectCtx, addr.ServerName, rawConn) -- rawConn.SetDeadline(time.Time{}) -+ conn, authInfo, err = transportCreds.ClientHandshake(connectCtx, addr.ServerName, conn) - if err != nil { - return nil, connectionErrorf(isTemporary(err), err, "transport: authentication handshake failed: %v", err) - } -@@ -288,6 +321,8 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts - ctxDone: ctx.Done(), // Cache Done chan. - cancel: cancel, - userAgent: opts.UserAgent, -+ registeredCompressors: grpcutil.RegisteredCompressors(), -+ address: addr, - conn: conn, - remoteAddr: conn.RemoteAddr(), - localAddr: conn.LocalAddr(), -@@ -302,19 +337,20 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts - isSecure: isSecure, - perRPCCreds: perRPCCreds, - kp: kp, -- statsHandler: opts.StatsHandler, -+ statsHandlers: opts.StatsHandlers, - initialWindowSize: initialWindowSize, -- onPrefaceReceipt: onPrefaceReceipt, - nextID: 1, - maxConcurrentStreams: defaultMaxStreamsClient, - streamQuota: defaultMaxStreamsClient, - streamsQuotaAvailable: make(chan struct{}, 1), - czData: new(channelzData), -- onGoAway: onGoAway, -- onClose: onClose, - keepaliveEnabled: keepaliveEnabled, - bufferPool: newBufferPool(), -+ onClose: onClose, - } -+ t.logger = prefixLoggerForClientTransport(t) -+ // Add peer information to the http2client context. -+ t.ctx = peer.NewContext(t.ctx, t.getPeer()) - - if md, ok := addr.Metadata.(*metadata.MD); ok { - t.md = *md -@@ -332,38 +368,50 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts - updateFlowControl: t.updateFlowControl, - } - } -- if t.statsHandler != nil { -- t.ctx = t.statsHandler.TagConn(t.ctx, &stats.ConnTagInfo{ -+ for _, sh := range t.statsHandlers { -+ t.ctx = sh.TagConn(t.ctx, &stats.ConnTagInfo{ - RemoteAddr: t.remoteAddr, - LocalAddr: t.localAddr, - }) - connBegin := &stats.ConnBegin{ - Client: true, - } -- t.statsHandler.HandleConn(t.ctx, connBegin) -+ sh.HandleConn(t.ctx, connBegin) - } -- if channelz.IsOn() { -- t.channelzID = channelz.RegisterNormalSocket(t, opts.ChannelzParentID, fmt.Sprintf("%s -> %s", t.localAddr, t.remoteAddr)) -+ t.channelzID, err = channelz.RegisterNormalSocket(t, opts.ChannelzParentID, fmt.Sprintf("%s -> %s", t.localAddr, t.remoteAddr)) -+ if err != nil { -+ return nil, err - } - if t.keepaliveEnabled { - t.kpDormancyCond = sync.NewCond(&t.mu) - go t.keepalive() - } -- // Start the reader goroutine for incoming message. Each transport has -- // a dedicated goroutine which reads HTTP2 frame from network. Then it -- // dispatches the frame to the corresponding stream entity. -- go t.reader() -+ -+ // Start the reader goroutine for incoming messages. Each transport has a -+ // dedicated goroutine which reads HTTP2 frames from the network. Then it -+ // dispatches the frame to the corresponding stream entity. When the -+ // server preface is received, readerErrCh is closed. If an error occurs -+ // first, an error is pushed to the channel. This must be checked before -+ // returning from this function. -+ readerErrCh := make(chan error, 1) -+ go t.reader(readerErrCh) -+ defer func() { -+ if err == nil { -+ err = <-readerErrCh -+ } -+ if err != nil { -+ t.Close(err) -+ } -+ }() - - // Send connection preface to server. - n, err := t.conn.Write(clientPreface) - if err != nil { - err = connectionErrorf(true, err, "transport: failed to write client preface: %v", err) -- t.Close(err) - return nil, err - } - if n != len(clientPreface) { - err = connectionErrorf(true, nil, "transport: preface mismatch, wrote %d bytes; want %d", n, len(clientPreface)) -- t.Close(err) - return nil, err - } - var ss []http2.Setting -@@ -383,14 +431,12 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts - err = t.framer.fr.WriteSettings(ss...) - if err != nil { - err = connectionErrorf(true, err, "transport: failed to write initial settings frame: %v", err) -- t.Close(err) - return nil, err - } - // Adjust the connection flow control window if needed. - if delta := uint32(icwz - defaultWindowSize); delta > 0 { - if err := t.framer.fr.WriteWindowUpdate(0, delta); err != nil { - err = connectionErrorf(true, err, "transport: failed to write window update: %v", err) -- t.Close(err) - return nil, err - } - } -@@ -401,17 +447,8 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts - return nil, err - } - go func() { -- t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst) -- err := t.loopy.run() -- if err != nil { -- if logger.V(logLevel) { -- logger.Errorf("transport: loopyWriter.run returning. Err: %v", err) -- } -- } -- // Do not close the transport. Let reader goroutine handle it since -- // there might be data in the buffers. -- t.conn.Close() -- t.controlBuf.finish() -+ t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger) -+ t.loopy.run() - close(t.writerDone) - }() - return t, nil -@@ -457,7 +494,7 @@ func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { - func (t *http2Client) getPeer() *peer.Peer { - return &peer.Peer{ - Addr: t.remoteAddr, -- AuthInfo: t.authInfo, -+ AuthInfo: t.authInfo, // Can be nil - } - } - -@@ -493,9 +530,22 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) - headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-previous-rpc-attempts", Value: strconv.Itoa(callHdr.PreviousAttempts)}) - } - -+ registeredCompressors := t.registeredCompressors - if callHdr.SendCompress != "" { - headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: callHdr.SendCompress}) -- headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-accept-encoding", Value: callHdr.SendCompress}) -+ // Include the outgoing compressor name when compressor is not registered -+ // via encoding.RegisterCompressor. This is possible when client uses -+ // WithCompressor dial option. -+ if !grpcutil.IsCompressorNameRegistered(callHdr.SendCompress) { -+ if registeredCompressors != "" { -+ registeredCompressors += "," -+ } -+ registeredCompressors += callHdr.SendCompress -+ } -+ } -+ -+ if registeredCompressors != "" { -+ headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-accept-encoding", Value: registeredCompressors}) - } - if dl, ok := ctx.Deadline(); ok { - // Send out timeout regardless its value. The server can detect timeout context by itself. -@@ -575,11 +625,15 @@ func (t *http2Client) getTrAuthData(ctx context.Context, audience string) (map[s - for _, c := range t.perRPCCreds { - data, err := c.GetRequestMetadata(ctx, audience) - if err != nil { -- if _, ok := status.FromError(err); ok { -+ if st, ok := status.FromError(err); ok { -+ // Restrict the code to the list allowed by gRFC A54. -+ if istatus.IsRestrictedControlPlaneCode(st) { -+ err = status.Errorf(codes.Internal, "transport: received per-RPC creds error with illegal status: %v", err) -+ } - return nil, err - } - -- return nil, status.Errorf(codes.Unauthenticated, "transport: %v", err) -+ return nil, status.Errorf(codes.Unauthenticated, "transport: per-RPC creds failed due to error: %v", err) - } - for k, v := range data { - // Capital header names are illegal in HTTP/2. -@@ -604,7 +658,14 @@ func (t *http2Client) getCallAuthData(ctx context.Context, audience string, call - } - data, err := callCreds.GetRequestMetadata(ctx, audience) - if err != nil { -- return nil, status.Errorf(codes.Internal, "transport: %v", err) -+ if st, ok := status.FromError(err); ok { -+ // Restrict the code to the list allowed by gRFC A54. -+ if istatus.IsRestrictedControlPlaneCode(st) { -+ err = status.Errorf(codes.Internal, "transport: received per-RPC creds error with illegal status: %v", err) -+ } -+ return nil, err -+ } -+ return nil, status.Errorf(codes.Internal, "transport: per-RPC creds failed due to error: %v", err) - } - callAuthData = make(map[string]string, len(data)) - for k, v := range data { -@@ -616,12 +677,21 @@ func (t *http2Client) getCallAuthData(ctx context.Context, audience string, call - return callAuthData, nil - } - --// NewStreamError wraps an error and reports additional information. -+// NewStreamError wraps an error and reports additional information. Typically -+// NewStream errors result in transparent retry, as they mean nothing went onto -+// the wire. However, there are two notable exceptions: -+// -+// 1. If the stream headers violate the max header list size allowed by the -+// server. It's possible this could succeed on another transport, even if -+// it's unlikely, but do not transparently retry. -+// 2. If the credentials errored when requesting their headers. In this case, -+// it's possible a retry can fix the problem, but indefinitely transparently -+// retrying is not appropriate as it is likely the credentials, if they can -+// eventually succeed, would need I/O to do so. - type NewStreamError struct { - Err error - -- DoNotRetry bool -- PerformedIO bool -+ AllowTransparentRetry bool - } - - func (e NewStreamError) Error() string { -@@ -630,25 +700,23 @@ func (e NewStreamError) Error() string { - - // NewStream creates a stream and registers it into the transport as "active" - // streams. All non-nil errors returned will be *NewStreamError. --func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Stream, err error) { -- defer func() { -- if err != nil { -- nse, ok := err.(*NewStreamError) -- if !ok { -- nse = &NewStreamError{Err: err} -- } -- if len(t.perRPCCreds) > 0 || callHdr.Creds != nil { -- // We may have performed I/O in the per-RPC creds callback, so do not -- // allow transparent retry. -- nse.PerformedIO = true -- } -- err = nse -- } -- }() -+func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, error) { - ctx = peer.NewContext(ctx, t.getPeer()) -+ -+ // ServerName field of the resolver returned address takes precedence over -+ // Host field of CallHdr to determine the :authority header. This is because, -+ // the ServerName field takes precedence for server authentication during -+ // TLS handshake, and the :authority header should match the value used -+ // for server authentication. -+ if t.address.ServerName != "" { -+ newCallHdr := *callHdr -+ newCallHdr.Host = t.address.ServerName -+ callHdr = &newCallHdr -+ } -+ - headerFields, err := t.createHeaderFields(ctx, callHdr) - if err != nil { -- return nil, err -+ return nil, &NewStreamError{Err: err, AllowTransparentRetry: false} - } - s := t.newStream(ctx, callHdr) - cleanup := func(err error) { -@@ -670,17 +738,13 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea - endStream: false, - initStream: func(id uint32) error { - t.mu.Lock() -- if state := t.state; state != reachable { -+ // TODO: handle transport closure in loopy instead and remove this -+ // initStream is never called when transport is draining. -+ if t.state == closing { - t.mu.Unlock() -- // Do a quick cleanup. -- err := error(errStreamDrain) -- if state == closing { -- err = ErrConnClosing -- } -- cleanup(err) -- return err -+ cleanup(ErrConnClosing) -+ return ErrConnClosing - } -- t.activeStreams[id] = s - if channelz.IsOn() { - atomic.AddInt64(&t.czData.streamsStarted, 1) - atomic.StoreInt64(&t.czData.lastStreamCreatedTime, time.Now().UnixNano()) -@@ -697,6 +761,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea - } - firstTry := true - var ch chan struct{} -+ transportDrainRequired := false - checkForStreamQuota := func(it interface{}) bool { - if t.streamQuota <= 0 { // Can go negative if server decreases it. - if firstTry { -@@ -712,8 +777,20 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea - h := it.(*headerFrame) - h.streamID = t.nextID - t.nextID += 2 -+ -+ // Drain client transport if nextID > MaxStreamID which signals gRPC that -+ // the connection is closed and a new one must be created for subsequent RPCs. -+ transportDrainRequired = t.nextID > MaxStreamID -+ - s.id = h.streamID - s.fc = &inFlow{limit: uint32(t.initialWindowSize)} -+ t.mu.Lock() -+ if t.state == draining || t.activeStreams == nil { // Can be niled from Close(). -+ t.mu.Unlock() -+ return false // Don't create a stream if the transport is already closed. -+ } -+ t.activeStreams[s.id] = s -+ t.mu.Unlock() - if t.streamQuota > 0 && t.waitingStreams > 0 { - select { - case t.streamsQuotaAvailable <- struct{}{}: -@@ -739,52 +816,56 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea - } - for { - success, err := t.controlBuf.executeAndPut(func(it interface{}) bool { -- if !checkForStreamQuota(it) { -- return false -- } -- if !checkForHeaderListSize(it) { -- return false -- } -- return true -+ return checkForHeaderListSize(it) && checkForStreamQuota(it) - }, hdr) - if err != nil { -- return nil, err -+ // Connection closed. -+ return nil, &NewStreamError{Err: err, AllowTransparentRetry: true} - } - if success { - break - } - if hdrListSizeErr != nil { -- return nil, &NewStreamError{Err: hdrListSizeErr, DoNotRetry: true} -+ return nil, &NewStreamError{Err: hdrListSizeErr} - } - firstTry = false - select { - case <-ch: -- case <-s.ctx.Done(): -- return nil, ContextErr(s.ctx.Err()) -+ case <-ctx.Done(): -+ return nil, &NewStreamError{Err: ContextErr(ctx.Err())} - case <-t.goAway: -- return nil, errStreamDrain -+ return nil, &NewStreamError{Err: errStreamDrain, AllowTransparentRetry: true} - case <-t.ctx.Done(): -- return nil, ErrConnClosing -+ return nil, &NewStreamError{Err: ErrConnClosing, AllowTransparentRetry: true} - } - } -- if t.statsHandler != nil { -+ if len(t.statsHandlers) != 0 { - header, ok := metadata.FromOutgoingContext(ctx) - if ok { - header.Set("user-agent", t.userAgent) - } else { - header = metadata.Pairs("user-agent", t.userAgent) - } -- // Note: The header fields are compressed with hpack after this call returns. -- // No WireLength field is set here. -- outHeader := &stats.OutHeader{ -- Client: true, -- FullMethod: callHdr.Method, -- RemoteAddr: t.remoteAddr, -- LocalAddr: t.localAddr, -- Compression: callHdr.SendCompress, -- Header: header, -+ for _, sh := range t.statsHandlers { -+ // Note: The header fields are compressed with hpack after this call returns. -+ // No WireLength field is set here. -+ // Note: Creating a new stats object to prevent pollution. -+ outHeader := &stats.OutHeader{ -+ Client: true, -+ FullMethod: callHdr.Method, -+ RemoteAddr: t.remoteAddr, -+ LocalAddr: t.localAddr, -+ Compression: callHdr.SendCompress, -+ Header: header, -+ } -+ sh.HandleRPC(s.ctx, outHeader) -+ } -+ } -+ if transportDrainRequired { -+ if t.logger.V(logLevel) { -+ t.logger.Infof("Draining transport: t.nextID > MaxStreamID") - } -- t.statsHandler.HandleRPC(s.ctx, outHeader) -+ t.GracefulClose() - } - return s, nil - } -@@ -867,20 +948,21 @@ func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2. - // Close kicks off the shutdown process of the transport. This should be called - // only once on a transport. Once it is called, the transport should not be - // accessed any more. --// --// This method blocks until the addrConn that initiated this transport is --// re-connected. This happens because t.onClose() begins reconnect logic at the --// addrConn level and blocks until the addrConn is successfully connected. - func (t *http2Client) Close(err error) { - t.mu.Lock() -- // Make sure we only Close once. -+ // Make sure we only close once. - if t.state == closing { - t.mu.Unlock() - return - } -- // Call t.onClose before setting the state to closing to prevent the client -- // from attempting to create new streams ASAP. -- t.onClose() -+ if t.logger.V(logLevel) { -+ t.logger.Infof("Closing: %v", err) -+ } -+ // Call t.onClose ASAP to prevent the client from attempting to create new -+ // streams. -+ if t.state != draining { -+ t.onClose(GoAwayInvalid) -+ } - t.state = closing - streams := t.activeStreams - t.activeStreams = nil -@@ -893,9 +975,7 @@ func (t *http2Client) Close(err error) { - t.controlBuf.finish() - t.cancel() - t.conn.Close() -- if channelz.IsOn() { -- channelz.RemoveEntry(t.channelzID) -- } -+ channelz.RemoveEntry(t.channelzID) - // Append info about previous goaways if there were any, since this may be important - // for understanding the root cause for this connection to be closed. - _, goAwayDebugMessage := t.GetGoAwayReason() -@@ -912,11 +992,11 @@ func (t *http2Client) Close(err error) { - for _, s := range streams { - t.closeStream(s, err, false, http2.ErrCodeNo, st, nil, false) - } -- if t.statsHandler != nil { -+ for _, sh := range t.statsHandlers { - connEnd := &stats.ConnEnd{ - Client: true, - } -- t.statsHandler.HandleConn(t.ctx, connEnd) -+ sh.HandleConn(t.ctx, connEnd) - } - } - -@@ -932,11 +1012,15 @@ func (t *http2Client) GracefulClose() { - t.mu.Unlock() - return - } -+ if t.logger.V(logLevel) { -+ t.logger.Infof("GracefulClose called") -+ } -+ t.onClose(GoAwayInvalid) - t.state = draining - active := len(t.activeStreams) - t.mu.Unlock() - if active == 0 { -- t.Close(ErrConnClosing) -+ t.Close(connectionErrorf(true, nil, "no active streams left to process while draining")) - return - } - t.controlBuf.put(&incomingGoAway{}) -@@ -996,13 +1080,13 @@ func (t *http2Client) updateWindow(s *Stream, n uint32) { - // for the transport and the stream based on the current bdp - // estimation. - func (t *http2Client) updateFlowControl(n uint32) { -- t.mu.Lock() -- for _, s := range t.activeStreams { -- s.fc.newLimit(n) -- } -- t.mu.Unlock() - updateIWS := func(interface{}) bool { - t.initialWindowSize = int32(n) -+ t.mu.Lock() -+ for _, s := range t.activeStreams { -+ s.fc.newLimit(n) -+ } -+ t.mu.Unlock() - return true - } - t.controlBuf.executeAndPut(updateIWS, &outgoingWindowUpdate{streamID: 0, increment: t.fc.newLimit(n)}) -@@ -1077,7 +1161,7 @@ func (t *http2Client) handleData(f *http2.DataFrame) { - } - // The server has closed the stream without sending trailers. Record that - // the read direction is closed, and set the status appropriately. -- if f.FrameHeader.Flags.Has(http2.FlagDataEndStream) { -+ if f.StreamEnded() { - t.closeStream(s, io.EOF, false, http2.ErrCodeNo, status.New(codes.Internal, "server closed the stream without sending trailers"), nil, true) - } - } -@@ -1093,8 +1177,8 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { - } - statusCode, ok := http2ErrConvTab[f.ErrCode] - if !ok { -- if logger.V(logLevel) { -- logger.Warningf("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error %v", f.ErrCode) -+ if t.logger.V(logLevel) { -+ t.logger.Infof("Received a RST_STREAM frame with code %q, but found no mapped gRPC status", f.ErrCode) - } - statusCode = codes.Unknown - } -@@ -1176,10 +1260,12 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { - t.mu.Unlock() - return - } -- if f.ErrCode == http2.ErrCodeEnhanceYourCalm { -- if logger.V(logLevel) { -- logger.Infof("Client received GoAway with http2.ErrCodeEnhanceYourCalm.") -- } -+ if f.ErrCode == http2.ErrCodeEnhanceYourCalm && string(f.DebugData()) == "too_many_pings" { -+ // When a client receives a GOAWAY with error code ENHANCE_YOUR_CALM and debug -+ // data equal to ASCII "too_many_pings", it should log the occurrence at a log level that is -+ // enabled by default and double the configure KEEPALIVE_TIME used for new connections -+ // on that channel. -+ logger.Errorf("Client received GoAway with error code ENHANCE_YOUR_CALM and debug data equal to ASCII \"too_many_pings\".") - } - id := f.LastStreamID - if id > 0 && id%2 == 0 { -@@ -1208,12 +1294,14 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { - default: - t.setGoAwayReason(f) - close(t.goAway) -- t.controlBuf.put(&incomingGoAway{}) -+ defer t.controlBuf.put(&incomingGoAway{}) // Defer as t.mu is currently held. - // Notify the clientconn about the GOAWAY before we set the state to - // draining, to allow the client to stop attempting to create streams - // before disallowing new streams on this connection. -- t.onGoAway(t.goAwayReason) -- t.state = draining -+ if t.state != draining { -+ t.onClose(t.goAwayReason) -+ t.state = draining -+ } - } - // All streams with IDs greater than the GoAwayId - // and smaller than the previous GoAway ID should be killed. -@@ -1221,24 +1309,35 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { - if upperLimit == 0 { // This is the first GoAway Frame. - upperLimit = math.MaxUint32 // Kill all streams after the GoAway ID. - } -+ -+ t.prevGoAwayID = id -+ if len(t.activeStreams) == 0 { -+ t.mu.Unlock() -+ t.Close(connectionErrorf(true, nil, "received goaway and there are no active streams")) -+ return -+ } -+ -+ streamsToClose := make([]*Stream, 0) - for streamID, stream := range t.activeStreams { - if streamID > id && streamID <= upperLimit { - // The stream was unprocessed by the server. -- atomic.StoreUint32(&stream.unprocessed, 1) -- t.closeStream(stream, errStreamDrain, false, http2.ErrCodeNo, statusGoAway, nil, false) -+ if streamID > id && streamID <= upperLimit { -+ atomic.StoreUint32(&stream.unprocessed, 1) -+ streamsToClose = append(streamsToClose, stream) -+ } - } - } -- t.prevGoAwayID = id -- active := len(t.activeStreams) - t.mu.Unlock() -- if active == 0 { -- t.Close(connectionErrorf(true, nil, "received goaway and there are no active streams")) -+ // Called outside t.mu because closeStream can take controlBuf's mu, which -+ // could induce deadlock and is not allowed. -+ for _, stream := range streamsToClose { -+ t.closeStream(stream, errStreamDrain, false, http2.ErrCodeNo, statusGoAway, nil, false) - } - } - - // setGoAwayReason sets the value of t.goAwayReason based - // on the GoAway frame received. --// It expects a lock on transport's mutext to be held by -+// It expects a lock on transport's mutex to be held by - // the caller. - func (t *http2Client) setGoAwayReason(f *http2.GoAwayFrame) { - t.goAwayReason = GoAwayNoReason -@@ -1407,26 +1506,6 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { - } - - isHeader := false -- defer func() { -- if t.statsHandler != nil { -- if isHeader { -- inHeader := &stats.InHeader{ -- Client: true, -- WireLength: int(frame.Header().Length), -- Header: s.header.Copy(), -- Compression: s.recvCompress, -- } -- t.statsHandler.HandleRPC(s.ctx, inHeader) -- } else { -- inTrailer := &stats.InTrailer{ -- Client: true, -- WireLength: int(frame.Header().Length), -- Trailer: s.trailer.Copy(), -- } -- t.statsHandler.HandleRPC(s.ctx, inTrailer) -- } -- } -- }() - - // If headerChan hasn't been closed yet - if atomic.CompareAndSwapUint32(&s.headerChanClosed, 0, 1) { -@@ -1448,6 +1527,25 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { - close(s.headerChan) - } - -+ for _, sh := range t.statsHandlers { -+ if isHeader { -+ inHeader := &stats.InHeader{ -+ Client: true, -+ WireLength: int(frame.Header().Length), -+ Header: metadata.MD(mdata).Copy(), -+ Compression: s.recvCompress, -+ } -+ sh.HandleRPC(s.ctx, inHeader) -+ } else { -+ inTrailer := &stats.InTrailer{ -+ Client: true, -+ WireLength: int(frame.Header().Length), -+ Trailer: metadata.MD(mdata).Copy(), -+ } -+ sh.HandleRPC(s.ctx, inTrailer) -+ } -+ } -+ - if !endStream { - return - } -@@ -1461,33 +1559,35 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { - t.closeStream(s, io.EOF, rst, http2.ErrCodeNo, statusGen, mdata, true) - } - --// reader runs as a separate goroutine in charge of reading data from network --// connection. --// --// TODO(zhaoq): currently one reader per transport. Investigate whether this is --// optimal. --// TODO(zhaoq): Check the validity of the incoming frame sequence. --func (t *http2Client) reader() { -- defer close(t.readerDone) -- // Check the validity of server preface. -+// readServerPreface reads and handles the initial settings frame from the -+// server. -+func (t *http2Client) readServerPreface() error { - frame, err := t.framer.fr.ReadFrame() - if err != nil { -- err = connectionErrorf(true, err, "error reading server preface: %v", err) -- t.Close(err) // this kicks off resetTransport, so must be last before return -- return -- } -- t.conn.SetReadDeadline(time.Time{}) // reset deadline once we get the settings frame (we didn't time out, yay!) -- if t.keepaliveEnabled { -- atomic.StoreInt64(&t.lastRead, time.Now().UnixNano()) -+ return connectionErrorf(true, err, "error reading server preface: %v", err) - } - sf, ok := frame.(*http2.SettingsFrame) - if !ok { -- // this kicks off resetTransport, so must be last before return -- t.Close(connectionErrorf(true, nil, "initial http2 frame from server is not a settings frame: %T", frame)) -- return -+ return connectionErrorf(true, nil, "initial http2 frame from server is not a settings frame: %T", frame) - } -- t.onPrefaceReceipt() - t.handleSettings(sf, true) -+ return nil -+} -+ -+// reader verifies the server preface and reads all subsequent data from -+// network connection. If the server preface is not read successfully, an -+// error is pushed to errCh; otherwise errCh is closed with no error. -+func (t *http2Client) reader(errCh chan<- error) { -+ defer close(t.readerDone) -+ -+ if err := t.readServerPreface(); err != nil { -+ errCh <- err -+ return -+ } -+ close(errCh) -+ if t.keepaliveEnabled { -+ atomic.StoreInt64(&t.lastRead, time.Now().UnixNano()) -+ } - - // loop to keep reading incoming messages on this transport. - for { -@@ -1553,7 +1653,7 @@ func minTime(a, b time.Duration) time.Duration { - return b - } - --// keepalive running in a separate goroutune makes sure the connection is alive by sending pings. -+// keepalive running in a separate goroutine makes sure the connection is alive by sending pings. - func (t *http2Client) keepalive() { - p := &ping{data: [8]byte{}} - // True iff a ping has been sent, and no data has been received since then. -@@ -1690,3 +1790,9 @@ func (t *http2Client) getOutFlowWindow() int64 { - return -2 - } - } -+ -+func (t *http2Client) stateForTesting() transportState { -+ t.mu.Lock() -+ defer t.mu.Unlock() -+ return t.state -+} -diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_server.go b/vendor/google.golang.org/grpc/internal/transport/http2_server.go -index e3799d5..ec4eef2 100644 ---- a/vendor/google.golang.org/grpc/internal/transport/http2_server.go -+++ b/vendor/google.golang.org/grpc/internal/transport/http2_server.go -@@ -35,12 +35,16 @@ import ( - "github.com/golang/protobuf/proto" - "golang.org/x/net/http2" - "golang.org/x/net/http2/hpack" -+ "google.golang.org/grpc/internal/grpclog" - "google.golang.org/grpc/internal/grpcutil" -+ "google.golang.org/grpc/internal/pretty" -+ "google.golang.org/grpc/internal/syscall" - - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/grpcrand" -+ "google.golang.org/grpc/internal/grpcsync" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/peer" -@@ -52,10 +56,10 @@ import ( - var ( - // ErrIllegalHeaderWrite indicates that setting header is illegal because of - // the stream's state. -- ErrIllegalHeaderWrite = errors.New("transport: the stream is done or WriteHeader was already called") -+ ErrIllegalHeaderWrite = status.Error(codes.Internal, "transport: SendHeader called multiple times") - // ErrHeaderListSizeLimitViolation indicates that the header list size is larger - // than the limit set by peer. -- ErrHeaderListSizeLimitViolation = errors.New("transport: trying to send header list size larger than the limit set by peer") -+ ErrHeaderListSizeLimitViolation = status.Error(codes.Internal, "transport: trying to send header list size larger than the limit set by peer") - ) - - // serverConnectionCounter counts the number of connections a server has seen -@@ -73,7 +77,6 @@ type http2Server struct { - writerDone chan struct{} // sync point to enable testing. - remoteAddr net.Addr - localAddr net.Addr -- maxStreamID uint32 // max stream ID ever seen - authInfo credentials.AuthInfo // auth info about the connection - inTapHandle tap.ServerInHandle - framer *framer -@@ -83,7 +86,7 @@ type http2Server struct { - // updates, reset streams, and various settings) to the controller. - controlBuf *controlBuffer - fc *trInFlow -- stats stats.Handler -+ stats []stats.Handler - // Keepalive and max-age parameters for the server. - kp keepalive.ServerParameters - // Keepalive enforcement policy. -@@ -102,13 +105,13 @@ type http2Server struct { - - mu sync.Mutex // guard the following - -- // drainChan is initialized when Drain() is called the first time. -- // After which the server writes out the first GoAway(with ID 2^31-1) frame. -- // Then an independent goroutine will be launched to later send the second GoAway. -- // During this time we don't want to write another first GoAway(with ID 2^31 -1) frame. -- // Thus call to Drain() will be a no-op if drainChan is already initialized since draining is -- // already underway. -- drainChan chan struct{} -+ // drainEvent is initialized when Drain() is called the first time. After -+ // which the server writes out the first GoAway(with ID 2^31-1) frame. Then -+ // an independent goroutine will be launched to later send the second -+ // GoAway. During this time we don't want to write another first GoAway(with -+ // ID 2^31 -1) frame. Thus call to Drain() will be a no-op if drainEvent is -+ // already initialized since draining is already underway. -+ drainEvent *grpcsync.Event - state transportState - activeStreams map[uint32]*Stream - // idle is the time instant when the connection went idle. -@@ -118,21 +121,44 @@ type http2Server struct { - idle time.Time - - // Fields below are for channelz metric collection. -- channelzID int64 // channelz unique identification number -+ channelzID *channelz.Identifier - czData *channelzData - bufferPool *bufferPool - - connectionID uint64 -+ -+ // maxStreamMu guards the maximum stream ID -+ // This lock may not be taken if mu is already held. -+ maxStreamMu sync.Mutex -+ maxStreamID uint32 // max stream ID ever seen -+ -+ logger *grpclog.PrefixLogger - } - - // NewServerTransport creates a http2 transport with conn and configuration - // options from config. - // - // It returns a non-nil transport and a nil error on success. On failure, it --// returns a non-nil transport and a nil-error. For a special case where the -+// returns a nil transport and a non-nil error. For a special case where the - // underlying conn gets closed before the client preface could be read, it - // returns a nil transport and a nil error. - func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, err error) { -+ var authInfo credentials.AuthInfo -+ rawConn := conn -+ if config.Credentials != nil { -+ var err error -+ conn, authInfo, err = config.Credentials.ServerHandshake(rawConn) -+ if err != nil { -+ // ErrConnDispatched means that the connection was dispatched away -+ // from gRPC; those connections should be left open. io.EOF means -+ // the connection was closed before handshaking completed, which can -+ // happen naturally from probers. Return these errors directly. -+ if err == credentials.ErrConnDispatched || err == io.EOF { -+ return nil, err -+ } -+ return nil, connectionErrorf(false, err, "ServerHandshake(%q) failed: %v", rawConn.RemoteAddr(), err) -+ } -+ } - writeBufSize := config.WriteBufferSize - readBufSize := config.ReadBufferSize - maxHeaderListSize := defaultServerMaxHeaderListSize -@@ -145,15 +171,10 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, - ID: http2.SettingMaxFrameSize, - Val: http2MaxFrameLen, - }} -- // TODO(zhaoq): Have a better way to signal "no limit" because 0 is -- // permitted in the HTTP2 spec. -- maxStreams := config.MaxStreams -- if maxStreams == 0 { -- maxStreams = math.MaxUint32 -- } else { -+ if config.MaxStreams != math.MaxUint32 { - isettings = append(isettings, http2.Setting{ - ID: http2.SettingMaxConcurrentStreams, -- Val: maxStreams, -+ Val: config.MaxStreams, - }) - } - dynamicWindow := true -@@ -211,27 +232,33 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, - if kp.Timeout == 0 { - kp.Timeout = defaultServerKeepaliveTimeout - } -+ if kp.Time != infinity { -+ if err = syscall.SetTCPUserTimeout(conn, kp.Timeout); err != nil { -+ return nil, connectionErrorf(false, err, "transport: failed to set TCP_USER_TIMEOUT: %v", err) -+ } -+ } - kep := config.KeepalivePolicy - if kep.MinTime == 0 { - kep.MinTime = defaultKeepalivePolicyMinTime - } -+ - done := make(chan struct{}) - t := &http2Server{ -- ctx: context.Background(), -+ ctx: setConnection(context.Background(), rawConn), - done: done, - conn: conn, - remoteAddr: conn.RemoteAddr(), - localAddr: conn.LocalAddr(), -- authInfo: config.AuthInfo, -+ authInfo: authInfo, - framer: framer, - readerDone: make(chan struct{}), - writerDone: make(chan struct{}), -- maxStreams: maxStreams, -+ maxStreams: config.MaxStreams, - inTapHandle: config.InTapHandle, - fc: &trInFlow{limit: uint32(icwz)}, - state: reachable, - activeStreams: make(map[uint32]*Stream), -- stats: config.StatsHandler, -+ stats: config.StatsHandlers, - kp: kp, - idle: time.Now(), - kep: kep, -@@ -239,6 +266,10 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, - czData: new(channelzData), - bufferPool: newBufferPool(), - } -+ t.logger = prefixLoggerForServerTransport(t) -+ // Add peer information to the http2server context. -+ t.ctx = peer.NewContext(t.ctx, t.getPeer()) -+ - t.controlBuf = newControlBuffer(t.done) - if dynamicWindow { - t.bdpEst = &bdpEstimator{ -@@ -246,25 +277,25 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, - updateFlowControl: t.updateFlowControl, - } - } -- if t.stats != nil { -- t.ctx = t.stats.TagConn(t.ctx, &stats.ConnTagInfo{ -+ for _, sh := range t.stats { -+ t.ctx = sh.TagConn(t.ctx, &stats.ConnTagInfo{ - RemoteAddr: t.remoteAddr, - LocalAddr: t.localAddr, - }) - connBegin := &stats.ConnBegin{} -- t.stats.HandleConn(t.ctx, connBegin) -+ sh.HandleConn(t.ctx, connBegin) - } -- if channelz.IsOn() { -- t.channelzID = channelz.RegisterNormalSocket(t, config.ChannelzParentID, fmt.Sprintf("%s -> %s", t.remoteAddr, t.localAddr)) -+ t.channelzID, err = channelz.RegisterNormalSocket(t, config.ChannelzParentID, fmt.Sprintf("%s -> %s", t.remoteAddr, t.localAddr)) -+ if err != nil { -+ return nil, err - } - - t.connectionID = atomic.AddUint64(&serverConnectionCounter, 1) -- - t.framer.writer.Flush() - - defer func() { - if err != nil { -- t.Close() -+ t.Close(err) - } - }() - -@@ -273,10 +304,11 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, - if _, err := io.ReadFull(t.conn, preface); err != nil { - // In deployments where a gRPC server runs behind a cloud load balancer - // which performs regular TCP level health checks, the connection is -- // closed immediately by the latter. Skipping the error here will help -- // reduce log clutter. -+ // closed immediately by the latter. Returning io.EOF here allows the -+ // grpc server implementation to recognize this scenario and suppress -+ // logging to reduce spam. - if err == io.EOF { -- return nil, nil -+ return nil, io.EOF - } - return nil, connectionErrorf(false, err, "transport: http2Server.HandleStreams failed to receive the preface from client: %v", err) - } -@@ -299,23 +331,22 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, - t.handleSettings(sf) - - go func() { -- t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst) -+ t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger) - t.loopy.ssGoAwayHandler = t.outgoingGoAwayHandler -- if err := t.loopy.run(); err != nil { -- if logger.V(logLevel) { -- logger.Errorf("transport: loopyWriter.run returning. Err: %v", err) -- } -- } -- t.conn.Close() -- t.controlBuf.finish() -+ t.loopy.run() - close(t.writerDone) - }() - go t.keepalive() - return t, nil - } - --// operateHeader takes action on the decoded headers. --func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(*Stream), traceCtx func(context.Context, string) context.Context) (fatal bool) { -+// operateHeaders takes action on the decoded headers. Returns an error if fatal -+// error encountered and transport needs to close, otherwise returns nil. -+func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(*Stream), traceCtx func(context.Context, string) context.Context) error { -+ // Acquire max stream ID lock for entire duration -+ t.maxStreamMu.Lock() -+ defer t.maxStreamMu.Unlock() -+ - streamID := frame.Header().StreamID - - // frame.Truncated is set to true when framer detects that the current header -@@ -327,9 +358,15 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( - rstCode: http2.ErrCodeFrameSize, - onWrite: func() {}, - }) -- return false -+ return nil - } - -+ if streamID%2 != 1 || streamID <= t.maxStreamID { -+ // illegal gRPC stream id. -+ return fmt.Errorf("received an illegal stream id: %v. headers frame: %+v", streamID, frame) -+ } -+ t.maxStreamID = streamID -+ - buf := newRecvBuffer() - s := &Stream{ - id: streamID, -@@ -337,15 +374,15 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( - buf: buf, - fc: &inFlow{limit: uint32(t.initialWindowSize)}, - } -- - var ( -- // If a gRPC Response-Headers has already been received, then it means -- // that the peer is speaking gRPC and we are in gRPC mode. -- isGRPC = false -- mdata = make(map[string][]string) -- httpMethod string -- // headerError is set if an error is encountered while parsing the headers -- headerError bool -+ // if false, content-type was missing or invalid -+ isGRPC = false -+ contentType = "" -+ mdata = make(metadata.MD, len(frame.Fields)) -+ httpMethod string -+ // these are set if an error is encountered while parsing the headers -+ protocolError bool -+ headerError *status.Status - - timeoutSet bool - timeout time.Duration -@@ -356,11 +393,23 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( - case "content-type": - contentSubtype, validContentType := grpcutil.ContentSubtype(hf.Value) - if !validContentType { -+ contentType = hf.Value - break - } - mdata[hf.Name] = append(mdata[hf.Name], hf.Value) - s.contentSubtype = contentSubtype - isGRPC = true -+ -+ case "grpc-accept-encoding": -+ mdata[hf.Name] = append(mdata[hf.Name], hf.Value) -+ if hf.Value == "" { -+ continue -+ } -+ compressors := hf.Value -+ if s.clientAdvertisedCompressors != "" { -+ compressors = s.clientAdvertisedCompressors + "," + compressors -+ } -+ s.clientAdvertisedCompressors = compressors - case "grpc-encoding": - s.recvCompress = hf.Value - case ":method": -@@ -371,30 +420,90 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( - timeoutSet = true - var err error - if timeout, err = decodeTimeout(hf.Value); err != nil { -- headerError = true -+ headerError = status.Newf(codes.Internal, "malformed grpc-timeout: %v", err) - } -+ // "Transports must consider requests containing the Connection header -+ // as malformed." - A41 -+ case "connection": -+ if t.logger.V(logLevel) { -+ t.logger.Infof("Received a HEADERS frame with a :connection header which makes the request malformed, as per the HTTP/2 spec") -+ } -+ protocolError = true - default: - if isReservedHeader(hf.Name) && !isWhitelistedHeader(hf.Name) { - break - } - v, err := decodeMetadataHeader(hf.Name, hf.Value) - if err != nil { -- headerError = true -- logger.Warningf("Failed to decode metadata header (%q, %q): %v", hf.Name, hf.Value, err) -+ headerError = status.Newf(codes.Internal, "malformed binary metadata %q in header %q: %v", hf.Value, hf.Name, err) -+ t.logger.Warningf("Failed to decode metadata header (%q, %q): %v", hf.Name, hf.Value, err) - break - } - mdata[hf.Name] = append(mdata[hf.Name], v) - } - } - -- if !isGRPC || headerError { -+ // "If multiple Host headers or multiple :authority headers are present, the -+ // request must be rejected with an HTTP status code 400 as required by Host -+ // validation in RFC 7230 §5.4, gRPC status code INTERNAL, or RST_STREAM -+ // with HTTP/2 error code PROTOCOL_ERROR." - A41. Since this is a HTTP/2 -+ // error, this takes precedence over a client not speaking gRPC. -+ if len(mdata[":authority"]) > 1 || len(mdata["host"]) > 1 { -+ errMsg := fmt.Sprintf("num values of :authority: %v, num values of host: %v, both must only have 1 value as per HTTP/2 spec", len(mdata[":authority"]), len(mdata["host"])) -+ if t.logger.V(logLevel) { -+ t.logger.Infof("Aborting the stream early: %v", errMsg) -+ } -+ t.controlBuf.put(&earlyAbortStream{ -+ httpStatus: http.StatusBadRequest, -+ streamID: streamID, -+ contentSubtype: s.contentSubtype, -+ status: status.New(codes.Internal, errMsg), -+ rst: !frame.StreamEnded(), -+ }) -+ return nil -+ } -+ -+ if protocolError { - t.controlBuf.put(&cleanupStream{ - streamID: streamID, - rst: true, - rstCode: http2.ErrCodeProtocol, - onWrite: func() {}, - }) -- return false -+ return nil -+ } -+ if !isGRPC { -+ t.controlBuf.put(&earlyAbortStream{ -+ httpStatus: http.StatusUnsupportedMediaType, -+ streamID: streamID, -+ contentSubtype: s.contentSubtype, -+ status: status.Newf(codes.InvalidArgument, "invalid gRPC request content-type %q", contentType), -+ rst: !frame.StreamEnded(), -+ }) -+ return nil -+ } -+ if headerError != nil { -+ t.controlBuf.put(&earlyAbortStream{ -+ httpStatus: http.StatusBadRequest, -+ streamID: streamID, -+ contentSubtype: s.contentSubtype, -+ status: headerError, -+ rst: !frame.StreamEnded(), -+ }) -+ return nil -+ } -+ -+ // "If :authority is missing, Host must be renamed to :authority." - A41 -+ if len(mdata[":authority"]) == 0 { -+ // No-op if host isn't present, no eventual :authority header is a valid -+ // RPC. -+ if host, ok := mdata["host"]; ok { -+ mdata[":authority"] = host -+ delete(mdata, "host") -+ } -+ } else { -+ // "If :authority is present, Host must be discarded" - A41 -+ delete(mdata, "host") - } - - if frame.StreamEnded() { -@@ -406,14 +515,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( - } else { - s.ctx, s.cancel = context.WithCancel(t.ctx) - } -- pr := &peer.Peer{ -- Addr: t.remoteAddr, -- } -- // Attach Auth info if there is any. -- if t.authInfo != nil { -- pr.AuthInfo = t.authInfo -- } -- s.ctx = peer.NewContext(s.ctx, pr) -+ - // Attach the received metadata to the context. - if len(mdata) > 0 { - s.ctx = metadata.NewIncomingContext(s.ctx, mdata) -@@ -428,7 +530,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( - if t.state != reachable { - t.mu.Unlock() - s.cancel() -- return false -+ return nil - } - if uint32(len(t.activeStreams)) >= t.maxStreams { - t.mu.Unlock() -@@ -439,49 +541,43 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( - onWrite: func() {}, - }) - s.cancel() -- return false -- } -- if streamID%2 != 1 || streamID <= t.maxStreamID { -- t.mu.Unlock() -- // illegal gRPC stream id. -- if logger.V(logLevel) { -- logger.Errorf("transport: http2Server.HandleStreams received an illegal stream id: %v", streamID) -- } -- s.cancel() -- return true -+ return nil - } -- t.maxStreamID = streamID - if httpMethod != http.MethodPost { - t.mu.Unlock() -- if logger.V(logLevel) { -- logger.Infof("transport: http2Server.operateHeaders parsed a :method field: %v which should be POST", httpMethod) -+ errMsg := fmt.Sprintf("Received a HEADERS frame with :method %q which should be POST", httpMethod) -+ if t.logger.V(logLevel) { -+ t.logger.Infof("Aborting the stream early: %v", errMsg) - } -- t.controlBuf.put(&cleanupStream{ -- streamID: streamID, -- rst: true, -- rstCode: http2.ErrCodeProtocol, -- onWrite: func() {}, -+ t.controlBuf.put(&earlyAbortStream{ -+ httpStatus: 405, -+ streamID: streamID, -+ contentSubtype: s.contentSubtype, -+ status: status.New(codes.Internal, errMsg), -+ rst: !frame.StreamEnded(), - }) - s.cancel() -- return false -+ return nil - } - if t.inTapHandle != nil { - var err error - if s.ctx, err = t.inTapHandle(s.ctx, &tap.Info{FullMethodName: s.method}); err != nil { - t.mu.Unlock() -- if logger.V(logLevel) { -- logger.Infof("transport: http2Server.operateHeaders got an error from InTapHandle: %v", err) -+ if t.logger.V(logLevel) { -+ t.logger.Infof("Aborting the stream early due to InTapHandle failure: %v", err) - } - stat, ok := status.FromError(err) - if !ok { - stat = status.New(codes.PermissionDenied, err.Error()) - } - t.controlBuf.put(&earlyAbortStream{ -+ httpStatus: 200, - streamID: s.id, - contentSubtype: s.contentSubtype, - status: stat, -+ rst: !frame.StreamEnded(), - }) -- return false -+ return nil - } - } - t.activeStreams[streamID] = s -@@ -497,17 +593,17 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( - t.adjustWindow(s, uint32(n)) - } - s.ctx = traceCtx(s.ctx, s.method) -- if t.stats != nil { -- s.ctx = t.stats.TagRPC(s.ctx, &stats.RPCTagInfo{FullMethodName: s.method}) -+ for _, sh := range t.stats { -+ s.ctx = sh.TagRPC(s.ctx, &stats.RPCTagInfo{FullMethodName: s.method}) - inHeader := &stats.InHeader{ - FullMethod: s.method, - RemoteAddr: t.remoteAddr, - LocalAddr: t.localAddr, - Compression: s.recvCompress, - WireLength: int(frame.Header().Length), -- Header: metadata.MD(mdata).Copy(), -+ Header: mdata.Copy(), - } -- t.stats.HandleRPC(s.ctx, inHeader) -+ sh.HandleRPC(s.ctx, inHeader) - } - s.ctxDone = s.ctx.Done() - s.wq = newWriteQuota(defaultWriteQuota, s.ctxDone) -@@ -528,7 +624,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( - wq: s.wq, - }) - handle(s) -- return false -+ return nil - } - - // HandleStreams receives incoming streams using the given handler. This is -@@ -542,8 +638,8 @@ func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context. - atomic.StoreInt64(&t.lastRead, time.Now().UnixNano()) - if err != nil { - if se, ok := err.(http2.StreamError); ok { -- if logger.V(logLevel) { -- logger.Warningf("transport: http2Server.HandleStreams encountered http2.StreamError: %v", se) -+ if t.logger.V(logLevel) { -+ t.logger.Warningf("Encountered http2.StreamError: %v", se) - } - t.mu.Lock() - s := t.activeStreams[se.StreamID] -@@ -561,19 +657,16 @@ func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context. - continue - } - if err == io.EOF || err == io.ErrUnexpectedEOF { -- t.Close() -+ t.Close(err) - return - } -- if logger.V(logLevel) { -- logger.Warningf("transport: http2Server.HandleStreams failed to read frame: %v", err) -- } -- t.Close() -+ t.Close(err) - return - } - switch frame := frame.(type) { - case *http2.MetaHeadersFrame: -- if t.operateHeaders(frame, handle, traceCtx) { -- t.Close() -+ if err := t.operateHeaders(frame, handle, traceCtx); err != nil { -+ t.Close(err) - break - } - case *http2.DataFrame: -@@ -589,8 +682,8 @@ func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context. - case *http2.GoAwayFrame: - // TODO: Handle GoAway from the client appropriately. - default: -- if logger.V(logLevel) { -- logger.Errorf("transport: http2Server.HandleStreams found unhandled frame type %v.", frame) -+ if t.logger.V(logLevel) { -+ t.logger.Infof("Received unsupported frame type %T", frame) - } - } - } -@@ -717,7 +810,7 @@ func (t *http2Server) handleData(f *http2.DataFrame) { - s.write(recvMsg{buffer: buffer}) - } - } -- if f.Header().Flags.Has(http2.FlagDataEndStream) { -+ if f.StreamEnded() { - // Received the end of stream from the client. - s.compareAndSwapState(streamActive, streamReadDone) - s.write(recvMsg{err: io.EOF}) -@@ -774,8 +867,8 @@ const ( - - func (t *http2Server) handlePing(f *http2.PingFrame) { - if f.IsAck() { -- if f.Data == goAwayPing.data && t.drainChan != nil { -- close(t.drainChan) -+ if f.Data == goAwayPing.data && t.drainEvent != nil { -+ t.drainEvent.Fire() - return - } - // Maybe it's a BDP ping. -@@ -817,10 +910,7 @@ func (t *http2Server) handlePing(f *http2.PingFrame) { - - if t.pingStrikes > maxPingStrikes { - // Send goaway and close the connection. -- if logger.V(logLevel) { -- logger.Errorf("transport: Got too many pings from the client, closing the connection.") -- } -- t.controlBuf.put(&goAway{code: http2.ErrCodeEnhanceYourCalm, debugData: []byte("too_many_pings"), closeConn: true}) -+ t.controlBuf.put(&goAway{code: http2.ErrCodeEnhanceYourCalm, debugData: []byte("too_many_pings"), closeConn: errors.New("got too many pings from the client")}) - } - } - -@@ -852,8 +942,8 @@ func (t *http2Server) checkForHeaderListSize(it interface{}) bool { - var sz int64 - for _, f := range hdrFrame.hf { - if sz += int64(f.Size()); sz > int64(*t.maxSendHeaderListSize) { -- if logger.V(logLevel) { -- logger.Errorf("header list size to send violates the maximum size (%d bytes) set by client", *t.maxSendHeaderListSize) -+ if t.logger.V(logLevel) { -+ t.logger.Infof("Header list size to send violates the maximum size (%d bytes) set by client", *t.maxSendHeaderListSize) - } - return false - } -@@ -861,12 +951,27 @@ func (t *http2Server) checkForHeaderListSize(it interface{}) bool { - return true - } - -+func (t *http2Server) streamContextErr(s *Stream) error { -+ select { -+ case <-t.done: -+ return ErrConnClosing -+ default: -+ } -+ return ContextErr(s.ctx.Err()) -+} -+ - // WriteHeader sends the header metadata md back to the client. - func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { -- if s.updateHeaderSent() || s.getState() == streamDone { -+ s.hdrMu.Lock() -+ defer s.hdrMu.Unlock() -+ if s.getState() == streamDone { -+ return t.streamContextErr(s) -+ } -+ -+ if s.updateHeaderSent() { - return ErrIllegalHeaderWrite - } -- s.hdrMu.Lock() -+ - if md.Len() > 0 { - if s.header.Len() > 0 { - s.header = metadata.Join(s.header, md) -@@ -875,10 +980,8 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { - } - } - if err := t.writeHeaderLocked(s); err != nil { -- s.hdrMu.Unlock() -- return err -+ return status.Convert(err).Err() - } -- s.hdrMu.Unlock() - return nil - } - -@@ -909,14 +1012,14 @@ func (t *http2Server) writeHeaderLocked(s *Stream) error { - t.closeStream(s, true, http2.ErrCodeInternal, false) - return ErrHeaderListSizeLimitViolation - } -- if t.stats != nil { -+ for _, sh := range t.stats { - // Note: Headers are compressed with hpack after this call returns. - // No WireLength field is set here. - outHeader := &stats.OutHeader{ - Header: s.header.Copy(), - Compression: s.sendCompress, - } -- t.stats.HandleRPC(s.Context(), outHeader) -+ sh.HandleRPC(s.Context(), outHeader) - } - return nil - } -@@ -926,17 +1029,19 @@ func (t *http2Server) writeHeaderLocked(s *Stream) error { - // TODO(zhaoq): Now it indicates the end of entire stream. Revisit if early - // OK is adopted. - func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { -+ s.hdrMu.Lock() -+ defer s.hdrMu.Unlock() -+ - if s.getState() == streamDone { - return nil - } -- s.hdrMu.Lock() -+ - // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields - // first and create a slice of that exact size. - headerFields := make([]hpack.HeaderField, 0, 2) // grpc-status and grpc-message will be there if none else. - if !s.updateHeaderSent() { // No headers have been sent. - if len(s.header) > 0 { // Send a separate header frame. - if err := t.writeHeaderLocked(s); err != nil { -- s.hdrMu.Unlock() - return err - } - } else { // Send a trailer only response. -@@ -951,7 +1056,7 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { - stBytes, err := proto.Marshal(p) - if err != nil { - // TODO: return error instead, when callers are able to handle it. -- logger.Errorf("transport: failed to marshal rpc status: %v, error: %v", p, err) -+ t.logger.Errorf("Failed to marshal rpc status: %s, error: %v", pretty.ToJSON(p), err) - } else { - headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status-details-bin", Value: encodeBinHeader(stBytes)}) - } -@@ -965,7 +1070,7 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { - endStream: true, - onWrite: t.setResetPingStrikes, - } -- s.hdrMu.Unlock() -+ - success, err := t.controlBuf.execute(t.checkForHeaderListSize, trailingHeader) - if !success { - if err != nil { -@@ -977,10 +1082,10 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { - // Send a RST_STREAM after the trailers if the client has not already half-closed. - rst := s.getState() == streamActive - t.finishStream(s, rst, http2.ErrCodeNo, trailingHeader, true) -- if t.stats != nil { -+ for _, sh := range t.stats { - // Note: The trailer fields are compressed with hpack after this call returns. - // No WireLength field is set here. -- t.stats.HandleRPC(s.Context(), &stats.OutTrailer{ -+ sh.HandleRPC(s.Context(), &stats.OutTrailer{ - Trailer: s.trailer.Copy(), - }) - } -@@ -992,23 +1097,12 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { - func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) error { - if !s.isHeaderSent() { // Headers haven't been written yet. - if err := t.WriteHeader(s, nil); err != nil { -- if _, ok := err.(ConnectionError); ok { -- return err -- } -- // TODO(mmukhi, dfawley): Make sure this is the right code to return. -- return status.Errorf(codes.Internal, "transport: %v", err) -+ return err - } - } else { - // Writing headers checks for this condition. - if s.getState() == streamDone { -- // TODO(mmukhi, dfawley): Should the server write also return io.EOF? -- s.cancel() -- select { -- case <-t.done: -- return ErrConnClosing -- default: -- } -- return ContextErr(s.ctx.Err()) -+ return t.streamContextErr(s) - } - } - df := &dataFrame{ -@@ -1018,12 +1112,7 @@ func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) e - onEachWrite: t.setResetPingStrikes, - } - if err := s.wq.get(int32(len(hdr) + len(data))); err != nil { -- select { -- case <-t.done: -- return ErrConnClosing -- default: -- } -- return ContextErr(s.ctx.Err()) -+ return t.streamContextErr(s) - } - return t.controlBuf.put(df) - } -@@ -1072,20 +1161,20 @@ func (t *http2Server) keepalive() { - if val <= 0 { - // The connection has been idle for a duration of keepalive.MaxConnectionIdle or more. - // Gracefully close the connection. -- t.Drain() -+ t.Drain("max_idle") - return - } - idleTimer.Reset(val) - case <-ageTimer.C: -- t.Drain() -+ t.Drain("max_age") - ageTimer.Reset(t.kp.MaxConnectionAgeGrace) - select { - case <-ageTimer.C: - // Close the connection after grace period. -- if logger.V(logLevel) { -- logger.Infof("transport: closing server transport due to maximum connection age.") -+ if t.logger.V(logLevel) { -+ t.logger.Infof("Closing server transport due to maximum connection age") - } -- t.Close() -+ t.controlBuf.put(closeConnection{}) - case <-t.done: - } - return -@@ -1101,10 +1190,7 @@ func (t *http2Server) keepalive() { - continue - } - if outstandingPing && kpTimeoutLeft <= 0 { -- if logger.V(logLevel) { -- logger.Infof("transport: closing server transport due to idleness.") -- } -- t.Close() -+ t.Close(fmt.Errorf("keepalive ping not acked within timeout %s", t.kp.Time)) - return - } - if !outstandingPing { -@@ -1131,40 +1217,37 @@ func (t *http2Server) keepalive() { - // Close starts shutting down the http2Server transport. - // TODO(zhaoq): Now the destruction is not blocked on any pending streams. This - // could cause some resource issue. Revisit this later. --func (t *http2Server) Close() { -+func (t *http2Server) Close(err error) { - t.mu.Lock() - if t.state == closing { - t.mu.Unlock() - return - } -+ if t.logger.V(logLevel) { -+ t.logger.Infof("Closing: %v", err) -+ } - t.state = closing - streams := t.activeStreams - t.activeStreams = nil - t.mu.Unlock() - t.controlBuf.finish() - close(t.done) -- if err := t.conn.Close(); err != nil && logger.V(logLevel) { -- logger.Infof("transport: error closing conn during Close: %v", err) -- } -- if channelz.IsOn() { -- channelz.RemoveEntry(t.channelzID) -+ if err := t.conn.Close(); err != nil && t.logger.V(logLevel) { -+ t.logger.Infof("Error closing underlying net.Conn during Close: %v", err) - } -+ channelz.RemoveEntry(t.channelzID) - // Cancel all active streams. - for _, s := range streams { - s.cancel() - } -- if t.stats != nil { -+ for _, sh := range t.stats { - connEnd := &stats.ConnEnd{} -- t.stats.HandleConn(t.ctx, connEnd) -+ sh.HandleConn(t.ctx, connEnd) - } - } - - // deleteStream deletes the stream s from transport's active streams. - func (t *http2Server) deleteStream(s *Stream, eosReceived bool) { -- // In case stream sending and receiving are invoked in separate -- // goroutines (e.g., bi-directional streaming), cancel needs to be -- // called to interrupt the potential blocking on other goroutines. -- s.cancel() - - t.mu.Lock() - if _, ok := t.activeStreams[s.id]; ok { -@@ -1186,6 +1269,11 @@ func (t *http2Server) deleteStream(s *Stream, eosReceived bool) { - - // finishStream closes the stream and puts the trailing headerFrame into controlbuf. - func (t *http2Server) finishStream(s *Stream, rst bool, rstCode http2.ErrCode, hdr *headerFrame, eosReceived bool) { -+ // In case stream sending and receiving are invoked in separate -+ // goroutines (e.g., bi-directional streaming), cancel needs to be -+ // called to interrupt the potential blocking on other goroutines. -+ s.cancel() -+ - oldState := s.swapState(streamDone) - if oldState == streamDone { - // If the stream was already done, return. -@@ -1205,6 +1293,11 @@ func (t *http2Server) finishStream(s *Stream, rst bool, rstCode http2.ErrCode, h - - // closeStream clears the footprint of a stream when the stream is not needed any more. - func (t *http2Server) closeStream(s *Stream, rst bool, rstCode http2.ErrCode, eosReceived bool) { -+ // In case stream sending and receiving are invoked in separate -+ // goroutines (e.g., bi-directional streaming), cancel needs to be -+ // called to interrupt the potential blocking on other goroutines. -+ s.cancel() -+ - s.swapState(streamDone) - t.deleteStream(s, eosReceived) - -@@ -1220,14 +1313,14 @@ func (t *http2Server) RemoteAddr() net.Addr { - return t.remoteAddr - } - --func (t *http2Server) Drain() { -+func (t *http2Server) Drain(debugData string) { - t.mu.Lock() - defer t.mu.Unlock() -- if t.drainChan != nil { -+ if t.drainEvent != nil { - return - } -- t.drainChan = make(chan struct{}) -- t.controlBuf.put(&goAway{code: http2.ErrCodeNo, debugData: []byte{}, headsUp: true}) -+ t.drainEvent = grpcsync.NewEvent() -+ t.controlBuf.put(&goAway{code: http2.ErrCodeNo, debugData: []byte(debugData), headsUp: true}) - } - - var goAwayPing = &ping{data: [8]byte{1, 6, 1, 8, 0, 3, 3, 9}} -@@ -1235,39 +1328,41 @@ var goAwayPing = &ping{data: [8]byte{1, 6, 1, 8, 0, 3, 3, 9}} - // Handles outgoing GoAway and returns true if loopy needs to put itself - // in draining mode. - func (t *http2Server) outgoingGoAwayHandler(g *goAway) (bool, error) { -+ t.maxStreamMu.Lock() - t.mu.Lock() - if t.state == closing { // TODO(mmukhi): This seems unnecessary. - t.mu.Unlock() -+ t.maxStreamMu.Unlock() - // The transport is closing. - return false, ErrConnClosing - } -- sid := t.maxStreamID - if !g.headsUp { - // Stop accepting more streams now. - t.state = draining -+ sid := t.maxStreamID -+ retErr := g.closeConn - if len(t.activeStreams) == 0 { -- g.closeConn = true -+ retErr = errors.New("second GOAWAY written and no active streams left to process") - } - t.mu.Unlock() -+ t.maxStreamMu.Unlock() - if err := t.framer.fr.WriteGoAway(sid, g.code, g.debugData); err != nil { - return false, err - } -- if g.closeConn { -- // Abruptly close the connection following the GoAway (via -- // loopywriter). But flush out what's inside the buffer first. -- t.framer.writer.Flush() -- return false, fmt.Errorf("transport: Connection closing") -+ if retErr != nil { -+ return false, retErr - } - return true, nil - } - t.mu.Unlock() -+ t.maxStreamMu.Unlock() - // For a graceful close, send out a GoAway with stream ID of MaxUInt32, - // Follow that with a ping and wait for the ack to come back or a timer - // to expire. During this time accept new streams since they might have - // originated before the GoAway reaches the client. - // After getting the ack or timer expiration send out another GoAway this - // time with an ID of the max stream server intends to process. -- if err := t.framer.fr.WriteGoAway(math.MaxUint32, http2.ErrCodeNo, []byte{}); err != nil { -+ if err := t.framer.fr.WriteGoAway(math.MaxUint32, http2.ErrCodeNo, g.debugData); err != nil { - return false, err - } - if err := t.framer.fr.WritePing(false, goAwayPing.data); err != nil { -@@ -1277,7 +1372,7 @@ func (t *http2Server) outgoingGoAwayHandler(g *goAway) (bool, error) { - timer := time.NewTimer(time.Minute) - defer timer.Stop() - select { -- case <-t.drainChan: -+ case <-t.drainEvent.Done(): - case <-timer.C: - case <-t.done: - return -@@ -1336,6 +1431,13 @@ func (t *http2Server) getOutFlowWindow() int64 { - } - } - -+func (t *http2Server) getPeer() *peer.Peer { -+ return &peer.Peer{ -+ Addr: t.remoteAddr, -+ AuthInfo: t.authInfo, // Can be nil -+ } -+} -+ - func getJitter(v time.Duration) time.Duration { - if v == infinity { - return 0 -@@ -1345,3 +1447,18 @@ func getJitter(v time.Duration) time.Duration { - j := grpcrand.Int63n(2*r) - r - return time.Duration(j) - } -+ -+type connectionKey struct{} -+ -+// GetConnection gets the connection from the context. -+func GetConnection(ctx context.Context) net.Conn { -+ conn, _ := ctx.Value(connectionKey{}).(net.Conn) -+ return conn -+} -+ -+// SetConnection adds the connection to the context to be able to get -+// information about the destination ip and port for an incoming RPC. This also -+// allows any unary or streaming interceptors to see the connection. -+func setConnection(ctx context.Context, conn net.Conn) context.Context { -+ return context.WithValue(ctx, connectionKey{}, conn) -+} -diff --git a/vendor/google.golang.org/grpc/internal/transport/http_util.go b/vendor/google.golang.org/grpc/internal/transport/http_util.go -index d8247bc..19cbb18 100644 ---- a/vendor/google.golang.org/grpc/internal/transport/http_util.go -+++ b/vendor/google.golang.org/grpc/internal/transport/http_util.go -@@ -20,8 +20,8 @@ package transport - - import ( - "bufio" -- "bytes" - "encoding/base64" -+ "errors" - "fmt" - "io" - "math" -@@ -38,21 +38,14 @@ import ( - "golang.org/x/net/http2/hpack" - spb "google.golang.org/genproto/googleapis/rpc/status" - "google.golang.org/grpc/codes" -- "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/status" - ) - - const ( - // http2MaxFrameLen specifies the max length of a HTTP2 frame. - http2MaxFrameLen = 16384 // 16KB frame -- // http://http2.github.io/http2-spec/#SettingValues -+ // https://httpwg.org/specs/rfc7540.html#SettingValues - http2InitHeaderTableSize = 4096 -- // baseContentType is the base content-type for gRPC. This is a valid -- // content-type on it's own, but can also include a content-subtype such as -- // "proto" as a suffix after "+" or ";". See -- // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests -- // for more details. -- - ) - - var ( -@@ -92,7 +85,6 @@ var ( - // 504 Gateway timeout - UNAVAILABLE. - http.StatusGatewayTimeout: codes.Unavailable, - } -- logger = grpclog.Component("transport") - ) - - // isReservedHeader checks whether hdr belongs to HTTP2 headers -@@ -257,13 +249,13 @@ func encodeGrpcMessage(msg string) string { - } - - func encodeGrpcMessageUnchecked(msg string) string { -- var buf bytes.Buffer -+ var sb strings.Builder - for len(msg) > 0 { - r, size := utf8.DecodeRuneInString(msg) - for _, b := range []byte(string(r)) { - if size > 1 { - // If size > 1, r is not ascii. Always do percent encoding. -- buf.WriteString(fmt.Sprintf("%%%02X", b)) -+ fmt.Fprintf(&sb, "%%%02X", b) - continue - } - -@@ -272,14 +264,14 @@ func encodeGrpcMessageUnchecked(msg string) string { - // - // fmt.Sprintf("%%%02X", utf8.RuneError) gives "%FFFD". - if b >= spaceByte && b <= tildeByte && b != percentByte { -- buf.WriteByte(b) -+ sb.WriteByte(b) - } else { -- buf.WriteString(fmt.Sprintf("%%%02X", b)) -+ fmt.Fprintf(&sb, "%%%02X", b) - } - } - msg = msg[size:] - } -- return buf.String() -+ return sb.String() - } - - // decodeGrpcMessage decodes the msg encoded by encodeGrpcMessage. -@@ -297,23 +289,23 @@ func decodeGrpcMessage(msg string) string { - } - - func decodeGrpcMessageUnchecked(msg string) string { -- var buf bytes.Buffer -+ var sb strings.Builder - lenMsg := len(msg) - for i := 0; i < lenMsg; i++ { - c := msg[i] - if c == percentByte && i+2 < lenMsg { - parsed, err := strconv.ParseUint(msg[i+1:i+3], 16, 8) - if err != nil { -- buf.WriteByte(c) -+ sb.WriteByte(c) - } else { -- buf.WriteByte(byte(parsed)) -+ sb.WriteByte(byte(parsed)) - i += 2 - } - } else { -- buf.WriteByte(c) -+ sb.WriteByte(c) - } - } -- return buf.String() -+ return sb.String() - } - - type bufWriter struct { -@@ -322,8 +314,6 @@ type bufWriter struct { - batchSize int - conn net.Conn - err error -- -- onFlush func() - } - - func newBufWriter(conn net.Conn, batchSize int) *bufWriter { -@@ -339,7 +329,8 @@ func (w *bufWriter) Write(b []byte) (n int, err error) { - return 0, w.err - } - if w.batchSize == 0 { // Buffer has been disabled. -- return w.conn.Write(b) -+ n, err = w.conn.Write(b) -+ return n, toIOError(err) - } - for len(b) > 0 { - nn := copy(w.buf[w.offset:], b) -@@ -360,14 +351,31 @@ func (w *bufWriter) Flush() error { - if w.offset == 0 { - return nil - } -- if w.onFlush != nil { -- w.onFlush() -- } - _, w.err = w.conn.Write(w.buf[:w.offset]) -+ w.err = toIOError(w.err) - w.offset = 0 - return w.err - } - -+type ioError struct { -+ error -+} -+ -+func (i ioError) Unwrap() error { -+ return i.error -+} -+ -+func isIOError(err error) bool { -+ return errors.As(err, &ioError{}) -+} -+ -+func toIOError(err error) error { -+ if err == nil { -+ return nil -+ } -+ return ioError{error: err} -+} -+ - type framer struct { - writer *bufWriter - fr *http2.Framer -diff --git a/vendor/google.golang.org/grpc/internal/transport/logging.go b/vendor/google.golang.org/grpc/internal/transport/logging.go -new file mode 100644 -index 0000000..42ed2b0 ---- /dev/null -+++ b/vendor/google.golang.org/grpc/internal/transport/logging.go -@@ -0,0 +1,40 @@ -+/* -+ * -+ * Copyright 2023 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+package transport -+ -+import ( -+ "fmt" -+ -+ "google.golang.org/grpc/grpclog" -+ internalgrpclog "google.golang.org/grpc/internal/grpclog" -+) -+ -+var logger = grpclog.Component("transport") -+ -+func prefixLoggerForServerTransport(p *http2Server) *internalgrpclog.PrefixLogger { -+ return internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[server-transport %p] ", p)) -+} -+ -+func prefixLoggerForServerHandlerTransport(p *serverHandlerTransport) *internalgrpclog.PrefixLogger { -+ return internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[server-handler-transport %p] ", p)) -+} -+ -+func prefixLoggerForClientTransport(p *http2Client) *internalgrpclog.PrefixLogger { -+ return internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[client-transport %p] ", p)) -+} -diff --git a/vendor/google.golang.org/grpc/internal/transport/networktype/networktype.go b/vendor/google.golang.org/grpc/internal/transport/networktype/networktype.go -index 7bb53cf..c11b527 100644 ---- a/vendor/google.golang.org/grpc/internal/transport/networktype/networktype.go -+++ b/vendor/google.golang.org/grpc/internal/transport/networktype/networktype.go -@@ -31,7 +31,7 @@ const key = keyType("grpc.internal.transport.networktype") - - // Set returns a copy of the provided address with attributes containing networkType. - func Set(address resolver.Address, networkType string) resolver.Address { -- address.Attributes = address.Attributes.WithValues(key, networkType) -+ address.Attributes = address.Attributes.WithValue(key, networkType) - return address - } - -diff --git a/vendor/google.golang.org/grpc/internal/transport/proxy.go b/vendor/google.golang.org/grpc/internal/transport/proxy.go -index a662bf3..4159619 100644 ---- a/vendor/google.golang.org/grpc/internal/transport/proxy.go -+++ b/vendor/google.golang.org/grpc/internal/transport/proxy.go -@@ -37,7 +37,7 @@ var ( - httpProxyFromEnvironment = http.ProxyFromEnvironment - ) - --func mapAddress(ctx context.Context, address string) (*url.URL, error) { -+func mapAddress(address string) (*url.URL, error) { - req := &http.Request{ - URL: &url.URL{ - Scheme: "https", -@@ -114,7 +114,7 @@ func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, backendAddr stri - // connection. - func proxyDial(ctx context.Context, addr string, grpcUA string) (conn net.Conn, err error) { - newAddr := addr -- proxyURL, err := mapAddress(ctx, addr) -+ proxyURL, err := mapAddress(addr) - if err != nil { - return nil, err - } -diff --git a/vendor/google.golang.org/grpc/internal/transport/transport.go b/vendor/google.golang.org/grpc/internal/transport/transport.go -index 1419812..aa1c896 100644 ---- a/vendor/google.golang.org/grpc/internal/transport/transport.go -+++ b/vendor/google.golang.org/grpc/internal/transport/transport.go -@@ -30,9 +30,11 @@ import ( - "net" - "sync" - "sync/atomic" -+ "time" - - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" -+ "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/resolver" -@@ -41,6 +43,10 @@ import ( - "google.golang.org/grpc/tap" - ) - -+// ErrNoHeaders is used as a signal that a trailers only response was received, -+// and is not a real error. -+var ErrNoHeaders = errors.New("stream has no headers") -+ - const logLevel = 2 - - type bufferPool struct { -@@ -251,6 +257,9 @@ type Stream struct { - fc *inFlow - wq *writeQuota - -+ // Holds compressor names passed in grpc-accept-encoding metadata from the -+ // client. This is empty for the client side stream. -+ clientAdvertisedCompressors string - // Callback to state application's intentions to read data. This - // is used to adjust flow control, if needed. - requestRead func(int) -@@ -339,8 +348,24 @@ func (s *Stream) RecvCompress() string { - } - - // SetSendCompress sets the compression algorithm to the stream. --func (s *Stream) SetSendCompress(str string) { -- s.sendCompress = str -+func (s *Stream) SetSendCompress(name string) error { -+ if s.isHeaderSent() || s.getState() == streamDone { -+ return errors.New("transport: set send compressor called after headers sent or stream done") -+ } -+ -+ s.sendCompress = name -+ return nil -+} -+ -+// SendCompress returns the send compressor name. -+func (s *Stream) SendCompress() string { -+ return s.sendCompress -+} -+ -+// ClientAdvertisedCompressors returns the compressor names advertised by the -+// client via grpc-accept-encoding header. -+func (s *Stream) ClientAdvertisedCompressors() string { -+ return s.clientAdvertisedCompressors - } - - // Done returns a channel which is closed when it receives the final status -@@ -364,9 +389,15 @@ func (s *Stream) Header() (metadata.MD, error) { - return s.header.Copy(), nil - } - s.waitOnHeader() -+ - if !s.headerValid { - return nil, s.status.Err() - } -+ -+ if s.noHeaders { -+ return nil, ErrNoHeaders -+ } -+ - return s.header.Copy(), nil - } - -@@ -518,16 +549,17 @@ const ( - // ServerConfig consists of all the configurations to establish a server transport. - type ServerConfig struct { - MaxStreams uint32 -- AuthInfo credentials.AuthInfo -+ ConnectionTimeout time.Duration -+ Credentials credentials.TransportCredentials - InTapHandle tap.ServerInHandle -- StatsHandler stats.Handler -+ StatsHandlers []stats.Handler - KeepaliveParams keepalive.ServerParameters - KeepalivePolicy keepalive.EnforcementPolicy - InitialWindowSize int32 - InitialConnWindowSize int32 - WriteBufferSize int - ReadBufferSize int -- ChannelzParentID int64 -+ ChannelzParentID *channelz.Identifier - MaxHeaderListSize *uint32 - HeaderTableSize *uint32 - } -@@ -550,8 +582,8 @@ type ConnectOptions struct { - CredsBundle credentials.Bundle - // KeepaliveParams stores the keepalive parameters. - KeepaliveParams keepalive.ClientParameters -- // StatsHandler stores the handler for stats. -- StatsHandler stats.Handler -+ // StatsHandlers stores the handler for stats. -+ StatsHandlers []stats.Handler - // InitialWindowSize sets the initial window size for a stream. - InitialWindowSize int32 - // InitialConnWindowSize sets the initial window size for a connection. -@@ -561,7 +593,7 @@ type ConnectOptions struct { - // ReadBufferSize sets the size of read buffer, which in turn determines how much data can be read at most for one read syscall. - ReadBufferSize int - // ChannelzParentID sets the addrConn id which initiate the creation of this client transport. -- ChannelzParentID int64 -+ ChannelzParentID *channelz.Identifier - // MaxHeaderListSize sets the max (uncompressed) size of header list that is prepared to be received. - MaxHeaderListSize *uint32 - // UseProxy specifies if a proxy should be used. -@@ -570,8 +602,8 @@ type ConnectOptions struct { - - // NewClientTransport establishes the transport with the required ConnectOptions - // and returns it to the caller. --func NewClientTransport(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onPrefaceReceipt func(), onGoAway func(GoAwayReason), onClose func()) (ClientTransport, error) { -- return newHTTP2Client(connectCtx, ctx, addr, opts, onPrefaceReceipt, onGoAway, onClose) -+func NewClientTransport(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (ClientTransport, error) { -+ return newHTTP2Client(connectCtx, ctx, addr, opts, onClose) - } - - // Options provides additional hints and information for message -@@ -688,13 +720,13 @@ type ServerTransport interface { - // Close tears down the transport. Once it is called, the transport - // should not be accessed any more. All the pending streams and their - // handlers will be terminated asynchronously. -- Close() -+ Close(err error) - - // RemoteAddr returns the remote network address. - RemoteAddr() net.Addr - - // Drain notifies the client this ServerTransport stops accepting new RPCs. -- Drain() -+ Drain(debugData string) - - // IncrMsgSent increments the number of message sent through this transport. - IncrMsgSent() -@@ -739,6 +771,12 @@ func (e ConnectionError) Origin() error { - return e.err - } - -+// Unwrap returns the original error of this connection error or nil when the -+// origin is nil. -+func (e ConnectionError) Unwrap() error { -+ return e.err -+} -+ - var ( - // ErrConnClosing indicates that the transport is closing. - ErrConnClosing = connectionErrorf(true, nil, "transport is closing") -diff --git a/vendor/google.golang.org/grpc/internal/xds_handshake_cluster.go b/vendor/google.golang.org/grpc/internal/xds_handshake_cluster.go -index 3677c3f..e8b4927 100644 ---- a/vendor/google.golang.org/grpc/internal/xds_handshake_cluster.go -+++ b/vendor/google.golang.org/grpc/internal/xds_handshake_cluster.go -@@ -28,7 +28,7 @@ type handshakeClusterNameKey struct{} - // SetXDSHandshakeClusterName returns a copy of addr in which the Attributes field - // is updated with the cluster name. - func SetXDSHandshakeClusterName(addr resolver.Address, clusterName string) resolver.Address { -- addr.Attributes = addr.Attributes.WithValues(handshakeClusterNameKey{}, clusterName) -+ addr.Attributes = addr.Attributes.WithValue(handshakeClusterNameKey{}, clusterName) - return addr - } - -diff --git a/vendor/google.golang.org/grpc/metadata/metadata.go b/vendor/google.golang.org/grpc/metadata/metadata.go -index 3604c78..a2cdcaf 100644 ---- a/vendor/google.golang.org/grpc/metadata/metadata.go -+++ b/vendor/google.golang.org/grpc/metadata/metadata.go -@@ -41,16 +41,17 @@ type MD map[string][]string - // New creates an MD from a given key-value map. - // - // Only the following ASCII characters are allowed in keys: --// - digits: 0-9 --// - uppercase letters: A-Z (normalized to lower) --// - lowercase letters: a-z --// - special characters: -_. -+// - digits: 0-9 -+// - uppercase letters: A-Z (normalized to lower) -+// - lowercase letters: a-z -+// - special characters: -_. -+// - // Uppercase letters are automatically converted to lowercase. - // - // Keys beginning with "grpc-" are reserved for grpc-internal use only and may - // result in errors if set in metadata. - func New(m map[string]string) MD { -- md := MD{} -+ md := make(MD, len(m)) - for k, val := range m { - key := strings.ToLower(k) - md[key] = append(md[key], val) -@@ -62,10 +63,11 @@ func New(m map[string]string) MD { - // Pairs panics if len(kv) is odd. - // - // Only the following ASCII characters are allowed in keys: --// - digits: 0-9 --// - uppercase letters: A-Z (normalized to lower) --// - lowercase letters: a-z --// - special characters: -_. -+// - digits: 0-9 -+// - uppercase letters: A-Z (normalized to lower) -+// - lowercase letters: a-z -+// - special characters: -_. -+// - // Uppercase letters are automatically converted to lowercase. - // - // Keys beginning with "grpc-" are reserved for grpc-internal use only and may -@@ -74,7 +76,7 @@ func Pairs(kv ...string) MD { - if len(kv)%2 == 1 { - panic(fmt.Sprintf("metadata: Pairs got the odd number of input pairs for metadata: %d", len(kv))) - } -- md := MD{} -+ md := make(MD, len(kv)/2) - for i := 0; i < len(kv); i += 2 { - key := strings.ToLower(kv[i]) - md[key] = append(md[key], kv[i+1]) -@@ -89,7 +91,11 @@ func (md MD) Len() int { - - // Copy returns a copy of md. - func (md MD) Copy() MD { -- return Join(md) -+ out := make(MD, len(md)) -+ for k, v := range md { -+ out[k] = copyOf(v) -+ } -+ return out - } - - // Get obtains the values for a given key. -@@ -169,8 +175,11 @@ func AppendToOutgoingContext(ctx context.Context, kv ...string) context.Context - md, _ := ctx.Value(mdOutgoingKey{}).(rawMD) - added := make([][]string, len(md.added)+1) - copy(added, md.added) -- added[len(added)-1] = make([]string, len(kv)) -- copy(added[len(added)-1], kv) -+ kvCopy := make([]string, 0, len(kv)) -+ for i := 0; i < len(kv); i += 2 { -+ kvCopy = append(kvCopy, strings.ToLower(kv[i]), kv[i+1]) -+ } -+ added[len(added)-1] = kvCopy - return context.WithValue(ctx, mdOutgoingKey{}, rawMD{md: md.md, added: added}) - } - -@@ -182,17 +191,51 @@ func FromIncomingContext(ctx context.Context) (MD, bool) { - if !ok { - return nil, false - } -- out := MD{} -+ out := make(MD, len(md)) - for k, v := range md { - // We need to manually convert all keys to lower case, because MD is a - // map, and there's no guarantee that the MD attached to the context is - // created using our helper functions. - key := strings.ToLower(k) -- out[key] = v -+ out[key] = copyOf(v) - } - return out, true - } - -+// ValueFromIncomingContext returns the metadata value corresponding to the metadata -+// key from the incoming metadata if it exists. Key must be lower-case. -+// -+// # Experimental -+// -+// Notice: This API is EXPERIMENTAL and may be changed or removed in a -+// later release. -+func ValueFromIncomingContext(ctx context.Context, key string) []string { -+ md, ok := ctx.Value(mdIncomingKey{}).(MD) -+ if !ok { -+ return nil -+ } -+ -+ if v, ok := md[key]; ok { -+ return copyOf(v) -+ } -+ for k, v := range md { -+ // We need to manually convert all keys to lower case, because MD is a -+ // map, and there's no guarantee that the MD attached to the context is -+ // created using our helper functions. -+ if strings.ToLower(k) == key { -+ return copyOf(v) -+ } -+ } -+ return nil -+} -+ -+// the returned slice must not be modified in place -+func copyOf(v []string) []string { -+ vals := make([]string, len(v)) -+ copy(vals, v) -+ return vals -+} -+ - // FromOutgoingContextRaw returns the un-merged, intermediary contents of rawMD. - // - // Remember to perform strings.ToLower on the keys, for both the returned MD (MD -@@ -220,13 +263,18 @@ func FromOutgoingContext(ctx context.Context) (MD, bool) { - return nil, false - } - -- out := MD{} -+ mdSize := len(raw.md) -+ for i := range raw.added { -+ mdSize += len(raw.added[i]) / 2 -+ } -+ -+ out := make(MD, mdSize) - for k, v := range raw.md { - // We need to manually convert all keys to lower case, because MD is a - // map, and there's no guarantee that the MD attached to the context is - // created using our helper functions. - key := strings.ToLower(k) -- out[key] = v -+ out[key] = copyOf(v) - } - for _, added := range raw.added { - if len(added)%2 == 1 { -diff --git a/vendor/google.golang.org/grpc/picker_wrapper.go b/vendor/google.golang.org/grpc/picker_wrapper.go -index 0878ada..02f9759 100644 ---- a/vendor/google.golang.org/grpc/picker_wrapper.go -+++ b/vendor/google.golang.org/grpc/picker_wrapper.go -@@ -26,6 +26,7 @@ import ( - "google.golang.org/grpc/balancer" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/internal/channelz" -+ istatus "google.golang.org/grpc/internal/status" - "google.golang.org/grpc/internal/transport" - "google.golang.org/grpc/status" - ) -@@ -35,6 +36,7 @@ import ( - type pickerWrapper struct { - mu sync.Mutex - done bool -+ idle bool - blockingCh chan struct{} - picker balancer.Picker - } -@@ -46,7 +48,11 @@ func newPickerWrapper() *pickerWrapper { - // updatePicker is called by UpdateBalancerState. It unblocks all blocked pick. - func (pw *pickerWrapper) updatePicker(p balancer.Picker) { - pw.mu.Lock() -- if pw.done { -+ if pw.done || pw.idle { -+ // There is a small window where a picker update from the LB policy can -+ // race with the channel going to idle mode. If the picker is idle here, -+ // it is because the channel asked it to do so, and therefore it is sage -+ // to ignore the update from the LB policy. - pw.mu.Unlock() - return - } -@@ -57,12 +63,16 @@ func (pw *pickerWrapper) updatePicker(p balancer.Picker) { - pw.mu.Unlock() - } - --func doneChannelzWrapper(acw *acBalancerWrapper, done func(balancer.DoneInfo)) func(balancer.DoneInfo) { -- acw.mu.Lock() -- ac := acw.ac -- acw.mu.Unlock() -+// doneChannelzWrapper performs the following: -+// - increments the calls started channelz counter -+// - wraps the done function in the passed in result to increment the calls -+// failed or calls succeeded channelz counter before invoking the actual -+// done function. -+func doneChannelzWrapper(acbw *acBalancerWrapper, result *balancer.PickResult) { -+ ac := acbw.ac - ac.incrCallsStarted() -- return func(b balancer.DoneInfo) { -+ done := result.Done -+ result.Done = func(b balancer.DoneInfo) { - if b.Err != nil && b.Err != io.EOF { - ac.incrCallsFailed() - } else { -@@ -81,7 +91,7 @@ func doneChannelzWrapper(acw *acBalancerWrapper, done func(balancer.DoneInfo)) f - // - the current picker returns other errors and failfast is false. - // - the subConn returned by the current picker is not READY - // When one of these situations happens, pick blocks until the picker gets updated. --func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer.PickInfo) (transport.ClientTransport, func(balancer.DoneInfo), error) { -+func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer.PickInfo) (transport.ClientTransport, balancer.PickResult, error) { - var ch chan struct{} - - var lastPickErr error -@@ -89,7 +99,7 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. - pw.mu.Lock() - if pw.done { - pw.mu.Unlock() -- return nil, nil, ErrClientConnClosing -+ return nil, balancer.PickResult{}, ErrClientConnClosing - } - - if pw.picker == nil { -@@ -110,9 +120,9 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. - } - switch ctx.Err() { - case context.DeadlineExceeded: -- return nil, nil, status.Error(codes.DeadlineExceeded, errStr) -+ return nil, balancer.PickResult{}, status.Error(codes.DeadlineExceeded, errStr) - case context.Canceled: -- return nil, nil, status.Error(codes.Canceled, errStr) -+ return nil, balancer.PickResult{}, status.Error(codes.Canceled, errStr) - } - case <-ch: - } -@@ -124,14 +134,17 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. - pw.mu.Unlock() - - pickResult, err := p.Pick(info) -- - if err != nil { - if err == balancer.ErrNoSubConnAvailable { - continue - } -- if _, ok := status.FromError(err); ok { -+ if st, ok := status.FromError(err); ok { - // Status error: end the RPC unconditionally with this status. -- return nil, nil, err -+ // First restrict the code to the list allowed by gRFC A54. -+ if istatus.IsRestrictedControlPlaneCode(st) { -+ err = status.Errorf(codes.Internal, "received picker error with illegal status: %v", err) -+ } -+ return nil, balancer.PickResult{}, dropError{error: err} - } - // For all other errors, wait for ready RPCs should block and other - // RPCs should fail with unavailable. -@@ -139,19 +152,20 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. - lastPickErr = err - continue - } -- return nil, nil, status.Error(codes.Unavailable, err.Error()) -+ return nil, balancer.PickResult{}, status.Error(codes.Unavailable, err.Error()) - } - -- acw, ok := pickResult.SubConn.(*acBalancerWrapper) -+ acbw, ok := pickResult.SubConn.(*acBalancerWrapper) - if !ok { -- logger.Error("subconn returned from pick is not *acBalancerWrapper") -+ logger.Errorf("subconn returned from pick is type %T, not *acBalancerWrapper", pickResult.SubConn) - continue - } -- if t := acw.getAddrConn().getReadyTransport(); t != nil { -+ if t := acbw.ac.getReadyTransport(); t != nil { - if channelz.IsOn() { -- return t, doneChannelzWrapper(acw, pickResult.Done), nil -+ doneChannelzWrapper(acbw, &pickResult) -+ return t, pickResult, nil - } -- return t, pickResult.Done, nil -+ return t, pickResult, nil - } - if pickResult.Done != nil { - // Calling done with nil error, no bytes sent and no bytes received. -@@ -175,3 +189,28 @@ func (pw *pickerWrapper) close() { - pw.done = true - close(pw.blockingCh) - } -+ -+func (pw *pickerWrapper) enterIdleMode() { -+ pw.mu.Lock() -+ defer pw.mu.Unlock() -+ if pw.done { -+ return -+ } -+ pw.idle = true -+} -+ -+func (pw *pickerWrapper) exitIdleMode() { -+ pw.mu.Lock() -+ defer pw.mu.Unlock() -+ if pw.done { -+ return -+ } -+ pw.blockingCh = make(chan struct{}) -+ pw.idle = false -+} -+ -+// dropError is a wrapper error that indicates the LB policy wishes to drop the -+// RPC and not retry it. -+type dropError struct { -+ error -+} -diff --git a/vendor/google.golang.org/grpc/pickfirst.go b/vendor/google.golang.org/grpc/pickfirst.go -index b858c2a..abe266b 100644 ---- a/vendor/google.golang.org/grpc/pickfirst.go -+++ b/vendor/google.golang.org/grpc/pickfirst.go -@@ -19,11 +19,15 @@ - package grpc - - import ( -+ "encoding/json" - "errors" - "fmt" - - "google.golang.org/grpc/balancer" - "google.golang.org/grpc/connectivity" -+ "google.golang.org/grpc/internal/envconfig" -+ "google.golang.org/grpc/internal/grpcrand" -+ "google.golang.org/grpc/serviceconfig" - ) - - // PickFirstBalancerName is the name of the pick_first balancer. -@@ -43,94 +47,181 @@ func (*pickfirstBuilder) Name() string { - return PickFirstBalancerName - } - -+type pfConfig struct { -+ serviceconfig.LoadBalancingConfig `json:"-"` -+ -+ // If set to true, instructs the LB policy to shuffle the order of the list -+ // of addresses received from the name resolver before attempting to -+ // connect to them. -+ ShuffleAddressList bool `json:"shuffleAddressList"` -+} -+ -+func (*pickfirstBuilder) ParseConfig(js json.RawMessage) (serviceconfig.LoadBalancingConfig, error) { -+ cfg := &pfConfig{} -+ if err := json.Unmarshal(js, cfg); err != nil { -+ return nil, fmt.Errorf("pickfirst: unable to unmarshal LB policy config: %s, error: %v", string(js), err) -+ } -+ return cfg, nil -+} -+ - type pickfirstBalancer struct { -- state connectivity.State -- cc balancer.ClientConn -- sc balancer.SubConn -+ state connectivity.State -+ cc balancer.ClientConn -+ subConn balancer.SubConn -+ cfg *pfConfig - } - - func (b *pickfirstBalancer) ResolverError(err error) { -- switch b.state { -- case connectivity.TransientFailure, connectivity.Idle, connectivity.Connecting: -- // Set a failing picker if we don't have a good picker. -- b.cc.UpdateState(balancer.State{ConnectivityState: connectivity.TransientFailure, -- Picker: &picker{err: fmt.Errorf("name resolver error: %v", err)}, -- }) -- } - if logger.V(2) { -- logger.Infof("pickfirstBalancer: ResolverError called with error %v", err) -+ logger.Infof("pickfirstBalancer: ResolverError called with error: %v", err) -+ } -+ if b.subConn == nil { -+ b.state = connectivity.TransientFailure -+ } -+ -+ if b.state != connectivity.TransientFailure { -+ // The picker will not change since the balancer does not currently -+ // report an error. -+ return - } -+ b.cc.UpdateState(balancer.State{ -+ ConnectivityState: connectivity.TransientFailure, -+ Picker: &picker{err: fmt.Errorf("name resolver error: %v", err)}, -+ }) - } - --func (b *pickfirstBalancer) UpdateClientConnState(cs balancer.ClientConnState) error { -- if len(cs.ResolverState.Addresses) == 0 { -+func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState) error { -+ addrs := state.ResolverState.Addresses -+ if len(addrs) == 0 { -+ // The resolver reported an empty address list. Treat it like an error by -+ // calling b.ResolverError. -+ if b.subConn != nil { -+ // Remove the old subConn. All addresses were removed, so it is no longer -+ // valid. -+ b.cc.RemoveSubConn(b.subConn) -+ b.subConn = nil -+ } - b.ResolverError(errors.New("produced zero addresses")) - return balancer.ErrBadResolverState - } -- if b.sc == nil { -- var err error -- b.sc, err = b.cc.NewSubConn(cs.ResolverState.Addresses, balancer.NewSubConnOptions{}) -- if err != nil { -- if logger.V(2) { -- logger.Errorf("pickfirstBalancer: failed to NewSubConn: %v", err) -- } -- b.state = connectivity.TransientFailure -- b.cc.UpdateState(balancer.State{ConnectivityState: connectivity.TransientFailure, -- Picker: &picker{err: fmt.Errorf("error creating connection: %v", err)}, -- }) -- return balancer.ErrBadResolverState -+ -+ if state.BalancerConfig != nil { -+ cfg, ok := state.BalancerConfig.(*pfConfig) -+ if !ok { -+ return fmt.Errorf("pickfirstBalancer: received nil or illegal BalancerConfig (type %T): %v", state.BalancerConfig, state.BalancerConfig) - } -- b.state = connectivity.Idle -- b.cc.UpdateState(balancer.State{ConnectivityState: connectivity.Idle, Picker: &picker{result: balancer.PickResult{SubConn: b.sc}}}) -- b.sc.Connect() -- } else { -- b.cc.UpdateAddresses(b.sc, cs.ResolverState.Addresses) -- b.sc.Connect() -+ b.cfg = cfg -+ } -+ -+ if envconfig.PickFirstLBConfig && b.cfg != nil && b.cfg.ShuffleAddressList { -+ grpcrand.Shuffle(len(addrs), func(i, j int) { addrs[i], addrs[j] = addrs[j], addrs[i] }) -+ } -+ if b.subConn != nil { -+ b.cc.UpdateAddresses(b.subConn, addrs) -+ return nil - } -+ -+ subConn, err := b.cc.NewSubConn(addrs, balancer.NewSubConnOptions{}) -+ if err != nil { -+ if logger.V(2) { -+ logger.Errorf("pickfirstBalancer: failed to NewSubConn: %v", err) -+ } -+ b.state = connectivity.TransientFailure -+ b.cc.UpdateState(balancer.State{ -+ ConnectivityState: connectivity.TransientFailure, -+ Picker: &picker{err: fmt.Errorf("error creating connection: %v", err)}, -+ }) -+ return balancer.ErrBadResolverState -+ } -+ b.subConn = subConn -+ b.state = connectivity.Idle -+ b.cc.UpdateState(balancer.State{ -+ ConnectivityState: connectivity.Connecting, -+ Picker: &picker{err: balancer.ErrNoSubConnAvailable}, -+ }) -+ b.subConn.Connect() - return nil - } - --func (b *pickfirstBalancer) UpdateSubConnState(sc balancer.SubConn, s balancer.SubConnState) { -+func (b *pickfirstBalancer) UpdateSubConnState(subConn balancer.SubConn, state balancer.SubConnState) { - if logger.V(2) { -- logger.Infof("pickfirstBalancer: UpdateSubConnState: %p, %v", sc, s) -+ logger.Infof("pickfirstBalancer: UpdateSubConnState: %p, %v", subConn, state) - } -- if b.sc != sc { -+ if b.subConn != subConn { - if logger.V(2) { -- logger.Infof("pickfirstBalancer: ignored state change because sc is not recognized") -+ logger.Infof("pickfirstBalancer: ignored state change because subConn is not recognized") - } - return - } -- b.state = s.ConnectivityState -- if s.ConnectivityState == connectivity.Shutdown { -- b.sc = nil -+ if state.ConnectivityState == connectivity.Shutdown { -+ b.subConn = nil - return - } - -- switch s.ConnectivityState { -- case connectivity.Ready, connectivity.Idle: -- b.cc.UpdateState(balancer.State{ConnectivityState: s.ConnectivityState, Picker: &picker{result: balancer.PickResult{SubConn: sc}}}) -+ switch state.ConnectivityState { -+ case connectivity.Ready: -+ b.cc.UpdateState(balancer.State{ -+ ConnectivityState: state.ConnectivityState, -+ Picker: &picker{result: balancer.PickResult{SubConn: subConn}}, -+ }) - case connectivity.Connecting: -- b.cc.UpdateState(balancer.State{ConnectivityState: s.ConnectivityState, Picker: &picker{err: balancer.ErrNoSubConnAvailable}}) -+ if b.state == connectivity.TransientFailure { -+ // We stay in TransientFailure until we are Ready. See A62. -+ return -+ } -+ b.cc.UpdateState(balancer.State{ -+ ConnectivityState: state.ConnectivityState, -+ Picker: &picker{err: balancer.ErrNoSubConnAvailable}, -+ }) -+ case connectivity.Idle: -+ if b.state == connectivity.TransientFailure { -+ // We stay in TransientFailure until we are Ready. Also kick the -+ // subConn out of Idle into Connecting. See A62. -+ b.subConn.Connect() -+ return -+ } -+ b.cc.UpdateState(balancer.State{ -+ ConnectivityState: state.ConnectivityState, -+ Picker: &idlePicker{subConn: subConn}, -+ }) - case connectivity.TransientFailure: - b.cc.UpdateState(balancer.State{ -- ConnectivityState: s.ConnectivityState, -- Picker: &picker{err: s.ConnectionError}, -+ ConnectivityState: state.ConnectivityState, -+ Picker: &picker{err: state.ConnectionError}, - }) - } -+ b.state = state.ConnectivityState - } - - func (b *pickfirstBalancer) Close() { - } - -+func (b *pickfirstBalancer) ExitIdle() { -+ if b.subConn != nil && b.state == connectivity.Idle { -+ b.subConn.Connect() -+ } -+} -+ - type picker struct { - result balancer.PickResult - err error - } - --func (p *picker) Pick(info balancer.PickInfo) (balancer.PickResult, error) { -+func (p *picker) Pick(balancer.PickInfo) (balancer.PickResult, error) { - return p.result, p.err - } - -+// idlePicker is used when the SubConn is IDLE and kicks the SubConn into -+// CONNECTING when Pick is called. -+type idlePicker struct { -+ subConn balancer.SubConn -+} -+ -+func (i *idlePicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { -+ i.subConn.Connect() -+ return balancer.PickResult{}, balancer.ErrNoSubConnAvailable -+} -+ - func init() { - balancer.Register(newPickfirstBuilder()) - } -diff --git a/vendor/google.golang.org/grpc/preloader.go b/vendor/google.golang.org/grpc/preloader.go -index 0a1e975..cd45547 100644 ---- a/vendor/google.golang.org/grpc/preloader.go -+++ b/vendor/google.golang.org/grpc/preloader.go -@@ -25,7 +25,7 @@ import ( - - // PreparedMsg is responsible for creating a Marshalled and Compressed object. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -diff --git a/vendor/google.golang.org/grpc/regenerate.sh b/vendor/google.golang.org/grpc/regenerate.sh -index dfd3226..a6f26c8 100644 ---- a/vendor/google.golang.org/grpc/regenerate.sh -+++ b/vendor/google.golang.org/grpc/regenerate.sh -@@ -27,9 +27,9 @@ export PATH=${GOBIN}:${PATH} - mkdir -p ${GOBIN} - - echo "remove existing generated files" --# grpc_testingv3/testv3.pb.go is not re-generated because it was --# intentionally generated by an older version of protoc-gen-go. --rm -f $(find . -name '*.pb.go' | grep -v 'grpc_testingv3/testv3.pb.go') -+# grpc_testing_not_regenerate/*.pb.go is not re-generated, -+# see grpc_testing_not_regenerate/README.md for details. -+rm -f $(find . -name '*.pb.go' | grep -v 'grpc_testing_not_regenerate') - - echo "go install google.golang.org/protobuf/cmd/protoc-gen-go" - (cd test/tools && go install google.golang.org/protobuf/cmd/protoc-gen-go) -@@ -57,7 +57,8 @@ LEGACY_SOURCES=( - ${WORKDIR}/grpc-proto/grpc/health/v1/health.proto - ${WORKDIR}/grpc-proto/grpc/lb/v1/load_balancer.proto - profiling/proto/service.proto -- reflection/grpc_reflection_v1alpha/reflection.proto -+ ${WORKDIR}/grpc-proto/grpc/reflection/v1alpha/reflection.proto -+ ${WORKDIR}/grpc-proto/grpc/reflection/v1/reflection.proto - ) - - # Generates only the new gRPC Service symbols -@@ -68,7 +69,6 @@ SOURCES=( - ${WORKDIR}/grpc-proto/grpc/gcp/transport_security_common.proto - ${WORKDIR}/grpc-proto/grpc/lookup/v1/rls.proto - ${WORKDIR}/grpc-proto/grpc/lookup/v1/rls_config.proto -- ${WORKDIR}/grpc-proto/grpc/service_config/service_config.proto - ${WORKDIR}/grpc-proto/grpc/testing/*.proto - ${WORKDIR}/grpc-proto/grpc/core/*.proto - ) -@@ -76,7 +76,20 @@ SOURCES=( - # These options of the form 'Mfoo.proto=bar' instruct the codegen to use an - # import path of 'bar' in the generated code when 'foo.proto' is imported in - # one of the sources. --OPTS=Mgrpc/service_config/service_config.proto=/internal/proto/grpc_service_config,Mgrpc/core/stats.proto=google.golang.org/grpc/interop/grpc_testing/core -+# -+# Note that the protos listed here are all for testing purposes. All protos to -+# be used externally should have a go_package option (and they don't need to be -+# listed here). -+OPTS=Mgrpc/core/stats.proto=google.golang.org/grpc/interop/grpc_testing/core,\ -+Mgrpc/testing/benchmark_service.proto=google.golang.org/grpc/interop/grpc_testing,\ -+Mgrpc/testing/stats.proto=google.golang.org/grpc/interop/grpc_testing,\ -+Mgrpc/testing/report_qps_scenario_service.proto=google.golang.org/grpc/interop/grpc_testing,\ -+Mgrpc/testing/messages.proto=google.golang.org/grpc/interop/grpc_testing,\ -+Mgrpc/testing/worker_service.proto=google.golang.org/grpc/interop/grpc_testing,\ -+Mgrpc/testing/control.proto=google.golang.org/grpc/interop/grpc_testing,\ -+Mgrpc/testing/test.proto=google.golang.org/grpc/interop/grpc_testing,\ -+Mgrpc/testing/payloads.proto=google.golang.org/grpc/interop/grpc_testing,\ -+Mgrpc/testing/empty.proto=google.golang.org/grpc/interop/grpc_testing - - for src in ${SOURCES[@]}; do - echo "protoc ${src}" -@@ -85,7 +98,6 @@ for src in ${SOURCES[@]}; do - -I${WORKDIR}/grpc-proto \ - -I${WORKDIR}/googleapis \ - -I${WORKDIR}/protobuf/src \ -- -I${WORKDIR}/istio \ - ${src} - done - -@@ -96,24 +108,16 @@ for src in ${LEGACY_SOURCES[@]}; do - -I${WORKDIR}/grpc-proto \ - -I${WORKDIR}/googleapis \ - -I${WORKDIR}/protobuf/src \ -- -I${WORKDIR}/istio \ - ${src} - done - - # The go_package option in grpc/lookup/v1/rls.proto doesn't match the - # current location. Move it into the right place. --mkdir -p ${WORKDIR}/out/google.golang.org/grpc/balancer/rls/internal/proto/grpc_lookup_v1 --mv ${WORKDIR}/out/google.golang.org/grpc/lookup/grpc_lookup_v1/* ${WORKDIR}/out/google.golang.org/grpc/balancer/rls/internal/proto/grpc_lookup_v1 -- --# grpc_testingv3/testv3.pb.go is not re-generated because it was --# intentionally generated by an older version of protoc-gen-go. --rm ${WORKDIR}/out/google.golang.org/grpc/reflection/grpc_testingv3/*.pb.go -- --# grpc/service_config/service_config.proto does not have a go_package option. --mv ${WORKDIR}/out/grpc/service_config/service_config.pb.go internal/proto/grpc_service_config -+mkdir -p ${WORKDIR}/out/google.golang.org/grpc/internal/proto/grpc_lookup_v1 -+mv ${WORKDIR}/out/google.golang.org/grpc/lookup/grpc_lookup_v1/* ${WORKDIR}/out/google.golang.org/grpc/internal/proto/grpc_lookup_v1 - --# grpc/testing does not have a go_package option. --mv ${WORKDIR}/out/grpc/testing/*.pb.go interop/grpc_testing/ --mv ${WORKDIR}/out/grpc/core/*.pb.go interop/grpc_testing/core/ -+# grpc_testing_not_regenerate/*.pb.go are not re-generated, -+# see grpc_testing_not_regenerate/README.md for details. -+rm ${WORKDIR}/out/google.golang.org/grpc/reflection/grpc_testing_not_regenerate/*.pb.go - - cp -R ${WORKDIR}/out/google.golang.org/grpc/* . -diff --git a/vendor/google.golang.org/grpc/resolver/map.go b/vendor/google.golang.org/grpc/resolver/map.go -new file mode 100644 -index 0000000..efcb7f3 ---- /dev/null -+++ b/vendor/google.golang.org/grpc/resolver/map.go -@@ -0,0 +1,138 @@ -+/* -+ * -+ * Copyright 2021 gRPC authors. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+ -+package resolver -+ -+type addressMapEntry struct { -+ addr Address -+ value interface{} -+} -+ -+// AddressMap is a map of addresses to arbitrary values taking into account -+// Attributes. BalancerAttributes are ignored, as are Metadata and Type. -+// Multiple accesses may not be performed concurrently. Must be created via -+// NewAddressMap; do not construct directly. -+type AddressMap struct { -+ // The underlying map is keyed by an Address with fields that we don't care -+ // about being set to their zero values. The only fields that we care about -+ // are `Addr`, `ServerName` and `Attributes`. Since we need to be able to -+ // distinguish between addresses with same `Addr` and `ServerName`, but -+ // different `Attributes`, we cannot store the `Attributes` in the map key. -+ // -+ // The comparison operation for structs work as follows: -+ // Struct values are comparable if all their fields are comparable. Two -+ // struct values are equal if their corresponding non-blank fields are equal. -+ // -+ // The value type of the map contains a slice of addresses which match the key -+ // in their `Addr` and `ServerName` fields and contain the corresponding value -+ // associated with them. -+ m map[Address]addressMapEntryList -+} -+ -+func toMapKey(addr *Address) Address { -+ return Address{Addr: addr.Addr, ServerName: addr.ServerName} -+} -+ -+type addressMapEntryList []*addressMapEntry -+ -+// NewAddressMap creates a new AddressMap. -+func NewAddressMap() *AddressMap { -+ return &AddressMap{m: make(map[Address]addressMapEntryList)} -+} -+ -+// find returns the index of addr in the addressMapEntry slice, or -1 if not -+// present. -+func (l addressMapEntryList) find(addr Address) int { -+ for i, entry := range l { -+ // Attributes are the only thing to match on here, since `Addr` and -+ // `ServerName` are already equal. -+ if entry.addr.Attributes.Equal(addr.Attributes) { -+ return i -+ } -+ } -+ return -1 -+} -+ -+// Get returns the value for the address in the map, if present. -+func (a *AddressMap) Get(addr Address) (value interface{}, ok bool) { -+ addrKey := toMapKey(&addr) -+ entryList := a.m[addrKey] -+ if entry := entryList.find(addr); entry != -1 { -+ return entryList[entry].value, true -+ } -+ return nil, false -+} -+ -+// Set updates or adds the value to the address in the map. -+func (a *AddressMap) Set(addr Address, value interface{}) { -+ addrKey := toMapKey(&addr) -+ entryList := a.m[addrKey] -+ if entry := entryList.find(addr); entry != -1 { -+ entryList[entry].value = value -+ return -+ } -+ a.m[addrKey] = append(entryList, &addressMapEntry{addr: addr, value: value}) -+} -+ -+// Delete removes addr from the map. -+func (a *AddressMap) Delete(addr Address) { -+ addrKey := toMapKey(&addr) -+ entryList := a.m[addrKey] -+ entry := entryList.find(addr) -+ if entry == -1 { -+ return -+ } -+ if len(entryList) == 1 { -+ entryList = nil -+ } else { -+ copy(entryList[entry:], entryList[entry+1:]) -+ entryList = entryList[:len(entryList)-1] -+ } -+ a.m[addrKey] = entryList -+} -+ -+// Len returns the number of entries in the map. -+func (a *AddressMap) Len() int { -+ ret := 0 -+ for _, entryList := range a.m { -+ ret += len(entryList) -+ } -+ return ret -+} -+ -+// Keys returns a slice of all current map keys. -+func (a *AddressMap) Keys() []Address { -+ ret := make([]Address, 0, a.Len()) -+ for _, entryList := range a.m { -+ for _, entry := range entryList { -+ ret = append(ret, entry.addr) -+ } -+ } -+ return ret -+} -+ -+// Values returns a slice of all current map values. -+func (a *AddressMap) Values() []interface{} { -+ ret := make([]interface{}, 0, a.Len()) -+ for _, entryList := range a.m { -+ for _, entry := range entryList { -+ ret = append(ret, entry.value) -+ } -+ } -+ return ret -+} -diff --git a/vendor/google.golang.org/grpc/resolver/resolver.go b/vendor/google.golang.org/grpc/resolver/resolver.go -index 6a9d234..353c10b 100644 ---- a/vendor/google.golang.org/grpc/resolver/resolver.go -+++ b/vendor/google.golang.org/grpc/resolver/resolver.go -@@ -22,7 +22,10 @@ package resolver - - import ( - "context" -+ "fmt" - "net" -+ "net/url" -+ "strings" - - "google.golang.org/grpc/attributes" - "google.golang.org/grpc/credentials" -@@ -38,8 +41,9 @@ var ( - - // TODO(bar) install dns resolver in init(){}. - --// Register registers the resolver builder to the resolver map. b.Scheme will be --// used as the scheme registered with this builder. -+// Register registers the resolver builder to the resolver map. b.Scheme will -+// be used as the scheme registered with this builder. The registry is case -+// sensitive, and schemes should not contain any uppercase characters. - // - // NOTE: this function must only be called during initialization time (i.e. in - // an init() function), and is not thread-safe. If multiple Resolvers are -@@ -94,7 +98,7 @@ const ( - - // Address represents a server the client connects to. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -116,9 +120,14 @@ type Address struct { - ServerName string - - // Attributes contains arbitrary data about this address intended for -- // consumption by the load balancing policy. -+ // consumption by the SubConn. - Attributes *attributes.Attributes - -+ // BalancerAttributes contains arbitrary data about this address intended -+ // for consumption by the LB policy. These attributes do not affect SubConn -+ // creation, connection establishment, handshaking, etc. -+ BalancerAttributes *attributes.Attributes -+ - // Type is the type of this address. - // - // Deprecated: use Attributes instead. -@@ -131,6 +140,30 @@ type Address struct { - Metadata interface{} - } - -+// Equal returns whether a and o are identical. Metadata is compared directly, -+// not with any recursive introspection. -+func (a Address) Equal(o Address) bool { -+ return a.Addr == o.Addr && a.ServerName == o.ServerName && -+ a.Attributes.Equal(o.Attributes) && -+ a.BalancerAttributes.Equal(o.BalancerAttributes) && -+ a.Type == o.Type && a.Metadata == o.Metadata -+} -+ -+// String returns JSON formatted string representation of the address. -+func (a Address) String() string { -+ var sb strings.Builder -+ sb.WriteString(fmt.Sprintf("{Addr: %q, ", a.Addr)) -+ sb.WriteString(fmt.Sprintf("ServerName: %q, ", a.ServerName)) -+ if a.Attributes != nil { -+ sb.WriteString(fmt.Sprintf("Attributes: %v, ", a.Attributes.String())) -+ } -+ if a.BalancerAttributes != nil { -+ sb.WriteString(fmt.Sprintf("BalancerAttributes: %v", a.BalancerAttributes.String())) -+ } -+ sb.WriteString("}") -+ return sb.String() -+} -+ - // BuildOptions includes additional information for the builder to create - // the resolver. - type BuildOptions struct { -@@ -181,6 +214,15 @@ type State struct { - // gRPC to add new methods to this interface. - type ClientConn interface { - // UpdateState updates the state of the ClientConn appropriately. -+ // -+ // If an error is returned, the resolver should try to resolve the -+ // target again. The resolver should use a backoff timer to prevent -+ // overloading the server with requests. If a resolver is certain that -+ // reresolving will not change the result, e.g. because it is -+ // a watch-based resolver, returned errors can be ignored. -+ // -+ // If the resolved State is the same as the last reported one, calling -+ // UpdateState can be omitted. - UpdateState(State) error - // ReportError notifies the ClientConn that the Resolver encountered an - // error. The ClientConn will notify the load balancer and begin calling -@@ -204,25 +246,51 @@ type ClientConn interface { - - // Target represents a target for gRPC, as specified in: - // https://github.com/grpc/grpc/blob/master/doc/naming.md. --// It is parsed from the target string that gets passed into Dial or DialContext by the user. And --// grpc passes it to the resolver and the balancer. -+// It is parsed from the target string that gets passed into Dial or DialContext -+// by the user. And gRPC passes it to the resolver and the balancer. - // --// If the target follows the naming spec, and the parsed scheme is registered with grpc, we will --// parse the target string according to the spec. e.g. "dns://some_authority/foo.bar" will be parsed --// into &Target{Scheme: "dns", Authority: "some_authority", Endpoint: "foo.bar"} -+// If the target follows the naming spec, and the parsed scheme is registered -+// with gRPC, we will parse the target string according to the spec. If the -+// target does not contain a scheme or if the parsed scheme is not registered -+// (i.e. no corresponding resolver available to resolve the endpoint), we will -+// apply the default scheme, and will attempt to reparse it. - // --// If the target does not contain a scheme, we will apply the default scheme, and set the Target to --// be the full target string. e.g. "foo.bar" will be parsed into --// &Target{Scheme: resolver.GetDefaultScheme(), Endpoint: "foo.bar"}. -+// Examples: - // --// If the parsed scheme is not registered (i.e. no corresponding resolver available to resolve the --// endpoint), we set the Scheme to be the default scheme, and set the Endpoint to be the full target --// string. e.g. target string "unknown_scheme://authority/endpoint" will be parsed into --// &Target{Scheme: resolver.GetDefaultScheme(), Endpoint: "unknown_scheme://authority/endpoint"}. -+// - "dns://some_authority/foo.bar" -+// Target{Scheme: "dns", Authority: "some_authority", Endpoint: "foo.bar"} -+// - "foo.bar" -+// Target{Scheme: resolver.GetDefaultScheme(), Endpoint: "foo.bar"} -+// - "unknown_scheme://authority/endpoint" -+// Target{Scheme: resolver.GetDefaultScheme(), Endpoint: "unknown_scheme://authority/endpoint"} - type Target struct { -- Scheme string -+ // Deprecated: use URL.Scheme instead. -+ Scheme string -+ // Deprecated: use URL.Host instead. - Authority string -- Endpoint string -+ // URL contains the parsed dial target with an optional default scheme added -+ // to it if the original dial target contained no scheme or contained an -+ // unregistered scheme. Any query params specified in the original dial -+ // target can be accessed from here. -+ URL url.URL -+} -+ -+// Endpoint retrieves endpoint without leading "/" from either `URL.Path` -+// or `URL.Opaque`. The latter is used when the former is empty. -+func (t Target) Endpoint() string { -+ endpoint := t.URL.Path -+ if endpoint == "" { -+ endpoint = t.URL.Opaque -+ } -+ // For targets of the form "[scheme]://[authority]/endpoint, the endpoint -+ // value returned from url.Parse() contains a leading "/". Although this is -+ // in accordance with RFC 3986, we do not want to break existing resolver -+ // implementations which expect the endpoint without the leading "/". So, we -+ // end up stripping the leading "/" here. But this will result in an -+ // incorrect parsing for something like "unix:///path/to/socket". Since we -+ // own the "unix" resolver, we can workaround in the unix resolver by using -+ // the `URL` field. -+ return strings.TrimPrefix(endpoint, "/") - } - - // Builder creates a resolver that will be used to watch name resolution updates. -@@ -232,8 +300,10 @@ type Builder interface { - // gRPC dial calls Build synchronously, and fails if the returned error is - // not nil. - Build(target Target, cc ClientConn, opts BuildOptions) (Resolver, error) -- // Scheme returns the scheme supported by this resolver. -- // Scheme is defined at https://github.com/grpc/grpc/blob/master/doc/naming.md. -+ // Scheme returns the scheme supported by this resolver. Scheme is defined -+ // at https://github.com/grpc/grpc/blob/master/doc/naming.md. The returned -+ // string should not contain uppercase characters, as they will not match -+ // the parsed target's scheme as defined in RFC 3986. - Scheme() string - } - -diff --git a/vendor/google.golang.org/grpc/resolver_conn_wrapper.go b/vendor/google.golang.org/grpc/resolver_conn_wrapper.go -index 2c47cd5..b408b36 100644 ---- a/vendor/google.golang.org/grpc/resolver_conn_wrapper.go -+++ b/vendor/google.golang.org/grpc/resolver_conn_wrapper.go -@@ -19,149 +19,204 @@ - package grpc - - import ( -- "fmt" -+ "context" - "strings" - "sync" - - "google.golang.org/grpc/balancer" -- "google.golang.org/grpc/credentials" - "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/grpcsync" -+ "google.golang.org/grpc/internal/pretty" - "google.golang.org/grpc/resolver" - "google.golang.org/grpc/serviceconfig" - ) - -+// resolverStateUpdater wraps the single method used by ccResolverWrapper to -+// report a state update from the actual resolver implementation. -+type resolverStateUpdater interface { -+ updateResolverState(s resolver.State, err error) error -+} -+ - // ccResolverWrapper is a wrapper on top of cc for resolvers. - // It implements resolver.ClientConn interface. - type ccResolverWrapper struct { -- cc *ClientConn -- resolverMu sync.Mutex -- resolver resolver.Resolver -- done *grpcsync.Event -- curState resolver.State -+ // The following fields are initialized when the wrapper is created and are -+ // read-only afterwards, and therefore can be accessed without a mutex. -+ cc resolverStateUpdater -+ channelzID *channelz.Identifier -+ ignoreServiceConfig bool -+ opts ccResolverWrapperOpts -+ serializer *grpcsync.CallbackSerializer // To serialize all incoming calls. -+ serializerCancel context.CancelFunc // To close the serializer, accessed only from close(). -+ -+ // All incoming (resolver --> gRPC) calls are guaranteed to execute in a -+ // mutually exclusive manner as they are scheduled on the serializer. -+ // Fields accessed *only* in these serializer callbacks, can therefore be -+ // accessed without a mutex. -+ curState resolver.State -+ -+ // mu guards access to the below fields. -+ mu sync.Mutex -+ closed bool -+ resolver resolver.Resolver // Accessed only from outgoing calls. -+} - -- incomingMu sync.Mutex // Synchronizes all the incoming calls. -+// ccResolverWrapperOpts wraps the arguments to be passed when creating a new -+// ccResolverWrapper. -+type ccResolverWrapperOpts struct { -+ target resolver.Target // User specified dial target to resolve. -+ builder resolver.Builder // Resolver builder to use. -+ bOpts resolver.BuildOptions // Resolver build options to use. -+ channelzID *channelz.Identifier // Channelz identifier for the channel. - } - - // newCCResolverWrapper uses the resolver.Builder to build a Resolver and - // returns a ccResolverWrapper object which wraps the newly built resolver. --func newCCResolverWrapper(cc *ClientConn, rb resolver.Builder) (*ccResolverWrapper, error) { -+func newCCResolverWrapper(cc resolverStateUpdater, opts ccResolverWrapperOpts) (*ccResolverWrapper, error) { -+ ctx, cancel := context.WithCancel(context.Background()) - ccr := &ccResolverWrapper{ -- cc: cc, -- done: grpcsync.NewEvent(), -- } -- -- var credsClone credentials.TransportCredentials -- if creds := cc.dopts.copts.TransportCredentials; creds != nil { -- credsClone = creds.Clone() -- } -- rbo := resolver.BuildOptions{ -- DisableServiceConfig: cc.dopts.disableServiceConfig, -- DialCreds: credsClone, -- CredsBundle: cc.dopts.copts.CredsBundle, -- Dialer: cc.dopts.copts.Dialer, -- } -- -- var err error -- // We need to hold the lock here while we assign to the ccr.resolver field -- // to guard against a data race caused by the following code path, -- // rb.Build-->ccr.ReportError-->ccr.poll-->ccr.resolveNow, would end up -- // accessing ccr.resolver which is being assigned here. -- ccr.resolverMu.Lock() -- defer ccr.resolverMu.Unlock() -- ccr.resolver, err = rb.Build(cc.parsedTarget, ccr, rbo) -+ cc: cc, -+ channelzID: opts.channelzID, -+ ignoreServiceConfig: opts.bOpts.DisableServiceConfig, -+ opts: opts, -+ serializer: grpcsync.NewCallbackSerializer(ctx), -+ serializerCancel: cancel, -+ } -+ -+ // Cannot hold the lock at build time because the resolver can send an -+ // update or error inline and these incoming calls grab the lock to schedule -+ // a callback in the serializer. -+ r, err := opts.builder.Build(opts.target, ccr, opts.bOpts) - if err != nil { -+ cancel() - return nil, err - } -+ -+ // Any error reported by the resolver at build time that leads to a -+ // re-resolution request from the balancer is dropped by grpc until we -+ // return from this function. So, we don't have to handle pending resolveNow -+ // requests here. -+ ccr.mu.Lock() -+ ccr.resolver = r -+ ccr.mu.Unlock() -+ - return ccr, nil - } - - func (ccr *ccResolverWrapper) resolveNow(o resolver.ResolveNowOptions) { -- ccr.resolverMu.Lock() -- if !ccr.done.HasFired() { -- ccr.resolver.ResolveNow(o) -+ ccr.mu.Lock() -+ defer ccr.mu.Unlock() -+ -+ // ccr.resolver field is set only after the call to Build() returns. But in -+ // the process of building, the resolver may send an error update which when -+ // propagated to the balancer may result in a re-resolution request. -+ if ccr.closed || ccr.resolver == nil { -+ return - } -- ccr.resolverMu.Unlock() -+ ccr.resolver.ResolveNow(o) - } - - func (ccr *ccResolverWrapper) close() { -- ccr.resolverMu.Lock() -- ccr.resolver.Close() -- ccr.done.Fire() -- ccr.resolverMu.Unlock() -+ ccr.mu.Lock() -+ if ccr.closed { -+ ccr.mu.Unlock() -+ return -+ } -+ -+ channelz.Info(logger, ccr.channelzID, "Closing the name resolver") -+ -+ // Close the serializer to ensure that no more calls from the resolver are -+ // handled, before actually closing the resolver. -+ ccr.serializerCancel() -+ ccr.closed = true -+ r := ccr.resolver -+ ccr.mu.Unlock() -+ -+ // Give enqueued callbacks a chance to finish. -+ <-ccr.serializer.Done -+ -+ // Spawn a goroutine to close the resolver (since it may block trying to -+ // cleanup all allocated resources) and return early. -+ go r.Close() - } - -+// serializerScheduleLocked is a convenience method to schedule a function to be -+// run on the serializer while holding ccr.mu. -+func (ccr *ccResolverWrapper) serializerScheduleLocked(f func(context.Context)) { -+ ccr.mu.Lock() -+ ccr.serializer.Schedule(f) -+ ccr.mu.Unlock() -+} -+ -+// UpdateState is called by resolver implementations to report new state to gRPC -+// which includes addresses and service config. - func (ccr *ccResolverWrapper) UpdateState(s resolver.State) error { -- ccr.incomingMu.Lock() -- defer ccr.incomingMu.Unlock() -- if ccr.done.HasFired() { -- return nil -- } -- channelz.Infof(logger, ccr.cc.channelzID, "ccResolverWrapper: sending update to cc: %v", s) -- if channelz.IsOn() { -+ errCh := make(chan error, 1) -+ ok := ccr.serializer.Schedule(func(context.Context) { - ccr.addChannelzTraceEvent(s) -+ ccr.curState = s -+ if err := ccr.cc.updateResolverState(ccr.curState, nil); err == balancer.ErrBadResolverState { -+ errCh <- balancer.ErrBadResolverState -+ return -+ } -+ errCh <- nil -+ }) -+ if !ok { -+ // The only time when Schedule() fail to add the callback to the -+ // serializer is when the serializer is closed, and this happens only -+ // when the resolver wrapper is closed. -+ return nil - } -- ccr.curState = s -- if err := ccr.cc.updateResolverState(ccr.curState, nil); err == balancer.ErrBadResolverState { -- return balancer.ErrBadResolverState -- } -- return nil -+ return <-errCh - } - -+// ReportError is called by resolver implementations to report errors -+// encountered during name resolution to gRPC. - func (ccr *ccResolverWrapper) ReportError(err error) { -- ccr.incomingMu.Lock() -- defer ccr.incomingMu.Unlock() -- if ccr.done.HasFired() { -- return -- } -- channelz.Warningf(logger, ccr.cc.channelzID, "ccResolverWrapper: reporting error to cc: %v", err) -- ccr.cc.updateResolverState(resolver.State{}, err) -+ ccr.serializerScheduleLocked(func(_ context.Context) { -+ channelz.Warningf(logger, ccr.channelzID, "ccResolverWrapper: reporting error to cc: %v", err) -+ ccr.cc.updateResolverState(resolver.State{}, err) -+ }) - } - --// NewAddress is called by the resolver implementation to send addresses to gRPC. -+// NewAddress is called by the resolver implementation to send addresses to -+// gRPC. - func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) { -- ccr.incomingMu.Lock() -- defer ccr.incomingMu.Unlock() -- if ccr.done.HasFired() { -- return -- } -- channelz.Infof(logger, ccr.cc.channelzID, "ccResolverWrapper: sending new addresses to cc: %v", addrs) -- if channelz.IsOn() { -+ ccr.serializerScheduleLocked(func(_ context.Context) { - ccr.addChannelzTraceEvent(resolver.State{Addresses: addrs, ServiceConfig: ccr.curState.ServiceConfig}) -- } -- ccr.curState.Addresses = addrs -- ccr.cc.updateResolverState(ccr.curState, nil) -+ ccr.curState.Addresses = addrs -+ ccr.cc.updateResolverState(ccr.curState, nil) -+ }) - } - - // NewServiceConfig is called by the resolver implementation to send service - // configs to gRPC. - func (ccr *ccResolverWrapper) NewServiceConfig(sc string) { -- ccr.incomingMu.Lock() -- defer ccr.incomingMu.Unlock() -- if ccr.done.HasFired() { -- return -- } -- channelz.Infof(logger, ccr.cc.channelzID, "ccResolverWrapper: got new service config: %v", sc) -- if ccr.cc.dopts.disableServiceConfig { -- channelz.Info(logger, ccr.cc.channelzID, "Service config lookups disabled; ignoring config") -- return -- } -- scpr := parseServiceConfig(sc) -- if scpr.Err != nil { -- channelz.Warningf(logger, ccr.cc.channelzID, "ccResolverWrapper: error parsing service config: %v", scpr.Err) -- return -- } -- if channelz.IsOn() { -+ ccr.serializerScheduleLocked(func(_ context.Context) { -+ channelz.Infof(logger, ccr.channelzID, "ccResolverWrapper: got new service config: %s", sc) -+ if ccr.ignoreServiceConfig { -+ channelz.Info(logger, ccr.channelzID, "Service config lookups disabled; ignoring config") -+ return -+ } -+ scpr := parseServiceConfig(sc) -+ if scpr.Err != nil { -+ channelz.Warningf(logger, ccr.channelzID, "ccResolverWrapper: error parsing service config: %v", scpr.Err) -+ return -+ } - ccr.addChannelzTraceEvent(resolver.State{Addresses: ccr.curState.Addresses, ServiceConfig: scpr}) -- } -- ccr.curState.ServiceConfig = scpr -- ccr.cc.updateResolverState(ccr.curState, nil) -+ ccr.curState.ServiceConfig = scpr -+ ccr.cc.updateResolverState(ccr.curState, nil) -+ }) - } - -+// ParseServiceConfig is called by resolver implementations to parse a JSON -+// representation of the service config. - func (ccr *ccResolverWrapper) ParseServiceConfig(scJSON string) *serviceconfig.ParseResult { - return parseServiceConfig(scJSON) - } - -+// addChannelzTraceEvent adds a channelz trace event containing the new -+// state received from resolver implementations. - func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) { - var updates []string - var oldSC, newSC *ServiceConfig -@@ -180,8 +235,5 @@ func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) { - } else if len(ccr.curState.Addresses) == 0 && len(s.Addresses) > 0 { - updates = append(updates, "resolver returned new addresses") - } -- channelz.AddTraceEvent(logger, ccr.cc.channelzID, 0, &channelz.TraceEventDesc{ -- Desc: fmt.Sprintf("Resolver state updated: %+v (%v)", s, strings.Join(updates, "; ")), -- Severity: channelz.CtInfo, -- }) -+ channelz.Infof(logger, ccr.channelzID, "Resolver state updated: %s (%v)", pretty.ToJSON(s), strings.Join(updates, "; ")) - } -diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go -index 87987a2..2030736 100644 ---- a/vendor/google.golang.org/grpc/rpc_util.go -+++ b/vendor/google.golang.org/grpc/rpc_util.go -@@ -25,7 +25,6 @@ import ( - "encoding/binary" - "fmt" - "io" -- "io/ioutil" - "math" - "strings" - "sync" -@@ -77,7 +76,7 @@ func NewGZIPCompressorWithLevel(level int) (Compressor, error) { - return &gzipCompressor{ - pool: sync.Pool{ - New: func() interface{} { -- w, err := gzip.NewWriterLevel(ioutil.Discard, level) -+ w, err := gzip.NewWriterLevel(io.Discard, level) - if err != nil { - panic(err) - } -@@ -143,7 +142,7 @@ func (d *gzipDecompressor) Do(r io.Reader) ([]byte, error) { - z.Close() - d.pool.Put(z) - }() -- return ioutil.ReadAll(z) -+ return io.ReadAll(z) - } - - func (d *gzipDecompressor) Type() string { -@@ -160,6 +159,7 @@ type callInfo struct { - contentSubtype string - codec baseCodec - maxRetryRPCBufferSize int -+ onFinish []func(err error) - } - - func defaultCallInfo() *callInfo { -@@ -198,7 +198,7 @@ func Header(md *metadata.MD) CallOption { - // HeaderCallOption is a CallOption for collecting response header metadata. - // The metadata field will be populated *after* the RPC completes. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -220,7 +220,7 @@ func Trailer(md *metadata.MD) CallOption { - // TrailerCallOption is a CallOption for collecting response trailer metadata. - // The metadata field will be populated *after* the RPC completes. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -242,7 +242,7 @@ func Peer(p *peer.Peer) CallOption { - // PeerCallOption is a CallOption for collecting the identity of the remote - // peer. The peer field will be populated *after* the RPC completes. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -282,7 +282,7 @@ func FailFast(failFast bool) CallOption { - // FailFastCallOption is a CallOption for indicating whether an RPC should fail - // fast or not. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -296,8 +296,44 @@ func (o FailFastCallOption) before(c *callInfo) error { - } - func (o FailFastCallOption) after(c *callInfo, attempt *csAttempt) {} - -+// OnFinish returns a CallOption that configures a callback to be called when -+// the call completes. The error passed to the callback is the status of the -+// RPC, and may be nil. The onFinish callback provided will only be called once -+// by gRPC. This is mainly used to be used by streaming interceptors, to be -+// notified when the RPC completes along with information about the status of -+// the RPC. -+// -+// # Experimental -+// -+// Notice: This API is EXPERIMENTAL and may be changed or removed in a -+// later release. -+func OnFinish(onFinish func(err error)) CallOption { -+ return OnFinishCallOption{ -+ OnFinish: onFinish, -+ } -+} -+ -+// OnFinishCallOption is CallOption that indicates a callback to be called when -+// the call completes. -+// -+// # Experimental -+// -+// Notice: This type is EXPERIMENTAL and may be changed or removed in a -+// later release. -+type OnFinishCallOption struct { -+ OnFinish func(error) -+} -+ -+func (o OnFinishCallOption) before(c *callInfo) error { -+ c.onFinish = append(c.onFinish, o.OnFinish) -+ return nil -+} -+ -+func (o OnFinishCallOption) after(c *callInfo, attempt *csAttempt) {} -+ - // MaxCallRecvMsgSize returns a CallOption which sets the maximum message size --// in bytes the client can receive. -+// in bytes the client can receive. If this is not set, gRPC uses the default -+// 4MB. - func MaxCallRecvMsgSize(bytes int) CallOption { - return MaxRecvMsgSizeCallOption{MaxRecvMsgSize: bytes} - } -@@ -305,7 +341,7 @@ func MaxCallRecvMsgSize(bytes int) CallOption { - // MaxRecvMsgSizeCallOption is a CallOption that indicates the maximum message - // size in bytes the client can receive. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -320,7 +356,8 @@ func (o MaxRecvMsgSizeCallOption) before(c *callInfo) error { - func (o MaxRecvMsgSizeCallOption) after(c *callInfo, attempt *csAttempt) {} - - // MaxCallSendMsgSize returns a CallOption which sets the maximum message size --// in bytes the client can send. -+// in bytes the client can send. If this is not set, gRPC uses the default -+// `math.MaxInt32`. - func MaxCallSendMsgSize(bytes int) CallOption { - return MaxSendMsgSizeCallOption{MaxSendMsgSize: bytes} - } -@@ -328,7 +365,7 @@ func MaxCallSendMsgSize(bytes int) CallOption { - // MaxSendMsgSizeCallOption is a CallOption that indicates the maximum message - // size in bytes the client can send. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -351,7 +388,7 @@ func PerRPCCredentials(creds credentials.PerRPCCredentials) CallOption { - // PerRPCCredsCallOption is a CallOption that indicates the per-RPC - // credentials to use for the call. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -369,7 +406,7 @@ func (o PerRPCCredsCallOption) after(c *callInfo, attempt *csAttempt) {} - // sending the request. If WithCompressor is also set, UseCompressor has - // higher priority. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -379,7 +416,7 @@ func UseCompressor(name string) CallOption { - - // CompressorCallOption is a CallOption that indicates the compressor to use. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -416,7 +453,7 @@ func CallContentSubtype(contentSubtype string) CallOption { - // ContentSubtypeCallOption is a CallOption that indicates the content-subtype - // used for marshaling messages. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -444,7 +481,7 @@ func (o ContentSubtypeCallOption) after(c *callInfo, attempt *csAttempt) {} - // This function is provided for advanced users; prefer to use only - // CallContentSubtype to select a registered codec instead. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -455,7 +492,7 @@ func ForceCodec(codec encoding.Codec) CallOption { - // ForceCodecCallOption is a CallOption that indicates the codec used for - // marshaling messages. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -480,7 +517,7 @@ func CallCustomCodec(codec Codec) CallOption { - // CustomCodecCallOption is a CallOption that indicates the codec used for - // marshaling messages. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -497,7 +534,7 @@ func (o CustomCodecCallOption) after(c *callInfo, attempt *csAttempt) {} - // MaxRetryRPCBufferSize returns a CallOption that limits the amount of memory - // used for buffering this RPC's requests for retry purposes. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -508,7 +545,7 @@ func MaxRetryRPCBufferSize(bytes int) CallOption { - // MaxRetryRPCBufferSizeCallOption is a CallOption indicating the amount of - // memory to be used for caching this RPC for retry purposes. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -548,10 +585,11 @@ type parser struct { - // format. The caller owns the returned msg memory. - // - // If there is an error, possible values are: --// * io.EOF, when no messages remain --// * io.ErrUnexpectedEOF --// * of type transport.ConnectionError --// * an error from the status package -+// - io.EOF, when no messages remain -+// - io.ErrUnexpectedEOF -+// - of type transport.ConnectionError -+// - an error from the status package -+// - // No other error values or types must be returned, which also means - // that the underlying io.Reader must not return an incompatible - // error. -@@ -656,12 +694,13 @@ func msgHeader(data, compData []byte) (hdr []byte, payload []byte) { - - func outPayload(client bool, msg interface{}, data, payload []byte, t time.Time) *stats.OutPayload { - return &stats.OutPayload{ -- Client: client, -- Payload: msg, -- Data: data, -- Length: len(data), -- WireLength: len(payload) + headerLen, -- SentTime: t, -+ Client: client, -+ Payload: msg, -+ Data: data, -+ Length: len(data), -+ WireLength: len(payload) + headerLen, -+ CompressedLength: len(payload), -+ SentTime: t, - } - } - -@@ -682,7 +721,7 @@ func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool - } - - type payloadInfo struct { -- wireLength int // The compressed length got from wire. -+ compressedLength int // The compressed length got from wire. - uncompressedBytes []byte - } - -@@ -692,7 +731,7 @@ func recvAndDecompress(p *parser, s *transport.Stream, dc Decompressor, maxRecei - return nil, err - } - if payInfo != nil { -- payInfo.wireLength = len(d) -+ payInfo.compressedLength = len(d) - } - - if st := checkRecvPayload(pf, s.RecvCompress(), compressor != nil || dc != nil); st != nil { -@@ -710,15 +749,13 @@ func recvAndDecompress(p *parser, s *transport.Stream, dc Decompressor, maxRecei - d, size, err = decompress(compressor, d, maxReceiveMessageSize) - } - if err != nil { -- return nil, status.Errorf(codes.Internal, "grpc: failed to decompress the received message %v", err) -+ return nil, status.Errorf(codes.Internal, "grpc: failed to decompress the received message: %v", err) -+ } -+ if size > maxReceiveMessageSize { -+ // TODO: Revisit the error code. Currently keep it consistent with java -+ // implementation. -+ return nil, status.Errorf(codes.ResourceExhausted, "grpc: received message after decompression larger than max (%d vs. %d)", size, maxReceiveMessageSize) - } -- } else { -- size = len(d) -- } -- if size > maxReceiveMessageSize { -- // TODO: Revisit the error code. Currently keep it consistent with java -- // implementation. -- return nil, status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", size, maxReceiveMessageSize) - } - return d, nil - } -@@ -747,7 +784,7 @@ func decompress(compressor encoding.Compressor, d []byte, maxReceiveMessageSize - } - // Read from LimitReader with limit max+1. So if the underlying - // reader is over limit, the result will be bigger than max. -- d, err = ioutil.ReadAll(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) -+ d, err = io.ReadAll(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) - return d, len(d), err - } - -@@ -760,7 +797,7 @@ func recv(p *parser, c baseCodec, s *transport.Stream, dc Decompressor, m interf - return err - } - if err := c.Unmarshal(d, m); err != nil { -- return status.Errorf(codes.Internal, "grpc: failed to unmarshal the received message %v", err) -+ return status.Errorf(codes.Internal, "grpc: failed to unmarshal the received message: %v", err) - } - if payInfo != nil { - payInfo.uncompressedBytes = d -diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go -index 0251f48..8869cc9 100644 ---- a/vendor/google.golang.org/grpc/server.go -+++ b/vendor/google.golang.org/grpc/server.go -@@ -43,8 +43,8 @@ import ( - "google.golang.org/grpc/internal" - "google.golang.org/grpc/internal/binarylog" - "google.golang.org/grpc/internal/channelz" -- "google.golang.org/grpc/internal/grpcrand" - "google.golang.org/grpc/internal/grpcsync" -+ "google.golang.org/grpc/internal/grpcutil" - "google.golang.org/grpc/internal/transport" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/metadata" -@@ -73,6 +73,14 @@ func init() { - internal.DrainServerTransports = func(srv *Server, addr string) { - srv.drainServerTransports(addr) - } -+ internal.AddGlobalServerOptions = func(opt ...ServerOption) { -+ globalServerOptions = append(globalServerOptions, opt...) -+ } -+ internal.ClearGlobalServerOptions = func() { -+ globalServerOptions = nil -+ } -+ internal.BinaryLogger = binaryLogger -+ internal.JoinServerOptions = newJoinServerOption - } - - var statusOK = status.New(codes.OK, "") -@@ -107,12 +115,6 @@ type serviceInfo struct { - mdata interface{} - } - --type serverWorkerData struct { -- st transport.ServerTransport -- wg *sync.WaitGroup -- stream *transport.Stream --} -- - // Server is a gRPC server to serve RPC requests. - type Server struct { - opts serverOptions -@@ -134,10 +136,10 @@ type Server struct { - channelzRemoveOnce sync.Once - serveWG sync.WaitGroup // counts active Serve goroutines for GracefulStop - -- channelzID int64 // channelz unique identification number -+ channelzID *channelz.Identifier - czData *channelzData - -- serverWorkerChannels []chan *serverWorkerData -+ serverWorkerChannel chan func() - } - - type serverOptions struct { -@@ -149,8 +151,9 @@ type serverOptions struct { - streamInt StreamServerInterceptor - chainUnaryInts []UnaryServerInterceptor - chainStreamInts []StreamServerInterceptor -+ binaryLogger binarylog.Logger - inTapHandle tap.ServerInHandle -- statsHandler stats.Handler -+ statsHandlers []stats.Handler - maxConcurrentStreams uint32 - maxReceiveMessageSize int - maxSendMessageSize int -@@ -168,12 +171,14 @@ type serverOptions struct { - } - - var defaultServerOptions = serverOptions{ -+ maxConcurrentStreams: math.MaxUint32, - maxReceiveMessageSize: defaultServerMaxReceiveMessageSize, - maxSendMessageSize: defaultServerMaxSendMessageSize, - connectionTimeout: 120 * time.Second, - writeBufferSize: defaultWriteBufSize, - readBufferSize: defaultReadBufSize, - } -+var globalServerOptions []ServerOption - - // A ServerOption sets options such as credentials, codec and keepalive parameters, etc. - type ServerOption interface { -@@ -183,7 +188,7 @@ type ServerOption interface { - // EmptyServerOption does not alter the server configuration. It can be embedded - // in another structure to build custom server options. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -207,10 +212,27 @@ func newFuncServerOption(f func(*serverOptions)) *funcServerOption { - } - } - --// WriteBufferSize determines how much data can be batched before doing a write on the wire. --// The corresponding memory allocation for this buffer will be twice the size to keep syscalls low. --// The default value for this buffer is 32KB. --// Zero will disable the write buffer such that each write will be on underlying connection. -+// joinServerOption provides a way to combine arbitrary number of server -+// options into one. -+type joinServerOption struct { -+ opts []ServerOption -+} -+ -+func (mdo *joinServerOption) apply(do *serverOptions) { -+ for _, opt := range mdo.opts { -+ opt.apply(do) -+ } -+} -+ -+func newJoinServerOption(opts ...ServerOption) ServerOption { -+ return &joinServerOption{opts: opts} -+} -+ -+// WriteBufferSize determines how much data can be batched before doing a write -+// on the wire. The corresponding memory allocation for this buffer will be -+// twice the size to keep syscalls low. The default value for this buffer is -+// 32KB. Zero or negative values will disable the write buffer such that each -+// write will be on underlying connection. - // Note: A Send call may not directly translate to a write. - func WriteBufferSize(s int) ServerOption { - return newFuncServerOption(func(o *serverOptions) { -@@ -218,11 +240,10 @@ func WriteBufferSize(s int) ServerOption { - }) - } - --// ReadBufferSize lets you set the size of read buffer, this determines how much data can be read at most --// for one read syscall. --// The default value for this buffer is 32KB. --// Zero will disable read buffer for a connection so data framer can access the underlying --// conn directly. -+// ReadBufferSize lets you set the size of read buffer, this determines how much -+// data can be read at most for one read syscall. The default value for this -+// buffer is 32KB. Zero or negative values will disable read buffer for a -+// connection so data framer can access the underlying conn directly. - func ReadBufferSize(s int) ServerOption { - return newFuncServerOption(func(o *serverOptions) { - o.readBufferSize = s -@@ -298,7 +319,7 @@ func CustomCodec(codec Codec) ServerOption { - // https://github.com/grpc/grpc-go/blob/master/Documentation/encoding.md#using-a-codec. - // Will be supported throughout 1.x. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -361,6 +382,9 @@ func MaxSendMsgSize(m int) ServerOption { - // MaxConcurrentStreams returns a ServerOption that will apply a limit on the number - // of concurrent streams to each ServerTransport. - func MaxConcurrentStreams(n uint32) ServerOption { -+ if n == 0 { -+ n = math.MaxUint32 -+ } - return newFuncServerOption(func(o *serverOptions) { - o.maxConcurrentStreams = n - }) -@@ -419,7 +443,7 @@ func ChainStreamInterceptor(interceptors ...StreamServerInterceptor) ServerOptio - // InTapHandle returns a ServerOption that sets the tap handle for all the server - // transport to be created. Only one can be installed. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -435,7 +459,21 @@ func InTapHandle(h tap.ServerInHandle) ServerOption { - // StatsHandler returns a ServerOption that sets the stats handler for the server. - func StatsHandler(h stats.Handler) ServerOption { - return newFuncServerOption(func(o *serverOptions) { -- o.statsHandler = h -+ if h == nil { -+ logger.Error("ignoring nil parameter in grpc.StatsHandler ServerOption") -+ // Do not allow a nil stats handler, which would otherwise cause -+ // panics. -+ return -+ } -+ o.statsHandlers = append(o.statsHandlers, h) -+ }) -+} -+ -+// binaryLogger returns a ServerOption that can set the binary logger for the -+// server. -+func binaryLogger(bl binarylog.Logger) ServerOption { -+ return newFuncServerOption(func(o *serverOptions) { -+ o.binaryLogger = bl - }) - } - -@@ -462,7 +500,7 @@ func UnknownServiceHandler(streamHandler StreamHandler) ServerOption { - // new connections. If this is not set, the default is 120 seconds. A zero or - // negative value will result in an immediate timeout. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -483,7 +521,7 @@ func MaxHeaderListSize(s uint32) ServerOption { - // HeaderTableSize returns a ServerOption that sets the size of dynamic - // header table for stream. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -498,7 +536,7 @@ func HeaderTableSize(s uint32) ServerOption { - // zero (default) will disable workers and spawn a new goroutine for each - // stream. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -520,46 +558,42 @@ func NumStreamWorkers(numServerWorkers uint32) ServerOption { - const serverWorkerResetThreshold = 1 << 16 - - // serverWorkers blocks on a *transport.Stream channel forever and waits for --// data to be fed by serveStreams. This allows different requests to be -+// data to be fed by serveStreams. This allows multiple requests to be - // processed by the same goroutine, removing the need for expensive stack - // re-allocations (see the runtime.morestack problem [1]). - // - // [1] https://github.com/golang/go/issues/18138 --func (s *Server) serverWorker(ch chan *serverWorkerData) { -- // To make sure all server workers don't reset at the same time, choose a -- // random number of iterations before resetting. -- threshold := serverWorkerResetThreshold + grpcrand.Intn(serverWorkerResetThreshold) -- for completed := 0; completed < threshold; completed++ { -- data, ok := <-ch -+func (s *Server) serverWorker() { -+ for completed := 0; completed < serverWorkerResetThreshold; completed++ { -+ f, ok := <-s.serverWorkerChannel - if !ok { - return - } -- s.handleStream(data.st, data.stream, s.traceInfo(data.st, data.stream)) -- data.wg.Done() -+ f() - } -- go s.serverWorker(ch) -+ go s.serverWorker() - } - --// initServerWorkers creates worker goroutines and channels to process incoming -+// initServerWorkers creates worker goroutines and a channel to process incoming - // connections to reduce the time spent overall on runtime.morestack. - func (s *Server) initServerWorkers() { -- s.serverWorkerChannels = make([]chan *serverWorkerData, s.opts.numServerWorkers) -+ s.serverWorkerChannel = make(chan func()) - for i := uint32(0); i < s.opts.numServerWorkers; i++ { -- s.serverWorkerChannels[i] = make(chan *serverWorkerData) -- go s.serverWorker(s.serverWorkerChannels[i]) -+ go s.serverWorker() - } - } - - func (s *Server) stopServerWorkers() { -- for i := uint32(0); i < s.opts.numServerWorkers; i++ { -- close(s.serverWorkerChannels[i]) -- } -+ close(s.serverWorkerChannel) - } - - // NewServer creates a gRPC server which has no service registered and has not - // started to accept requests yet. - func NewServer(opt ...ServerOption) *Server { - opts := defaultServerOptions -+ for _, o := range globalServerOptions { -+ o.apply(&opts) -+ } - for _, o := range opt { - o.apply(&opts) - } -@@ -584,9 +618,8 @@ func NewServer(opt ...ServerOption) *Server { - s.initServerWorkers() - } - -- if channelz.IsOn() { -- s.channelzID = channelz.RegisterServer(&channelzServer{s}, "") -- } -+ s.channelzID = channelz.RegisterServer(&channelzServer{s}, "") -+ channelz.Info(logger, s.channelzID, "Server created") - return s - } - -@@ -710,16 +743,9 @@ func (s *Server) GetServiceInfo() map[string]ServiceInfo { - // the server being stopped. - var ErrServerStopped = errors.New("grpc: the server has been stopped") - --func (s *Server) useTransportAuthenticator(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) { -- if s.opts.creds == nil { -- return rawConn, nil, nil -- } -- return s.opts.creds.ServerHandshake(rawConn) --} -- - type listenSocket struct { - net.Listener -- channelzID int64 -+ channelzID *channelz.Identifier - } - - func (l *listenSocket) ChannelzMetric() *channelz.SocketInternalMetric { -@@ -731,9 +757,8 @@ func (l *listenSocket) ChannelzMetric() *channelz.SocketInternalMetric { - - func (l *listenSocket) Close() error { - err := l.Listener.Close() -- if channelz.IsOn() { -- channelz.RemoveEntry(l.channelzID) -- } -+ channelz.RemoveEntry(l.channelzID) -+ channelz.Info(logger, l.channelzID, "ListenSocket deleted") - return err - } - -@@ -766,11 +791,6 @@ func (s *Server) Serve(lis net.Listener) error { - ls := &listenSocket{Listener: lis} - s.lis[ls] = true - -- if channelz.IsOn() { -- ls.channelzID = channelz.RegisterListenSocket(ls, s.channelzID, lis.Addr().String()) -- } -- s.mu.Unlock() -- - defer func() { - s.mu.Lock() - if s.lis != nil && s.lis[ls] { -@@ -780,8 +800,16 @@ func (s *Server) Serve(lis net.Listener) error { - s.mu.Unlock() - }() - -- var tempDelay time.Duration // how long to sleep on accept failure -+ var err error -+ ls.channelzID, err = channelz.RegisterListenSocket(ls, s.channelzID, lis.Addr().String()) -+ if err != nil { -+ s.mu.Unlock() -+ return err -+ } -+ s.mu.Unlock() -+ channelz.Info(logger, ls.channelzID, "ListenSocket created") - -+ var tempDelay time.Duration // how long to sleep on accept failure - for { - rawConn, err := lis.Accept() - if err != nil { -@@ -839,35 +867,14 @@ func (s *Server) handleRawConn(lisAddr string, rawConn net.Conn) { - return - } - rawConn.SetDeadline(time.Now().Add(s.opts.connectionTimeout)) -- conn, authInfo, err := s.useTransportAuthenticator(rawConn) -- if err != nil { -- // ErrConnDispatched means that the connection was dispatched away from -- // gRPC; those connections should be left open. -- if err != credentials.ErrConnDispatched { -- // In deployments where a gRPC server runs behind a cloud load -- // balancer which performs regular TCP level health checks, the -- // connection is closed immediately by the latter. Skipping the -- // error here will help reduce log clutter. -- if err != io.EOF { -- s.mu.Lock() -- s.errorf("ServerHandshake(%q) failed: %v", rawConn.RemoteAddr(), err) -- s.mu.Unlock() -- channelz.Warningf(logger, s.channelzID, "grpc: Server.Serve failed to complete security handshake from %q: %v", rawConn.RemoteAddr(), err) -- } -- rawConn.Close() -- } -- rawConn.SetDeadline(time.Time{}) -- return -- } - - // Finish handshaking (HTTP2) -- st := s.newHTTP2Transport(conn, authInfo) -+ st := s.newHTTP2Transport(rawConn) -+ rawConn.SetDeadline(time.Time{}) - if st == nil { -- conn.Close() - return - } - -- rawConn.SetDeadline(time.Time{}) - if !s.addConn(lisAddr, st) { - return - } -@@ -881,19 +888,20 @@ func (s *Server) drainServerTransports(addr string) { - s.mu.Lock() - conns := s.conns[addr] - for st := range conns { -- st.Drain() -+ st.Drain("") - } - s.mu.Unlock() - } - - // newHTTP2Transport sets up a http/2 transport (using the - // gRPC http2 server transport in transport/http2_server.go). --func (s *Server) newHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo) transport.ServerTransport { -+func (s *Server) newHTTP2Transport(c net.Conn) transport.ServerTransport { - config := &transport.ServerConfig{ - MaxStreams: s.opts.maxConcurrentStreams, -- AuthInfo: authInfo, -+ ConnectionTimeout: s.opts.connectionTimeout, -+ Credentials: s.opts.creds, - InTapHandle: s.opts.inTapHandle, -- StatsHandler: s.opts.statsHandler, -+ StatsHandlers: s.opts.statsHandlers, - KeepaliveParams: s.opts.keepaliveParams, - KeepalivePolicy: s.opts.keepalivePolicy, - InitialWindowSize: s.opts.initialWindowSize, -@@ -909,8 +917,15 @@ func (s *Server) newHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo) tr - s.mu.Lock() - s.errorf("NewServerTransport(%q) failed: %v", c.RemoteAddr(), err) - s.mu.Unlock() -- c.Close() -- channelz.Warning(logger, s.channelzID, "grpc: Server.Serve failed to create ServerTransport: ", err) -+ // ErrConnDispatched means that the connection was dispatched away from -+ // gRPC; those connections should be left open. -+ if err != credentials.ErrConnDispatched { -+ // Don't log on ErrConnDispatched and io.EOF to prevent log spam. -+ if err != io.EOF { -+ channelz.Info(logger, s.channelzID, "grpc: Server.Serve failed to create ServerTransport: ", err) -+ } -+ c.Close() -+ } - return nil - } - -@@ -918,29 +933,29 @@ func (s *Server) newHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo) tr - } - - func (s *Server) serveStreams(st transport.ServerTransport) { -- defer st.Close() -+ defer st.Close(errors.New("finished serving streams for the server transport")) - var wg sync.WaitGroup - -- var roundRobinCounter uint32 -+ streamQuota := newHandlerQuota(s.opts.maxConcurrentStreams) - st.HandleStreams(func(stream *transport.Stream) { - wg.Add(1) -+ -+ streamQuota.acquire() -+ f := func() { -+ defer streamQuota.release() -+ defer wg.Done() -+ s.handleStream(st, stream, s.traceInfo(st, stream)) -+ } -+ - if s.opts.numServerWorkers > 0 { -- data := &serverWorkerData{st: st, wg: &wg, stream: stream} - select { -- case s.serverWorkerChannels[atomic.AddUint32(&roundRobinCounter, 1)%s.opts.numServerWorkers] <- data: -+ case s.serverWorkerChannel <- f: -+ return - default: - // If all stream workers are busy, fallback to the default code path. -- go func() { -- s.handleStream(st, stream, s.traceInfo(st, stream)) -- wg.Done() -- }() - } -- } else { -- go func() { -- defer wg.Done() -- s.handleStream(st, stream, s.traceInfo(st, stream)) -- }() - } -+ go f() - }, func(ctx context.Context, method string) context.Context { - if !EnableTracing { - return ctx -@@ -965,26 +980,27 @@ var _ http.Handler = (*Server)(nil) - // To share one port (such as 443 for https) between gRPC and an - // existing http.Handler, use a root http.Handler such as: - // --// if r.ProtoMajor == 2 && strings.HasPrefix( --// r.Header.Get("Content-Type"), "application/grpc") { --// grpcServer.ServeHTTP(w, r) --// } else { --// yourMux.ServeHTTP(w, r) --// } -+// if r.ProtoMajor == 2 && strings.HasPrefix( -+// r.Header.Get("Content-Type"), "application/grpc") { -+// grpcServer.ServeHTTP(w, r) -+// } else { -+// yourMux.ServeHTTP(w, r) -+// } - // - // Note that ServeHTTP uses Go's HTTP/2 server implementation which is totally - // separate from grpc-go's HTTP/2 server. Performance and features may vary - // between the two paths. ServeHTTP does not support some gRPC features - // available through grpc-go's HTTP/2 server. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. - func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { -- st, err := transport.NewServerHandlerTransport(w, r, s.opts.statsHandler) -+ st, err := transport.NewServerHandlerTransport(w, r, s.opts.statsHandlers) - if err != nil { -- http.Error(w, err.Error(), http.StatusInternalServerError) -+ // Errors returned from transport.NewServerHandlerTransport have -+ // already been written to w. - return - } - if !s.addConn(listenerAddressForServeHTTP, st) { -@@ -1022,13 +1038,13 @@ func (s *Server) addConn(addr string, st transport.ServerTransport) bool { - s.mu.Lock() - defer s.mu.Unlock() - if s.conns == nil { -- st.Close() -+ st.Close(errors.New("Server.addConn called when server has already been stopped")) - return false - } - if s.drain { - // Transport added after we drained our existing conns: drain it - // immediately. -- st.Drain() -+ st.Drain("") - } - - if s.conns[addr] == nil { -@@ -1095,8 +1111,10 @@ func (s *Server) sendResponse(t transport.ServerTransport, stream *transport.Str - return status.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", len(payload), s.opts.maxSendMessageSize) - } - err = t.Write(stream, hdr, payload, opts) -- if err == nil && s.opts.statsHandler != nil { -- s.opts.statsHandler.HandleRPC(stream.Context(), outPayload(false, msg, data, payload, time.Now())) -+ if err == nil { -+ for _, sh := range s.opts.statsHandlers { -+ sh.HandleRPC(stream.Context(), outPayload(false, msg, data, payload, time.Now())) -+ } - } - return err - } -@@ -1124,27 +1142,27 @@ func chainUnaryServerInterceptors(s *Server) { - - func chainUnaryInterceptors(interceptors []UnaryServerInterceptor) UnaryServerInterceptor { - return func(ctx context.Context, req interface{}, info *UnaryServerInfo, handler UnaryHandler) (interface{}, error) { -- var i int -- var next UnaryHandler -- next = func(ctx context.Context, req interface{}) (interface{}, error) { -- if i == len(interceptors)-1 { -- return interceptors[i](ctx, req, info, handler) -- } -- i++ -- return interceptors[i-1](ctx, req, info, next) -- } -- return next(ctx, req) -+ return interceptors[0](ctx, req, info, getChainUnaryHandler(interceptors, 0, info, handler)) -+ } -+} -+ -+func getChainUnaryHandler(interceptors []UnaryServerInterceptor, curr int, info *UnaryServerInfo, finalHandler UnaryHandler) UnaryHandler { -+ if curr == len(interceptors)-1 { -+ return finalHandler -+ } -+ return func(ctx context.Context, req interface{}) (interface{}, error) { -+ return interceptors[curr+1](ctx, req, info, getChainUnaryHandler(interceptors, curr+1, info, finalHandler)) - } - } - - func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.Stream, info *serviceInfo, md *MethodDesc, trInfo *traceInfo) (err error) { -- sh := s.opts.statsHandler -- if sh != nil || trInfo != nil || channelz.IsOn() { -+ shs := s.opts.statsHandlers -+ if len(shs) != 0 || trInfo != nil || channelz.IsOn() { - if channelz.IsOn() { - s.incrCallsStarted() - } - var statsBegin *stats.Begin -- if sh != nil { -+ for _, sh := range shs { - beginTime := time.Now() - statsBegin = &stats.Begin{ - BeginTime: beginTime, -@@ -1175,7 +1193,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. - trInfo.tr.Finish() - } - -- if sh != nil { -+ for _, sh := range shs { - end := &stats.End{ - BeginTime: statsBegin.BeginTime, - EndTime: time.Now(), -@@ -1195,9 +1213,16 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. - } - }() - } -- -- binlog := binarylog.GetMethodLogger(stream.Method()) -- if binlog != nil { -+ var binlogs []binarylog.MethodLogger -+ if ml := binarylog.GetMethodLogger(stream.Method()); ml != nil { -+ binlogs = append(binlogs, ml) -+ } -+ if s.opts.binaryLogger != nil { -+ if ml := s.opts.binaryLogger.GetMethodLogger(stream.Method()); ml != nil { -+ binlogs = append(binlogs, ml) -+ } -+ } -+ if len(binlogs) != 0 { - ctx := stream.Context() - md, _ := metadata.FromIncomingContext(ctx) - logEntry := &binarylog.ClientHeader{ -@@ -1217,7 +1242,9 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. - if peer, ok := peer.FromContext(ctx); ok { - logEntry.PeerAddr = peer.Addr - } -- binlog.Log(logEntry) -+ for _, binlog := range binlogs { -+ binlog.Log(ctx, logEntry) -+ } - } - - // comp and cp are used for compression. decomp and dc are used for -@@ -1227,6 +1254,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. - var comp, decomp encoding.Compressor - var cp Compressor - var dc Decompressor -+ var sendCompressorName string - - // If dc is set and matches the stream's compression, use it. Otherwise, try - // to find a matching registered compressor for decomp. -@@ -1247,23 +1275,29 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. - // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686. - if s.opts.cp != nil { - cp = s.opts.cp -- stream.SetSendCompress(cp.Type()) -+ sendCompressorName = cp.Type() - } else if rc := stream.RecvCompress(); rc != "" && rc != encoding.Identity { - // Legacy compressor not specified; attempt to respond with same encoding. - comp = encoding.GetCompressor(rc) - if comp != nil { -- stream.SetSendCompress(rc) -+ sendCompressorName = comp.Name() -+ } -+ } -+ -+ if sendCompressorName != "" { -+ if err := stream.SetSendCompress(sendCompressorName); err != nil { -+ return status.Errorf(codes.Internal, "grpc: failed to set send compressor: %v", err) - } - } - - var payInfo *payloadInfo -- if sh != nil || binlog != nil { -+ if len(shs) != 0 || len(binlogs) != 0 { - payInfo = &payloadInfo{} - } - d, err := recvAndDecompress(&parser{r: stream}, stream, dc, s.opts.maxReceiveMessageSize, payInfo, decomp) - if err != nil { - if e := t.WriteStatus(stream, status.Convert(err)); e != nil { -- channelz.Warningf(logger, s.channelzID, "grpc: Server.processUnaryRPC failed to write status %v", e) -+ channelz.Warningf(logger, s.channelzID, "grpc: Server.processUnaryRPC failed to write status: %v", e) - } - return err - } -@@ -1274,19 +1308,23 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. - if err := s.getCodec(stream.ContentSubtype()).Unmarshal(d, v); err != nil { - return status.Errorf(codes.Internal, "grpc: error unmarshalling request: %v", err) - } -- if sh != nil { -+ for _, sh := range shs { - sh.HandleRPC(stream.Context(), &stats.InPayload{ -- RecvTime: time.Now(), -- Payload: v, -- WireLength: payInfo.wireLength + headerLen, -- Data: d, -- Length: len(d), -+ RecvTime: time.Now(), -+ Payload: v, -+ Length: len(d), -+ WireLength: payInfo.compressedLength + headerLen, -+ CompressedLength: payInfo.compressedLength, -+ Data: d, - }) - } -- if binlog != nil { -- binlog.Log(&binarylog.ClientMessage{ -+ if len(binlogs) != 0 { -+ cm := &binarylog.ClientMessage{ - Message: d, -- }) -+ } -+ for _, binlog := range binlogs { -+ binlog.Log(stream.Context(), cm) -+ } - } - if trInfo != nil { - trInfo.tr.LazyLog(&payload{sent: false, msg: v}, true) -@@ -1298,9 +1336,10 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. - if appErr != nil { - appStatus, ok := status.FromError(appErr) - if !ok { -- // Convert appErr if it is not a grpc status error. -- appErr = status.Error(codes.Unknown, appErr.Error()) -- appStatus, _ = status.FromError(appErr) -+ // Convert non-status application error to a status error with code -+ // Unknown, but handle context errors specifically. -+ appStatus = status.FromContextError(appErr) -+ appErr = appStatus.Err() - } - if trInfo != nil { - trInfo.tr.LazyLog(stringer(appStatus.Message()), true) -@@ -1309,18 +1348,24 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. - if e := t.WriteStatus(stream, appStatus); e != nil { - channelz.Warningf(logger, s.channelzID, "grpc: Server.processUnaryRPC failed to write status: %v", e) - } -- if binlog != nil { -+ if len(binlogs) != 0 { - if h, _ := stream.Header(); h.Len() > 0 { - // Only log serverHeader if there was header. Otherwise it can - // be trailer only. -- binlog.Log(&binarylog.ServerHeader{ -+ sh := &binarylog.ServerHeader{ - Header: h, -- }) -+ } -+ for _, binlog := range binlogs { -+ binlog.Log(stream.Context(), sh) -+ } - } -- binlog.Log(&binarylog.ServerTrailer{ -+ st := &binarylog.ServerTrailer{ - Trailer: stream.Trailer(), - Err: appErr, -- }) -+ } -+ for _, binlog := range binlogs { -+ binlog.Log(stream.Context(), st) -+ } - } - return appErr - } -@@ -1329,6 +1374,11 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. - } - opts := &transport.Options{Last: true} - -+ // Server handler could have set new compressor by calling SetSendCompressor. -+ // In case it is set, we need to use it for compressing outbound message. -+ if stream.SendCompress() != sendCompressorName { -+ comp = encoding.GetCompressor(stream.SendCompress()) -+ } - if err := s.sendResponse(t, stream, reply, cp, opts, comp); err != nil { - if err == io.EOF { - // The entire stream is done (for unary RPC only). -@@ -1346,26 +1396,34 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. - panic(fmt.Sprintf("grpc: Unexpected error (%T) from sendResponse: %v", st, st)) - } - } -- if binlog != nil { -+ if len(binlogs) != 0 { - h, _ := stream.Header() -- binlog.Log(&binarylog.ServerHeader{ -+ sh := &binarylog.ServerHeader{ - Header: h, -- }) -- binlog.Log(&binarylog.ServerTrailer{ -+ } -+ st := &binarylog.ServerTrailer{ - Trailer: stream.Trailer(), - Err: appErr, -- }) -+ } -+ for _, binlog := range binlogs { -+ binlog.Log(stream.Context(), sh) -+ binlog.Log(stream.Context(), st) -+ } - } - return err - } -- if binlog != nil { -+ if len(binlogs) != 0 { - h, _ := stream.Header() -- binlog.Log(&binarylog.ServerHeader{ -+ sh := &binarylog.ServerHeader{ - Header: h, -- }) -- binlog.Log(&binarylog.ServerMessage{ -+ } -+ sm := &binarylog.ServerMessage{ - Message: reply, -- }) -+ } -+ for _, binlog := range binlogs { -+ binlog.Log(stream.Context(), sh) -+ binlog.Log(stream.Context(), sm) -+ } - } - if channelz.IsOn() { - t.IncrMsgSent() -@@ -1376,14 +1434,16 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. - // TODO: Should we be logging if writing status failed here, like above? - // Should the logging be in WriteStatus? Should we ignore the WriteStatus - // error or allow the stats handler to see it? -- err = t.WriteStatus(stream, statusOK) -- if binlog != nil { -- binlog.Log(&binarylog.ServerTrailer{ -+ if len(binlogs) != 0 { -+ st := &binarylog.ServerTrailer{ - Trailer: stream.Trailer(), - Err: appErr, -- }) -+ } -+ for _, binlog := range binlogs { -+ binlog.Log(stream.Context(), st) -+ } - } -- return err -+ return t.WriteStatus(stream, statusOK) - } - - // chainStreamServerInterceptors chains all stream server interceptors into one. -@@ -1409,16 +1469,16 @@ func chainStreamServerInterceptors(s *Server) { - - func chainStreamInterceptors(interceptors []StreamServerInterceptor) StreamServerInterceptor { - return func(srv interface{}, ss ServerStream, info *StreamServerInfo, handler StreamHandler) error { -- var i int -- var next StreamHandler -- next = func(srv interface{}, ss ServerStream) error { -- if i == len(interceptors)-1 { -- return interceptors[i](srv, ss, info, handler) -- } -- i++ -- return interceptors[i-1](srv, ss, info, next) -- } -- return next(srv, ss) -+ return interceptors[0](srv, ss, info, getChainStreamHandler(interceptors, 0, info, handler)) -+ } -+} -+ -+func getChainStreamHandler(interceptors []StreamServerInterceptor, curr int, info *StreamServerInfo, finalHandler StreamHandler) StreamHandler { -+ if curr == len(interceptors)-1 { -+ return finalHandler -+ } -+ return func(srv interface{}, stream ServerStream) error { -+ return interceptors[curr+1](srv, stream, info, getChainStreamHandler(interceptors, curr+1, info, finalHandler)) - } - } - -@@ -1426,16 +1486,18 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp - if channelz.IsOn() { - s.incrCallsStarted() - } -- sh := s.opts.statsHandler -+ shs := s.opts.statsHandlers - var statsBegin *stats.Begin -- if sh != nil { -+ if len(shs) != 0 { - beginTime := time.Now() - statsBegin = &stats.Begin{ - BeginTime: beginTime, - IsClientStream: sd.ClientStreams, - IsServerStream: sd.ServerStreams, - } -- sh.HandleRPC(stream.Context(), statsBegin) -+ for _, sh := range shs { -+ sh.HandleRPC(stream.Context(), statsBegin) -+ } - } - ctx := NewContextWithServerTransportStream(stream.Context(), stream) - ss := &serverStream{ -@@ -1447,10 +1509,10 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp - maxReceiveMessageSize: s.opts.maxReceiveMessageSize, - maxSendMessageSize: s.opts.maxSendMessageSize, - trInfo: trInfo, -- statsHandler: sh, -+ statsHandler: shs, - } - -- if sh != nil || trInfo != nil || channelz.IsOn() { -+ if len(shs) != 0 || trInfo != nil || channelz.IsOn() { - // See comment in processUnaryRPC on defers. - defer func() { - if trInfo != nil { -@@ -1464,7 +1526,7 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp - ss.mu.Unlock() - } - -- if sh != nil { -+ if len(shs) != 0 { - end := &stats.End{ - BeginTime: statsBegin.BeginTime, - EndTime: time.Now(), -@@ -1472,7 +1534,9 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp - if err != nil && err != io.EOF { - end.Error = toRPCErr(err) - } -- sh.HandleRPC(stream.Context(), end) -+ for _, sh := range shs { -+ sh.HandleRPC(stream.Context(), end) -+ } - } - - if channelz.IsOn() { -@@ -1485,8 +1549,15 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp - }() - } - -- ss.binlog = binarylog.GetMethodLogger(stream.Method()) -- if ss.binlog != nil { -+ if ml := binarylog.GetMethodLogger(stream.Method()); ml != nil { -+ ss.binlogs = append(ss.binlogs, ml) -+ } -+ if s.opts.binaryLogger != nil { -+ if ml := s.opts.binaryLogger.GetMethodLogger(stream.Method()); ml != nil { -+ ss.binlogs = append(ss.binlogs, ml) -+ } -+ } -+ if len(ss.binlogs) != 0 { - md, _ := metadata.FromIncomingContext(ctx) - logEntry := &binarylog.ClientHeader{ - Header: md, -@@ -1505,7 +1576,9 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp - if peer, ok := peer.FromContext(ss.Context()); ok { - logEntry.PeerAddr = peer.Addr - } -- ss.binlog.Log(logEntry) -+ for _, binlog := range ss.binlogs { -+ binlog.Log(stream.Context(), logEntry) -+ } - } - - // If dc is set and matches the stream's compression, use it. Otherwise, try -@@ -1527,12 +1600,18 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp - // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686. - if s.opts.cp != nil { - ss.cp = s.opts.cp -- stream.SetSendCompress(s.opts.cp.Type()) -+ ss.sendCompressorName = s.opts.cp.Type() - } else if rc := stream.RecvCompress(); rc != "" && rc != encoding.Identity { - // Legacy compressor not specified; attempt to respond with same encoding. - ss.comp = encoding.GetCompressor(rc) - if ss.comp != nil { -- stream.SetSendCompress(rc) -+ ss.sendCompressorName = rc -+ } -+ } -+ -+ if ss.sendCompressorName != "" { -+ if err := stream.SetSendCompress(ss.sendCompressorName); err != nil { -+ return status.Errorf(codes.Internal, "grpc: failed to set send compressor: %v", err) - } - } - -@@ -1559,7 +1638,9 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp - if appErr != nil { - appStatus, ok := status.FromError(appErr) - if !ok { -- appStatus = status.New(codes.Unknown, appErr.Error()) -+ // Convert non-status application error to a status error with code -+ // Unknown, but handle context errors specifically. -+ appStatus = status.FromContextError(appErr) - appErr = appStatus.Err() - } - if trInfo != nil { -@@ -1568,13 +1649,16 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp - ss.trInfo.tr.SetError() - ss.mu.Unlock() - } -- t.WriteStatus(ss.s, appStatus) -- if ss.binlog != nil { -- ss.binlog.Log(&binarylog.ServerTrailer{ -+ if len(ss.binlogs) != 0 { -+ st := &binarylog.ServerTrailer{ - Trailer: ss.s.Trailer(), - Err: appErr, -- }) -+ } -+ for _, binlog := range ss.binlogs { -+ binlog.Log(stream.Context(), st) -+ } - } -+ t.WriteStatus(ss.s, appStatus) - // TODO: Should we log an error from WriteStatus here and below? - return appErr - } -@@ -1583,14 +1667,16 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp - ss.trInfo.tr.LazyLog(stringer("OK"), false) - ss.mu.Unlock() - } -- err = t.WriteStatus(ss.s, statusOK) -- if ss.binlog != nil { -- ss.binlog.Log(&binarylog.ServerTrailer{ -+ if len(ss.binlogs) != 0 { -+ st := &binarylog.ServerTrailer{ - Trailer: ss.s.Trailer(), - Err: appErr, -- }) -+ } -+ for _, binlog := range ss.binlogs { -+ binlog.Log(stream.Context(), st) -+ } - } -- return err -+ return t.WriteStatus(ss.s, statusOK) - } - - func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Stream, trInfo *traceInfo) { -@@ -1664,7 +1750,7 @@ type streamKey struct{} - // NewContextWithServerTransportStream creates a new context from ctx and - // attaches stream to it. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -1679,7 +1765,7 @@ func NewContextWithServerTransportStream(ctx context.Context, stream ServerTrans - // - // See also NewContextWithServerTransportStream. - // --// Experimental -+// # Experimental - // - // Notice: This type is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -1694,7 +1780,7 @@ type ServerTransportStream interface { - // ctx. Returns nil if the given context has no stream associated with it - // (which implies it is not an RPC invocation context). - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -@@ -1716,11 +1802,7 @@ func (s *Server) Stop() { - s.done.Fire() - }() - -- s.channelzRemoveOnce.Do(func() { -- if channelz.IsOn() { -- channelz.RemoveEntry(s.channelzID) -- } -- }) -+ s.channelzRemoveOnce.Do(func() { channelz.RemoveEntry(s.channelzID) }) - - s.mu.Lock() - listeners := s.lis -@@ -1736,7 +1818,7 @@ func (s *Server) Stop() { - } - for _, cs := range conns { - for st := range cs { -- st.Close() -+ st.Close(errors.New("Server.Stop called")) - } - } - if s.opts.numServerWorkers > 0 { -@@ -1758,11 +1840,7 @@ func (s *Server) GracefulStop() { - s.quit.Fire() - defer s.done.Fire() - -- s.channelzRemoveOnce.Do(func() { -- if channelz.IsOn() { -- channelz.RemoveEntry(s.channelzID) -- } -- }) -+ s.channelzRemoveOnce.Do(func() { channelz.RemoveEntry(s.channelzID) }) - s.mu.Lock() - if s.conns == nil { - s.mu.Unlock() -@@ -1776,7 +1854,7 @@ func (s *Server) GracefulStop() { - if !s.drain { - for _, conns := range s.conns { - for st := range conns { -- st.Drain() -+ st.Drain("graceful_stop") - } - } - s.drain = true -@@ -1815,12 +1893,26 @@ func (s *Server) getCodec(contentSubtype string) baseCodec { - return codec - } - --// SetHeader sets the header metadata. --// When called multiple times, all the provided metadata will be merged. --// All the metadata will be sent out when one of the following happens: --// - grpc.SendHeader() is called; --// - The first response is sent out; --// - An RPC status is sent out (error or success). -+// SetHeader sets the header metadata to be sent from the server to the client. -+// The context provided must be the context passed to the server's handler. -+// -+// Streaming RPCs should prefer the SetHeader method of the ServerStream. -+// -+// When called multiple times, all the provided metadata will be merged. All -+// the metadata will be sent out when one of the following happens: -+// -+// - grpc.SendHeader is called, or for streaming handlers, stream.SendHeader. -+// - The first response message is sent. For unary handlers, this occurs when -+// the handler returns; for streaming handlers, this can happen when stream's -+// SendMsg method is called. -+// - An RPC status is sent out (error or success). This occurs when the handler -+// returns. -+// -+// SetHeader will fail if called after any of the events above. -+// -+// The error returned is compatible with the status package. However, the -+// status code will often not match the RPC status as seen by the client -+// application, and therefore, should not be relied upon for this purpose. - func SetHeader(ctx context.Context, md metadata.MD) error { - if md.Len() == 0 { - return nil -@@ -1832,8 +1924,14 @@ func SetHeader(ctx context.Context, md metadata.MD) error { - return stream.SetHeader(md) - } - --// SendHeader sends header metadata. It may be called at most once. --// The provided md and headers set by SetHeader() will be sent. -+// SendHeader sends header metadata. It may be called at most once, and may not -+// be called after any event that causes headers to be sent (see SetHeader for -+// a complete list). The provided md and headers set by SetHeader() will be -+// sent. -+// -+// The error returned is compatible with the status package. However, the -+// status code will often not match the RPC status as seen by the client -+// application, and therefore, should not be relied upon for this purpose. - func SendHeader(ctx context.Context, md metadata.MD) error { - stream := ServerTransportStreamFromContext(ctx) - if stream == nil { -@@ -1845,8 +1943,66 @@ func SendHeader(ctx context.Context, md metadata.MD) error { - return nil - } - -+// SetSendCompressor sets a compressor for outbound messages from the server. -+// It must not be called after any event that causes headers to be sent -+// (see ServerStream.SetHeader for the complete list). Provided compressor is -+// used when below conditions are met: -+// -+// - compressor is registered via encoding.RegisterCompressor -+// - compressor name must exist in the client advertised compressor names -+// sent in grpc-accept-encoding header. Use ClientSupportedCompressors to -+// get client supported compressor names. -+// -+// The context provided must be the context passed to the server's handler. -+// It must be noted that compressor name encoding.Identity disables the -+// outbound compression. -+// By default, server messages will be sent using the same compressor with -+// which request messages were sent. -+// -+// It is not safe to call SetSendCompressor concurrently with SendHeader and -+// SendMsg. -+// -+// # Experimental -+// -+// Notice: This function is EXPERIMENTAL and may be changed or removed in a -+// later release. -+func SetSendCompressor(ctx context.Context, name string) error { -+ stream, ok := ServerTransportStreamFromContext(ctx).(*transport.Stream) -+ if !ok || stream == nil { -+ return fmt.Errorf("failed to fetch the stream from the given context") -+ } -+ -+ if err := validateSendCompressor(name, stream.ClientAdvertisedCompressors()); err != nil { -+ return fmt.Errorf("unable to set send compressor: %w", err) -+ } -+ -+ return stream.SetSendCompress(name) -+} -+ -+// ClientSupportedCompressors returns compressor names advertised by the client -+// via grpc-accept-encoding header. -+// -+// The context provided must be the context passed to the server's handler. -+// -+// # Experimental -+// -+// Notice: This function is EXPERIMENTAL and may be changed or removed in a -+// later release. -+func ClientSupportedCompressors(ctx context.Context) ([]string, error) { -+ stream, ok := ServerTransportStreamFromContext(ctx).(*transport.Stream) -+ if !ok || stream == nil { -+ return nil, fmt.Errorf("failed to fetch the stream from the given context %v", ctx) -+ } -+ -+ return strings.Split(stream.ClientAdvertisedCompressors(), ","), nil -+} -+ - // SetTrailer sets the trailer metadata that will be sent when an RPC returns. - // When called more than once, all the provided metadata will be merged. -+// -+// The error returned is compatible with the status package. However, the -+// status code will often not match the RPC status as seen by the client -+// application, and therefore, should not be relied upon for this purpose. - func SetTrailer(ctx context.Context, md metadata.MD) error { - if md.Len() == 0 { - return nil -@@ -1875,3 +2031,51 @@ type channelzServer struct { - func (c *channelzServer) ChannelzMetric() *channelz.ServerInternalMetric { - return c.s.channelzMetric() - } -+ -+// validateSendCompressor returns an error when given compressor name cannot be -+// handled by the server or the client based on the advertised compressors. -+func validateSendCompressor(name, clientCompressors string) error { -+ if name == encoding.Identity { -+ return nil -+ } -+ -+ if !grpcutil.IsCompressorNameRegistered(name) { -+ return fmt.Errorf("compressor not registered %q", name) -+ } -+ -+ for _, c := range strings.Split(clientCompressors, ",") { -+ if c == name { -+ return nil // found match -+ } -+ } -+ return fmt.Errorf("client does not support compressor %q", name) -+} -+ -+// atomicSemaphore implements a blocking, counting semaphore. acquire should be -+// called synchronously; release may be called asynchronously. -+type atomicSemaphore struct { -+ n int64 -+ wait chan struct{} -+} -+ -+func (q *atomicSemaphore) acquire() { -+ if atomic.AddInt64(&q.n, -1) < 0 { -+ // We ran out of quota. Block until a release happens. -+ <-q.wait -+ } -+} -+ -+func (q *atomicSemaphore) release() { -+ // N.B. the "<= 0" check below should allow for this to work with multiple -+ // concurrent calls to acquire, but also note that with synchronous calls to -+ // acquire, as our system does, n will never be less than -1. There are -+ // fairness issues (queuing) to consider if this was to be generalized. -+ if atomic.AddInt64(&q.n, 1) <= 0 { -+ // An acquire was waiting on us. Unblock it. -+ q.wait <- struct{}{} -+ } -+} -+ -+func newHandlerQuota(n uint32) *atomicSemaphore { -+ return &atomicSemaphore{n: int64(n), wait: make(chan struct{}, 1)} -+} -diff --git a/vendor/google.golang.org/grpc/service_config.go b/vendor/google.golang.org/grpc/service_config.go -index 22c4240..0df11fc 100644 ---- a/vendor/google.golang.org/grpc/service_config.go -+++ b/vendor/google.golang.org/grpc/service_config.go -@@ -23,8 +23,6 @@ import ( - "errors" - "fmt" - "reflect" -- "strconv" -- "strings" - "time" - - "google.golang.org/grpc/codes" -@@ -57,10 +55,9 @@ type lbConfig struct { - type ServiceConfig struct { - serviceconfig.Config - -- // LB is the load balancer the service providers recommends. The balancer -- // specified via grpc.WithBalancerName will override this. This is deprecated; -- // lbConfigs is preferred. If lbConfig and LB are both present, lbConfig -- // will be used. -+ // LB is the load balancer the service providers recommends. This is -+ // deprecated; lbConfigs is preferred. If lbConfig and LB are both present, -+ // lbConfig will be used. - LB *string - - // lbConfig is the service config's load balancing configuration. If -@@ -107,8 +104,8 @@ type healthCheckConfig struct { - - type jsonRetryPolicy struct { - MaxAttempts int -- InitialBackoff string -- MaxBackoff string -+ InitialBackoff internalserviceconfig.Duration -+ MaxBackoff internalserviceconfig.Duration - BackoffMultiplier float64 - RetryableStatusCodes []codes.Code - } -@@ -130,50 +127,6 @@ type retryThrottlingPolicy struct { - TokenRatio float64 - } - --func parseDuration(s *string) (*time.Duration, error) { -- if s == nil { -- return nil, nil -- } -- if !strings.HasSuffix(*s, "s") { -- return nil, fmt.Errorf("malformed duration %q", *s) -- } -- ss := strings.SplitN((*s)[:len(*s)-1], ".", 3) -- if len(ss) > 2 { -- return nil, fmt.Errorf("malformed duration %q", *s) -- } -- // hasDigits is set if either the whole or fractional part of the number is -- // present, since both are optional but one is required. -- hasDigits := false -- var d time.Duration -- if len(ss[0]) > 0 { -- i, err := strconv.ParseInt(ss[0], 10, 32) -- if err != nil { -- return nil, fmt.Errorf("malformed duration %q: %v", *s, err) -- } -- d = time.Duration(i) * time.Second -- hasDigits = true -- } -- if len(ss) == 2 && len(ss[1]) > 0 { -- if len(ss[1]) > 9 { -- return nil, fmt.Errorf("malformed duration %q", *s) -- } -- f, err := strconv.ParseInt(ss[1], 10, 64) -- if err != nil { -- return nil, fmt.Errorf("malformed duration %q: %v", *s, err) -- } -- for i := 9; i > len(ss[1]); i-- { -- f *= 10 -- } -- d += time.Duration(f) -- hasDigits = true -- } -- if !hasDigits { -- return nil, fmt.Errorf("malformed duration %q", *s) -- } -- -- return &d, nil --} -- - type jsonName struct { - Service string - Method string -@@ -202,7 +155,7 @@ func (j jsonName) generatePath() (string, error) { - type jsonMC struct { - Name *[]jsonName - WaitForReady *bool -- Timeout *string -+ Timeout *internalserviceconfig.Duration - MaxRequestMessageBytes *int64 - MaxResponseMessageBytes *int64 - RetryPolicy *jsonRetryPolicy -@@ -218,7 +171,7 @@ type jsonSC struct { - } - - func init() { -- internal.ParseServiceConfigForTesting = parseServiceConfig -+ internal.ParseServiceConfig = parseServiceConfig - } - func parseServiceConfig(js string) *serviceconfig.ParseResult { - if len(js) == 0 { -@@ -227,7 +180,7 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { - var rsc jsonSC - err := json.Unmarshal([]byte(js), &rsc) - if err != nil { -- logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err) -+ logger.Warningf("grpc: unmarshaling service config %s: %v", js, err) - return &serviceconfig.ParseResult{Err: err} - } - sc := ServiceConfig{ -@@ -253,18 +206,13 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { - if m.Name == nil { - continue - } -- d, err := parseDuration(m.Timeout) -- if err != nil { -- logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err) -- return &serviceconfig.ParseResult{Err: err} -- } - - mc := MethodConfig{ - WaitForReady: m.WaitForReady, -- Timeout: d, -+ Timeout: (*time.Duration)(m.Timeout), - } - if mc.RetryPolicy, err = convertRetryPolicy(m.RetryPolicy); err != nil { -- logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err) -+ logger.Warningf("grpc: unmarshaling service config %s: %v", js, err) - return &serviceconfig.ParseResult{Err: err} - } - if m.MaxRequestMessageBytes != nil { -@@ -284,13 +232,13 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { - for i, n := range *m.Name { - path, err := n.generatePath() - if err != nil { -- logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to methodConfig[%d]: %v", js, i, err) -+ logger.Warningf("grpc: error unmarshaling service config %s due to methodConfig[%d]: %v", js, i, err) - return &serviceconfig.ParseResult{Err: err} - } - - if _, ok := paths[path]; ok { - err = errDuplicatedName -- logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to methodConfig[%d]: %v", js, i, err) -+ logger.Warningf("grpc: error unmarshaling service config %s due to methodConfig[%d]: %v", js, i, err) - return &serviceconfig.ParseResult{Err: err} - } - paths[path] = struct{}{} -@@ -313,18 +261,10 @@ func convertRetryPolicy(jrp *jsonRetryPolicy) (p *internalserviceconfig.RetryPol - if jrp == nil { - return nil, nil - } -- ib, err := parseDuration(&jrp.InitialBackoff) -- if err != nil { -- return nil, err -- } -- mb, err := parseDuration(&jrp.MaxBackoff) -- if err != nil { -- return nil, err -- } - - if jrp.MaxAttempts <= 1 || -- *ib <= 0 || -- *mb <= 0 || -+ jrp.InitialBackoff <= 0 || -+ jrp.MaxBackoff <= 0 || - jrp.BackoffMultiplier <= 0 || - len(jrp.RetryableStatusCodes) == 0 { - logger.Warningf("grpc: ignoring retry policy %v due to illegal configuration", jrp) -@@ -333,8 +273,8 @@ func convertRetryPolicy(jrp *jsonRetryPolicy) (p *internalserviceconfig.RetryPol - - rp := &internalserviceconfig.RetryPolicy{ - MaxAttempts: jrp.MaxAttempts, -- InitialBackoff: *ib, -- MaxBackoff: *mb, -+ InitialBackoff: time.Duration(jrp.InitialBackoff), -+ MaxBackoff: time.Duration(jrp.MaxBackoff), - BackoffMultiplier: jrp.BackoffMultiplier, - RetryableStatusCodes: make(map[codes.Code]bool), - } -@@ -381,6 +321,9 @@ func init() { - // - // If any of them is NOT *ServiceConfig, return false. - func equalServiceConfig(a, b serviceconfig.Config) bool { -+ if a == nil && b == nil { -+ return true -+ } - aa, ok := a.(*ServiceConfig) - if !ok { - return false -diff --git a/vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go b/vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go -index 73a2f92..35e7a20 100644 ---- a/vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go -+++ b/vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go -@@ -19,7 +19,7 @@ - // Package serviceconfig defines types and methods for operating on gRPC - // service configs. - // --// Experimental -+// # Experimental - // - // Notice: This package is EXPERIMENTAL and may be changed or removed in a - // later release. -diff --git a/vendor/google.golang.org/grpc/stats/stats.go b/vendor/google.golang.org/grpc/stats/stats.go -index a5ebeeb..7a552a9 100644 ---- a/vendor/google.golang.org/grpc/stats/stats.go -+++ b/vendor/google.golang.org/grpc/stats/stats.go -@@ -36,12 +36,12 @@ type RPCStats interface { - IsClient() bool - } - --// Begin contains stats when an RPC begins. -+// Begin contains stats when an RPC attempt begins. - // FailFast is only valid if this Begin is from client side. - type Begin struct { - // Client is true if this Begin is from client side. - Client bool -- // BeginTime is the time when the RPC begins. -+ // BeginTime is the time when the RPC attempt begins. - BeginTime time.Time - // FailFast indicates if this RPC is failfast. - FailFast bool -@@ -49,6 +49,9 @@ type Begin struct { - IsClientStream bool - // IsServerStream indicates whether the RPC is a server streaming RPC. - IsServerStream bool -+ // IsTransparentRetryAttempt indicates whether this attempt was initiated -+ // due to transparently retrying a previous attempt. -+ IsTransparentRetryAttempt bool - } - - // IsClient indicates if the stats information is from client side. -@@ -64,10 +67,18 @@ type InPayload struct { - Payload interface{} - // Data is the serialized message payload. - Data []byte -- // Length is the length of uncompressed data. -+ -+ // Length is the size of the uncompressed payload data. Does not include any -+ // framing (gRPC or HTTP/2). - Length int -- // WireLength is the length of data on wire (compressed, signed, encrypted). -+ // CompressedLength is the size of the compressed payload data. Does not -+ // include any framing (gRPC or HTTP/2). Same as Length if compression not -+ // enabled. -+ CompressedLength int -+ // WireLength is the size of the compressed payload data plus gRPC framing. -+ // Does not include HTTP/2 framing. - WireLength int -+ - // RecvTime is the time when the payload is received. - RecvTime time.Time - } -@@ -126,9 +137,15 @@ type OutPayload struct { - Payload interface{} - // Data is the serialized message payload. - Data []byte -- // Length is the length of uncompressed data. -+ // Length is the size of the uncompressed payload data. Does not include any -+ // framing (gRPC or HTTP/2). - Length int -- // WireLength is the length of data on wire (compressed, signed, encrypted). -+ // CompressedLength is the size of the compressed payload data. Does not -+ // include any framing (gRPC or HTTP/2). Same as Length if compression not -+ // enabled. -+ CompressedLength int -+ // WireLength is the size of the compressed payload data plus gRPC framing. -+ // Does not include HTTP/2 framing. - WireLength int - // SentTime is the time when the payload is sent. - SentTime time.Time -diff --git a/vendor/google.golang.org/grpc/status/status.go b/vendor/google.golang.org/grpc/status/status.go -index 54d1871..bcf2e4d 100644 ---- a/vendor/google.golang.org/grpc/status/status.go -+++ b/vendor/google.golang.org/grpc/status/status.go -@@ -29,6 +29,7 @@ package status - - import ( - "context" -+ "errors" - "fmt" - - spb "google.golang.org/genproto/googleapis/rpc/status" -@@ -73,19 +74,52 @@ func FromProto(s *spb.Status) *Status { - return status.FromProto(s) - } - --// FromError returns a Status representing err if it was produced by this --// package or has a method `GRPCStatus() *Status`. --// If err is nil, a Status is returned with codes.OK and no message. --// Otherwise, ok is false and a Status is returned with codes.Unknown and --// the original error message. -+// FromError returns a Status representation of err. -+// -+// - If err was produced by this package or implements the method `GRPCStatus() -+// *Status` and `GRPCStatus()` does not return nil, or if err wraps a type -+// satisfying this, the Status from `GRPCStatus()` is returned. For wrapped -+// errors, the message returned contains the entire err.Error() text and not -+// just the wrapped status. In that case, ok is true. -+// -+// - If err is nil, a Status is returned with codes.OK and no message, and ok -+// is true. -+// -+// - If err implements the method `GRPCStatus() *Status` and `GRPCStatus()` -+// returns nil (which maps to Codes.OK), or if err wraps a type -+// satisfying this, a Status is returned with codes.Unknown and err's -+// Error() message, and ok is false. -+// -+// - Otherwise, err is an error not compatible with this package. In this -+// case, a Status is returned with codes.Unknown and err's Error() message, -+// and ok is false. - func FromError(err error) (s *Status, ok bool) { - if err == nil { - return nil, true - } -- if se, ok := err.(interface { -- GRPCStatus() *Status -- }); ok { -- return se.GRPCStatus(), true -+ type grpcstatus interface{ GRPCStatus() *Status } -+ if gs, ok := err.(grpcstatus); ok { -+ if gs.GRPCStatus() == nil { -+ // Error has status nil, which maps to codes.OK. There -+ // is no sensible behavior for this, so we turn it into -+ // an error with codes.Unknown and discard the existing -+ // status. -+ return New(codes.Unknown, err.Error()), false -+ } -+ return gs.GRPCStatus(), true -+ } -+ var gs grpcstatus -+ if errors.As(err, &gs) { -+ if gs.GRPCStatus() == nil { -+ // Error wraps an error that has status nil, which maps -+ // to codes.OK. There is no sensible behavior for this, -+ // so we turn it into an error with codes.Unknown and -+ // discard the existing status. -+ return New(codes.Unknown, err.Error()), false -+ } -+ p := gs.GRPCStatus().Proto() -+ p.Message = err.Error() -+ return status.FromProto(p), true - } - return New(codes.Unknown, err.Error()), false - } -@@ -97,33 +131,30 @@ func Convert(err error) *Status { - return s - } - --// Code returns the Code of the error if it is a Status error, codes.OK if err --// is nil, or codes.Unknown otherwise. -+// Code returns the Code of the error if it is a Status error or if it wraps a -+// Status error. If that is not the case, it returns codes.OK if err is nil, or -+// codes.Unknown otherwise. - func Code(err error) codes.Code { - // Don't use FromError to avoid allocation of OK status. - if err == nil { - return codes.OK - } -- if se, ok := err.(interface { -- GRPCStatus() *Status -- }); ok { -- return se.GRPCStatus().Code() -- } -- return codes.Unknown -+ -+ return Convert(err).Code() - } - --// FromContextError converts a context error into a Status. It returns a --// Status with codes.OK if err is nil, or a Status with codes.Unknown if err is --// non-nil and not a context error. -+// FromContextError converts a context error or wrapped context error into a -+// Status. It returns a Status with codes.OK if err is nil, or a Status with -+// codes.Unknown if err is non-nil and not a context error. - func FromContextError(err error) *Status { -- switch err { -- case nil: -+ if err == nil { - return nil -- case context.DeadlineExceeded: -+ } -+ if errors.Is(err, context.DeadlineExceeded) { - return New(codes.DeadlineExceeded, err.Error()) -- case context.Canceled: -+ } -+ if errors.Is(err, context.Canceled) { - return New(codes.Canceled, err.Error()) -- default: -- return New(codes.Unknown, err.Error()) - } -+ return New(codes.Unknown, err.Error()) - } -diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go -index e224af1..1009268 100644 ---- a/vendor/google.golang.org/grpc/stream.go -+++ b/vendor/google.golang.org/grpc/stream.go -@@ -36,8 +36,10 @@ import ( - "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/grpcrand" - "google.golang.org/grpc/internal/grpcutil" -+ imetadata "google.golang.org/grpc/internal/metadata" - iresolver "google.golang.org/grpc/internal/resolver" - "google.golang.org/grpc/internal/serviceconfig" -+ istatus "google.golang.org/grpc/internal/status" - "google.golang.org/grpc/internal/transport" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/peer" -@@ -46,10 +48,12 @@ import ( - ) - - // StreamHandler defines the handler called by gRPC server to complete the --// execution of a streaming RPC. If a StreamHandler returns an error, it --// should be produced by the status package, or else gRPC will use --// codes.Unknown as the status code and err.Error() as the status message --// of the RPC. -+// execution of a streaming RPC. -+// -+// If a StreamHandler returns an error, it should either be produced by the -+// status package, or be one of the context errors. Otherwise, gRPC will use -+// codes.Unknown as the status code and err.Error() as the status message of the -+// RPC. - type StreamHandler func(srv interface{}, stream ServerStream) error - - // StreamDesc represents a streaming RPC service's method specification. Used -@@ -119,6 +123,9 @@ type ClientStream interface { - // calling RecvMsg on the same stream at the same time, but it is not safe - // to call SendMsg on the same stream in different goroutines. It is also - // not safe to call CloseSend concurrently with SendMsg. -+ // -+ // It is not safe to modify the message after calling SendMsg. Tracing -+ // libraries and stats handlers may use the message lazily. - SendMsg(m interface{}) error - // RecvMsg blocks until it receives a message into m or the stream is - // done. It returns io.EOF when the stream completes successfully. On -@@ -137,17 +144,22 @@ type ClientStream interface { - // To ensure resources are not leaked due to the stream returned, one of the following - // actions must be performed: - // --// 1. Call Close on the ClientConn. --// 2. Cancel the context provided. --// 3. Call RecvMsg until a non-nil error is returned. A protobuf-generated --// client-streaming RPC, for instance, might use the helper function --// CloseAndRecv (note that CloseSend does not Recv, therefore is not --// guaranteed to release all resources). --// 4. Receive a non-nil, non-io.EOF error from Header or SendMsg. -+// 1. Call Close on the ClientConn. -+// 2. Cancel the context provided. -+// 3. Call RecvMsg until a non-nil error is returned. A protobuf-generated -+// client-streaming RPC, for instance, might use the helper function -+// CloseAndRecv (note that CloseSend does not Recv, therefore is not -+// guaranteed to release all resources). -+// 4. Receive a non-nil, non-io.EOF error from Header or SendMsg. - // - // If none of the above happen, a goroutine and a context will be leaked, and grpc - // will not call the optionally-configured stats handler with a stats.End message. - func (cc *ClientConn) NewStream(ctx context.Context, desc *StreamDesc, method string, opts ...CallOption) (ClientStream, error) { -+ if err := cc.idlenessMgr.onCallBegin(); err != nil { -+ return nil, err -+ } -+ defer cc.idlenessMgr.onCallEnd() -+ - // allow interceptor to see all applicable call options, which means those - // configured as defaults from dial option as well as per-call options - opts = combine(cc.dopts.callOptions, opts) -@@ -164,6 +176,20 @@ func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth - } - - func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (_ ClientStream, err error) { -+ if md, added, ok := metadata.FromOutgoingContextRaw(ctx); ok { -+ // validate md -+ if err := imetadata.Validate(md); err != nil { -+ return nil, status.Error(codes.Internal, err.Error()) -+ } -+ // validate added -+ for _, kvs := range added { -+ for i := 0; i < len(kvs); i += 2 { -+ if err := imetadata.ValidatePair(kvs[i], kvs[i+1]); err != nil { -+ return nil, status.Error(codes.Internal, err.Error()) -+ } -+ } -+ } -+ } - if channelz.IsOn() { - cc.incrCallsStarted() - defer func() { -@@ -187,6 +213,13 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth - rpcInfo := iresolver.RPCInfo{Context: ctx, Method: method} - rpcConfig, err := cc.safeConfigSelector.SelectConfig(rpcInfo) - if err != nil { -+ if st, ok := status.FromError(err); ok { -+ // Restrict the code to the list allowed by gRFC A54. -+ if istatus.IsRestrictedControlPlaneCode(st) { -+ err = status.Errorf(codes.Internal, "config selector returned illegal status: %v", err) -+ } -+ return nil, err -+ } - return nil, toRPCErr(err) - } - -@@ -274,35 +307,6 @@ func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *Client - if c.creds != nil { - callHdr.Creds = c.creds - } -- var trInfo *traceInfo -- if EnableTracing { -- trInfo = &traceInfo{ -- tr: trace.New("grpc.Sent."+methodFamily(method), method), -- firstLine: firstLine{ -- client: true, -- }, -- } -- if deadline, ok := ctx.Deadline(); ok { -- trInfo.firstLine.deadline = time.Until(deadline) -- } -- trInfo.tr.LazyLog(&trInfo.firstLine, false) -- ctx = trace.NewContext(ctx, trInfo.tr) -- } -- ctx = newContextWithRPCInfo(ctx, c.failFast, c.codec, cp, comp) -- sh := cc.dopts.copts.StatsHandler -- var beginTime time.Time -- if sh != nil { -- ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: c.failFast}) -- beginTime = time.Now() -- begin := &stats.Begin{ -- Client: true, -- BeginTime: beginTime, -- FailFast: c.failFast, -- IsClientStream: desc.ClientStreams, -- IsServerStream: desc.ServerStreams, -- } -- sh.HandleRPC(ctx, begin) -- } - - cs := &clientStream{ - callHdr: callHdr, -@@ -316,29 +320,41 @@ func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *Client - cp: cp, - comp: comp, - cancel: cancel, -- beginTime: beginTime, - firstAttempt: true, - onCommit: onCommit, - } - if !cc.dopts.disableRetry { - cs.retryThrottler = cc.retryThrottler.Load().(*retryThrottler) - } -- cs.binlog = binarylog.GetMethodLogger(method) -- -- // Only this initial attempt has stats/tracing. -- // TODO(dfawley): move to newAttempt when per-attempt stats are implemented. -- if err := cs.newAttemptLocked(sh, trInfo); err != nil { -- cs.finish(err) -- return nil, err -+ if ml := binarylog.GetMethodLogger(method); ml != nil { -+ cs.binlogs = append(cs.binlogs, ml) -+ } -+ if cc.dopts.binaryLogger != nil { -+ if ml := cc.dopts.binaryLogger.GetMethodLogger(method); ml != nil { -+ cs.binlogs = append(cs.binlogs, ml) -+ } - } - -- op := func(a *csAttempt) error { return a.newStream() } -+ // Pick the transport to use and create a new stream on the transport. -+ // Assign cs.attempt upon success. -+ op := func(a *csAttempt) error { -+ if err := a.getTransport(); err != nil { -+ return err -+ } -+ if err := a.newStream(); err != nil { -+ return err -+ } -+ // Because this operation is always called either here (while creating -+ // the clientStream) or by the retry code while locked when replaying -+ // the operation, it is safe to access cs.attempt directly. -+ cs.attempt = a -+ return nil -+ } - if err := cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op) }); err != nil { -- cs.finish(err) - return nil, err - } - -- if cs.binlog != nil { -+ if len(cs.binlogs) != 0 { - md, _ := metadata.FromOutgoingContext(ctx) - logEntry := &binarylog.ClientHeader{ - OnClientSide: true, -@@ -352,7 +368,9 @@ func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *Client - logEntry.Timeout = 0 - } - } -- cs.binlog.Log(logEntry) -+ for _, binlog := range cs.binlogs { -+ binlog.Log(cs.ctx, logEntry) -+ } - } - - if desc != unaryStreamDesc { -@@ -373,60 +391,123 @@ func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *Client - return cs, nil - } - --// newAttemptLocked creates a new attempt with a transport. --// If it succeeds, then it replaces clientStream's attempt with this new attempt. --func (cs *clientStream) newAttemptLocked(sh stats.Handler, trInfo *traceInfo) (retErr error) { -- newAttempt := &csAttempt{ -- cs: cs, -- dc: cs.cc.dopts.dc, -- statsHandler: sh, -- trInfo: trInfo, -+// newAttemptLocked creates a new csAttempt without a transport or stream. -+func (cs *clientStream) newAttemptLocked(isTransparent bool) (*csAttempt, error) { -+ if err := cs.ctx.Err(); err != nil { -+ return nil, toRPCErr(err) - } -- defer func() { -- if retErr != nil { -- // This attempt is not set in the clientStream, so it's finish won't -- // be called. Call it here for stats and trace in case they are not -- // nil. -- newAttempt.finish(retErr) -+ if err := cs.cc.ctx.Err(); err != nil { -+ return nil, ErrClientConnClosing -+ } -+ -+ ctx := newContextWithRPCInfo(cs.ctx, cs.callInfo.failFast, cs.callInfo.codec, cs.cp, cs.comp) -+ method := cs.callHdr.Method -+ var beginTime time.Time -+ shs := cs.cc.dopts.copts.StatsHandlers -+ for _, sh := range shs { -+ ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: cs.callInfo.failFast}) -+ beginTime = time.Now() -+ begin := &stats.Begin{ -+ Client: true, -+ BeginTime: beginTime, -+ FailFast: cs.callInfo.failFast, -+ IsClientStream: cs.desc.ClientStreams, -+ IsServerStream: cs.desc.ServerStreams, -+ IsTransparentRetryAttempt: isTransparent, - } -- }() -+ sh.HandleRPC(ctx, begin) -+ } - -- if err := cs.ctx.Err(); err != nil { -- return toRPCErr(err) -+ var trInfo *traceInfo -+ if EnableTracing { -+ trInfo = &traceInfo{ -+ tr: trace.New("grpc.Sent."+methodFamily(method), method), -+ firstLine: firstLine{ -+ client: true, -+ }, -+ } -+ if deadline, ok := ctx.Deadline(); ok { -+ trInfo.firstLine.deadline = time.Until(deadline) -+ } -+ trInfo.tr.LazyLog(&trInfo.firstLine, false) -+ ctx = trace.NewContext(ctx, trInfo.tr) - } - -- ctx := cs.ctx -- if cs.cc.parsedTarget.Scheme == "xds" { -+ if cs.cc.parsedTarget.URL.Scheme == "xds" { - // Add extra metadata (metadata that will be added by transport) to context - // so the balancer can see them. -- ctx = grpcutil.WithExtraMetadata(cs.ctx, metadata.Pairs( -+ ctx = grpcutil.WithExtraMetadata(ctx, metadata.Pairs( - "content-type", grpcutil.ContentType(cs.callHdr.ContentSubtype), - )) - } -- t, done, err := cs.cc.getTransport(ctx, cs.callInfo.failFast, cs.callHdr.Method) -+ -+ return &csAttempt{ -+ ctx: ctx, -+ beginTime: beginTime, -+ cs: cs, -+ dc: cs.cc.dopts.dc, -+ statsHandlers: shs, -+ trInfo: trInfo, -+ }, nil -+} -+ -+func (a *csAttempt) getTransport() error { -+ cs := a.cs -+ -+ var err error -+ a.t, a.pickResult, err = cs.cc.getTransport(a.ctx, cs.callInfo.failFast, cs.callHdr.Method) - if err != nil { -+ if de, ok := err.(dropError); ok { -+ err = de.error -+ a.drop = true -+ } - return err - } -- if trInfo != nil { -- trInfo.firstLine.SetRemoteAddr(t.RemoteAddr()) -+ if a.trInfo != nil { -+ a.trInfo.firstLine.SetRemoteAddr(a.t.RemoteAddr()) - } -- newAttempt.t = t -- newAttempt.done = done -- cs.attempt = newAttempt - return nil - } - - func (a *csAttempt) newStream() error { - cs := a.cs - cs.callHdr.PreviousAttempts = cs.numRetries -- s, err := a.t.NewStream(cs.ctx, cs.callHdr) -+ -+ // Merge metadata stored in PickResult, if any, with existing call metadata. -+ // It is safe to overwrite the csAttempt's context here, since all state -+ // maintained in it are local to the attempt. When the attempt has to be -+ // retried, a new instance of csAttempt will be created. -+ if a.pickResult.Metadata != nil { -+ // We currently do not have a function it the metadata package which -+ // merges given metadata with existing metadata in a context. Existing -+ // function `AppendToOutgoingContext()` takes a variadic argument of key -+ // value pairs. -+ // -+ // TODO: Make it possible to retrieve key value pairs from metadata.MD -+ // in a form passable to AppendToOutgoingContext(), or create a version -+ // of AppendToOutgoingContext() that accepts a metadata.MD. -+ md, _ := metadata.FromOutgoingContext(a.ctx) -+ md = metadata.Join(md, a.pickResult.Metadata) -+ a.ctx = metadata.NewOutgoingContext(a.ctx, md) -+ } -+ -+ s, err := a.t.NewStream(a.ctx, cs.callHdr) - if err != nil { -- // Return without converting to an RPC error so retry code can -- // inspect. -- return err -+ nse, ok := err.(*transport.NewStreamError) -+ if !ok { -+ // Unexpected. -+ return err -+ } -+ -+ if nse.AllowTransparentRetry { -+ a.allowTransparentRetry = true -+ } -+ -+ // Unwrap and convert error. -+ return toRPCErr(nse.Err) - } -- cs.attempt.s = s -- cs.attempt.p = &parser{r: s} -+ a.s = s -+ a.p = &parser{r: s} - return nil - } - -@@ -444,8 +525,7 @@ type clientStream struct { - - cancel context.CancelFunc // cancels all attempts - -- sentLast bool // sent an end stream -- beginTime time.Time -+ sentLast bool // sent an end stream - - methodConfig *MethodConfig - -@@ -453,7 +533,7 @@ type clientStream struct { - - retryThrottler *retryThrottler // The throttler active when the RPC began. - -- binlog *binarylog.MethodLogger // Binary logger, can be nil. -+ binlogs []binarylog.MethodLogger - // serverHeaderBinlogged is a boolean for whether server header has been - // logged. Server header will be logged when the first time one of those - // happens: stream.Header(), stream.Recv(). -@@ -485,11 +565,12 @@ type clientStream struct { - // csAttempt implements a single transport stream attempt within a - // clientStream. - type csAttempt struct { -- cs *clientStream -- t transport.ClientTransport -- s *transport.Stream -- p *parser -- done func(balancer.DoneInfo) -+ ctx context.Context -+ cs *clientStream -+ t transport.ClientTransport -+ s *transport.Stream -+ p *parser -+ pickResult balancer.PickResult - - finished bool - dc Decompressor -@@ -502,7 +583,13 @@ type csAttempt struct { - // and cleared when the finish method is called. - trInfo *traceInfo - -- statsHandler stats.Handler -+ statsHandlers []stats.Handler -+ beginTime time.Time -+ -+ // set for newStream errors that may be transparently retried -+ allowTransparentRetry bool -+ // set for pick errors that are returned as a status -+ drop bool - } - - func (cs *clientStream) commitAttemptLocked() { -@@ -520,95 +607,76 @@ func (cs *clientStream) commitAttempt() { - } - - // shouldRetry returns nil if the RPC should be retried; otherwise it returns --// the error that should be returned by the operation. --func (cs *clientStream) shouldRetry(err error) error { -- if cs.attempt.s == nil { -- // Error from NewClientStream. -- nse, ok := err.(*transport.NewStreamError) -- if !ok { -- // Unexpected, but assume no I/O was performed and the RPC is not -- // fatal, so retry indefinitely. -- return nil -- } -- -- // Unwrap and convert error. -- err = toRPCErr(nse.Err) -- -- // Never retry DoNotRetry errors, which indicate the RPC should not be -- // retried due to max header list size violation, etc. -- if nse.DoNotRetry { -- return err -- } -+// the error that should be returned by the operation. If the RPC should be -+// retried, the bool indicates whether it is being retried transparently. -+func (a *csAttempt) shouldRetry(err error) (bool, error) { -+ cs := a.cs - -- // In the event of a non-IO operation error from NewStream, we never -- // attempted to write anything to the wire, so we can retry -- // indefinitely. -- if !nse.PerformedIO { -- return nil -- } -+ if cs.finished || cs.committed || a.drop { -+ // RPC is finished or committed or was dropped by the picker; cannot retry. -+ return false, err - } -- if cs.finished || cs.committed { -- // RPC is finished or committed; cannot retry. -- return err -+ if a.s == nil && a.allowTransparentRetry { -+ return true, nil - } - // Wait for the trailers. - unprocessed := false -- if cs.attempt.s != nil { -- <-cs.attempt.s.Done() -- unprocessed = cs.attempt.s.Unprocessed() -+ if a.s != nil { -+ <-a.s.Done() -+ unprocessed = a.s.Unprocessed() - } - if cs.firstAttempt && unprocessed { - // First attempt, stream unprocessed: transparently retry. -- return nil -+ return true, nil - } - if cs.cc.dopts.disableRetry { -- return err -+ return false, err - } - - pushback := 0 - hasPushback := false -- if cs.attempt.s != nil { -- if !cs.attempt.s.TrailersOnly() { -- return err -+ if a.s != nil { -+ if !a.s.TrailersOnly() { -+ return false, err - } - - // TODO(retry): Move down if the spec changes to not check server pushback - // before considering this a failure for throttling. -- sps := cs.attempt.s.Trailer()["grpc-retry-pushback-ms"] -+ sps := a.s.Trailer()["grpc-retry-pushback-ms"] - if len(sps) == 1 { - var e error - if pushback, e = strconv.Atoi(sps[0]); e != nil || pushback < 0 { - channelz.Infof(logger, cs.cc.channelzID, "Server retry pushback specified to abort (%q).", sps[0]) - cs.retryThrottler.throttle() // This counts as a failure for throttling. -- return err -+ return false, err - } - hasPushback = true - } else if len(sps) > 1 { - channelz.Warningf(logger, cs.cc.channelzID, "Server retry pushback specified multiple values (%q); not retrying.", sps) - cs.retryThrottler.throttle() // This counts as a failure for throttling. -- return err -+ return false, err - } - } - - var code codes.Code -- if cs.attempt.s != nil { -- code = cs.attempt.s.Status().Code() -+ if a.s != nil { -+ code = a.s.Status().Code() - } else { -- code = status.Convert(err).Code() -+ code = status.Code(err) - } - - rp := cs.methodConfig.RetryPolicy - if rp == nil || !rp.RetryableStatusCodes[code] { -- return err -+ return false, err - } - - // Note: the ordering here is important; we count this as a failure - // only if the code matched a retryable code. - if cs.retryThrottler.throttle() { -- return err -+ return false, err - } - if cs.numRetries+1 >= rp.MaxAttempts { -- return err -+ return false, err - } - - var dur time.Duration -@@ -631,26 +699,32 @@ func (cs *clientStream) shouldRetry(err error) error { - select { - case <-t.C: - cs.numRetries++ -- return nil -+ return false, nil - case <-cs.ctx.Done(): - t.Stop() -- return status.FromContextError(cs.ctx.Err()).Err() -+ return false, status.FromContextError(cs.ctx.Err()).Err() - } - } - - // Returns nil if a retry was performed and succeeded; error otherwise. --func (cs *clientStream) retryLocked(lastErr error) error { -+func (cs *clientStream) retryLocked(attempt *csAttempt, lastErr error) error { - for { -- cs.attempt.finish(toRPCErr(lastErr)) -- if err := cs.shouldRetry(lastErr); err != nil { -+ attempt.finish(toRPCErr(lastErr)) -+ isTransparent, err := attempt.shouldRetry(lastErr) -+ if err != nil { - cs.commitAttemptLocked() - return err - } - cs.firstAttempt = false -- if err := cs.newAttemptLocked(nil, nil); err != nil { -+ attempt, err = cs.newAttemptLocked(isTransparent) -+ if err != nil { -+ // Only returns error if the clientconn is closed or the context of -+ // the stream is canceled. - return err - } -- if lastErr = cs.replayBufferLocked(); lastErr == nil { -+ // Note that the first op in the replay buffer always sets cs.attempt -+ // if it is able to pick a transport and create a stream. -+ if lastErr = cs.replayBufferLocked(attempt); lastErr == nil { - return nil - } - } -@@ -660,7 +734,10 @@ func (cs *clientStream) Context() context.Context { - cs.commitAttempt() - // No need to lock before using attempt, since we know it is committed and - // cannot change. -- return cs.attempt.s.Context() -+ if cs.attempt.s != nil { -+ return cs.attempt.s.Context() -+ } -+ return cs.ctx - } - - func (cs *clientStream) withRetry(op func(a *csAttempt) error, onSuccess func()) error { -@@ -674,6 +751,18 @@ func (cs *clientStream) withRetry(op func(a *csAttempt) error, onSuccess func()) - // already be status errors. - return toRPCErr(op(cs.attempt)) - } -+ if len(cs.buffer) == 0 { -+ // For the first op, which controls creation of the stream and -+ // assigns cs.attempt, we need to create a new attempt inline -+ // before executing the first op. On subsequent ops, the attempt -+ // is created immediately before replaying the ops. -+ var err error -+ if cs.attempt, err = cs.newAttemptLocked(false /* isTransparent */); err != nil { -+ cs.mu.Unlock() -+ cs.finish(err) -+ return err -+ } -+ } - a := cs.attempt - cs.mu.Unlock() - err := op(a) -@@ -690,7 +779,7 @@ func (cs *clientStream) withRetry(op func(a *csAttempt) error, onSuccess func()) - cs.mu.Unlock() - return err - } -- if err := cs.retryLocked(err); err != nil { -+ if err := cs.retryLocked(a, err); err != nil { - cs.mu.Unlock() - return err - } -@@ -699,17 +788,25 @@ func (cs *clientStream) withRetry(op func(a *csAttempt) error, onSuccess func()) - - func (cs *clientStream) Header() (metadata.MD, error) { - var m metadata.MD -+ noHeader := false - err := cs.withRetry(func(a *csAttempt) error { - var err error - m, err = a.s.Header() -+ if err == transport.ErrNoHeaders { -+ noHeader = true -+ return nil -+ } - return toRPCErr(err) - }, cs.commitAttemptLocked) -+ - if err != nil { - cs.finish(err) - return nil, err - } -- if cs.binlog != nil && !cs.serverHeaderBinlogged { -- // Only log if binary log is on and header has not been logged. -+ -+ if len(cs.binlogs) != 0 && !cs.serverHeaderBinlogged && !noHeader { -+ // Only log if binary log is on and header has not been logged, and -+ // there is actually headers to log. - logEntry := &binarylog.ServerHeader{ - OnClientSide: true, - Header: m, -@@ -718,10 +815,12 @@ func (cs *clientStream) Header() (metadata.MD, error) { - if peer, ok := peer.FromContext(cs.Context()); ok { - logEntry.PeerAddr = peer.Addr - } -- cs.binlog.Log(logEntry) - cs.serverHeaderBinlogged = true -+ for _, binlog := range cs.binlogs { -+ binlog.Log(cs.ctx, logEntry) -+ } - } -- return m, err -+ return m, nil - } - - func (cs *clientStream) Trailer() metadata.MD { -@@ -739,10 +838,9 @@ func (cs *clientStream) Trailer() metadata.MD { - return cs.attempt.s.Trailer() - } - --func (cs *clientStream) replayBufferLocked() error { -- a := cs.attempt -+func (cs *clientStream) replayBufferLocked(attempt *csAttempt) error { - for _, f := range cs.buffer { -- if err := f(a); err != nil { -+ if err := f(attempt); err != nil { - return err - } - } -@@ -790,47 +888,48 @@ func (cs *clientStream) SendMsg(m interface{}) (err error) { - if len(payload) > *cs.callInfo.maxSendMessageSize { - return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(payload), *cs.callInfo.maxSendMessageSize) - } -- msgBytes := data // Store the pointer before setting to nil. For binary logging. - op := func(a *csAttempt) error { -- err := a.sendMsg(m, hdr, payload, data) -- // nil out the message and uncomp when replaying; they are only needed for -- // stats which is disabled for subsequent attempts. -- m, data = nil, nil -- return err -+ return a.sendMsg(m, hdr, payload, data) - } - err = cs.withRetry(op, func() { cs.bufferForRetryLocked(len(hdr)+len(payload), op) }) -- if cs.binlog != nil && err == nil { -- cs.binlog.Log(&binarylog.ClientMessage{ -+ if len(cs.binlogs) != 0 && err == nil { -+ cm := &binarylog.ClientMessage{ - OnClientSide: true, -- Message: msgBytes, -- }) -+ Message: data, -+ } -+ for _, binlog := range cs.binlogs { -+ binlog.Log(cs.ctx, cm) -+ } - } -- return -+ return err - } - - func (cs *clientStream) RecvMsg(m interface{}) error { -- if cs.binlog != nil && !cs.serverHeaderBinlogged { -+ if len(cs.binlogs) != 0 && !cs.serverHeaderBinlogged { - // Call Header() to binary log header if it's not already logged. - cs.Header() - } - var recvInfo *payloadInfo -- if cs.binlog != nil { -+ if len(cs.binlogs) != 0 { - recvInfo = &payloadInfo{} - } - err := cs.withRetry(func(a *csAttempt) error { - return a.recvMsg(m, recvInfo) - }, cs.commitAttemptLocked) -- if cs.binlog != nil && err == nil { -- cs.binlog.Log(&binarylog.ServerMessage{ -+ if len(cs.binlogs) != 0 && err == nil { -+ sm := &binarylog.ServerMessage{ - OnClientSide: true, - Message: recvInfo.uncompressedBytes, -- }) -+ } -+ for _, binlog := range cs.binlogs { -+ binlog.Log(cs.ctx, sm) -+ } - } - if err != nil || !cs.desc.ServerStreams { - // err != nil or non-server-streaming indicates end of stream. - cs.finish(err) - -- if cs.binlog != nil { -+ if len(cs.binlogs) != 0 { - // finish will not log Trailer. Log Trailer here. - logEntry := &binarylog.ServerTrailer{ - OnClientSide: true, -@@ -843,7 +942,9 @@ func (cs *clientStream) RecvMsg(m interface{}) error { - if peer, ok := peer.FromContext(cs.Context()); ok { - logEntry.PeerAddr = peer.Addr - } -- cs.binlog.Log(logEntry) -+ for _, binlog := range cs.binlogs { -+ binlog.Log(cs.ctx, logEntry) -+ } - } - } - return err -@@ -864,10 +965,13 @@ func (cs *clientStream) CloseSend() error { - return nil - } - cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op) }) -- if cs.binlog != nil { -- cs.binlog.Log(&binarylog.ClientHalfClose{ -+ if len(cs.binlogs) != 0 { -+ chc := &binarylog.ClientHalfClose{ - OnClientSide: true, -- }) -+ } -+ for _, binlog := range cs.binlogs { -+ binlog.Log(cs.ctx, chc) -+ } - } - // We never returned an error here for reasons. - return nil -@@ -884,6 +988,9 @@ func (cs *clientStream) finish(err error) { - return - } - cs.finished = true -+ for _, onFinish := range cs.callInfo.onFinish { -+ onFinish(err) -+ } - cs.commitAttemptLocked() - if cs.attempt != nil { - cs.attempt.finish(err) -@@ -900,10 +1007,13 @@ func (cs *clientStream) finish(err error) { - // - // Only one of cancel or trailer needs to be logged. In the cases where - // users don't call RecvMsg, users must have already canceled the RPC. -- if cs.binlog != nil && status.Code(err) == codes.Canceled { -- cs.binlog.Log(&binarylog.Cancel{ -+ if len(cs.binlogs) != 0 && status.Code(err) == codes.Canceled { -+ c := &binarylog.Cancel{ - OnClientSide: true, -- }) -+ } -+ for _, binlog := range cs.binlogs { -+ binlog.Log(cs.ctx, c) -+ } - } - if err == nil { - cs.retryThrottler.successfulRPC() -@@ -936,8 +1046,8 @@ func (a *csAttempt) sendMsg(m interface{}, hdr, payld, data []byte) error { - } - return io.EOF - } -- if a.statsHandler != nil { -- a.statsHandler.HandleRPC(cs.ctx, outPayload(true, m, data, payld, time.Now())) -+ for _, sh := range a.statsHandlers { -+ sh.HandleRPC(a.ctx, outPayload(true, m, data, payld, time.Now())) - } - if channelz.IsOn() { - a.t.IncrMsgSent() -@@ -947,7 +1057,7 @@ func (a *csAttempt) sendMsg(m interface{}, hdr, payld, data []byte) error { - - func (a *csAttempt) recvMsg(m interface{}, payInfo *payloadInfo) (err error) { - cs := a.cs -- if a.statsHandler != nil && payInfo == nil { -+ if len(a.statsHandlers) != 0 && payInfo == nil { - payInfo = &payloadInfo{} - } - -@@ -975,6 +1085,7 @@ func (a *csAttempt) recvMsg(m interface{}, payInfo *payloadInfo) (err error) { - } - return io.EOF // indicates successful end of stream. - } -+ - return toRPCErr(err) - } - if a.trInfo != nil { -@@ -984,15 +1095,16 @@ func (a *csAttempt) recvMsg(m interface{}, payInfo *payloadInfo) (err error) { - } - a.mu.Unlock() - } -- if a.statsHandler != nil { -- a.statsHandler.HandleRPC(cs.ctx, &stats.InPayload{ -+ for _, sh := range a.statsHandlers { -+ sh.HandleRPC(a.ctx, &stats.InPayload{ - Client: true, - RecvTime: time.Now(), - Payload: m, - // TODO truncate large payload. -- Data: payInfo.uncompressedBytes, -- WireLength: payInfo.wireLength + headerLen, -- Length: len(payInfo.uncompressedBytes), -+ Data: payInfo.uncompressedBytes, -+ WireLength: payInfo.compressedLength + headerLen, -+ CompressedLength: payInfo.compressedLength, -+ Length: len(payInfo.uncompressedBytes), - }) - } - if channelz.IsOn() { -@@ -1031,12 +1143,12 @@ func (a *csAttempt) finish(err error) { - tr = a.s.Trailer() - } - -- if a.done != nil { -+ if a.pickResult.Done != nil { - br := false - if a.s != nil { - br = a.s.BytesReceived() - } -- a.done(balancer.DoneInfo{ -+ a.pickResult.Done(balancer.DoneInfo{ - Err: err, - Trailer: tr, - BytesSent: a.s != nil, -@@ -1044,15 +1156,15 @@ func (a *csAttempt) finish(err error) { - ServerLoad: balancerload.Parse(tr), - }) - } -- if a.statsHandler != nil { -+ for _, sh := range a.statsHandlers { - end := &stats.End{ - Client: true, -- BeginTime: a.cs.beginTime, -+ BeginTime: a.beginTime, - EndTime: time.Now(), - Trailer: tr, - Error: err, - } -- a.statsHandler.HandleRPC(a.cs.ctx, end) -+ sh.HandleRPC(a.ctx, end) - } - if a.trInfo != nil && a.trInfo.tr != nil { - if err == nil { -@@ -1161,14 +1273,19 @@ func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method strin - as.p = &parser{r: s} - ac.incrCallsStarted() - if desc != unaryStreamDesc { -- // Listen on cc and stream contexts to cleanup when the user closes the -- // ClientConn or cancels the stream context. In all other cases, an error -- // should already be injected into the recv buffer by the transport, which -- // the client will eventually receive, and then we will cancel the stream's -- // context in clientStream.finish. -+ // Listen on stream context to cleanup when the stream context is -+ // canceled. Also listen for the addrConn's context in case the -+ // addrConn is closed or reconnects to a different address. In all -+ // other cases, an error should already be injected into the recv -+ // buffer by the transport, which the client will eventually receive, -+ // and then we will cancel the stream's context in -+ // addrConnStream.finish. - go func() { -+ ac.mu.Lock() -+ acCtx := ac.ctx -+ ac.mu.Unlock() - select { -- case <-ac.ctx.Done(): -+ case <-acCtx.Done(): - as.finish(status.Error(codes.Canceled, "grpc: the SubConn is closing")) - case <-ctx.Done(): - as.finish(toRPCErr(ctx.Err())) -@@ -1357,8 +1474,10 @@ func (as *addrConnStream) finish(err error) { - - // ServerStream defines the server-side behavior of a streaming RPC. - // --// All errors returned from ServerStream methods are compatible with the --// status package. -+// Errors returned from ServerStream methods are compatible with the status -+// package. However, the status code will often not match the RPC status as -+// seen by the client application, and therefore, should not be relied upon for -+// this purpose. - type ServerStream interface { - // SetHeader sets the header metadata. It may be called multiple times. - // When call multiple times, all the provided metadata will be merged. -@@ -1390,6 +1509,9 @@ type ServerStream interface { - // It is safe to have a goroutine calling SendMsg and another goroutine - // calling RecvMsg on the same stream at the same time, but it is not safe - // to call SendMsg on the same stream in different goroutines. -+ // -+ // It is not safe to modify the message after calling SendMsg. Tracing -+ // libraries and stats handlers may use the message lazily. - SendMsg(m interface{}) error - // RecvMsg blocks until it receives a message into m or the stream is - // done. It returns io.EOF when the client has performed a CloseSend. On -@@ -1415,13 +1537,15 @@ type serverStream struct { - comp encoding.Compressor - decomp encoding.Compressor - -+ sendCompressorName string -+ - maxReceiveMessageSize int - maxSendMessageSize int - trInfo *traceInfo - -- statsHandler stats.Handler -+ statsHandler []stats.Handler - -- binlog *binarylog.MethodLogger -+ binlogs []binarylog.MethodLogger - // serverHeaderBinlogged indicates whether server header has been logged. It - // will happen when one of the following two happens: stream.SendHeader(), - // stream.Send(). -@@ -1441,17 +1565,29 @@ func (ss *serverStream) SetHeader(md metadata.MD) error { - if md.Len() == 0 { - return nil - } -+ err := imetadata.Validate(md) -+ if err != nil { -+ return status.Error(codes.Internal, err.Error()) -+ } - return ss.s.SetHeader(md) - } - - func (ss *serverStream) SendHeader(md metadata.MD) error { -- err := ss.t.WriteHeader(ss.s, md) -- if ss.binlog != nil && !ss.serverHeaderBinlogged { -+ err := imetadata.Validate(md) -+ if err != nil { -+ return status.Error(codes.Internal, err.Error()) -+ } -+ -+ err = ss.t.WriteHeader(ss.s, md) -+ if len(ss.binlogs) != 0 && !ss.serverHeaderBinlogged { - h, _ := ss.s.Header() -- ss.binlog.Log(&binarylog.ServerHeader{ -+ sh := &binarylog.ServerHeader{ - Header: h, -- }) -+ } - ss.serverHeaderBinlogged = true -+ for _, binlog := range ss.binlogs { -+ binlog.Log(ss.ctx, sh) -+ } - } - return err - } -@@ -1460,6 +1596,9 @@ func (ss *serverStream) SetTrailer(md metadata.MD) { - if md.Len() == 0 { - return - } -+ if err := imetadata.Validate(md); err != nil { -+ logger.Errorf("stream: failed to validate md when setting trailer, err: %v", err) -+ } - ss.s.SetTrailer(md) - } - -@@ -1492,6 +1631,13 @@ func (ss *serverStream) SendMsg(m interface{}) (err error) { - } - }() - -+ // Server handler could have set new compressor by calling SetSendCompressor. -+ // In case it is set, we need to use it for compressing outbound message. -+ if sendCompressorsName := ss.s.SendCompress(); sendCompressorsName != ss.sendCompressorName { -+ ss.comp = encoding.GetCompressor(sendCompressorsName) -+ ss.sendCompressorName = sendCompressorsName -+ } -+ - // load hdr, payload, data - hdr, payload, data, err := prepareMsg(m, ss.codec, ss.cp, ss.comp) - if err != nil { -@@ -1505,20 +1651,28 @@ func (ss *serverStream) SendMsg(m interface{}) (err error) { - if err := ss.t.Write(ss.s, hdr, payload, &transport.Options{Last: false}); err != nil { - return toRPCErr(err) - } -- if ss.binlog != nil { -+ if len(ss.binlogs) != 0 { - if !ss.serverHeaderBinlogged { - h, _ := ss.s.Header() -- ss.binlog.Log(&binarylog.ServerHeader{ -+ sh := &binarylog.ServerHeader{ - Header: h, -- }) -+ } - ss.serverHeaderBinlogged = true -+ for _, binlog := range ss.binlogs { -+ binlog.Log(ss.ctx, sh) -+ } - } -- ss.binlog.Log(&binarylog.ServerMessage{ -+ sm := &binarylog.ServerMessage{ - Message: data, -- }) -+ } -+ for _, binlog := range ss.binlogs { -+ binlog.Log(ss.ctx, sm) -+ } - } -- if ss.statsHandler != nil { -- ss.statsHandler.HandleRPC(ss.s.Context(), outPayload(false, m, data, payload, time.Now())) -+ if len(ss.statsHandler) != 0 { -+ for _, sh := range ss.statsHandler { -+ sh.HandleRPC(ss.s.Context(), outPayload(false, m, data, payload, time.Now())) -+ } - } - return nil - } -@@ -1552,13 +1706,16 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) { - } - }() - var payInfo *payloadInfo -- if ss.statsHandler != nil || ss.binlog != nil { -+ if len(ss.statsHandler) != 0 || len(ss.binlogs) != 0 { - payInfo = &payloadInfo{} - } - if err := recv(ss.p, ss.codec, ss.s, ss.dc, m, ss.maxReceiveMessageSize, payInfo, ss.decomp); err != nil { - if err == io.EOF { -- if ss.binlog != nil { -- ss.binlog.Log(&binarylog.ClientHalfClose{}) -+ if len(ss.binlogs) != 0 { -+ chc := &binarylog.ClientHalfClose{} -+ for _, binlog := range ss.binlogs { -+ binlog.Log(ss.ctx, chc) -+ } - } - return err - } -@@ -1567,20 +1724,26 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) { - } - return toRPCErr(err) - } -- if ss.statsHandler != nil { -- ss.statsHandler.HandleRPC(ss.s.Context(), &stats.InPayload{ -- RecvTime: time.Now(), -- Payload: m, -- // TODO truncate large payload. -- Data: payInfo.uncompressedBytes, -- WireLength: payInfo.wireLength + headerLen, -- Length: len(payInfo.uncompressedBytes), -- }) -+ if len(ss.statsHandler) != 0 { -+ for _, sh := range ss.statsHandler { -+ sh.HandleRPC(ss.s.Context(), &stats.InPayload{ -+ RecvTime: time.Now(), -+ Payload: m, -+ // TODO truncate large payload. -+ Data: payInfo.uncompressedBytes, -+ Length: len(payInfo.uncompressedBytes), -+ WireLength: payInfo.compressedLength + headerLen, -+ CompressedLength: payInfo.compressedLength, -+ }) -+ } - } -- if ss.binlog != nil { -- ss.binlog.Log(&binarylog.ClientMessage{ -+ if len(ss.binlogs) != 0 { -+ cm := &binarylog.ClientMessage{ - Message: payInfo.uncompressedBytes, -- }) -+ } -+ for _, binlog := range ss.binlogs { -+ binlog.Log(ss.ctx, cm) -+ } - } - return nil - } -diff --git a/vendor/google.golang.org/grpc/tap/tap.go b/vendor/google.golang.org/grpc/tap/tap.go -index dbf34e6..bfa5dfa 100644 ---- a/vendor/google.golang.org/grpc/tap/tap.go -+++ b/vendor/google.golang.org/grpc/tap/tap.go -@@ -19,7 +19,7 @@ - // Package tap defines the function handles which are executed on the transport - // layer of gRPC-Go and related information. - // --// Experimental -+// # Experimental - // - // Notice: This API is EXPERIMENTAL and may be changed or removed in a - // later release. -diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go -index e3510e1..3cc7540 100644 ---- a/vendor/google.golang.org/grpc/version.go -+++ b/vendor/google.golang.org/grpc/version.go -@@ -19,4 +19,4 @@ - package grpc - - // Version is the current grpc version. --const Version = "1.40.0" -+const Version = "1.56.3" -diff --git a/vendor/google.golang.org/grpc/vet.sh b/vendor/google.golang.org/grpc/vet.sh -index 5eaa8b0..a8e4732 100644 ---- a/vendor/google.golang.org/grpc/vet.sh -+++ b/vendor/google.golang.org/grpc/vet.sh -@@ -41,16 +41,8 @@ if [[ "$1" = "-install" ]]; then - github.com/client9/misspell/cmd/misspell - popd - if [[ -z "${VET_SKIP_PROTO}" ]]; then -- if [[ "${TRAVIS}" = "true" ]]; then -- PROTOBUF_VERSION=3.14.0 -- PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip -- pushd /home/travis -- wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME} -- unzip ${PROTOC_FILENAME} -- bin/protoc --version -- popd -- elif [[ "${GITHUB_ACTIONS}" = "true" ]]; then -- PROTOBUF_VERSION=3.14.0 -+ if [[ "${GITHUB_ACTIONS}" = "true" ]]; then -+ PROTOBUF_VERSION=22.0 # a.k.a v4.22.0 in pb.go files. - PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip - pushd /home/runner/go - wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME} -@@ -66,8 +58,20 @@ elif [[ "$#" -ne 0 ]]; then - die "Unknown argument(s): $*" - fi - -+# - Check that generated proto files are up to date. -+if [[ -z "${VET_SKIP_PROTO}" ]]; then -+ make proto && git status --porcelain 2>&1 | fail_on_output || \ -+ (git status; git --no-pager diff; exit 1) -+fi -+ -+if [[ -n "${VET_ONLY_PROTO}" ]]; then -+ exit 0 -+fi -+ - # - Ensure all source files contain a copyright message. --not git grep -L "\(Copyright [0-9]\{4,\} gRPC authors\)\|DO NOT EDIT" -- '*.go' -+# (Done in two parts because Darwin "git grep" has broken support for compound -+# exclusion matches.) -+(grep -L "DO NOT EDIT" $(git grep -L "\(Copyright [0-9]\{4,\} gRPC authors\)" -- '*.go') || true) | fail_on_output - - # - Make sure all tests in grpc and grpc/test use leakcheck via Teardown. - not grep 'func Test[^(]' *_test.go -@@ -81,7 +85,7 @@ not git grep -l 'x/net/context' -- "*.go" - git grep -l '"math/rand"' -- "*.go" 2>&1 | not grep -v '^examples\|^stress\|grpcrand\|^benchmark\|wrr_test' - - # - Do not call grpclog directly. Use grpclog.Component instead. --git grep -l 'grpclog.I\|grpclog.W\|grpclog.E\|grpclog.F\|grpclog.V' -- "*.go" | not grep -v '^grpclog/component.go\|^internal/grpctest/tlogger_test.go' -+git grep -l -e 'grpclog.I' --or -e 'grpclog.W' --or -e 'grpclog.E' --or -e 'grpclog.F' --or -e 'grpclog.V' -- "*.go" | not grep -v '^grpclog/component.go\|^internal/grpctest/tlogger_test.go' - - # - Ensure all ptypes proto packages are renamed when importing. - not git grep "\(import \|^\s*\)\"github.com/golang/protobuf/ptypes/" -- "*.go" -@@ -89,19 +93,8 @@ not git grep "\(import \|^\s*\)\"github.com/golang/protobuf/ptypes/" -- "*.go" - # - Ensure all xds proto imports are renamed to *pb or *grpc. - git grep '"github.com/envoyproxy/go-control-plane/envoy' -- '*.go' ':(exclude)*.pb.go' | not grep -v 'pb "\|grpc "' - --# - Check imports that are illegal in appengine (until Go 1.11). --# TODO: Remove when we drop Go 1.10 support --go list -f {{.Dir}} ./... | xargs go run test/go_vet/vet.go -- - misspell -error . - --# - Check that generated proto files are up to date. --if [[ -z "${VET_SKIP_PROTO}" ]]; then -- PATH="/home/travis/bin:${PATH}" make proto && \ -- git status --porcelain 2>&1 | fail_on_output || \ -- (git status; git --no-pager diff; exit 1) --fi -- - # - gofmt, goimports, golint (with exceptions for generated code), go vet, - # go mod tidy. - # Perform these checks on each module inside gRPC. -@@ -111,9 +104,9 @@ for MOD_FILE in $(find . -name 'go.mod'); do - go vet -all ./... | fail_on_output - gofmt -s -d -l . 2>&1 | fail_on_output - goimports -l . 2>&1 | not grep -vE "\.pb\.go" -- golint ./... 2>&1 | not grep -vE "/testv3\.pb\.go:" -+ golint ./... 2>&1 | not grep -vE "/grpc_testing_not_regenerate/.*\.pb\.go:" - -- go mod tidy -+ go mod tidy -compat=1.17 - git status --porcelain 2>&1 | fail_on_output || \ - (git status; git --no-pager diff; exit 1) - popd -@@ -123,8 +116,9 @@ done - # - # TODO(dfawley): don't use deprecated functions in examples or first-party - # plugins. -+# TODO(dfawley): enable ST1019 (duplicate imports) but allow for protobufs. - SC_OUT="$(mktemp)" --staticcheck -go 1.9 -checks 'inherit,-ST1015' ./... > "${SC_OUT}" || true -+staticcheck -go 1.19 -checks 'inherit,-ST1015,-ST1019,-SA1019' ./... > "${SC_OUT}" || true - # Error if anything other than deprecation warnings are printed. - not grep -v "is deprecated:.*SA1019" "${SC_OUT}" - # Only ignore the following deprecated types/fields/functions. -@@ -151,7 +145,6 @@ grpc.NewGZIPDecompressor - grpc.RPCCompressor - grpc.RPCDecompressor - grpc.ServiceConfig --grpc.WithBalancerName - grpc.WithCompressor - grpc.WithDecompressor - grpc.WithDialer -diff --git a/vendor/google.golang.org/protobuf/AUTHORS b/vendor/google.golang.org/protobuf/AUTHORS -deleted file mode 100644 -index 2b00ddb..0000000 ---- a/vendor/google.golang.org/protobuf/AUTHORS -+++ /dev/null -@@ -1,3 +0,0 @@ --# This source code refers to The Go Authors for copyright purposes. --# The master list of authors is in the main Go distribution, --# visible at https://tip.golang.org/AUTHORS. -diff --git a/vendor/google.golang.org/protobuf/CONTRIBUTORS b/vendor/google.golang.org/protobuf/CONTRIBUTORS -deleted file mode 100644 -index 1fbd3e9..0000000 ---- a/vendor/google.golang.org/protobuf/CONTRIBUTORS -+++ /dev/null -@@ -1,3 +0,0 @@ --# This source code was written by the Go contributors. --# The master list of contributors is in the main Go distribution, --# visible at https://tip.golang.org/CONTRIBUTORS. -diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/decode.go b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go -new file mode 100644 -index 0000000..5f28148 ---- /dev/null -+++ b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go -@@ -0,0 +1,665 @@ -+// Copyright 2019 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+package protojson -+ -+import ( -+ "encoding/base64" -+ "fmt" -+ "math" -+ "strconv" -+ "strings" -+ -+ "google.golang.org/protobuf/internal/encoding/json" -+ "google.golang.org/protobuf/internal/encoding/messageset" -+ "google.golang.org/protobuf/internal/errors" -+ "google.golang.org/protobuf/internal/flags" -+ "google.golang.org/protobuf/internal/genid" -+ "google.golang.org/protobuf/internal/pragma" -+ "google.golang.org/protobuf/internal/set" -+ "google.golang.org/protobuf/proto" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoregistry" -+) -+ -+// Unmarshal reads the given []byte into the given proto.Message. -+// The provided message must be mutable (e.g., a non-nil pointer to a message). -+func Unmarshal(b []byte, m proto.Message) error { -+ return UnmarshalOptions{}.Unmarshal(b, m) -+} -+ -+// UnmarshalOptions is a configurable JSON format parser. -+type UnmarshalOptions struct { -+ pragma.NoUnkeyedLiterals -+ -+ // If AllowPartial is set, input for messages that will result in missing -+ // required fields will not return an error. -+ AllowPartial bool -+ -+ // If DiscardUnknown is set, unknown fields are ignored. -+ DiscardUnknown bool -+ -+ // Resolver is used for looking up types when unmarshaling -+ // google.protobuf.Any messages or extension fields. -+ // If nil, this defaults to using protoregistry.GlobalTypes. -+ Resolver interface { -+ protoregistry.MessageTypeResolver -+ protoregistry.ExtensionTypeResolver -+ } -+} -+ -+// Unmarshal reads the given []byte and populates the given proto.Message -+// using options in the UnmarshalOptions object. -+// It will clear the message first before setting the fields. -+// If it returns an error, the given message may be partially set. -+// The provided message must be mutable (e.g., a non-nil pointer to a message). -+func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error { -+ return o.unmarshal(b, m) -+} -+ -+// unmarshal is a centralized function that all unmarshal operations go through. -+// For profiling purposes, avoid changing the name of this function or -+// introducing other code paths for unmarshal that do not go through this. -+func (o UnmarshalOptions) unmarshal(b []byte, m proto.Message) error { -+ proto.Reset(m) -+ -+ if o.Resolver == nil { -+ o.Resolver = protoregistry.GlobalTypes -+ } -+ -+ dec := decoder{json.NewDecoder(b), o} -+ if err := dec.unmarshalMessage(m.ProtoReflect(), false); err != nil { -+ return err -+ } -+ -+ // Check for EOF. -+ tok, err := dec.Read() -+ if err != nil { -+ return err -+ } -+ if tok.Kind() != json.EOF { -+ return dec.unexpectedTokenError(tok) -+ } -+ -+ if o.AllowPartial { -+ return nil -+ } -+ return proto.CheckInitialized(m) -+} -+ -+type decoder struct { -+ *json.Decoder -+ opts UnmarshalOptions -+} -+ -+// newError returns an error object with position info. -+func (d decoder) newError(pos int, f string, x ...interface{}) error { -+ line, column := d.Position(pos) -+ head := fmt.Sprintf("(line %d:%d): ", line, column) -+ return errors.New(head+f, x...) -+} -+ -+// unexpectedTokenError returns a syntax error for the given unexpected token. -+func (d decoder) unexpectedTokenError(tok json.Token) error { -+ return d.syntaxError(tok.Pos(), "unexpected token %s", tok.RawString()) -+} -+ -+// syntaxError returns a syntax error for given position. -+func (d decoder) syntaxError(pos int, f string, x ...interface{}) error { -+ line, column := d.Position(pos) -+ head := fmt.Sprintf("syntax error (line %d:%d): ", line, column) -+ return errors.New(head+f, x...) -+} -+ -+// unmarshalMessage unmarshals a message into the given protoreflect.Message. -+func (d decoder) unmarshalMessage(m protoreflect.Message, skipTypeURL bool) error { -+ if unmarshal := wellKnownTypeUnmarshaler(m.Descriptor().FullName()); unmarshal != nil { -+ return unmarshal(d, m) -+ } -+ -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ if tok.Kind() != json.ObjectOpen { -+ return d.unexpectedTokenError(tok) -+ } -+ -+ messageDesc := m.Descriptor() -+ if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) { -+ return errors.New("no support for proto1 MessageSets") -+ } -+ -+ var seenNums set.Ints -+ var seenOneofs set.Ints -+ fieldDescs := messageDesc.Fields() -+ for { -+ // Read field name. -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ switch tok.Kind() { -+ default: -+ return d.unexpectedTokenError(tok) -+ case json.ObjectClose: -+ return nil -+ case json.Name: -+ // Continue below. -+ } -+ -+ name := tok.Name() -+ // Unmarshaling a non-custom embedded message in Any will contain the -+ // JSON field "@type" which should be skipped because it is not a field -+ // of the embedded message, but simply an artifact of the Any format. -+ if skipTypeURL && name == "@type" { -+ d.Read() -+ continue -+ } -+ -+ // Get the FieldDescriptor. -+ var fd protoreflect.FieldDescriptor -+ if strings.HasPrefix(name, "[") && strings.HasSuffix(name, "]") { -+ // Only extension names are in [name] format. -+ extName := protoreflect.FullName(name[1 : len(name)-1]) -+ extType, err := d.opts.Resolver.FindExtensionByName(extName) -+ if err != nil && err != protoregistry.NotFound { -+ return d.newError(tok.Pos(), "unable to resolve %s: %v", tok.RawString(), err) -+ } -+ if extType != nil { -+ fd = extType.TypeDescriptor() -+ if !messageDesc.ExtensionRanges().Has(fd.Number()) || fd.ContainingMessage().FullName() != messageDesc.FullName() { -+ return d.newError(tok.Pos(), "message %v cannot be extended by %v", messageDesc.FullName(), fd.FullName()) -+ } -+ } -+ } else { -+ // The name can either be the JSON name or the proto field name. -+ fd = fieldDescs.ByJSONName(name) -+ if fd == nil { -+ fd = fieldDescs.ByTextName(name) -+ } -+ } -+ if flags.ProtoLegacy { -+ if fd != nil && fd.IsWeak() && fd.Message().IsPlaceholder() { -+ fd = nil // reset since the weak reference is not linked in -+ } -+ } -+ -+ if fd == nil { -+ // Field is unknown. -+ if d.opts.DiscardUnknown { -+ if err := d.skipJSONValue(); err != nil { -+ return err -+ } -+ continue -+ } -+ return d.newError(tok.Pos(), "unknown field %v", tok.RawString()) -+ } -+ -+ // Do not allow duplicate fields. -+ num := uint64(fd.Number()) -+ if seenNums.Has(num) { -+ return d.newError(tok.Pos(), "duplicate field %v", tok.RawString()) -+ } -+ seenNums.Set(num) -+ -+ // No need to set values for JSON null unless the field type is -+ // google.protobuf.Value or google.protobuf.NullValue. -+ if tok, _ := d.Peek(); tok.Kind() == json.Null && !isKnownValue(fd) && !isNullValue(fd) { -+ d.Read() -+ continue -+ } -+ -+ switch { -+ case fd.IsList(): -+ list := m.Mutable(fd).List() -+ if err := d.unmarshalList(list, fd); err != nil { -+ return err -+ } -+ case fd.IsMap(): -+ mmap := m.Mutable(fd).Map() -+ if err := d.unmarshalMap(mmap, fd); err != nil { -+ return err -+ } -+ default: -+ // If field is a oneof, check if it has already been set. -+ if od := fd.ContainingOneof(); od != nil { -+ idx := uint64(od.Index()) -+ if seenOneofs.Has(idx) { -+ return d.newError(tok.Pos(), "error parsing %s, oneof %v is already set", tok.RawString(), od.FullName()) -+ } -+ seenOneofs.Set(idx) -+ } -+ -+ // Required or optional fields. -+ if err := d.unmarshalSingular(m, fd); err != nil { -+ return err -+ } -+ } -+ } -+} -+ -+func isKnownValue(fd protoreflect.FieldDescriptor) bool { -+ md := fd.Message() -+ return md != nil && md.FullName() == genid.Value_message_fullname -+} -+ -+func isNullValue(fd protoreflect.FieldDescriptor) bool { -+ ed := fd.Enum() -+ return ed != nil && ed.FullName() == genid.NullValue_enum_fullname -+} -+ -+// unmarshalSingular unmarshals to the non-repeated field specified -+// by the given FieldDescriptor. -+func (d decoder) unmarshalSingular(m protoreflect.Message, fd protoreflect.FieldDescriptor) error { -+ var val protoreflect.Value -+ var err error -+ switch fd.Kind() { -+ case protoreflect.MessageKind, protoreflect.GroupKind: -+ val = m.NewField(fd) -+ err = d.unmarshalMessage(val.Message(), false) -+ default: -+ val, err = d.unmarshalScalar(fd) -+ } -+ -+ if err != nil { -+ return err -+ } -+ m.Set(fd, val) -+ return nil -+} -+ -+// unmarshalScalar unmarshals to a scalar/enum protoreflect.Value specified by -+// the given FieldDescriptor. -+func (d decoder) unmarshalScalar(fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { -+ const b32 int = 32 -+ const b64 int = 64 -+ -+ tok, err := d.Read() -+ if err != nil { -+ return protoreflect.Value{}, err -+ } -+ -+ kind := fd.Kind() -+ switch kind { -+ case protoreflect.BoolKind: -+ if tok.Kind() == json.Bool { -+ return protoreflect.ValueOfBool(tok.Bool()), nil -+ } -+ -+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: -+ if v, ok := unmarshalInt(tok, b32); ok { -+ return v, nil -+ } -+ -+ case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: -+ if v, ok := unmarshalInt(tok, b64); ok { -+ return v, nil -+ } -+ -+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: -+ if v, ok := unmarshalUint(tok, b32); ok { -+ return v, nil -+ } -+ -+ case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: -+ if v, ok := unmarshalUint(tok, b64); ok { -+ return v, nil -+ } -+ -+ case protoreflect.FloatKind: -+ if v, ok := unmarshalFloat(tok, b32); ok { -+ return v, nil -+ } -+ -+ case protoreflect.DoubleKind: -+ if v, ok := unmarshalFloat(tok, b64); ok { -+ return v, nil -+ } -+ -+ case protoreflect.StringKind: -+ if tok.Kind() == json.String { -+ return protoreflect.ValueOfString(tok.ParsedString()), nil -+ } -+ -+ case protoreflect.BytesKind: -+ if v, ok := unmarshalBytes(tok); ok { -+ return v, nil -+ } -+ -+ case protoreflect.EnumKind: -+ if v, ok := unmarshalEnum(tok, fd); ok { -+ return v, nil -+ } -+ -+ default: -+ panic(fmt.Sprintf("unmarshalScalar: invalid scalar kind %v", kind)) -+ } -+ -+ return protoreflect.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString()) -+} -+ -+func unmarshalInt(tok json.Token, bitSize int) (protoreflect.Value, bool) { -+ switch tok.Kind() { -+ case json.Number: -+ return getInt(tok, bitSize) -+ -+ case json.String: -+ // Decode number from string. -+ s := strings.TrimSpace(tok.ParsedString()) -+ if len(s) != len(tok.ParsedString()) { -+ return protoreflect.Value{}, false -+ } -+ dec := json.NewDecoder([]byte(s)) -+ tok, err := dec.Read() -+ if err != nil { -+ return protoreflect.Value{}, false -+ } -+ return getInt(tok, bitSize) -+ } -+ return protoreflect.Value{}, false -+} -+ -+func getInt(tok json.Token, bitSize int) (protoreflect.Value, bool) { -+ n, ok := tok.Int(bitSize) -+ if !ok { -+ return protoreflect.Value{}, false -+ } -+ if bitSize == 32 { -+ return protoreflect.ValueOfInt32(int32(n)), true -+ } -+ return protoreflect.ValueOfInt64(n), true -+} -+ -+func unmarshalUint(tok json.Token, bitSize int) (protoreflect.Value, bool) { -+ switch tok.Kind() { -+ case json.Number: -+ return getUint(tok, bitSize) -+ -+ case json.String: -+ // Decode number from string. -+ s := strings.TrimSpace(tok.ParsedString()) -+ if len(s) != len(tok.ParsedString()) { -+ return protoreflect.Value{}, false -+ } -+ dec := json.NewDecoder([]byte(s)) -+ tok, err := dec.Read() -+ if err != nil { -+ return protoreflect.Value{}, false -+ } -+ return getUint(tok, bitSize) -+ } -+ return protoreflect.Value{}, false -+} -+ -+func getUint(tok json.Token, bitSize int) (protoreflect.Value, bool) { -+ n, ok := tok.Uint(bitSize) -+ if !ok { -+ return protoreflect.Value{}, false -+ } -+ if bitSize == 32 { -+ return protoreflect.ValueOfUint32(uint32(n)), true -+ } -+ return protoreflect.ValueOfUint64(n), true -+} -+ -+func unmarshalFloat(tok json.Token, bitSize int) (protoreflect.Value, bool) { -+ switch tok.Kind() { -+ case json.Number: -+ return getFloat(tok, bitSize) -+ -+ case json.String: -+ s := tok.ParsedString() -+ switch s { -+ case "NaN": -+ if bitSize == 32 { -+ return protoreflect.ValueOfFloat32(float32(math.NaN())), true -+ } -+ return protoreflect.ValueOfFloat64(math.NaN()), true -+ case "Infinity": -+ if bitSize == 32 { -+ return protoreflect.ValueOfFloat32(float32(math.Inf(+1))), true -+ } -+ return protoreflect.ValueOfFloat64(math.Inf(+1)), true -+ case "-Infinity": -+ if bitSize == 32 { -+ return protoreflect.ValueOfFloat32(float32(math.Inf(-1))), true -+ } -+ return protoreflect.ValueOfFloat64(math.Inf(-1)), true -+ } -+ -+ // Decode number from string. -+ if len(s) != len(strings.TrimSpace(s)) { -+ return protoreflect.Value{}, false -+ } -+ dec := json.NewDecoder([]byte(s)) -+ tok, err := dec.Read() -+ if err != nil { -+ return protoreflect.Value{}, false -+ } -+ return getFloat(tok, bitSize) -+ } -+ return protoreflect.Value{}, false -+} -+ -+func getFloat(tok json.Token, bitSize int) (protoreflect.Value, bool) { -+ n, ok := tok.Float(bitSize) -+ if !ok { -+ return protoreflect.Value{}, false -+ } -+ if bitSize == 32 { -+ return protoreflect.ValueOfFloat32(float32(n)), true -+ } -+ return protoreflect.ValueOfFloat64(n), true -+} -+ -+func unmarshalBytes(tok json.Token) (protoreflect.Value, bool) { -+ if tok.Kind() != json.String { -+ return protoreflect.Value{}, false -+ } -+ -+ s := tok.ParsedString() -+ enc := base64.StdEncoding -+ if strings.ContainsAny(s, "-_") { -+ enc = base64.URLEncoding -+ } -+ if len(s)%4 != 0 { -+ enc = enc.WithPadding(base64.NoPadding) -+ } -+ b, err := enc.DecodeString(s) -+ if err != nil { -+ return protoreflect.Value{}, false -+ } -+ return protoreflect.ValueOfBytes(b), true -+} -+ -+func unmarshalEnum(tok json.Token, fd protoreflect.FieldDescriptor) (protoreflect.Value, bool) { -+ switch tok.Kind() { -+ case json.String: -+ // Lookup EnumNumber based on name. -+ s := tok.ParsedString() -+ if enumVal := fd.Enum().Values().ByName(protoreflect.Name(s)); enumVal != nil { -+ return protoreflect.ValueOfEnum(enumVal.Number()), true -+ } -+ -+ case json.Number: -+ if n, ok := tok.Int(32); ok { -+ return protoreflect.ValueOfEnum(protoreflect.EnumNumber(n)), true -+ } -+ -+ case json.Null: -+ // This is only valid for google.protobuf.NullValue. -+ if isNullValue(fd) { -+ return protoreflect.ValueOfEnum(0), true -+ } -+ } -+ -+ return protoreflect.Value{}, false -+} -+ -+func (d decoder) unmarshalList(list protoreflect.List, fd protoreflect.FieldDescriptor) error { -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ if tok.Kind() != json.ArrayOpen { -+ return d.unexpectedTokenError(tok) -+ } -+ -+ switch fd.Kind() { -+ case protoreflect.MessageKind, protoreflect.GroupKind: -+ for { -+ tok, err := d.Peek() -+ if err != nil { -+ return err -+ } -+ -+ if tok.Kind() == json.ArrayClose { -+ d.Read() -+ return nil -+ } -+ -+ val := list.NewElement() -+ if err := d.unmarshalMessage(val.Message(), false); err != nil { -+ return err -+ } -+ list.Append(val) -+ } -+ default: -+ for { -+ tok, err := d.Peek() -+ if err != nil { -+ return err -+ } -+ -+ if tok.Kind() == json.ArrayClose { -+ d.Read() -+ return nil -+ } -+ -+ val, err := d.unmarshalScalar(fd) -+ if err != nil { -+ return err -+ } -+ list.Append(val) -+ } -+ } -+ -+ return nil -+} -+ -+func (d decoder) unmarshalMap(mmap protoreflect.Map, fd protoreflect.FieldDescriptor) error { -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ if tok.Kind() != json.ObjectOpen { -+ return d.unexpectedTokenError(tok) -+ } -+ -+ // Determine ahead whether map entry is a scalar type or a message type in -+ // order to call the appropriate unmarshalMapValue func inside the for loop -+ // below. -+ var unmarshalMapValue func() (protoreflect.Value, error) -+ switch fd.MapValue().Kind() { -+ case protoreflect.MessageKind, protoreflect.GroupKind: -+ unmarshalMapValue = func() (protoreflect.Value, error) { -+ val := mmap.NewValue() -+ if err := d.unmarshalMessage(val.Message(), false); err != nil { -+ return protoreflect.Value{}, err -+ } -+ return val, nil -+ } -+ default: -+ unmarshalMapValue = func() (protoreflect.Value, error) { -+ return d.unmarshalScalar(fd.MapValue()) -+ } -+ } -+ -+Loop: -+ for { -+ // Read field name. -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ switch tok.Kind() { -+ default: -+ return d.unexpectedTokenError(tok) -+ case json.ObjectClose: -+ break Loop -+ case json.Name: -+ // Continue. -+ } -+ -+ // Unmarshal field name. -+ pkey, err := d.unmarshalMapKey(tok, fd.MapKey()) -+ if err != nil { -+ return err -+ } -+ -+ // Check for duplicate field name. -+ if mmap.Has(pkey) { -+ return d.newError(tok.Pos(), "duplicate map key %v", tok.RawString()) -+ } -+ -+ // Read and unmarshal field value. -+ pval, err := unmarshalMapValue() -+ if err != nil { -+ return err -+ } -+ -+ mmap.Set(pkey, pval) -+ } -+ -+ return nil -+} -+ -+// unmarshalMapKey converts given token of Name kind into a protoreflect.MapKey. -+// A map key type is any integral or string type. -+func (d decoder) unmarshalMapKey(tok json.Token, fd protoreflect.FieldDescriptor) (protoreflect.MapKey, error) { -+ const b32 = 32 -+ const b64 = 64 -+ const base10 = 10 -+ -+ name := tok.Name() -+ kind := fd.Kind() -+ switch kind { -+ case protoreflect.StringKind: -+ return protoreflect.ValueOfString(name).MapKey(), nil -+ -+ case protoreflect.BoolKind: -+ switch name { -+ case "true": -+ return protoreflect.ValueOfBool(true).MapKey(), nil -+ case "false": -+ return protoreflect.ValueOfBool(false).MapKey(), nil -+ } -+ -+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: -+ if n, err := strconv.ParseInt(name, base10, b32); err == nil { -+ return protoreflect.ValueOfInt32(int32(n)).MapKey(), nil -+ } -+ -+ case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: -+ if n, err := strconv.ParseInt(name, base10, b64); err == nil { -+ return protoreflect.ValueOfInt64(int64(n)).MapKey(), nil -+ } -+ -+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: -+ if n, err := strconv.ParseUint(name, base10, b32); err == nil { -+ return protoreflect.ValueOfUint32(uint32(n)).MapKey(), nil -+ } -+ -+ case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: -+ if n, err := strconv.ParseUint(name, base10, b64); err == nil { -+ return protoreflect.ValueOfUint64(uint64(n)).MapKey(), nil -+ } -+ -+ default: -+ panic(fmt.Sprintf("invalid kind for map key: %v", kind)) -+ } -+ -+ return protoreflect.MapKey{}, d.newError(tok.Pos(), "invalid value for %v key: %s", kind, tok.RawString()) -+} -diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/doc.go b/vendor/google.golang.org/protobuf/encoding/protojson/doc.go -new file mode 100644 -index 0000000..21d5d2c ---- /dev/null -+++ b/vendor/google.golang.org/protobuf/encoding/protojson/doc.go -@@ -0,0 +1,11 @@ -+// Copyright 2019 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+// Package protojson marshals and unmarshals protocol buffer messages as JSON -+// format. It follows the guide at -+// https://protobuf.dev/programming-guides/proto3#json. -+// -+// This package produces a different output than the standard "encoding/json" -+// package, which does not operate correctly on protocol buffer messages. -+package protojson -diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/encode.go b/vendor/google.golang.org/protobuf/encoding/protojson/encode.go -new file mode 100644 -index 0000000..d09d22e ---- /dev/null -+++ b/vendor/google.golang.org/protobuf/encoding/protojson/encode.go -@@ -0,0 +1,343 @@ -+// Copyright 2019 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+package protojson -+ -+import ( -+ "encoding/base64" -+ "fmt" -+ -+ "google.golang.org/protobuf/internal/encoding/json" -+ "google.golang.org/protobuf/internal/encoding/messageset" -+ "google.golang.org/protobuf/internal/errors" -+ "google.golang.org/protobuf/internal/filedesc" -+ "google.golang.org/protobuf/internal/flags" -+ "google.golang.org/protobuf/internal/genid" -+ "google.golang.org/protobuf/internal/order" -+ "google.golang.org/protobuf/internal/pragma" -+ "google.golang.org/protobuf/proto" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoregistry" -+) -+ -+const defaultIndent = " " -+ -+// Format formats the message as a multiline string. -+// This function is only intended for human consumption and ignores errors. -+// Do not depend on the output being stable. It may change over time across -+// different versions of the program. -+func Format(m proto.Message) string { -+ return MarshalOptions{Multiline: true}.Format(m) -+} -+ -+// Marshal writes the given proto.Message in JSON format using default options. -+// Do not depend on the output being stable. It may change over time across -+// different versions of the program. -+func Marshal(m proto.Message) ([]byte, error) { -+ return MarshalOptions{}.Marshal(m) -+} -+ -+// MarshalOptions is a configurable JSON format marshaler. -+type MarshalOptions struct { -+ pragma.NoUnkeyedLiterals -+ -+ // Multiline specifies whether the marshaler should format the output in -+ // indented-form with every textual element on a new line. -+ // If Indent is an empty string, then an arbitrary indent is chosen. -+ Multiline bool -+ -+ // Indent specifies the set of indentation characters to use in a multiline -+ // formatted output such that every entry is preceded by Indent and -+ // terminated by a newline. If non-empty, then Multiline is treated as true. -+ // Indent can only be composed of space or tab characters. -+ Indent string -+ -+ // AllowPartial allows messages that have missing required fields to marshal -+ // without returning an error. If AllowPartial is false (the default), -+ // Marshal will return error if there are any missing required fields. -+ AllowPartial bool -+ -+ // UseProtoNames uses proto field name instead of lowerCamelCase name in JSON -+ // field names. -+ UseProtoNames bool -+ -+ // UseEnumNumbers emits enum values as numbers. -+ UseEnumNumbers bool -+ -+ // EmitUnpopulated specifies whether to emit unpopulated fields. It does not -+ // emit unpopulated oneof fields or unpopulated extension fields. -+ // The JSON value emitted for unpopulated fields are as follows: -+ // ╔═══════╤════════════════════════════╗ -+ // ║ JSON │ Protobuf field ║ -+ // ╠═══════╪════════════════════════════╣ -+ // ║ false │ proto3 boolean fields ║ -+ // ║ 0 │ proto3 numeric fields ║ -+ // ║ "" │ proto3 string/bytes fields ║ -+ // ║ null │ proto2 scalar fields ║ -+ // ║ null │ message fields ║ -+ // ║ [] │ list fields ║ -+ // ║ {} │ map fields ║ -+ // ╚═══════╧════════════════════════════╝ -+ EmitUnpopulated bool -+ -+ // Resolver is used for looking up types when expanding google.protobuf.Any -+ // messages. If nil, this defaults to using protoregistry.GlobalTypes. -+ Resolver interface { -+ protoregistry.ExtensionTypeResolver -+ protoregistry.MessageTypeResolver -+ } -+} -+ -+// Format formats the message as a string. -+// This method is only intended for human consumption and ignores errors. -+// Do not depend on the output being stable. It may change over time across -+// different versions of the program. -+func (o MarshalOptions) Format(m proto.Message) string { -+ if m == nil || !m.ProtoReflect().IsValid() { -+ return "" // invalid syntax, but okay since this is for debugging -+ } -+ o.AllowPartial = true -+ b, _ := o.Marshal(m) -+ return string(b) -+} -+ -+// Marshal marshals the given proto.Message in the JSON format using options in -+// MarshalOptions. Do not depend on the output being stable. It may change over -+// time across different versions of the program. -+func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { -+ return o.marshal(m) -+} -+ -+// marshal is a centralized function that all marshal operations go through. -+// For profiling purposes, avoid changing the name of this function or -+// introducing other code paths for marshal that do not go through this. -+func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { -+ if o.Multiline && o.Indent == "" { -+ o.Indent = defaultIndent -+ } -+ if o.Resolver == nil { -+ o.Resolver = protoregistry.GlobalTypes -+ } -+ -+ internalEnc, err := json.NewEncoder(o.Indent) -+ if err != nil { -+ return nil, err -+ } -+ -+ // Treat nil message interface as an empty message, -+ // in which case the output in an empty JSON object. -+ if m == nil { -+ return []byte("{}"), nil -+ } -+ -+ enc := encoder{internalEnc, o} -+ if err := enc.marshalMessage(m.ProtoReflect(), ""); err != nil { -+ return nil, err -+ } -+ if o.AllowPartial { -+ return enc.Bytes(), nil -+ } -+ return enc.Bytes(), proto.CheckInitialized(m) -+} -+ -+type encoder struct { -+ *json.Encoder -+ opts MarshalOptions -+} -+ -+// typeFieldDesc is a synthetic field descriptor used for the "@type" field. -+var typeFieldDesc = func() protoreflect.FieldDescriptor { -+ var fd filedesc.Field -+ fd.L0.FullName = "@type" -+ fd.L0.Index = -1 -+ fd.L1.Cardinality = protoreflect.Optional -+ fd.L1.Kind = protoreflect.StringKind -+ return &fd -+}() -+ -+// typeURLFieldRanger wraps a protoreflect.Message and modifies its Range method -+// to additionally iterate over a synthetic field for the type URL. -+type typeURLFieldRanger struct { -+ order.FieldRanger -+ typeURL string -+} -+ -+func (m typeURLFieldRanger) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { -+ if !f(typeFieldDesc, protoreflect.ValueOfString(m.typeURL)) { -+ return -+ } -+ m.FieldRanger.Range(f) -+} -+ -+// unpopulatedFieldRanger wraps a protoreflect.Message and modifies its Range -+// method to additionally iterate over unpopulated fields. -+type unpopulatedFieldRanger struct{ protoreflect.Message } -+ -+func (m unpopulatedFieldRanger) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { -+ fds := m.Descriptor().Fields() -+ for i := 0; i < fds.Len(); i++ { -+ fd := fds.Get(i) -+ if m.Has(fd) || fd.ContainingOneof() != nil { -+ continue // ignore populated fields and fields within a oneofs -+ } -+ -+ v := m.Get(fd) -+ isProto2Scalar := fd.Syntax() == protoreflect.Proto2 && fd.Default().IsValid() -+ isSingularMessage := fd.Cardinality() != protoreflect.Repeated && fd.Message() != nil -+ if isProto2Scalar || isSingularMessage { -+ v = protoreflect.Value{} // use invalid value to emit null -+ } -+ if !f(fd, v) { -+ return -+ } -+ } -+ m.Message.Range(f) -+} -+ -+// marshalMessage marshals the fields in the given protoreflect.Message. -+// If the typeURL is non-empty, then a synthetic "@type" field is injected -+// containing the URL as the value. -+func (e encoder) marshalMessage(m protoreflect.Message, typeURL string) error { -+ if !flags.ProtoLegacy && messageset.IsMessageSet(m.Descriptor()) { -+ return errors.New("no support for proto1 MessageSets") -+ } -+ -+ if marshal := wellKnownTypeMarshaler(m.Descriptor().FullName()); marshal != nil { -+ return marshal(e, m) -+ } -+ -+ e.StartObject() -+ defer e.EndObject() -+ -+ var fields order.FieldRanger = m -+ if e.opts.EmitUnpopulated { -+ fields = unpopulatedFieldRanger{m} -+ } -+ if typeURL != "" { -+ fields = typeURLFieldRanger{fields, typeURL} -+ } -+ -+ var err error -+ order.RangeFields(fields, order.IndexNameFieldOrder, func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { -+ name := fd.JSONName() -+ if e.opts.UseProtoNames { -+ name = fd.TextName() -+ } -+ -+ if err = e.WriteName(name); err != nil { -+ return false -+ } -+ if err = e.marshalValue(v, fd); err != nil { -+ return false -+ } -+ return true -+ }) -+ return err -+} -+ -+// marshalValue marshals the given protoreflect.Value. -+func (e encoder) marshalValue(val protoreflect.Value, fd protoreflect.FieldDescriptor) error { -+ switch { -+ case fd.IsList(): -+ return e.marshalList(val.List(), fd) -+ case fd.IsMap(): -+ return e.marshalMap(val.Map(), fd) -+ default: -+ return e.marshalSingular(val, fd) -+ } -+} -+ -+// marshalSingular marshals the given non-repeated field value. This includes -+// all scalar types, enums, messages, and groups. -+func (e encoder) marshalSingular(val protoreflect.Value, fd protoreflect.FieldDescriptor) error { -+ if !val.IsValid() { -+ e.WriteNull() -+ return nil -+ } -+ -+ switch kind := fd.Kind(); kind { -+ case protoreflect.BoolKind: -+ e.WriteBool(val.Bool()) -+ -+ case protoreflect.StringKind: -+ if e.WriteString(val.String()) != nil { -+ return errors.InvalidUTF8(string(fd.FullName())) -+ } -+ -+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: -+ e.WriteInt(val.Int()) -+ -+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: -+ e.WriteUint(val.Uint()) -+ -+ case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Uint64Kind, -+ protoreflect.Sfixed64Kind, protoreflect.Fixed64Kind: -+ // 64-bit integers are written out as JSON string. -+ e.WriteString(val.String()) -+ -+ case protoreflect.FloatKind: -+ // Encoder.WriteFloat handles the special numbers NaN and infinites. -+ e.WriteFloat(val.Float(), 32) -+ -+ case protoreflect.DoubleKind: -+ // Encoder.WriteFloat handles the special numbers NaN and infinites. -+ e.WriteFloat(val.Float(), 64) -+ -+ case protoreflect.BytesKind: -+ e.WriteString(base64.StdEncoding.EncodeToString(val.Bytes())) -+ -+ case protoreflect.EnumKind: -+ if fd.Enum().FullName() == genid.NullValue_enum_fullname { -+ e.WriteNull() -+ } else { -+ desc := fd.Enum().Values().ByNumber(val.Enum()) -+ if e.opts.UseEnumNumbers || desc == nil { -+ e.WriteInt(int64(val.Enum())) -+ } else { -+ e.WriteString(string(desc.Name())) -+ } -+ } -+ -+ case protoreflect.MessageKind, protoreflect.GroupKind: -+ if err := e.marshalMessage(val.Message(), ""); err != nil { -+ return err -+ } -+ -+ default: -+ panic(fmt.Sprintf("%v has unknown kind: %v", fd.FullName(), kind)) -+ } -+ return nil -+} -+ -+// marshalList marshals the given protoreflect.List. -+func (e encoder) marshalList(list protoreflect.List, fd protoreflect.FieldDescriptor) error { -+ e.StartArray() -+ defer e.EndArray() -+ -+ for i := 0; i < list.Len(); i++ { -+ item := list.Get(i) -+ if err := e.marshalSingular(item, fd); err != nil { -+ return err -+ } -+ } -+ return nil -+} -+ -+// marshalMap marshals given protoreflect.Map. -+func (e encoder) marshalMap(mmap protoreflect.Map, fd protoreflect.FieldDescriptor) error { -+ e.StartObject() -+ defer e.EndObject() -+ -+ var err error -+ order.RangeEntries(mmap, order.GenericKeyOrder, func(k protoreflect.MapKey, v protoreflect.Value) bool { -+ if err = e.WriteName(k.String()); err != nil { -+ return false -+ } -+ if err = e.marshalSingular(v, fd.MapValue()); err != nil { -+ return false -+ } -+ return true -+ }) -+ return err -+} -diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go -new file mode 100644 -index 0000000..6c37d41 ---- /dev/null -+++ b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go -@@ -0,0 +1,895 @@ -+// Copyright 2019 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+package protojson -+ -+import ( -+ "bytes" -+ "fmt" -+ "math" -+ "strconv" -+ "strings" -+ "time" -+ -+ "google.golang.org/protobuf/internal/encoding/json" -+ "google.golang.org/protobuf/internal/errors" -+ "google.golang.org/protobuf/internal/genid" -+ "google.golang.org/protobuf/internal/strs" -+ "google.golang.org/protobuf/proto" -+ "google.golang.org/protobuf/reflect/protoreflect" -+) -+ -+type marshalFunc func(encoder, protoreflect.Message) error -+ -+// wellKnownTypeMarshaler returns a marshal function if the message type -+// has specialized serialization behavior. It returns nil otherwise. -+func wellKnownTypeMarshaler(name protoreflect.FullName) marshalFunc { -+ if name.Parent() == genid.GoogleProtobuf_package { -+ switch name.Name() { -+ case genid.Any_message_name: -+ return encoder.marshalAny -+ case genid.Timestamp_message_name: -+ return encoder.marshalTimestamp -+ case genid.Duration_message_name: -+ return encoder.marshalDuration -+ case genid.BoolValue_message_name, -+ genid.Int32Value_message_name, -+ genid.Int64Value_message_name, -+ genid.UInt32Value_message_name, -+ genid.UInt64Value_message_name, -+ genid.FloatValue_message_name, -+ genid.DoubleValue_message_name, -+ genid.StringValue_message_name, -+ genid.BytesValue_message_name: -+ return encoder.marshalWrapperType -+ case genid.Struct_message_name: -+ return encoder.marshalStruct -+ case genid.ListValue_message_name: -+ return encoder.marshalListValue -+ case genid.Value_message_name: -+ return encoder.marshalKnownValue -+ case genid.FieldMask_message_name: -+ return encoder.marshalFieldMask -+ case genid.Empty_message_name: -+ return encoder.marshalEmpty -+ } -+ } -+ return nil -+} -+ -+type unmarshalFunc func(decoder, protoreflect.Message) error -+ -+// wellKnownTypeUnmarshaler returns a unmarshal function if the message type -+// has specialized serialization behavior. It returns nil otherwise. -+func wellKnownTypeUnmarshaler(name protoreflect.FullName) unmarshalFunc { -+ if name.Parent() == genid.GoogleProtobuf_package { -+ switch name.Name() { -+ case genid.Any_message_name: -+ return decoder.unmarshalAny -+ case genid.Timestamp_message_name: -+ return decoder.unmarshalTimestamp -+ case genid.Duration_message_name: -+ return decoder.unmarshalDuration -+ case genid.BoolValue_message_name, -+ genid.Int32Value_message_name, -+ genid.Int64Value_message_name, -+ genid.UInt32Value_message_name, -+ genid.UInt64Value_message_name, -+ genid.FloatValue_message_name, -+ genid.DoubleValue_message_name, -+ genid.StringValue_message_name, -+ genid.BytesValue_message_name: -+ return decoder.unmarshalWrapperType -+ case genid.Struct_message_name: -+ return decoder.unmarshalStruct -+ case genid.ListValue_message_name: -+ return decoder.unmarshalListValue -+ case genid.Value_message_name: -+ return decoder.unmarshalKnownValue -+ case genid.FieldMask_message_name: -+ return decoder.unmarshalFieldMask -+ case genid.Empty_message_name: -+ return decoder.unmarshalEmpty -+ } -+ } -+ return nil -+} -+ -+// The JSON representation of an Any message uses the regular representation of -+// the deserialized, embedded message, with an additional field `@type` which -+// contains the type URL. If the embedded message type is well-known and has a -+// custom JSON representation, that representation will be embedded adding a -+// field `value` which holds the custom JSON in addition to the `@type` field. -+ -+func (e encoder) marshalAny(m protoreflect.Message) error { -+ fds := m.Descriptor().Fields() -+ fdType := fds.ByNumber(genid.Any_TypeUrl_field_number) -+ fdValue := fds.ByNumber(genid.Any_Value_field_number) -+ -+ if !m.Has(fdType) { -+ if !m.Has(fdValue) { -+ // If message is empty, marshal out empty JSON object. -+ e.StartObject() -+ e.EndObject() -+ return nil -+ } else { -+ // Return error if type_url field is not set, but value is set. -+ return errors.New("%s: %v is not set", genid.Any_message_fullname, genid.Any_TypeUrl_field_name) -+ } -+ } -+ -+ typeVal := m.Get(fdType) -+ valueVal := m.Get(fdValue) -+ -+ // Resolve the type in order to unmarshal value field. -+ typeURL := typeVal.String() -+ emt, err := e.opts.Resolver.FindMessageByURL(typeURL) -+ if err != nil { -+ return errors.New("%s: unable to resolve %q: %v", genid.Any_message_fullname, typeURL, err) -+ } -+ -+ em := emt.New() -+ err = proto.UnmarshalOptions{ -+ AllowPartial: true, // never check required fields inside an Any -+ Resolver: e.opts.Resolver, -+ }.Unmarshal(valueVal.Bytes(), em.Interface()) -+ if err != nil { -+ return errors.New("%s: unable to unmarshal %q: %v", genid.Any_message_fullname, typeURL, err) -+ } -+ -+ // If type of value has custom JSON encoding, marshal out a field "value" -+ // with corresponding custom JSON encoding of the embedded message as a -+ // field. -+ if marshal := wellKnownTypeMarshaler(emt.Descriptor().FullName()); marshal != nil { -+ e.StartObject() -+ defer e.EndObject() -+ -+ // Marshal out @type field. -+ e.WriteName("@type") -+ if err := e.WriteString(typeURL); err != nil { -+ return err -+ } -+ -+ e.WriteName("value") -+ return marshal(e, em) -+ } -+ -+ // Else, marshal out the embedded message's fields in this Any object. -+ if err := e.marshalMessage(em, typeURL); err != nil { -+ return err -+ } -+ -+ return nil -+} -+ -+func (d decoder) unmarshalAny(m protoreflect.Message) error { -+ // Peek to check for json.ObjectOpen to avoid advancing a read. -+ start, err := d.Peek() -+ if err != nil { -+ return err -+ } -+ if start.Kind() != json.ObjectOpen { -+ return d.unexpectedTokenError(start) -+ } -+ -+ // Use another decoder to parse the unread bytes for @type field. This -+ // avoids advancing a read from current decoder because the current JSON -+ // object may contain the fields of the embedded type. -+ dec := decoder{d.Clone(), UnmarshalOptions{}} -+ tok, err := findTypeURL(dec) -+ switch err { -+ case errEmptyObject: -+ // An empty JSON object translates to an empty Any message. -+ d.Read() // Read json.ObjectOpen. -+ d.Read() // Read json.ObjectClose. -+ return nil -+ -+ case errMissingType: -+ if d.opts.DiscardUnknown { -+ // Treat all fields as unknowns, similar to an empty object. -+ return d.skipJSONValue() -+ } -+ // Use start.Pos() for line position. -+ return d.newError(start.Pos(), err.Error()) -+ -+ default: -+ if err != nil { -+ return err -+ } -+ } -+ -+ typeURL := tok.ParsedString() -+ emt, err := d.opts.Resolver.FindMessageByURL(typeURL) -+ if err != nil { -+ return d.newError(tok.Pos(), "unable to resolve %v: %q", tok.RawString(), err) -+ } -+ -+ // Create new message for the embedded message type and unmarshal into it. -+ em := emt.New() -+ if unmarshal := wellKnownTypeUnmarshaler(emt.Descriptor().FullName()); unmarshal != nil { -+ // If embedded message is a custom type, -+ // unmarshal the JSON "value" field into it. -+ if err := d.unmarshalAnyValue(unmarshal, em); err != nil { -+ return err -+ } -+ } else { -+ // Else unmarshal the current JSON object into it. -+ if err := d.unmarshalMessage(em, true); err != nil { -+ return err -+ } -+ } -+ // Serialize the embedded message and assign the resulting bytes to the -+ // proto value field. -+ b, err := proto.MarshalOptions{ -+ AllowPartial: true, // No need to check required fields inside an Any. -+ Deterministic: true, -+ }.Marshal(em.Interface()) -+ if err != nil { -+ return d.newError(start.Pos(), "error in marshaling Any.value field: %v", err) -+ } -+ -+ fds := m.Descriptor().Fields() -+ fdType := fds.ByNumber(genid.Any_TypeUrl_field_number) -+ fdValue := fds.ByNumber(genid.Any_Value_field_number) -+ -+ m.Set(fdType, protoreflect.ValueOfString(typeURL)) -+ m.Set(fdValue, protoreflect.ValueOfBytes(b)) -+ return nil -+} -+ -+var errEmptyObject = fmt.Errorf(`empty object`) -+var errMissingType = fmt.Errorf(`missing "@type" field`) -+ -+// findTypeURL returns the token for the "@type" field value from the given -+// JSON bytes. It is expected that the given bytes start with json.ObjectOpen. -+// It returns errEmptyObject if the JSON object is empty or errMissingType if -+// @type field does not exist. It returns other error if the @type field is not -+// valid or other decoding issues. -+func findTypeURL(d decoder) (json.Token, error) { -+ var typeURL string -+ var typeTok json.Token -+ numFields := 0 -+ // Skip start object. -+ d.Read() -+ -+Loop: -+ for { -+ tok, err := d.Read() -+ if err != nil { -+ return json.Token{}, err -+ } -+ -+ switch tok.Kind() { -+ case json.ObjectClose: -+ if typeURL == "" { -+ // Did not find @type field. -+ if numFields > 0 { -+ return json.Token{}, errMissingType -+ } -+ return json.Token{}, errEmptyObject -+ } -+ break Loop -+ -+ case json.Name: -+ numFields++ -+ if tok.Name() != "@type" { -+ // Skip value. -+ if err := d.skipJSONValue(); err != nil { -+ return json.Token{}, err -+ } -+ continue -+ } -+ -+ // Return error if this was previously set already. -+ if typeURL != "" { -+ return json.Token{}, d.newError(tok.Pos(), `duplicate "@type" field`) -+ } -+ // Read field value. -+ tok, err := d.Read() -+ if err != nil { -+ return json.Token{}, err -+ } -+ if tok.Kind() != json.String { -+ return json.Token{}, d.newError(tok.Pos(), `@type field value is not a string: %v`, tok.RawString()) -+ } -+ typeURL = tok.ParsedString() -+ if typeURL == "" { -+ return json.Token{}, d.newError(tok.Pos(), `@type field contains empty value`) -+ } -+ typeTok = tok -+ } -+ } -+ -+ return typeTok, nil -+} -+ -+// skipJSONValue parses a JSON value (null, boolean, string, number, object and -+// array) in order to advance the read to the next JSON value. It relies on -+// the decoder returning an error if the types are not in valid sequence. -+func (d decoder) skipJSONValue() error { -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ // Only need to continue reading for objects and arrays. -+ switch tok.Kind() { -+ case json.ObjectOpen: -+ for { -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ switch tok.Kind() { -+ case json.ObjectClose: -+ return nil -+ case json.Name: -+ // Skip object field value. -+ if err := d.skipJSONValue(); err != nil { -+ return err -+ } -+ } -+ } -+ -+ case json.ArrayOpen: -+ for { -+ tok, err := d.Peek() -+ if err != nil { -+ return err -+ } -+ switch tok.Kind() { -+ case json.ArrayClose: -+ d.Read() -+ return nil -+ default: -+ // Skip array item. -+ if err := d.skipJSONValue(); err != nil { -+ return err -+ } -+ } -+ } -+ } -+ return nil -+} -+ -+// unmarshalAnyValue unmarshals the given custom-type message from the JSON -+// object's "value" field. -+func (d decoder) unmarshalAnyValue(unmarshal unmarshalFunc, m protoreflect.Message) error { -+ // Skip ObjectOpen, and start reading the fields. -+ d.Read() -+ -+ var found bool // Used for detecting duplicate "value". -+ for { -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ switch tok.Kind() { -+ case json.ObjectClose: -+ if !found { -+ return d.newError(tok.Pos(), `missing "value" field`) -+ } -+ return nil -+ -+ case json.Name: -+ switch tok.Name() { -+ case "@type": -+ // Skip the value as this was previously parsed already. -+ d.Read() -+ -+ case "value": -+ if found { -+ return d.newError(tok.Pos(), `duplicate "value" field`) -+ } -+ // Unmarshal the field value into the given message. -+ if err := unmarshal(d, m); err != nil { -+ return err -+ } -+ found = true -+ -+ default: -+ if d.opts.DiscardUnknown { -+ if err := d.skipJSONValue(); err != nil { -+ return err -+ } -+ continue -+ } -+ return d.newError(tok.Pos(), "unknown field %v", tok.RawString()) -+ } -+ } -+ } -+} -+ -+// Wrapper types are encoded as JSON primitives like string, number or boolean. -+ -+func (e encoder) marshalWrapperType(m protoreflect.Message) error { -+ fd := m.Descriptor().Fields().ByNumber(genid.WrapperValue_Value_field_number) -+ val := m.Get(fd) -+ return e.marshalSingular(val, fd) -+} -+ -+func (d decoder) unmarshalWrapperType(m protoreflect.Message) error { -+ fd := m.Descriptor().Fields().ByNumber(genid.WrapperValue_Value_field_number) -+ val, err := d.unmarshalScalar(fd) -+ if err != nil { -+ return err -+ } -+ m.Set(fd, val) -+ return nil -+} -+ -+// The JSON representation for Empty is an empty JSON object. -+ -+func (e encoder) marshalEmpty(protoreflect.Message) error { -+ e.StartObject() -+ e.EndObject() -+ return nil -+} -+ -+func (d decoder) unmarshalEmpty(protoreflect.Message) error { -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ if tok.Kind() != json.ObjectOpen { -+ return d.unexpectedTokenError(tok) -+ } -+ -+ for { -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ switch tok.Kind() { -+ case json.ObjectClose: -+ return nil -+ -+ case json.Name: -+ if d.opts.DiscardUnknown { -+ if err := d.skipJSONValue(); err != nil { -+ return err -+ } -+ continue -+ } -+ return d.newError(tok.Pos(), "unknown field %v", tok.RawString()) -+ -+ default: -+ return d.unexpectedTokenError(tok) -+ } -+ } -+} -+ -+// The JSON representation for Struct is a JSON object that contains the encoded -+// Struct.fields map and follows the serialization rules for a map. -+ -+func (e encoder) marshalStruct(m protoreflect.Message) error { -+ fd := m.Descriptor().Fields().ByNumber(genid.Struct_Fields_field_number) -+ return e.marshalMap(m.Get(fd).Map(), fd) -+} -+ -+func (d decoder) unmarshalStruct(m protoreflect.Message) error { -+ fd := m.Descriptor().Fields().ByNumber(genid.Struct_Fields_field_number) -+ return d.unmarshalMap(m.Mutable(fd).Map(), fd) -+} -+ -+// The JSON representation for ListValue is JSON array that contains the encoded -+// ListValue.values repeated field and follows the serialization rules for a -+// repeated field. -+ -+func (e encoder) marshalListValue(m protoreflect.Message) error { -+ fd := m.Descriptor().Fields().ByNumber(genid.ListValue_Values_field_number) -+ return e.marshalList(m.Get(fd).List(), fd) -+} -+ -+func (d decoder) unmarshalListValue(m protoreflect.Message) error { -+ fd := m.Descriptor().Fields().ByNumber(genid.ListValue_Values_field_number) -+ return d.unmarshalList(m.Mutable(fd).List(), fd) -+} -+ -+// The JSON representation for a Value is dependent on the oneof field that is -+// set. Each of the field in the oneof has its own custom serialization rule. A -+// Value message needs to be a oneof field set, else it is an error. -+ -+func (e encoder) marshalKnownValue(m protoreflect.Message) error { -+ od := m.Descriptor().Oneofs().ByName(genid.Value_Kind_oneof_name) -+ fd := m.WhichOneof(od) -+ if fd == nil { -+ return errors.New("%s: none of the oneof fields is set", genid.Value_message_fullname) -+ } -+ if fd.Number() == genid.Value_NumberValue_field_number { -+ if v := m.Get(fd).Float(); math.IsNaN(v) || math.IsInf(v, 0) { -+ return errors.New("%s: invalid %v value", genid.Value_NumberValue_field_fullname, v) -+ } -+ } -+ return e.marshalSingular(m.Get(fd), fd) -+} -+ -+func (d decoder) unmarshalKnownValue(m protoreflect.Message) error { -+ tok, err := d.Peek() -+ if err != nil { -+ return err -+ } -+ -+ var fd protoreflect.FieldDescriptor -+ var val protoreflect.Value -+ switch tok.Kind() { -+ case json.Null: -+ d.Read() -+ fd = m.Descriptor().Fields().ByNumber(genid.Value_NullValue_field_number) -+ val = protoreflect.ValueOfEnum(0) -+ -+ case json.Bool: -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ fd = m.Descriptor().Fields().ByNumber(genid.Value_BoolValue_field_number) -+ val = protoreflect.ValueOfBool(tok.Bool()) -+ -+ case json.Number: -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ fd = m.Descriptor().Fields().ByNumber(genid.Value_NumberValue_field_number) -+ var ok bool -+ val, ok = unmarshalFloat(tok, 64) -+ if !ok { -+ return d.newError(tok.Pos(), "invalid %v: %v", genid.Value_message_fullname, tok.RawString()) -+ } -+ -+ case json.String: -+ // A JSON string may have been encoded from the number_value field, -+ // e.g. "NaN", "Infinity", etc. Parsing a proto double type also allows -+ // for it to be in JSON string form. Given this custom encoding spec, -+ // however, there is no way to identify that and hence a JSON string is -+ // always assigned to the string_value field, which means that certain -+ // encoding cannot be parsed back to the same field. -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ fd = m.Descriptor().Fields().ByNumber(genid.Value_StringValue_field_number) -+ val = protoreflect.ValueOfString(tok.ParsedString()) -+ -+ case json.ObjectOpen: -+ fd = m.Descriptor().Fields().ByNumber(genid.Value_StructValue_field_number) -+ val = m.NewField(fd) -+ if err := d.unmarshalStruct(val.Message()); err != nil { -+ return err -+ } -+ -+ case json.ArrayOpen: -+ fd = m.Descriptor().Fields().ByNumber(genid.Value_ListValue_field_number) -+ val = m.NewField(fd) -+ if err := d.unmarshalListValue(val.Message()); err != nil { -+ return err -+ } -+ -+ default: -+ return d.newError(tok.Pos(), "invalid %v: %v", genid.Value_message_fullname, tok.RawString()) -+ } -+ -+ m.Set(fd, val) -+ return nil -+} -+ -+// The JSON representation for a Duration is a JSON string that ends in the -+// suffix "s" (indicating seconds) and is preceded by the number of seconds, -+// with nanoseconds expressed as fractional seconds. -+// -+// Durations less than one second are represented with a 0 seconds field and a -+// positive or negative nanos field. For durations of one second or more, a -+// non-zero value for the nanos field must be of the same sign as the seconds -+// field. -+// -+// Duration.seconds must be from -315,576,000,000 to +315,576,000,000 inclusive. -+// Duration.nanos must be from -999,999,999 to +999,999,999 inclusive. -+ -+const ( -+ secondsInNanos = 999999999 -+ maxSecondsInDuration = 315576000000 -+) -+ -+func (e encoder) marshalDuration(m protoreflect.Message) error { -+ fds := m.Descriptor().Fields() -+ fdSeconds := fds.ByNumber(genid.Duration_Seconds_field_number) -+ fdNanos := fds.ByNumber(genid.Duration_Nanos_field_number) -+ -+ secsVal := m.Get(fdSeconds) -+ nanosVal := m.Get(fdNanos) -+ secs := secsVal.Int() -+ nanos := nanosVal.Int() -+ if secs < -maxSecondsInDuration || secs > maxSecondsInDuration { -+ return errors.New("%s: seconds out of range %v", genid.Duration_message_fullname, secs) -+ } -+ if nanos < -secondsInNanos || nanos > secondsInNanos { -+ return errors.New("%s: nanos out of range %v", genid.Duration_message_fullname, nanos) -+ } -+ if (secs > 0 && nanos < 0) || (secs < 0 && nanos > 0) { -+ return errors.New("%s: signs of seconds and nanos do not match", genid.Duration_message_fullname) -+ } -+ // Generated output always contains 0, 3, 6, or 9 fractional digits, -+ // depending on required precision, followed by the suffix "s". -+ var sign string -+ if secs < 0 || nanos < 0 { -+ sign, secs, nanos = "-", -1*secs, -1*nanos -+ } -+ x := fmt.Sprintf("%s%d.%09d", sign, secs, nanos) -+ x = strings.TrimSuffix(x, "000") -+ x = strings.TrimSuffix(x, "000") -+ x = strings.TrimSuffix(x, ".000") -+ e.WriteString(x + "s") -+ return nil -+} -+ -+func (d decoder) unmarshalDuration(m protoreflect.Message) error { -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ if tok.Kind() != json.String { -+ return d.unexpectedTokenError(tok) -+ } -+ -+ secs, nanos, ok := parseDuration(tok.ParsedString()) -+ if !ok { -+ return d.newError(tok.Pos(), "invalid %v value %v", genid.Duration_message_fullname, tok.RawString()) -+ } -+ // Validate seconds. No need to validate nanos because parseDuration would -+ // have covered that already. -+ if secs < -maxSecondsInDuration || secs > maxSecondsInDuration { -+ return d.newError(tok.Pos(), "%v value out of range: %v", genid.Duration_message_fullname, tok.RawString()) -+ } -+ -+ fds := m.Descriptor().Fields() -+ fdSeconds := fds.ByNumber(genid.Duration_Seconds_field_number) -+ fdNanos := fds.ByNumber(genid.Duration_Nanos_field_number) -+ -+ m.Set(fdSeconds, protoreflect.ValueOfInt64(secs)) -+ m.Set(fdNanos, protoreflect.ValueOfInt32(nanos)) -+ return nil -+} -+ -+// parseDuration parses the given input string for seconds and nanoseconds value -+// for the Duration JSON format. The format is a decimal number with a suffix -+// 's'. It can have optional plus/minus sign. There needs to be at least an -+// integer or fractional part. Fractional part is limited to 9 digits only for -+// nanoseconds precision, regardless of whether there are trailing zero digits. -+// Example values are 1s, 0.1s, 1.s, .1s, +1s, -1s, -.1s. -+func parseDuration(input string) (int64, int32, bool) { -+ b := []byte(input) -+ size := len(b) -+ if size < 2 { -+ return 0, 0, false -+ } -+ if b[size-1] != 's' { -+ return 0, 0, false -+ } -+ b = b[:size-1] -+ -+ // Read optional plus/minus symbol. -+ var neg bool -+ switch b[0] { -+ case '-': -+ neg = true -+ b = b[1:] -+ case '+': -+ b = b[1:] -+ } -+ if len(b) == 0 { -+ return 0, 0, false -+ } -+ -+ // Read the integer part. -+ var intp []byte -+ switch { -+ case b[0] == '0': -+ b = b[1:] -+ -+ case '1' <= b[0] && b[0] <= '9': -+ intp = b[0:] -+ b = b[1:] -+ n := 1 -+ for len(b) > 0 && '0' <= b[0] && b[0] <= '9' { -+ n++ -+ b = b[1:] -+ } -+ intp = intp[:n] -+ -+ case b[0] == '.': -+ // Continue below. -+ -+ default: -+ return 0, 0, false -+ } -+ -+ hasFrac := false -+ var frac [9]byte -+ if len(b) > 0 { -+ if b[0] != '.' { -+ return 0, 0, false -+ } -+ // Read the fractional part. -+ b = b[1:] -+ n := 0 -+ for len(b) > 0 && n < 9 && '0' <= b[0] && b[0] <= '9' { -+ frac[n] = b[0] -+ n++ -+ b = b[1:] -+ } -+ // It is not valid if there are more bytes left. -+ if len(b) > 0 { -+ return 0, 0, false -+ } -+ // Pad fractional part with 0s. -+ for i := n; i < 9; i++ { -+ frac[i] = '0' -+ } -+ hasFrac = true -+ } -+ -+ var secs int64 -+ if len(intp) > 0 { -+ var err error -+ secs, err = strconv.ParseInt(string(intp), 10, 64) -+ if err != nil { -+ return 0, 0, false -+ } -+ } -+ -+ var nanos int64 -+ if hasFrac { -+ nanob := bytes.TrimLeft(frac[:], "0") -+ if len(nanob) > 0 { -+ var err error -+ nanos, err = strconv.ParseInt(string(nanob), 10, 32) -+ if err != nil { -+ return 0, 0, false -+ } -+ } -+ } -+ -+ if neg { -+ if secs > 0 { -+ secs = -secs -+ } -+ if nanos > 0 { -+ nanos = -nanos -+ } -+ } -+ return secs, int32(nanos), true -+} -+ -+// The JSON representation for a Timestamp is a JSON string in the RFC 3339 -+// format, i.e. "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" where -+// {year} is always expressed using four digits while {month}, {day}, {hour}, -+// {min}, and {sec} are zero-padded to two digits each. The fractional seconds, -+// which can go up to 9 digits, up to 1 nanosecond resolution, is optional. The -+// "Z" suffix indicates the timezone ("UTC"); the timezone is required. Encoding -+// should always use UTC (as indicated by "Z") and a decoder should be able to -+// accept both UTC and other timezones (as indicated by an offset). -+// -+// Timestamp.seconds must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z -+// inclusive. -+// Timestamp.nanos must be from 0 to 999,999,999 inclusive. -+ -+const ( -+ maxTimestampSeconds = 253402300799 -+ minTimestampSeconds = -62135596800 -+) -+ -+func (e encoder) marshalTimestamp(m protoreflect.Message) error { -+ fds := m.Descriptor().Fields() -+ fdSeconds := fds.ByNumber(genid.Timestamp_Seconds_field_number) -+ fdNanos := fds.ByNumber(genid.Timestamp_Nanos_field_number) -+ -+ secsVal := m.Get(fdSeconds) -+ nanosVal := m.Get(fdNanos) -+ secs := secsVal.Int() -+ nanos := nanosVal.Int() -+ if secs < minTimestampSeconds || secs > maxTimestampSeconds { -+ return errors.New("%s: seconds out of range %v", genid.Timestamp_message_fullname, secs) -+ } -+ if nanos < 0 || nanos > secondsInNanos { -+ return errors.New("%s: nanos out of range %v", genid.Timestamp_message_fullname, nanos) -+ } -+ // Uses RFC 3339, where generated output will be Z-normalized and uses 0, 3, -+ // 6 or 9 fractional digits. -+ t := time.Unix(secs, nanos).UTC() -+ x := t.Format("2006-01-02T15:04:05.000000000") -+ x = strings.TrimSuffix(x, "000") -+ x = strings.TrimSuffix(x, "000") -+ x = strings.TrimSuffix(x, ".000") -+ e.WriteString(x + "Z") -+ return nil -+} -+ -+func (d decoder) unmarshalTimestamp(m protoreflect.Message) error { -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ if tok.Kind() != json.String { -+ return d.unexpectedTokenError(tok) -+ } -+ -+ s := tok.ParsedString() -+ t, err := time.Parse(time.RFC3339Nano, s) -+ if err != nil { -+ return d.newError(tok.Pos(), "invalid %v value %v", genid.Timestamp_message_fullname, tok.RawString()) -+ } -+ // Validate seconds. -+ secs := t.Unix() -+ if secs < minTimestampSeconds || secs > maxTimestampSeconds { -+ return d.newError(tok.Pos(), "%v value out of range: %v", genid.Timestamp_message_fullname, tok.RawString()) -+ } -+ // Validate subseconds. -+ i := strings.LastIndexByte(s, '.') // start of subsecond field -+ j := strings.LastIndexAny(s, "Z-+") // start of timezone field -+ if i >= 0 && j >= i && j-i > len(".999999999") { -+ return d.newError(tok.Pos(), "invalid %v value %v", genid.Timestamp_message_fullname, tok.RawString()) -+ } -+ -+ fds := m.Descriptor().Fields() -+ fdSeconds := fds.ByNumber(genid.Timestamp_Seconds_field_number) -+ fdNanos := fds.ByNumber(genid.Timestamp_Nanos_field_number) -+ -+ m.Set(fdSeconds, protoreflect.ValueOfInt64(secs)) -+ m.Set(fdNanos, protoreflect.ValueOfInt32(int32(t.Nanosecond()))) -+ return nil -+} -+ -+// The JSON representation for a FieldMask is a JSON string where paths are -+// separated by a comma. Fields name in each path are converted to/from -+// lower-camel naming conventions. Encoding should fail if the path name would -+// end up differently after a round-trip. -+ -+func (e encoder) marshalFieldMask(m protoreflect.Message) error { -+ fd := m.Descriptor().Fields().ByNumber(genid.FieldMask_Paths_field_number) -+ list := m.Get(fd).List() -+ paths := make([]string, 0, list.Len()) -+ -+ for i := 0; i < list.Len(); i++ { -+ s := list.Get(i).String() -+ if !protoreflect.FullName(s).IsValid() { -+ return errors.New("%s contains invalid path: %q", genid.FieldMask_Paths_field_fullname, s) -+ } -+ // Return error if conversion to camelCase is not reversible. -+ cc := strs.JSONCamelCase(s) -+ if s != strs.JSONSnakeCase(cc) { -+ return errors.New("%s contains irreversible value %q", genid.FieldMask_Paths_field_fullname, s) -+ } -+ paths = append(paths, cc) -+ } -+ -+ e.WriteString(strings.Join(paths, ",")) -+ return nil -+} -+ -+func (d decoder) unmarshalFieldMask(m protoreflect.Message) error { -+ tok, err := d.Read() -+ if err != nil { -+ return err -+ } -+ if tok.Kind() != json.String { -+ return d.unexpectedTokenError(tok) -+ } -+ str := strings.TrimSpace(tok.ParsedString()) -+ if str == "" { -+ return nil -+ } -+ paths := strings.Split(str, ",") -+ -+ fd := m.Descriptor().Fields().ByNumber(genid.FieldMask_Paths_field_number) -+ list := m.Mutable(fd).List() -+ -+ for _, s0 := range paths { -+ s := strs.JSONSnakeCase(s0) -+ if strings.Contains(s0, "_") || !protoreflect.FullName(s).IsValid() { -+ return d.newError(tok.Pos(), "%v contains invalid path: %q", genid.FieldMask_Paths_field_fullname, s0) -+ } -+ list.Append(protoreflect.ValueOfString(s)) -+ } -+ return nil -+} -diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go -index 179d6e8..4921b2d 100644 ---- a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go -+++ b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go -@@ -17,7 +17,7 @@ import ( - "google.golang.org/protobuf/internal/set" - "google.golang.org/protobuf/internal/strs" - "google.golang.org/protobuf/proto" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - ) - -@@ -103,7 +103,7 @@ func (d decoder) syntaxError(pos int, f string, x ...interface{}) error { - } - - // unmarshalMessage unmarshals into the given protoreflect.Message. --func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { -+func (d decoder) unmarshalMessage(m protoreflect.Message, checkDelims bool) error { - messageDesc := m.Descriptor() - if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) { - return errors.New("no support for proto1 MessageSets") -@@ -150,24 +150,24 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { - } - - // Resolve the field descriptor. -- var name pref.Name -- var fd pref.FieldDescriptor -- var xt pref.ExtensionType -+ var name protoreflect.Name -+ var fd protoreflect.FieldDescriptor -+ var xt protoreflect.ExtensionType - var xtErr error - var isFieldNumberName bool - - switch tok.NameKind() { - case text.IdentName: -- name = pref.Name(tok.IdentName()) -+ name = protoreflect.Name(tok.IdentName()) - fd = fieldDescs.ByTextName(string(name)) - - case text.TypeName: - // Handle extensions only. This code path is not for Any. -- xt, xtErr = d.opts.Resolver.FindExtensionByName(pref.FullName(tok.TypeName())) -+ xt, xtErr = d.opts.Resolver.FindExtensionByName(protoreflect.FullName(tok.TypeName())) - - case text.FieldNumber: - isFieldNumberName = true -- num := pref.FieldNumber(tok.FieldNumber()) -+ num := protoreflect.FieldNumber(tok.FieldNumber()) - if !num.IsValid() { - return d.newError(tok.Pos(), "invalid field number: %d", num) - } -@@ -215,7 +215,7 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { - switch { - case fd.IsList(): - kind := fd.Kind() -- if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() { -+ if kind != protoreflect.MessageKind && kind != protoreflect.GroupKind && !tok.HasSeparator() { - return d.syntaxError(tok.Pos(), "missing field separator :") - } - -@@ -232,7 +232,7 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { - - default: - kind := fd.Kind() -- if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() { -+ if kind != protoreflect.MessageKind && kind != protoreflect.GroupKind && !tok.HasSeparator() { - return d.syntaxError(tok.Pos(), "missing field separator :") - } - -@@ -262,11 +262,11 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { - - // unmarshalSingular unmarshals a non-repeated field value specified by the - // given FieldDescriptor. --func (d decoder) unmarshalSingular(fd pref.FieldDescriptor, m pref.Message) error { -- var val pref.Value -+func (d decoder) unmarshalSingular(fd protoreflect.FieldDescriptor, m protoreflect.Message) error { -+ var val protoreflect.Value - var err error - switch fd.Kind() { -- case pref.MessageKind, pref.GroupKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind: - val = m.NewField(fd) - err = d.unmarshalMessage(val.Message(), true) - default: -@@ -280,94 +280,94 @@ func (d decoder) unmarshalSingular(fd pref.FieldDescriptor, m pref.Message) erro - - // unmarshalScalar unmarshals a scalar/enum protoreflect.Value specified by the - // given FieldDescriptor. --func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) { -+func (d decoder) unmarshalScalar(fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { - tok, err := d.Read() - if err != nil { -- return pref.Value{}, err -+ return protoreflect.Value{}, err - } - - if tok.Kind() != text.Scalar { -- return pref.Value{}, d.unexpectedTokenError(tok) -+ return protoreflect.Value{}, d.unexpectedTokenError(tok) - } - - kind := fd.Kind() - switch kind { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - if b, ok := tok.Bool(); ok { -- return pref.ValueOfBool(b), nil -+ return protoreflect.ValueOfBool(b), nil - } - -- case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: -+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: - if n, ok := tok.Int32(); ok { -- return pref.ValueOfInt32(n), nil -+ return protoreflect.ValueOfInt32(n), nil - } - -- case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: -+ case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - if n, ok := tok.Int64(); ok { -- return pref.ValueOfInt64(n), nil -+ return protoreflect.ValueOfInt64(n), nil - } - -- case pref.Uint32Kind, pref.Fixed32Kind: -+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: - if n, ok := tok.Uint32(); ok { -- return pref.ValueOfUint32(n), nil -+ return protoreflect.ValueOfUint32(n), nil - } - -- case pref.Uint64Kind, pref.Fixed64Kind: -+ case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - if n, ok := tok.Uint64(); ok { -- return pref.ValueOfUint64(n), nil -+ return protoreflect.ValueOfUint64(n), nil - } - -- case pref.FloatKind: -+ case protoreflect.FloatKind: - if n, ok := tok.Float32(); ok { -- return pref.ValueOfFloat32(n), nil -+ return protoreflect.ValueOfFloat32(n), nil - } - -- case pref.DoubleKind: -+ case protoreflect.DoubleKind: - if n, ok := tok.Float64(); ok { -- return pref.ValueOfFloat64(n), nil -+ return protoreflect.ValueOfFloat64(n), nil - } - -- case pref.StringKind: -+ case protoreflect.StringKind: - if s, ok := tok.String(); ok { - if strs.EnforceUTF8(fd) && !utf8.ValidString(s) { -- return pref.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8") -+ return protoreflect.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8") - } -- return pref.ValueOfString(s), nil -+ return protoreflect.ValueOfString(s), nil - } - -- case pref.BytesKind: -+ case protoreflect.BytesKind: - if b, ok := tok.String(); ok { -- return pref.ValueOfBytes([]byte(b)), nil -+ return protoreflect.ValueOfBytes([]byte(b)), nil - } - -- case pref.EnumKind: -+ case protoreflect.EnumKind: - if lit, ok := tok.Enum(); ok { - // Lookup EnumNumber based on name. -- if enumVal := fd.Enum().Values().ByName(pref.Name(lit)); enumVal != nil { -- return pref.ValueOfEnum(enumVal.Number()), nil -+ if enumVal := fd.Enum().Values().ByName(protoreflect.Name(lit)); enumVal != nil { -+ return protoreflect.ValueOfEnum(enumVal.Number()), nil - } - } - if num, ok := tok.Int32(); ok { -- return pref.ValueOfEnum(pref.EnumNumber(num)), nil -+ return protoreflect.ValueOfEnum(protoreflect.EnumNumber(num)), nil - } - - default: - panic(fmt.Sprintf("invalid scalar kind %v", kind)) - } - -- return pref.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString()) -+ return protoreflect.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString()) - } - - // unmarshalList unmarshals into given protoreflect.List. A list value can - // either be in [] syntax or simply just a single scalar/message value. --func (d decoder) unmarshalList(fd pref.FieldDescriptor, list pref.List) error { -+func (d decoder) unmarshalList(fd protoreflect.FieldDescriptor, list protoreflect.List) error { - tok, err := d.Peek() - if err != nil { - return err - } - - switch fd.Kind() { -- case pref.MessageKind, pref.GroupKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind: - switch tok.Kind() { - case text.ListOpen: - d.Read() -@@ -441,22 +441,22 @@ func (d decoder) unmarshalList(fd pref.FieldDescriptor, list pref.List) error { - - // unmarshalMap unmarshals into given protoreflect.Map. A map value is a - // textproto message containing {key: , value: }. --func (d decoder) unmarshalMap(fd pref.FieldDescriptor, mmap pref.Map) error { -+func (d decoder) unmarshalMap(fd protoreflect.FieldDescriptor, mmap protoreflect.Map) error { - // Determine ahead whether map entry is a scalar type or a message type in - // order to call the appropriate unmarshalMapValue func inside - // unmarshalMapEntry. -- var unmarshalMapValue func() (pref.Value, error) -+ var unmarshalMapValue func() (protoreflect.Value, error) - switch fd.MapValue().Kind() { -- case pref.MessageKind, pref.GroupKind: -- unmarshalMapValue = func() (pref.Value, error) { -+ case protoreflect.MessageKind, protoreflect.GroupKind: -+ unmarshalMapValue = func() (protoreflect.Value, error) { - pval := mmap.NewValue() - if err := d.unmarshalMessage(pval.Message(), true); err != nil { -- return pref.Value{}, err -+ return protoreflect.Value{}, err - } - return pval, nil - } - default: -- unmarshalMapValue = func() (pref.Value, error) { -+ unmarshalMapValue = func() (protoreflect.Value, error) { - return d.unmarshalScalar(fd.MapValue()) - } - } -@@ -494,9 +494,9 @@ func (d decoder) unmarshalMap(fd pref.FieldDescriptor, mmap pref.Map) error { - - // unmarshalMap unmarshals into given protoreflect.Map. A map value is a - // textproto message containing {key: , value: }. --func (d decoder) unmarshalMapEntry(fd pref.FieldDescriptor, mmap pref.Map, unmarshalMapValue func() (pref.Value, error)) error { -- var key pref.MapKey -- var pval pref.Value -+func (d decoder) unmarshalMapEntry(fd protoreflect.FieldDescriptor, mmap protoreflect.Map, unmarshalMapValue func() (protoreflect.Value, error)) error { -+ var key protoreflect.MapKey -+ var pval protoreflect.Value - Loop: - for { - // Read field name. -@@ -520,7 +520,7 @@ Loop: - return d.unexpectedTokenError(tok) - } - -- switch name := pref.Name(tok.IdentName()); name { -+ switch name := protoreflect.Name(tok.IdentName()); name { - case genid.MapEntry_Key_field_name: - if !tok.HasSeparator() { - return d.syntaxError(tok.Pos(), "missing field separator :") -@@ -535,7 +535,7 @@ Loop: - key = val.MapKey() - - case genid.MapEntry_Value_field_name: -- if kind := fd.MapValue().Kind(); (kind != pref.MessageKind) && (kind != pref.GroupKind) { -+ if kind := fd.MapValue().Kind(); (kind != protoreflect.MessageKind) && (kind != protoreflect.GroupKind) { - if !tok.HasSeparator() { - return d.syntaxError(tok.Pos(), "missing field separator :") - } -@@ -561,7 +561,7 @@ Loop: - } - if !pval.IsValid() { - switch fd.MapValue().Kind() { -- case pref.MessageKind, pref.GroupKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind: - // If value field is not set for message/group types, construct an - // empty one as default. - pval = mmap.NewValue() -@@ -575,7 +575,7 @@ Loop: - - // unmarshalAny unmarshals an Any textproto. It can either be in expanded form - // or non-expanded form. --func (d decoder) unmarshalAny(m pref.Message, checkDelims bool) error { -+func (d decoder) unmarshalAny(m protoreflect.Message, checkDelims bool) error { - var typeURL string - var bValue []byte - var seenTypeUrl bool -@@ -619,7 +619,7 @@ Loop: - return d.syntaxError(tok.Pos(), "missing field separator :") - } - -- switch name := pref.Name(tok.IdentName()); name { -+ switch name := protoreflect.Name(tok.IdentName()); name { - case genid.Any_TypeUrl_field_name: - if seenTypeUrl { - return d.newError(tok.Pos(), "duplicate %v field", genid.Any_TypeUrl_field_fullname) -@@ -686,10 +686,10 @@ Loop: - - fds := m.Descriptor().Fields() - if len(typeURL) > 0 { -- m.Set(fds.ByNumber(genid.Any_TypeUrl_field_number), pref.ValueOfString(typeURL)) -+ m.Set(fds.ByNumber(genid.Any_TypeUrl_field_number), protoreflect.ValueOfString(typeURL)) - } - if len(bValue) > 0 { -- m.Set(fds.ByNumber(genid.Any_Value_field_number), pref.ValueOfBytes(bValue)) -+ m.Set(fds.ByNumber(genid.Any_Value_field_number), protoreflect.ValueOfBytes(bValue)) - } - return nil - } -diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go -index 8d5304d..ebf6c65 100644 ---- a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go -+++ b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go -@@ -20,7 +20,6 @@ import ( - "google.golang.org/protobuf/internal/strs" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" -- pref "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - ) - -@@ -150,7 +149,7 @@ type encoder struct { - } - - // marshalMessage marshals the given protoreflect.Message. --func (e encoder) marshalMessage(m pref.Message, inclDelims bool) error { -+func (e encoder) marshalMessage(m protoreflect.Message, inclDelims bool) error { - messageDesc := m.Descriptor() - if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) { - return errors.New("no support for proto1 MessageSets") -@@ -190,7 +189,7 @@ func (e encoder) marshalMessage(m pref.Message, inclDelims bool) error { - } - - // marshalField marshals the given field with protoreflect.Value. --func (e encoder) marshalField(name string, val pref.Value, fd pref.FieldDescriptor) error { -+func (e encoder) marshalField(name string, val protoreflect.Value, fd protoreflect.FieldDescriptor) error { - switch { - case fd.IsList(): - return e.marshalList(name, val.List(), fd) -@@ -204,40 +203,40 @@ func (e encoder) marshalField(name string, val pref.Value, fd pref.FieldDescript - - // marshalSingular marshals the given non-repeated field value. This includes - // all scalar types, enums, messages, and groups. --func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error { -+func (e encoder) marshalSingular(val protoreflect.Value, fd protoreflect.FieldDescriptor) error { - kind := fd.Kind() - switch kind { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - e.WriteBool(val.Bool()) - -- case pref.StringKind: -+ case protoreflect.StringKind: - s := val.String() - if !e.opts.allowInvalidUTF8 && strs.EnforceUTF8(fd) && !utf8.ValidString(s) { - return errors.InvalidUTF8(string(fd.FullName())) - } - e.WriteString(s) - -- case pref.Int32Kind, pref.Int64Kind, -- pref.Sint32Kind, pref.Sint64Kind, -- pref.Sfixed32Kind, pref.Sfixed64Kind: -+ case protoreflect.Int32Kind, protoreflect.Int64Kind, -+ protoreflect.Sint32Kind, protoreflect.Sint64Kind, -+ protoreflect.Sfixed32Kind, protoreflect.Sfixed64Kind: - e.WriteInt(val.Int()) - -- case pref.Uint32Kind, pref.Uint64Kind, -- pref.Fixed32Kind, pref.Fixed64Kind: -+ case protoreflect.Uint32Kind, protoreflect.Uint64Kind, -+ protoreflect.Fixed32Kind, protoreflect.Fixed64Kind: - e.WriteUint(val.Uint()) - -- case pref.FloatKind: -+ case protoreflect.FloatKind: - // Encoder.WriteFloat handles the special numbers NaN and infinites. - e.WriteFloat(val.Float(), 32) - -- case pref.DoubleKind: -+ case protoreflect.DoubleKind: - // Encoder.WriteFloat handles the special numbers NaN and infinites. - e.WriteFloat(val.Float(), 64) - -- case pref.BytesKind: -+ case protoreflect.BytesKind: - e.WriteString(string(val.Bytes())) - -- case pref.EnumKind: -+ case protoreflect.EnumKind: - num := val.Enum() - if desc := fd.Enum().Values().ByNumber(num); desc != nil { - e.WriteLiteral(string(desc.Name())) -@@ -246,7 +245,7 @@ func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error - e.WriteInt(int64(num)) - } - -- case pref.MessageKind, pref.GroupKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind: - return e.marshalMessage(val.Message(), true) - - default: -@@ -256,7 +255,7 @@ func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error - } - - // marshalList marshals the given protoreflect.List as multiple name-value fields. --func (e encoder) marshalList(name string, list pref.List, fd pref.FieldDescriptor) error { -+func (e encoder) marshalList(name string, list protoreflect.List, fd protoreflect.FieldDescriptor) error { - size := list.Len() - for i := 0; i < size; i++ { - e.WriteName(name) -@@ -268,9 +267,9 @@ func (e encoder) marshalList(name string, list pref.List, fd pref.FieldDescripto - } - - // marshalMap marshals the given protoreflect.Map as multiple name-value fields. --func (e encoder) marshalMap(name string, mmap pref.Map, fd pref.FieldDescriptor) error { -+func (e encoder) marshalMap(name string, mmap protoreflect.Map, fd protoreflect.FieldDescriptor) error { - var err error -- order.RangeEntries(mmap, order.GenericKeyOrder, func(key pref.MapKey, val pref.Value) bool { -+ order.RangeEntries(mmap, order.GenericKeyOrder, func(key protoreflect.MapKey, val protoreflect.Value) bool { - e.WriteName(name) - e.StartMessage() - defer e.EndMessage() -@@ -334,7 +333,7 @@ func (e encoder) marshalUnknown(b []byte) { - - // marshalAny marshals the given google.protobuf.Any message in expanded form. - // It returns true if it was able to marshal, else false. --func (e encoder) marshalAny(any pref.Message) bool { -+func (e encoder) marshalAny(any protoreflect.Message) bool { - // Construct the embedded message. - fds := any.Descriptor().Fields() - fdType := fds.ByNumber(genid.Any_TypeUrl_field_number) -diff --git a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go -index 9c61112..f4b4686 100644 ---- a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go -+++ b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go -@@ -3,7 +3,7 @@ - // license that can be found in the LICENSE file. - - // Package protowire parses and formats the raw wire encoding. --// See https://developers.google.com/protocol-buffers/docs/encoding. -+// See https://protobuf.dev/programming-guides/encoding. - // - // For marshaling and unmarshaling entire protobuf messages, - // use the "google.golang.org/protobuf/proto" package instead. -@@ -29,12 +29,8 @@ const ( - ) - - // IsValid reports whether the field number is semantically valid. --// --// Note that while numbers within the reserved range are semantically invalid, --// they are syntactically valid in the wire format. --// Implementations may treat records with reserved field numbers as unknown. - func (n Number) IsValid() bool { -- return MinValidNumber <= n && n < FirstReservedNumber || LastReservedNumber < n && n <= MaxValidNumber -+ return MinValidNumber <= n && n <= MaxValidNumber - } - - // Type represents the wire type. -@@ -516,6 +512,7 @@ func EncodeTag(num Number, typ Type) uint64 { - } - - // DecodeZigZag decodes a zig-zag-encoded uint64 as an int64. -+// - // Input: {…, 5, 3, 1, 0, 2, 4, 6, …} - // Output: {…, -3, -2, -1, 0, +1, +2, +3, …} - func DecodeZigZag(x uint64) int64 { -@@ -523,6 +520,7 @@ func DecodeZigZag(x uint64) int64 { - } - - // EncodeZigZag encodes an int64 as a zig-zag-encoded uint64. -+// - // Input: {…, -3, -2, -1, 0, +1, +2, +3, …} - // Output: {…, 5, 3, 1, 0, 2, 4, 6, …} - func EncodeZigZag(x int64) uint64 { -@@ -530,6 +528,7 @@ func EncodeZigZag(x int64) uint64 { - } - - // DecodeBool decodes a uint64 as a bool. -+// - // Input: { 0, 1, 2, …} - // Output: {false, true, true, …} - func DecodeBool(x uint64) bool { -@@ -537,6 +536,7 @@ func DecodeBool(x uint64) bool { - } - - // EncodeBool encodes a bool as a uint64. -+// - // Input: {false, true} - // Output: { 0, 1} - func EncodeBool(x bool) uint64 { -diff --git a/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go b/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go -index 360c633..db5248e 100644 ---- a/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go -+++ b/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go -@@ -14,7 +14,7 @@ import ( - - "google.golang.org/protobuf/internal/detrand" - "google.golang.org/protobuf/internal/pragma" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - type list interface { -@@ -30,17 +30,17 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { - if isRoot { - var name string - switch vs.(type) { -- case pref.Names: -+ case protoreflect.Names: - name = "Names" -- case pref.FieldNumbers: -+ case protoreflect.FieldNumbers: - name = "FieldNumbers" -- case pref.FieldRanges: -+ case protoreflect.FieldRanges: - name = "FieldRanges" -- case pref.EnumRanges: -+ case protoreflect.EnumRanges: - name = "EnumRanges" -- case pref.FileImports: -+ case protoreflect.FileImports: - name = "FileImports" -- case pref.Descriptor: -+ case protoreflect.Descriptor: - name = reflect.ValueOf(vs).MethodByName("Get").Type().Out(0).Name() + "s" - default: - name = reflect.ValueOf(vs).Elem().Type().Name() -@@ -50,17 +50,17 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { - - var ss []string - switch vs := vs.(type) { -- case pref.Names: -+ case protoreflect.Names: - for i := 0; i < vs.Len(); i++ { - ss = append(ss, fmt.Sprint(vs.Get(i))) - } - return start + joinStrings(ss, false) + end -- case pref.FieldNumbers: -+ case protoreflect.FieldNumbers: - for i := 0; i < vs.Len(); i++ { - ss = append(ss, fmt.Sprint(vs.Get(i))) - } - return start + joinStrings(ss, false) + end -- case pref.FieldRanges: -+ case protoreflect.FieldRanges: - for i := 0; i < vs.Len(); i++ { - r := vs.Get(i) - if r[0]+1 == r[1] { -@@ -70,7 +70,7 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { - } - } - return start + joinStrings(ss, false) + end -- case pref.EnumRanges: -+ case protoreflect.EnumRanges: - for i := 0; i < vs.Len(); i++ { - r := vs.Get(i) - if r[0] == r[1] { -@@ -80,7 +80,7 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { - } - } - return start + joinStrings(ss, false) + end -- case pref.FileImports: -+ case protoreflect.FileImports: - for i := 0; i < vs.Len(); i++ { - var rs records - rs.Append(reflect.ValueOf(vs.Get(i)), "Path", "Package", "IsPublic", "IsWeak") -@@ -88,11 +88,11 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { - } - return start + joinStrings(ss, allowMulti) + end - default: -- _, isEnumValue := vs.(pref.EnumValueDescriptors) -+ _, isEnumValue := vs.(protoreflect.EnumValueDescriptors) - for i := 0; i < vs.Len(); i++ { - m := reflect.ValueOf(vs).MethodByName("Get") - v := m.Call([]reflect.Value{reflect.ValueOf(i)})[0].Interface() -- ss = append(ss, formatDescOpt(v.(pref.Descriptor), false, allowMulti && !isEnumValue)) -+ ss = append(ss, formatDescOpt(v.(protoreflect.Descriptor), false, allowMulti && !isEnumValue)) - } - return start + joinStrings(ss, allowMulti && isEnumValue) + end - } -@@ -106,20 +106,20 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { - // - // Using a list allows us to print the accessors in a sensible order. - var descriptorAccessors = map[reflect.Type][]string{ -- reflect.TypeOf((*pref.FileDescriptor)(nil)).Elem(): {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"}, -- reflect.TypeOf((*pref.MessageDescriptor)(nil)).Elem(): {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"}, -- reflect.TypeOf((*pref.FieldDescriptor)(nil)).Elem(): {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "HasPresence", "IsExtension", "IsPacked", "IsWeak", "IsList", "IsMap", "MapKey", "MapValue", "HasDefault", "Default", "ContainingOneof", "ContainingMessage", "Message", "Enum"}, -- reflect.TypeOf((*pref.OneofDescriptor)(nil)).Elem(): {"Fields"}, // not directly used; must keep in sync with formatDescOpt -- reflect.TypeOf((*pref.EnumDescriptor)(nil)).Elem(): {"Values", "ReservedNames", "ReservedRanges"}, -- reflect.TypeOf((*pref.EnumValueDescriptor)(nil)).Elem(): {"Number"}, -- reflect.TypeOf((*pref.ServiceDescriptor)(nil)).Elem(): {"Methods"}, -- reflect.TypeOf((*pref.MethodDescriptor)(nil)).Elem(): {"Input", "Output", "IsStreamingClient", "IsStreamingServer"}, -+ reflect.TypeOf((*protoreflect.FileDescriptor)(nil)).Elem(): {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"}, -+ reflect.TypeOf((*protoreflect.MessageDescriptor)(nil)).Elem(): {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"}, -+ reflect.TypeOf((*protoreflect.FieldDescriptor)(nil)).Elem(): {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "HasPresence", "IsExtension", "IsPacked", "IsWeak", "IsList", "IsMap", "MapKey", "MapValue", "HasDefault", "Default", "ContainingOneof", "ContainingMessage", "Message", "Enum"}, -+ reflect.TypeOf((*protoreflect.OneofDescriptor)(nil)).Elem(): {"Fields"}, // not directly used; must keep in sync with formatDescOpt -+ reflect.TypeOf((*protoreflect.EnumDescriptor)(nil)).Elem(): {"Values", "ReservedNames", "ReservedRanges"}, -+ reflect.TypeOf((*protoreflect.EnumValueDescriptor)(nil)).Elem(): {"Number"}, -+ reflect.TypeOf((*protoreflect.ServiceDescriptor)(nil)).Elem(): {"Methods"}, -+ reflect.TypeOf((*protoreflect.MethodDescriptor)(nil)).Elem(): {"Input", "Output", "IsStreamingClient", "IsStreamingServer"}, - } - --func FormatDesc(s fmt.State, r rune, t pref.Descriptor) { -+func FormatDesc(s fmt.State, r rune, t protoreflect.Descriptor) { - io.WriteString(s, formatDescOpt(t, true, r == 'v' && (s.Flag('+') || s.Flag('#')))) - } --func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { -+func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { - rv := reflect.ValueOf(t) - rt := rv.MethodByName("ProtoType").Type().In(0) - -@@ -128,7 +128,7 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { - start = rt.Name() + "{" - } - -- _, isFile := t.(pref.FileDescriptor) -+ _, isFile := t.(protoreflect.FileDescriptor) - rs := records{allowMulti: allowMulti} - if t.IsPlaceholder() { - if isFile { -@@ -146,7 +146,7 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { - rs.Append(rv, "Name") - } - switch t := t.(type) { -- case pref.FieldDescriptor: -+ case protoreflect.FieldDescriptor: - for _, s := range descriptorAccessors[rt] { - switch s { - case "MapKey": -@@ -156,9 +156,9 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { - case "MapValue": - if v := t.MapValue(); v != nil { - switch v.Kind() { -- case pref.EnumKind: -+ case protoreflect.EnumKind: - rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Enum().FullName())}) -- case pref.MessageKind, pref.GroupKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind: - rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Message().FullName())}) - default: - rs.recs = append(rs.recs, [2]string{"MapValue", v.Kind().String()}) -@@ -180,7 +180,7 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { - rs.Append(rv, s) - } - } -- case pref.OneofDescriptor: -+ case protoreflect.OneofDescriptor: - var ss []string - fs := t.Fields() - for i := 0; i < fs.Len(); i++ { -@@ -216,7 +216,7 @@ func (rs *records) Append(v reflect.Value, accessors ...string) { - if !rv.IsValid() { - panic(fmt.Sprintf("unknown accessor: %v.%s", v.Type(), a)) - } -- if _, ok := rv.Interface().(pref.Value); ok { -+ if _, ok := rv.Interface().(protoreflect.Value); ok { - rv = rv.MethodByName("Interface").Call(nil)[0] - if !rv.IsNil() { - rv = rv.Elem() -@@ -250,9 +250,9 @@ func (rs *records) Append(v reflect.Value, accessors ...string) { - switch v := v.(type) { - case list: - s = formatListOpt(v, false, rs.allowMulti) -- case pref.FieldDescriptor, pref.OneofDescriptor, pref.EnumValueDescriptor, pref.MethodDescriptor: -- s = string(v.(pref.Descriptor).Name()) -- case pref.Descriptor: -+ case protoreflect.FieldDescriptor, protoreflect.OneofDescriptor, protoreflect.EnumValueDescriptor, protoreflect.MethodDescriptor: -+ s = string(v.(protoreflect.Descriptor).Name()) -+ case protoreflect.Descriptor: - s = string(v.FullName()) - case string: - s = strconv.Quote(v) -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go b/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go -index fdd9b13..328dc73 100644 ---- a/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go -+++ b/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go -@@ -15,8 +15,8 @@ import ( - "strconv" - - ptext "google.golang.org/protobuf/internal/encoding/text" -- errors "google.golang.org/protobuf/internal/errors" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/internal/errors" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - // Format is the serialization format used to represent the default value. -@@ -35,56 +35,56 @@ const ( - - // Unmarshal deserializes the default string s according to the given kind k. - // When k is an enum, a list of enum value descriptors must be provided. --func Unmarshal(s string, k pref.Kind, evs pref.EnumValueDescriptors, f Format) (pref.Value, pref.EnumValueDescriptor, error) { -+func Unmarshal(s string, k protoreflect.Kind, evs protoreflect.EnumValueDescriptors, f Format) (protoreflect.Value, protoreflect.EnumValueDescriptor, error) { - switch k { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - if f == GoTag { - switch s { - case "1": -- return pref.ValueOfBool(true), nil, nil -+ return protoreflect.ValueOfBool(true), nil, nil - case "0": -- return pref.ValueOfBool(false), nil, nil -+ return protoreflect.ValueOfBool(false), nil, nil - } - } else { - switch s { - case "true": -- return pref.ValueOfBool(true), nil, nil -+ return protoreflect.ValueOfBool(true), nil, nil - case "false": -- return pref.ValueOfBool(false), nil, nil -+ return protoreflect.ValueOfBool(false), nil, nil - } - } -- case pref.EnumKind: -+ case protoreflect.EnumKind: - if f == GoTag { - // Go tags use the numeric form of the enum value. - if n, err := strconv.ParseInt(s, 10, 32); err == nil { -- if ev := evs.ByNumber(pref.EnumNumber(n)); ev != nil { -- return pref.ValueOfEnum(ev.Number()), ev, nil -+ if ev := evs.ByNumber(protoreflect.EnumNumber(n)); ev != nil { -+ return protoreflect.ValueOfEnum(ev.Number()), ev, nil - } - } - } else { - // Descriptor default_value use the enum identifier. -- ev := evs.ByName(pref.Name(s)) -+ ev := evs.ByName(protoreflect.Name(s)) - if ev != nil { -- return pref.ValueOfEnum(ev.Number()), ev, nil -+ return protoreflect.ValueOfEnum(ev.Number()), ev, nil - } - } -- case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: -+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: - if v, err := strconv.ParseInt(s, 10, 32); err == nil { -- return pref.ValueOfInt32(int32(v)), nil, nil -+ return protoreflect.ValueOfInt32(int32(v)), nil, nil - } -- case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: -+ case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - if v, err := strconv.ParseInt(s, 10, 64); err == nil { -- return pref.ValueOfInt64(int64(v)), nil, nil -+ return protoreflect.ValueOfInt64(int64(v)), nil, nil - } -- case pref.Uint32Kind, pref.Fixed32Kind: -+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: - if v, err := strconv.ParseUint(s, 10, 32); err == nil { -- return pref.ValueOfUint32(uint32(v)), nil, nil -+ return protoreflect.ValueOfUint32(uint32(v)), nil, nil - } -- case pref.Uint64Kind, pref.Fixed64Kind: -+ case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - if v, err := strconv.ParseUint(s, 10, 64); err == nil { -- return pref.ValueOfUint64(uint64(v)), nil, nil -+ return protoreflect.ValueOfUint64(uint64(v)), nil, nil - } -- case pref.FloatKind, pref.DoubleKind: -+ case protoreflect.FloatKind, protoreflect.DoubleKind: - var v float64 - var err error - switch s { -@@ -98,29 +98,29 @@ func Unmarshal(s string, k pref.Kind, evs pref.EnumValueDescriptors, f Format) ( - v, err = strconv.ParseFloat(s, 64) - } - if err == nil { -- if k == pref.FloatKind { -- return pref.ValueOfFloat32(float32(v)), nil, nil -+ if k == protoreflect.FloatKind { -+ return protoreflect.ValueOfFloat32(float32(v)), nil, nil - } else { -- return pref.ValueOfFloat64(float64(v)), nil, nil -+ return protoreflect.ValueOfFloat64(float64(v)), nil, nil - } - } -- case pref.StringKind: -+ case protoreflect.StringKind: - // String values are already unescaped and can be used as is. -- return pref.ValueOfString(s), nil, nil -- case pref.BytesKind: -+ return protoreflect.ValueOfString(s), nil, nil -+ case protoreflect.BytesKind: - if b, ok := unmarshalBytes(s); ok { -- return pref.ValueOfBytes(b), nil, nil -+ return protoreflect.ValueOfBytes(b), nil, nil - } - } -- return pref.Value{}, nil, errors.New("could not parse value for %v: %q", k, s) -+ return protoreflect.Value{}, nil, errors.New("could not parse value for %v: %q", k, s) - } - - // Marshal serializes v as the default string according to the given kind k. - // When specifying the Descriptor format for an enum kind, the associated - // enum value descriptor must be provided. --func Marshal(v pref.Value, ev pref.EnumValueDescriptor, k pref.Kind, f Format) (string, error) { -+func Marshal(v protoreflect.Value, ev protoreflect.EnumValueDescriptor, k protoreflect.Kind, f Format) (string, error) { - switch k { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - if f == GoTag { - if v.Bool() { - return "1", nil -@@ -134,17 +134,17 @@ func Marshal(v pref.Value, ev pref.EnumValueDescriptor, k pref.Kind, f Format) ( - return "false", nil - } - } -- case pref.EnumKind: -+ case protoreflect.EnumKind: - if f == GoTag { - return strconv.FormatInt(int64(v.Enum()), 10), nil - } else { - return string(ev.Name()), nil - } -- case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind, pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: -+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - return strconv.FormatInt(v.Int(), 10), nil -- case pref.Uint32Kind, pref.Fixed32Kind, pref.Uint64Kind, pref.Fixed64Kind: -+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - return strconv.FormatUint(v.Uint(), 10), nil -- case pref.FloatKind, pref.DoubleKind: -+ case protoreflect.FloatKind, protoreflect.DoubleKind: - f := v.Float() - switch { - case math.IsInf(f, -1): -@@ -154,16 +154,16 @@ func Marshal(v pref.Value, ev pref.EnumValueDescriptor, k pref.Kind, f Format) ( - case math.IsNaN(f): - return "nan", nil - default: -- if k == pref.FloatKind { -+ if k == protoreflect.FloatKind { - return strconv.FormatFloat(f, 'g', -1, 32), nil - } else { - return strconv.FormatFloat(f, 'g', -1, 64), nil - } - } -- case pref.StringKind: -+ case protoreflect.StringKind: - // String values are serialized as is without any escaping. - return v.String(), nil -- case pref.BytesKind: -+ case protoreflect.BytesKind: - if s, ok := marshalBytes(v.Bytes()); ok { - return s, nil - } -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go b/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go -new file mode 100644 -index 0000000..d043a6e ---- /dev/null -+++ b/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go -@@ -0,0 +1,340 @@ -+// Copyright 2018 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+package json -+ -+import ( -+ "bytes" -+ "fmt" -+ "io" -+ "regexp" -+ "unicode/utf8" -+ -+ "google.golang.org/protobuf/internal/errors" -+) -+ -+// call specifies which Decoder method was invoked. -+type call uint8 -+ -+const ( -+ readCall call = iota -+ peekCall -+) -+ -+const unexpectedFmt = "unexpected token %s" -+ -+// ErrUnexpectedEOF means that EOF was encountered in the middle of the input. -+var ErrUnexpectedEOF = errors.New("%v", io.ErrUnexpectedEOF) -+ -+// Decoder is a token-based JSON decoder. -+type Decoder struct { -+ // lastCall is last method called, either readCall or peekCall. -+ // Initial value is readCall. -+ lastCall call -+ -+ // lastToken contains the last read token. -+ lastToken Token -+ -+ // lastErr contains the last read error. -+ lastErr error -+ -+ // openStack is a stack containing ObjectOpen and ArrayOpen values. The -+ // top of stack represents the object or the array the current value is -+ // directly located in. -+ openStack []Kind -+ -+ // orig is used in reporting line and column. -+ orig []byte -+ // in contains the unconsumed input. -+ in []byte -+} -+ -+// NewDecoder returns a Decoder to read the given []byte. -+func NewDecoder(b []byte) *Decoder { -+ return &Decoder{orig: b, in: b} -+} -+ -+// Peek looks ahead and returns the next token kind without advancing a read. -+func (d *Decoder) Peek() (Token, error) { -+ defer func() { d.lastCall = peekCall }() -+ if d.lastCall == readCall { -+ d.lastToken, d.lastErr = d.Read() -+ } -+ return d.lastToken, d.lastErr -+} -+ -+// Read returns the next JSON token. -+// It will return an error if there is no valid token. -+func (d *Decoder) Read() (Token, error) { -+ const scalar = Null | Bool | Number | String -+ -+ defer func() { d.lastCall = readCall }() -+ if d.lastCall == peekCall { -+ return d.lastToken, d.lastErr -+ } -+ -+ tok, err := d.parseNext() -+ if err != nil { -+ return Token{}, err -+ } -+ -+ switch tok.kind { -+ case EOF: -+ if len(d.openStack) != 0 || -+ d.lastToken.kind&scalar|ObjectClose|ArrayClose == 0 { -+ return Token{}, ErrUnexpectedEOF -+ } -+ -+ case Null: -+ if !d.isValueNext() { -+ return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) -+ } -+ -+ case Bool, Number: -+ if !d.isValueNext() { -+ return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) -+ } -+ -+ case String: -+ if d.isValueNext() { -+ break -+ } -+ // This string token should only be for a field name. -+ if d.lastToken.kind&(ObjectOpen|comma) == 0 { -+ return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) -+ } -+ if len(d.in) == 0 { -+ return Token{}, ErrUnexpectedEOF -+ } -+ if c := d.in[0]; c != ':' { -+ return Token{}, d.newSyntaxError(d.currPos(), `unexpected character %s, missing ":" after field name`, string(c)) -+ } -+ tok.kind = Name -+ d.consume(1) -+ -+ case ObjectOpen, ArrayOpen: -+ if !d.isValueNext() { -+ return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) -+ } -+ d.openStack = append(d.openStack, tok.kind) -+ -+ case ObjectClose: -+ if len(d.openStack) == 0 || -+ d.lastToken.kind == comma || -+ d.openStack[len(d.openStack)-1] != ObjectOpen { -+ return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) -+ } -+ d.openStack = d.openStack[:len(d.openStack)-1] -+ -+ case ArrayClose: -+ if len(d.openStack) == 0 || -+ d.lastToken.kind == comma || -+ d.openStack[len(d.openStack)-1] != ArrayOpen { -+ return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) -+ } -+ d.openStack = d.openStack[:len(d.openStack)-1] -+ -+ case comma: -+ if len(d.openStack) == 0 || -+ d.lastToken.kind&(scalar|ObjectClose|ArrayClose) == 0 { -+ return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) -+ } -+ } -+ -+ // Update d.lastToken only after validating token to be in the right sequence. -+ d.lastToken = tok -+ -+ if d.lastToken.kind == comma { -+ return d.Read() -+ } -+ return tok, nil -+} -+ -+// Any sequence that looks like a non-delimiter (for error reporting). -+var errRegexp = regexp.MustCompile(`^([-+._a-zA-Z0-9]{1,32}|.)`) -+ -+// parseNext parses for the next JSON token. It returns a Token object for -+// different types, except for Name. It does not handle whether the next token -+// is in a valid sequence or not. -+func (d *Decoder) parseNext() (Token, error) { -+ // Trim leading spaces. -+ d.consume(0) -+ -+ in := d.in -+ if len(in) == 0 { -+ return d.consumeToken(EOF, 0), nil -+ } -+ -+ switch in[0] { -+ case 'n': -+ if n := matchWithDelim("null", in); n != 0 { -+ return d.consumeToken(Null, n), nil -+ } -+ -+ case 't': -+ if n := matchWithDelim("true", in); n != 0 { -+ return d.consumeBoolToken(true, n), nil -+ } -+ -+ case 'f': -+ if n := matchWithDelim("false", in); n != 0 { -+ return d.consumeBoolToken(false, n), nil -+ } -+ -+ case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': -+ if n, ok := parseNumber(in); ok { -+ return d.consumeToken(Number, n), nil -+ } -+ -+ case '"': -+ s, n, err := d.parseString(in) -+ if err != nil { -+ return Token{}, err -+ } -+ return d.consumeStringToken(s, n), nil -+ -+ case '{': -+ return d.consumeToken(ObjectOpen, 1), nil -+ -+ case '}': -+ return d.consumeToken(ObjectClose, 1), nil -+ -+ case '[': -+ return d.consumeToken(ArrayOpen, 1), nil -+ -+ case ']': -+ return d.consumeToken(ArrayClose, 1), nil -+ -+ case ',': -+ return d.consumeToken(comma, 1), nil -+ } -+ return Token{}, d.newSyntaxError(d.currPos(), "invalid value %s", errRegexp.Find(in)) -+} -+ -+// newSyntaxError returns an error with line and column information useful for -+// syntax errors. -+func (d *Decoder) newSyntaxError(pos int, f string, x ...interface{}) error { -+ e := errors.New(f, x...) -+ line, column := d.Position(pos) -+ return errors.New("syntax error (line %d:%d): %v", line, column, e) -+} -+ -+// Position returns line and column number of given index of the original input. -+// It will panic if index is out of range. -+func (d *Decoder) Position(idx int) (line int, column int) { -+ b := d.orig[:idx] -+ line = bytes.Count(b, []byte("\n")) + 1 -+ if i := bytes.LastIndexByte(b, '\n'); i >= 0 { -+ b = b[i+1:] -+ } -+ column = utf8.RuneCount(b) + 1 // ignore multi-rune characters -+ return line, column -+} -+ -+// currPos returns the current index position of d.in from d.orig. -+func (d *Decoder) currPos() int { -+ return len(d.orig) - len(d.in) -+} -+ -+// matchWithDelim matches s with the input b and verifies that the match -+// terminates with a delimiter of some form (e.g., r"[^-+_.a-zA-Z0-9]"). -+// As a special case, EOF is considered a delimiter. It returns the length of s -+// if there is a match, else 0. -+func matchWithDelim(s string, b []byte) int { -+ if !bytes.HasPrefix(b, []byte(s)) { -+ return 0 -+ } -+ -+ n := len(s) -+ if n < len(b) && isNotDelim(b[n]) { -+ return 0 -+ } -+ return n -+} -+ -+// isNotDelim returns true if given byte is a not delimiter character. -+func isNotDelim(c byte) bool { -+ return (c == '-' || c == '+' || c == '.' || c == '_' || -+ ('a' <= c && c <= 'z') || -+ ('A' <= c && c <= 'Z') || -+ ('0' <= c && c <= '9')) -+} -+ -+// consume consumes n bytes of input and any subsequent whitespace. -+func (d *Decoder) consume(n int) { -+ d.in = d.in[n:] -+ for len(d.in) > 0 { -+ switch d.in[0] { -+ case ' ', '\n', '\r', '\t': -+ d.in = d.in[1:] -+ default: -+ return -+ } -+ } -+} -+ -+// isValueNext returns true if next type should be a JSON value: Null, -+// Number, String or Bool. -+func (d *Decoder) isValueNext() bool { -+ if len(d.openStack) == 0 { -+ return d.lastToken.kind == 0 -+ } -+ -+ start := d.openStack[len(d.openStack)-1] -+ switch start { -+ case ObjectOpen: -+ return d.lastToken.kind&Name != 0 -+ case ArrayOpen: -+ return d.lastToken.kind&(ArrayOpen|comma) != 0 -+ } -+ panic(fmt.Sprintf( -+ "unreachable logic in Decoder.isValueNext, lastToken.kind: %v, openStack: %v", -+ d.lastToken.kind, start)) -+} -+ -+// consumeToken constructs a Token for given Kind with raw value derived from -+// current d.in and given size, and consumes the given size-length of it. -+func (d *Decoder) consumeToken(kind Kind, size int) Token { -+ tok := Token{ -+ kind: kind, -+ raw: d.in[:size], -+ pos: len(d.orig) - len(d.in), -+ } -+ d.consume(size) -+ return tok -+} -+ -+// consumeBoolToken constructs a Token for a Bool kind with raw value derived from -+// current d.in and given size. -+func (d *Decoder) consumeBoolToken(b bool, size int) Token { -+ tok := Token{ -+ kind: Bool, -+ raw: d.in[:size], -+ pos: len(d.orig) - len(d.in), -+ boo: b, -+ } -+ d.consume(size) -+ return tok -+} -+ -+// consumeStringToken constructs a Token for a String kind with raw value derived -+// from current d.in and given size. -+func (d *Decoder) consumeStringToken(s string, size int) Token { -+ tok := Token{ -+ kind: String, -+ raw: d.in[:size], -+ pos: len(d.orig) - len(d.in), -+ str: s, -+ } -+ d.consume(size) -+ return tok -+} -+ -+// Clone returns a copy of the Decoder for use in reading ahead the next JSON -+// object, array or other values without affecting current Decoder. -+func (d *Decoder) Clone() *Decoder { -+ ret := *d -+ ret.openStack = append([]Kind(nil), ret.openStack...) -+ return &ret -+} -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go b/vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go -new file mode 100644 -index 0000000..2999d71 ---- /dev/null -+++ b/vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go -@@ -0,0 +1,254 @@ -+// Copyright 2018 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+package json -+ -+import ( -+ "bytes" -+ "strconv" -+) -+ -+// parseNumber reads the given []byte for a valid JSON number. If it is valid, -+// it returns the number of bytes. Parsing logic follows the definition in -+// https://tools.ietf.org/html/rfc7159#section-6, and is based off -+// encoding/json.isValidNumber function. -+func parseNumber(input []byte) (int, bool) { -+ var n int -+ -+ s := input -+ if len(s) == 0 { -+ return 0, false -+ } -+ -+ // Optional - -+ if s[0] == '-' { -+ s = s[1:] -+ n++ -+ if len(s) == 0 { -+ return 0, false -+ } -+ } -+ -+ // Digits -+ switch { -+ case s[0] == '0': -+ s = s[1:] -+ n++ -+ -+ case '1' <= s[0] && s[0] <= '9': -+ s = s[1:] -+ n++ -+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { -+ s = s[1:] -+ n++ -+ } -+ -+ default: -+ return 0, false -+ } -+ -+ // . followed by 1 or more digits. -+ if len(s) >= 2 && s[0] == '.' && '0' <= s[1] && s[1] <= '9' { -+ s = s[2:] -+ n += 2 -+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { -+ s = s[1:] -+ n++ -+ } -+ } -+ -+ // e or E followed by an optional - or + and -+ // 1 or more digits. -+ if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') { -+ s = s[1:] -+ n++ -+ if s[0] == '+' || s[0] == '-' { -+ s = s[1:] -+ n++ -+ if len(s) == 0 { -+ return 0, false -+ } -+ } -+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { -+ s = s[1:] -+ n++ -+ } -+ } -+ -+ // Check that next byte is a delimiter or it is at the end. -+ if n < len(input) && isNotDelim(input[n]) { -+ return 0, false -+ } -+ -+ return n, true -+} -+ -+// numberParts is the result of parsing out a valid JSON number. It contains -+// the parts of a number. The parts are used for integer conversion. -+type numberParts struct { -+ neg bool -+ intp []byte -+ frac []byte -+ exp []byte -+} -+ -+// parseNumber constructs numberParts from given []byte. The logic here is -+// similar to consumeNumber above with the difference of having to construct -+// numberParts. The slice fields in numberParts are subslices of the input. -+func parseNumberParts(input []byte) (numberParts, bool) { -+ var neg bool -+ var intp []byte -+ var frac []byte -+ var exp []byte -+ -+ s := input -+ if len(s) == 0 { -+ return numberParts{}, false -+ } -+ -+ // Optional - -+ if s[0] == '-' { -+ neg = true -+ s = s[1:] -+ if len(s) == 0 { -+ return numberParts{}, false -+ } -+ } -+ -+ // Digits -+ switch { -+ case s[0] == '0': -+ // Skip first 0 and no need to store. -+ s = s[1:] -+ -+ case '1' <= s[0] && s[0] <= '9': -+ intp = s -+ n := 1 -+ s = s[1:] -+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { -+ s = s[1:] -+ n++ -+ } -+ intp = intp[:n] -+ -+ default: -+ return numberParts{}, false -+ } -+ -+ // . followed by 1 or more digits. -+ if len(s) >= 2 && s[0] == '.' && '0' <= s[1] && s[1] <= '9' { -+ frac = s[1:] -+ n := 1 -+ s = s[2:] -+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { -+ s = s[1:] -+ n++ -+ } -+ frac = frac[:n] -+ } -+ -+ // e or E followed by an optional - or + and -+ // 1 or more digits. -+ if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') { -+ s = s[1:] -+ exp = s -+ n := 0 -+ if s[0] == '+' || s[0] == '-' { -+ s = s[1:] -+ n++ -+ if len(s) == 0 { -+ return numberParts{}, false -+ } -+ } -+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { -+ s = s[1:] -+ n++ -+ } -+ exp = exp[:n] -+ } -+ -+ return numberParts{ -+ neg: neg, -+ intp: intp, -+ frac: bytes.TrimRight(frac, "0"), // Remove unnecessary 0s to the right. -+ exp: exp, -+ }, true -+} -+ -+// normalizeToIntString returns an integer string in normal form without the -+// E-notation for given numberParts. It will return false if it is not an -+// integer or if the exponent exceeds than max/min int value. -+func normalizeToIntString(n numberParts) (string, bool) { -+ intpSize := len(n.intp) -+ fracSize := len(n.frac) -+ -+ if intpSize == 0 && fracSize == 0 { -+ return "0", true -+ } -+ -+ var exp int -+ if len(n.exp) > 0 { -+ i, err := strconv.ParseInt(string(n.exp), 10, 32) -+ if err != nil { -+ return "", false -+ } -+ exp = int(i) -+ } -+ -+ var num []byte -+ if exp >= 0 { -+ // For positive E, shift fraction digits into integer part and also pad -+ // with zeroes as needed. -+ -+ // If there are more digits in fraction than the E value, then the -+ // number is not an integer. -+ if fracSize > exp { -+ return "", false -+ } -+ -+ // Make sure resulting digits are within max value limit to avoid -+ // unnecessarily constructing a large byte slice that may simply fail -+ // later on. -+ const maxDigits = 20 // Max uint64 value has 20 decimal digits. -+ if intpSize+exp > maxDigits { -+ return "", false -+ } -+ -+ // Set cap to make a copy of integer part when appended. -+ num = n.intp[:len(n.intp):len(n.intp)] -+ num = append(num, n.frac...) -+ for i := 0; i < exp-fracSize; i++ { -+ num = append(num, '0') -+ } -+ } else { -+ // For negative E, shift digits in integer part out. -+ -+ // If there are fractions, then the number is not an integer. -+ if fracSize > 0 { -+ return "", false -+ } -+ -+ // index is where the decimal point will be after adjusting for negative -+ // exponent. -+ index := intpSize + exp -+ if index < 0 { -+ return "", false -+ } -+ -+ num = n.intp -+ // If any of the digits being shifted to the right of the decimal point -+ // is non-zero, then the number is not an integer. -+ for i := index; i < intpSize; i++ { -+ if num[i] != '0' { -+ return "", false -+ } -+ } -+ num = num[:index] -+ } -+ -+ if n.neg { -+ return "-" + string(num), true -+ } -+ return string(num), true -+} -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go b/vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go -new file mode 100644 -index 0000000..f7fea7d ---- /dev/null -+++ b/vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go -@@ -0,0 +1,91 @@ -+// Copyright 2018 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+package json -+ -+import ( -+ "strconv" -+ "unicode" -+ "unicode/utf16" -+ "unicode/utf8" -+ -+ "google.golang.org/protobuf/internal/strs" -+) -+ -+func (d *Decoder) parseString(in []byte) (string, int, error) { -+ in0 := in -+ if len(in) == 0 { -+ return "", 0, ErrUnexpectedEOF -+ } -+ if in[0] != '"' { -+ return "", 0, d.newSyntaxError(d.currPos(), "invalid character %q at start of string", in[0]) -+ } -+ in = in[1:] -+ i := indexNeedEscapeInBytes(in) -+ in, out := in[i:], in[:i:i] // set cap to prevent mutations -+ for len(in) > 0 { -+ switch r, n := utf8.DecodeRune(in); { -+ case r == utf8.RuneError && n == 1: -+ return "", 0, d.newSyntaxError(d.currPos(), "invalid UTF-8 in string") -+ case r < ' ': -+ return "", 0, d.newSyntaxError(d.currPos(), "invalid character %q in string", r) -+ case r == '"': -+ in = in[1:] -+ n := len(in0) - len(in) -+ return string(out), n, nil -+ case r == '\\': -+ if len(in) < 2 { -+ return "", 0, ErrUnexpectedEOF -+ } -+ switch r := in[1]; r { -+ case '"', '\\', '/': -+ in, out = in[2:], append(out, r) -+ case 'b': -+ in, out = in[2:], append(out, '\b') -+ case 'f': -+ in, out = in[2:], append(out, '\f') -+ case 'n': -+ in, out = in[2:], append(out, '\n') -+ case 'r': -+ in, out = in[2:], append(out, '\r') -+ case 't': -+ in, out = in[2:], append(out, '\t') -+ case 'u': -+ if len(in) < 6 { -+ return "", 0, ErrUnexpectedEOF -+ } -+ v, err := strconv.ParseUint(string(in[2:6]), 16, 16) -+ if err != nil { -+ return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:6]) -+ } -+ in = in[6:] -+ -+ r := rune(v) -+ if utf16.IsSurrogate(r) { -+ if len(in) < 6 { -+ return "", 0, ErrUnexpectedEOF -+ } -+ v, err := strconv.ParseUint(string(in[2:6]), 16, 16) -+ r = utf16.DecodeRune(r, rune(v)) -+ if in[0] != '\\' || in[1] != 'u' || -+ r == unicode.ReplacementChar || err != nil { -+ return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:6]) -+ } -+ in = in[6:] -+ } -+ out = append(out, string(r)...) -+ default: -+ return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:2]) -+ } -+ default: -+ i := indexNeedEscapeInBytes(in[n:]) -+ in, out = in[n+i:], append(out, in[:n+i]...) -+ } -+ } -+ return "", 0, ErrUnexpectedEOF -+} -+ -+// indexNeedEscapeInBytes returns the index of the character that needs -+// escaping. If no characters need escaping, this returns the input length. -+func indexNeedEscapeInBytes(b []byte) int { return indexNeedEscapeInString(strs.UnsafeString(b)) } -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go b/vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go -new file mode 100644 -index 0000000..50578d6 ---- /dev/null -+++ b/vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go -@@ -0,0 +1,192 @@ -+// Copyright 2019 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+package json -+ -+import ( -+ "bytes" -+ "fmt" -+ "strconv" -+) -+ -+// Kind represents a token kind expressible in the JSON format. -+type Kind uint16 -+ -+const ( -+ Invalid Kind = (1 << iota) / 2 -+ EOF -+ Null -+ Bool -+ Number -+ String -+ Name -+ ObjectOpen -+ ObjectClose -+ ArrayOpen -+ ArrayClose -+ -+ // comma is only for parsing in between tokens and -+ // does not need to be exported. -+ comma -+) -+ -+func (k Kind) String() string { -+ switch k { -+ case EOF: -+ return "eof" -+ case Null: -+ return "null" -+ case Bool: -+ return "bool" -+ case Number: -+ return "number" -+ case String: -+ return "string" -+ case ObjectOpen: -+ return "{" -+ case ObjectClose: -+ return "}" -+ case Name: -+ return "name" -+ case ArrayOpen: -+ return "[" -+ case ArrayClose: -+ return "]" -+ case comma: -+ return "," -+ } -+ return "" -+} -+ -+// Token provides a parsed token kind and value. -+// -+// Values are provided by the difference accessor methods. The accessor methods -+// Name, Bool, and ParsedString will panic if called on the wrong kind. There -+// are different accessor methods for the Number kind for converting to the -+// appropriate Go numeric type and those methods have the ok return value. -+type Token struct { -+ // Token kind. -+ kind Kind -+ // pos provides the position of the token in the original input. -+ pos int -+ // raw bytes of the serialized token. -+ // This is a subslice into the original input. -+ raw []byte -+ // boo is parsed boolean value. -+ boo bool -+ // str is parsed string value. -+ str string -+} -+ -+// Kind returns the token kind. -+func (t Token) Kind() Kind { -+ return t.kind -+} -+ -+// RawString returns the read value in string. -+func (t Token) RawString() string { -+ return string(t.raw) -+} -+ -+// Pos returns the token position from the input. -+func (t Token) Pos() int { -+ return t.pos -+} -+ -+// Name returns the object name if token is Name, else it panics. -+func (t Token) Name() string { -+ if t.kind == Name { -+ return t.str -+ } -+ panic(fmt.Sprintf("Token is not a Name: %v", t.RawString())) -+} -+ -+// Bool returns the bool value if token kind is Bool, else it panics. -+func (t Token) Bool() bool { -+ if t.kind == Bool { -+ return t.boo -+ } -+ panic(fmt.Sprintf("Token is not a Bool: %v", t.RawString())) -+} -+ -+// ParsedString returns the string value for a JSON string token or the read -+// value in string if token is not a string. -+func (t Token) ParsedString() string { -+ if t.kind == String { -+ return t.str -+ } -+ panic(fmt.Sprintf("Token is not a String: %v", t.RawString())) -+} -+ -+// Float returns the floating-point number if token kind is Number. -+// -+// The floating-point precision is specified by the bitSize parameter: 32 for -+// float32 or 64 for float64. If bitSize=32, the result still has type float64, -+// but it will be convertible to float32 without changing its value. It will -+// return false if the number exceeds the floating point limits for given -+// bitSize. -+func (t Token) Float(bitSize int) (float64, bool) { -+ if t.kind != Number { -+ return 0, false -+ } -+ f, err := strconv.ParseFloat(t.RawString(), bitSize) -+ if err != nil { -+ return 0, false -+ } -+ return f, true -+} -+ -+// Int returns the signed integer number if token is Number. -+// -+// The given bitSize specifies the integer type that the result must fit into. -+// It returns false if the number is not an integer value or if the result -+// exceeds the limits for given bitSize. -+func (t Token) Int(bitSize int) (int64, bool) { -+ s, ok := t.getIntStr() -+ if !ok { -+ return 0, false -+ } -+ n, err := strconv.ParseInt(s, 10, bitSize) -+ if err != nil { -+ return 0, false -+ } -+ return n, true -+} -+ -+// Uint returns the signed integer number if token is Number. -+// -+// The given bitSize specifies the unsigned integer type that the result must -+// fit into. It returns false if the number is not an unsigned integer value -+// or if the result exceeds the limits for given bitSize. -+func (t Token) Uint(bitSize int) (uint64, bool) { -+ s, ok := t.getIntStr() -+ if !ok { -+ return 0, false -+ } -+ n, err := strconv.ParseUint(s, 10, bitSize) -+ if err != nil { -+ return 0, false -+ } -+ return n, true -+} -+ -+func (t Token) getIntStr() (string, bool) { -+ if t.kind != Number { -+ return "", false -+ } -+ parts, ok := parseNumberParts(t.raw) -+ if !ok { -+ return "", false -+ } -+ return normalizeToIntString(parts) -+} -+ -+// TokenEquals returns true if given Tokens are equal, else false. -+func TokenEquals(x, y Token) bool { -+ return x.kind == y.kind && -+ x.pos == y.pos && -+ bytes.Equal(x.raw, y.raw) && -+ x.boo == y.boo && -+ x.str == y.str -+} -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/json/encode.go b/vendor/google.golang.org/protobuf/internal/encoding/json/encode.go -new file mode 100644 -index 0000000..fbdf348 ---- /dev/null -+++ b/vendor/google.golang.org/protobuf/internal/encoding/json/encode.go -@@ -0,0 +1,276 @@ -+// Copyright 2018 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+package json -+ -+import ( -+ "math" -+ "math/bits" -+ "strconv" -+ "strings" -+ "unicode/utf8" -+ -+ "google.golang.org/protobuf/internal/detrand" -+ "google.golang.org/protobuf/internal/errors" -+) -+ -+// kind represents an encoding type. -+type kind uint8 -+ -+const ( -+ _ kind = (1 << iota) / 2 -+ name -+ scalar -+ objectOpen -+ objectClose -+ arrayOpen -+ arrayClose -+) -+ -+// Encoder provides methods to write out JSON constructs and values. The user is -+// responsible for producing valid sequences of JSON constructs and values. -+type Encoder struct { -+ indent string -+ lastKind kind -+ indents []byte -+ out []byte -+} -+ -+// NewEncoder returns an Encoder. -+// -+// If indent is a non-empty string, it causes every entry for an Array or Object -+// to be preceded by the indent and trailed by a newline. -+func NewEncoder(indent string) (*Encoder, error) { -+ e := &Encoder{} -+ if len(indent) > 0 { -+ if strings.Trim(indent, " \t") != "" { -+ return nil, errors.New("indent may only be composed of space or tab characters") -+ } -+ e.indent = indent -+ } -+ return e, nil -+} -+ -+// Bytes returns the content of the written bytes. -+func (e *Encoder) Bytes() []byte { -+ return e.out -+} -+ -+// WriteNull writes out the null value. -+func (e *Encoder) WriteNull() { -+ e.prepareNext(scalar) -+ e.out = append(e.out, "null"...) -+} -+ -+// WriteBool writes out the given boolean value. -+func (e *Encoder) WriteBool(b bool) { -+ e.prepareNext(scalar) -+ if b { -+ e.out = append(e.out, "true"...) -+ } else { -+ e.out = append(e.out, "false"...) -+ } -+} -+ -+// WriteString writes out the given string in JSON string value. Returns error -+// if input string contains invalid UTF-8. -+func (e *Encoder) WriteString(s string) error { -+ e.prepareNext(scalar) -+ var err error -+ if e.out, err = appendString(e.out, s); err != nil { -+ return err -+ } -+ return nil -+} -+ -+// Sentinel error used for indicating invalid UTF-8. -+var errInvalidUTF8 = errors.New("invalid UTF-8") -+ -+func appendString(out []byte, in string) ([]byte, error) { -+ out = append(out, '"') -+ i := indexNeedEscapeInString(in) -+ in, out = in[i:], append(out, in[:i]...) -+ for len(in) > 0 { -+ switch r, n := utf8.DecodeRuneInString(in); { -+ case r == utf8.RuneError && n == 1: -+ return out, errInvalidUTF8 -+ case r < ' ' || r == '"' || r == '\\': -+ out = append(out, '\\') -+ switch r { -+ case '"', '\\': -+ out = append(out, byte(r)) -+ case '\b': -+ out = append(out, 'b') -+ case '\f': -+ out = append(out, 'f') -+ case '\n': -+ out = append(out, 'n') -+ case '\r': -+ out = append(out, 'r') -+ case '\t': -+ out = append(out, 't') -+ default: -+ out = append(out, 'u') -+ out = append(out, "0000"[1+(bits.Len32(uint32(r))-1)/4:]...) -+ out = strconv.AppendUint(out, uint64(r), 16) -+ } -+ in = in[n:] -+ default: -+ i := indexNeedEscapeInString(in[n:]) -+ in, out = in[n+i:], append(out, in[:n+i]...) -+ } -+ } -+ out = append(out, '"') -+ return out, nil -+} -+ -+// indexNeedEscapeInString returns the index of the character that needs -+// escaping. If no characters need escaping, this returns the input length. -+func indexNeedEscapeInString(s string) int { -+ for i, r := range s { -+ if r < ' ' || r == '\\' || r == '"' || r == utf8.RuneError { -+ return i -+ } -+ } -+ return len(s) -+} -+ -+// WriteFloat writes out the given float and bitSize in JSON number value. -+func (e *Encoder) WriteFloat(n float64, bitSize int) { -+ e.prepareNext(scalar) -+ e.out = appendFloat(e.out, n, bitSize) -+} -+ -+// appendFloat formats given float in bitSize, and appends to the given []byte. -+func appendFloat(out []byte, n float64, bitSize int) []byte { -+ switch { -+ case math.IsNaN(n): -+ return append(out, `"NaN"`...) -+ case math.IsInf(n, +1): -+ return append(out, `"Infinity"`...) -+ case math.IsInf(n, -1): -+ return append(out, `"-Infinity"`...) -+ } -+ -+ // JSON number formatting logic based on encoding/json. -+ // See floatEncoder.encode for reference. -+ fmt := byte('f') -+ if abs := math.Abs(n); abs != 0 { -+ if bitSize == 64 && (abs < 1e-6 || abs >= 1e21) || -+ bitSize == 32 && (float32(abs) < 1e-6 || float32(abs) >= 1e21) { -+ fmt = 'e' -+ } -+ } -+ out = strconv.AppendFloat(out, n, fmt, -1, bitSize) -+ if fmt == 'e' { -+ n := len(out) -+ if n >= 4 && out[n-4] == 'e' && out[n-3] == '-' && out[n-2] == '0' { -+ out[n-2] = out[n-1] -+ out = out[:n-1] -+ } -+ } -+ return out -+} -+ -+// WriteInt writes out the given signed integer in JSON number value. -+func (e *Encoder) WriteInt(n int64) { -+ e.prepareNext(scalar) -+ e.out = append(e.out, strconv.FormatInt(n, 10)...) -+} -+ -+// WriteUint writes out the given unsigned integer in JSON number value. -+func (e *Encoder) WriteUint(n uint64) { -+ e.prepareNext(scalar) -+ e.out = append(e.out, strconv.FormatUint(n, 10)...) -+} -+ -+// StartObject writes out the '{' symbol. -+func (e *Encoder) StartObject() { -+ e.prepareNext(objectOpen) -+ e.out = append(e.out, '{') -+} -+ -+// EndObject writes out the '}' symbol. -+func (e *Encoder) EndObject() { -+ e.prepareNext(objectClose) -+ e.out = append(e.out, '}') -+} -+ -+// WriteName writes out the given string in JSON string value and the name -+// separator ':'. Returns error if input string contains invalid UTF-8, which -+// should not be likely as protobuf field names should be valid. -+func (e *Encoder) WriteName(s string) error { -+ e.prepareNext(name) -+ var err error -+ // Append to output regardless of error. -+ e.out, err = appendString(e.out, s) -+ e.out = append(e.out, ':') -+ return err -+} -+ -+// StartArray writes out the '[' symbol. -+func (e *Encoder) StartArray() { -+ e.prepareNext(arrayOpen) -+ e.out = append(e.out, '[') -+} -+ -+// EndArray writes out the ']' symbol. -+func (e *Encoder) EndArray() { -+ e.prepareNext(arrayClose) -+ e.out = append(e.out, ']') -+} -+ -+// prepareNext adds possible comma and indentation for the next value based -+// on last type and indent option. It also updates lastKind to next. -+func (e *Encoder) prepareNext(next kind) { -+ defer func() { -+ // Set lastKind to next. -+ e.lastKind = next -+ }() -+ -+ if len(e.indent) == 0 { -+ // Need to add comma on the following condition. -+ if e.lastKind&(scalar|objectClose|arrayClose) != 0 && -+ next&(name|scalar|objectOpen|arrayOpen) != 0 { -+ e.out = append(e.out, ',') -+ // For single-line output, add a random extra space after each -+ // comma to make output unstable. -+ if detrand.Bool() { -+ e.out = append(e.out, ' ') -+ } -+ } -+ return -+ } -+ -+ switch { -+ case e.lastKind&(objectOpen|arrayOpen) != 0: -+ // If next type is NOT closing, add indent and newline. -+ if next&(objectClose|arrayClose) == 0 { -+ e.indents = append(e.indents, e.indent...) -+ e.out = append(e.out, '\n') -+ e.out = append(e.out, e.indents...) -+ } -+ -+ case e.lastKind&(scalar|objectClose|arrayClose) != 0: -+ switch { -+ // If next type is either a value or name, add comma and newline. -+ case next&(name|scalar|objectOpen|arrayOpen) != 0: -+ e.out = append(e.out, ',', '\n') -+ -+ // If next type is a closing object or array, adjust indentation. -+ case next&(objectClose|arrayClose) != 0: -+ e.indents = e.indents[:len(e.indents)-len(e.indent)] -+ e.out = append(e.out, '\n') -+ } -+ e.out = append(e.out, e.indents...) -+ -+ case e.lastKind&name != 0: -+ e.out = append(e.out, ' ') -+ // For multi-line output, add a random extra space after key: to make -+ // output unstable. -+ if detrand.Bool() { -+ e.out = append(e.out, ' ') -+ } -+ } -+} -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go b/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go -index c1866f3..a6693f0 100644 ---- a/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go -+++ b/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go -@@ -10,7 +10,7 @@ import ( - - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/errors" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - // The MessageSet wire format is equivalent to a message defined as follows, -@@ -33,6 +33,7 @@ const ( - // ExtensionName is the field name for extensions of MessageSet. - // - // A valid MessageSet extension must be of the form: -+// - // message MyMessage { - // extend proto2.bridge.MessageSet { - // optional MyMessage message_set_extension = 1234; -@@ -42,13 +43,13 @@ const ( - const ExtensionName = "message_set_extension" - - // IsMessageSet returns whether the message uses the MessageSet wire format. --func IsMessageSet(md pref.MessageDescriptor) bool { -+func IsMessageSet(md protoreflect.MessageDescriptor) bool { - xmd, ok := md.(interface{ IsMessageSet() bool }) - return ok && xmd.IsMessageSet() - } - - // IsMessageSetExtension reports this field properly extends a MessageSet. --func IsMessageSetExtension(fd pref.FieldDescriptor) bool { -+func IsMessageSetExtension(fd protoreflect.FieldDescriptor) bool { - switch { - case fd.Name() != ExtensionName: - return false -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go b/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go -index 38f1931..373d208 100644 ---- a/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go -+++ b/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go -@@ -11,10 +11,10 @@ import ( - "strconv" - "strings" - -- defval "google.golang.org/protobuf/internal/encoding/defval" -- fdesc "google.golang.org/protobuf/internal/filedesc" -+ "google.golang.org/protobuf/internal/encoding/defval" -+ "google.golang.org/protobuf/internal/filedesc" - "google.golang.org/protobuf/internal/strs" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - var byteType = reflect.TypeOf(byte(0)) -@@ -29,9 +29,9 @@ var byteType = reflect.TypeOf(byte(0)) - // This does not populate the Enum or Message (except for weak message). - // - // This function is a best effort attempt; parsing errors are ignored. --func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) pref.FieldDescriptor { -- f := new(fdesc.Field) -- f.L0.ParentFile = fdesc.SurrogateProto2 -+func Unmarshal(tag string, goType reflect.Type, evs protoreflect.EnumValueDescriptors) protoreflect.FieldDescriptor { -+ f := new(filedesc.Field) -+ f.L0.ParentFile = filedesc.SurrogateProto2 - for len(tag) > 0 { - i := strings.IndexByte(tag, ',') - if i < 0 { -@@ -39,68 +39,68 @@ func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) p - } - switch s := tag[:i]; { - case strings.HasPrefix(s, "name="): -- f.L0.FullName = pref.FullName(s[len("name="):]) -+ f.L0.FullName = protoreflect.FullName(s[len("name="):]) - case strings.Trim(s, "0123456789") == "": - n, _ := strconv.ParseUint(s, 10, 32) -- f.L1.Number = pref.FieldNumber(n) -+ f.L1.Number = protoreflect.FieldNumber(n) - case s == "opt": -- f.L1.Cardinality = pref.Optional -+ f.L1.Cardinality = protoreflect.Optional - case s == "req": -- f.L1.Cardinality = pref.Required -+ f.L1.Cardinality = protoreflect.Required - case s == "rep": -- f.L1.Cardinality = pref.Repeated -+ f.L1.Cardinality = protoreflect.Repeated - case s == "varint": - switch goType.Kind() { - case reflect.Bool: -- f.L1.Kind = pref.BoolKind -+ f.L1.Kind = protoreflect.BoolKind - case reflect.Int32: -- f.L1.Kind = pref.Int32Kind -+ f.L1.Kind = protoreflect.Int32Kind - case reflect.Int64: -- f.L1.Kind = pref.Int64Kind -+ f.L1.Kind = protoreflect.Int64Kind - case reflect.Uint32: -- f.L1.Kind = pref.Uint32Kind -+ f.L1.Kind = protoreflect.Uint32Kind - case reflect.Uint64: -- f.L1.Kind = pref.Uint64Kind -+ f.L1.Kind = protoreflect.Uint64Kind - } - case s == "zigzag32": - if goType.Kind() == reflect.Int32 { -- f.L1.Kind = pref.Sint32Kind -+ f.L1.Kind = protoreflect.Sint32Kind - } - case s == "zigzag64": - if goType.Kind() == reflect.Int64 { -- f.L1.Kind = pref.Sint64Kind -+ f.L1.Kind = protoreflect.Sint64Kind - } - case s == "fixed32": - switch goType.Kind() { - case reflect.Int32: -- f.L1.Kind = pref.Sfixed32Kind -+ f.L1.Kind = protoreflect.Sfixed32Kind - case reflect.Uint32: -- f.L1.Kind = pref.Fixed32Kind -+ f.L1.Kind = protoreflect.Fixed32Kind - case reflect.Float32: -- f.L1.Kind = pref.FloatKind -+ f.L1.Kind = protoreflect.FloatKind - } - case s == "fixed64": - switch goType.Kind() { - case reflect.Int64: -- f.L1.Kind = pref.Sfixed64Kind -+ f.L1.Kind = protoreflect.Sfixed64Kind - case reflect.Uint64: -- f.L1.Kind = pref.Fixed64Kind -+ f.L1.Kind = protoreflect.Fixed64Kind - case reflect.Float64: -- f.L1.Kind = pref.DoubleKind -+ f.L1.Kind = protoreflect.DoubleKind - } - case s == "bytes": - switch { - case goType.Kind() == reflect.String: -- f.L1.Kind = pref.StringKind -+ f.L1.Kind = protoreflect.StringKind - case goType.Kind() == reflect.Slice && goType.Elem() == byteType: -- f.L1.Kind = pref.BytesKind -+ f.L1.Kind = protoreflect.BytesKind - default: -- f.L1.Kind = pref.MessageKind -+ f.L1.Kind = protoreflect.MessageKind - } - case s == "group": -- f.L1.Kind = pref.GroupKind -+ f.L1.Kind = protoreflect.GroupKind - case strings.HasPrefix(s, "enum="): -- f.L1.Kind = pref.EnumKind -+ f.L1.Kind = protoreflect.EnumKind - case strings.HasPrefix(s, "json="): - jsonName := s[len("json="):] - if jsonName != strs.JSONCamelCase(string(f.L0.FullName.Name())) { -@@ -111,23 +111,23 @@ func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) p - f.L1.IsPacked = true - case strings.HasPrefix(s, "weak="): - f.L1.IsWeak = true -- f.L1.Message = fdesc.PlaceholderMessage(pref.FullName(s[len("weak="):])) -+ f.L1.Message = filedesc.PlaceholderMessage(protoreflect.FullName(s[len("weak="):])) - case strings.HasPrefix(s, "def="): - // The default tag is special in that everything afterwards is the - // default regardless of the presence of commas. - s, i = tag[len("def="):], len(tag) - v, ev, _ := defval.Unmarshal(s, f.L1.Kind, evs, defval.GoTag) -- f.L1.Default = fdesc.DefaultValue(v, ev) -+ f.L1.Default = filedesc.DefaultValue(v, ev) - case s == "proto3": -- f.L0.ParentFile = fdesc.SurrogateProto3 -+ f.L0.ParentFile = filedesc.SurrogateProto3 - } - tag = strings.TrimPrefix(tag[i:], ",") - } - - // The generator uses the group message name instead of the field name. - // We obtain the real field name by lowercasing the group name. -- if f.L1.Kind == pref.GroupKind { -- f.L0.FullName = pref.FullName(strings.ToLower(string(f.L0.FullName))) -+ if f.L1.Kind == protoreflect.GroupKind { -+ f.L0.FullName = protoreflect.FullName(strings.ToLower(string(f.L0.FullName))) - } - return f - } -@@ -140,38 +140,38 @@ func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) p - // Depending on the context on how Marshal is called, there are different ways - // through which that information is determined. As such it is the caller's - // responsibility to provide a function to obtain that information. --func Marshal(fd pref.FieldDescriptor, enumName string) string { -+func Marshal(fd protoreflect.FieldDescriptor, enumName string) string { - var tag []string - switch fd.Kind() { -- case pref.BoolKind, pref.EnumKind, pref.Int32Kind, pref.Uint32Kind, pref.Int64Kind, pref.Uint64Kind: -+ case protoreflect.BoolKind, protoreflect.EnumKind, protoreflect.Int32Kind, protoreflect.Uint32Kind, protoreflect.Int64Kind, protoreflect.Uint64Kind: - tag = append(tag, "varint") -- case pref.Sint32Kind: -+ case protoreflect.Sint32Kind: - tag = append(tag, "zigzag32") -- case pref.Sint64Kind: -+ case protoreflect.Sint64Kind: - tag = append(tag, "zigzag64") -- case pref.Sfixed32Kind, pref.Fixed32Kind, pref.FloatKind: -+ case protoreflect.Sfixed32Kind, protoreflect.Fixed32Kind, protoreflect.FloatKind: - tag = append(tag, "fixed32") -- case pref.Sfixed64Kind, pref.Fixed64Kind, pref.DoubleKind: -+ case protoreflect.Sfixed64Kind, protoreflect.Fixed64Kind, protoreflect.DoubleKind: - tag = append(tag, "fixed64") -- case pref.StringKind, pref.BytesKind, pref.MessageKind: -+ case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind: - tag = append(tag, "bytes") -- case pref.GroupKind: -+ case protoreflect.GroupKind: - tag = append(tag, "group") - } - tag = append(tag, strconv.Itoa(int(fd.Number()))) - switch fd.Cardinality() { -- case pref.Optional: -+ case protoreflect.Optional: - tag = append(tag, "opt") -- case pref.Required: -+ case protoreflect.Required: - tag = append(tag, "req") -- case pref.Repeated: -+ case protoreflect.Repeated: - tag = append(tag, "rep") - } - if fd.IsPacked() { - tag = append(tag, "packed") - } - name := string(fd.Name()) -- if fd.Kind() == pref.GroupKind { -+ if fd.Kind() == protoreflect.GroupKind { - // The name of the FieldDescriptor for a group field is - // lowercased. To find the original capitalization, we - // look in the field's MessageType. -@@ -189,10 +189,10 @@ func Marshal(fd pref.FieldDescriptor, enumName string) string { - // The previous implementation does not tag extension fields as proto3, - // even when the field is defined in a proto3 file. Match that behavior - // for consistency. -- if fd.Syntax() == pref.Proto3 && !fd.IsExtension() { -+ if fd.Syntax() == protoreflect.Proto3 && !fd.IsExtension() { - tag = append(tag, "proto3") - } -- if fd.Kind() == pref.EnumKind && enumName != "" { -+ if fd.Kind() == protoreflect.EnumKind && enumName != "" { - tag = append(tag, "enum="+enumName) - } - if fd.ContainingOneof() != nil { -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go -index 3780377..87853e7 100644 ---- a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go -+++ b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go -@@ -8,7 +8,6 @@ import ( - "bytes" - "fmt" - "io" -- "regexp" - "strconv" - "unicode/utf8" - -@@ -413,15 +412,16 @@ func (d *Decoder) parseFieldName() (tok Token, err error) { - // Field number. Identify if input is a valid number that is not negative - // and is decimal integer within 32-bit range. - if num := parseNumber(d.in); num.size > 0 { -+ str := num.string(d.in) - if !num.neg && num.kind == numDec { -- if _, err := strconv.ParseInt(string(d.in[:num.size]), 10, 32); err == nil { -+ if _, err := strconv.ParseInt(str, 10, 32); err == nil { - return d.consumeToken(Name, num.size, uint8(FieldNumber)), nil - } - } -- return Token{}, d.newSyntaxError("invalid field number: %s", d.in[:num.size]) -+ return Token{}, d.newSyntaxError("invalid field number: %s", str) - } - -- return Token{}, d.newSyntaxError("invalid field name: %s", errRegexp.Find(d.in)) -+ return Token{}, d.newSyntaxError("invalid field name: %s", errId(d.in)) - } - - // parseTypeName parses Any type URL or extension field name. The name is -@@ -571,7 +571,7 @@ func (d *Decoder) parseScalar() (Token, error) { - return tok, nil - } - -- return Token{}, d.newSyntaxError("invalid scalar value: %s", errRegexp.Find(d.in)) -+ return Token{}, d.newSyntaxError("invalid scalar value: %s", errId(d.in)) - } - - // parseLiteralValue parses a literal value. A literal value is used for -@@ -653,8 +653,29 @@ func consume(b []byte, n int) []byte { - return b - } - --// Any sequence that looks like a non-delimiter (for error reporting). --var errRegexp = regexp.MustCompile(`^([-+._a-zA-Z0-9\/]+|.)`) -+// errId extracts a byte sequence that looks like an invalid ID -+// (for the purposes of error reporting). -+func errId(seq []byte) []byte { -+ const maxLen = 32 -+ for i := 0; i < len(seq); { -+ if i > maxLen { -+ return append(seq[:i:i], "…"...) -+ } -+ r, size := utf8.DecodeRune(seq[i:]) -+ if r > utf8.RuneSelf || (r != '/' && isDelim(byte(r))) { -+ if i == 0 { -+ // Either the first byte is invalid UTF-8 or a -+ // delimiter, or the first rune is non-ASCII. -+ // Return it as-is. -+ i = size -+ } -+ return seq[:i:i] -+ } -+ i += size -+ } -+ // No delimiter found. -+ return seq -+} - - // isDelim returns true if given byte is a delimiter character. - func isDelim(c byte) bool { -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go b/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go -index f2d90b7..45c81f0 100644 ---- a/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go -+++ b/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go -@@ -15,17 +15,12 @@ func (d *Decoder) parseNumberValue() (Token, bool) { - if num.neg { - numAttrs |= isNegative - } -- strSize := num.size -- last := num.size - 1 -- if num.kind == numFloat && (d.in[last] == 'f' || d.in[last] == 'F') { -- strSize = last -- } - tok := Token{ - kind: Scalar, - attrs: numberValue, - pos: len(d.orig) - len(d.in), - raw: d.in[:num.size], -- str: string(d.in[:strSize]), -+ str: num.string(d.in), - numAttrs: numAttrs, - } - d.consume(num.size) -@@ -46,12 +41,35 @@ type number struct { - kind uint8 - neg bool - size int -+ // if neg, this is the length of whitespace and comments between -+ // the minus sign and the rest fo the number literal -+ sep int -+} -+ -+func (num number) string(data []byte) string { -+ strSize := num.size -+ last := num.size - 1 -+ if num.kind == numFloat && (data[last] == 'f' || data[last] == 'F') { -+ strSize = last -+ } -+ if num.neg && num.sep > 0 { -+ // strip whitespace/comments between negative sign and the rest -+ strLen := strSize - num.sep -+ str := make([]byte, strLen) -+ str[0] = data[0] -+ copy(str[1:], data[num.sep+1:strSize]) -+ return string(str) -+ } -+ return string(data[:strSize]) -+ - } - - // parseNumber constructs a number object from given input. It allows for the - // following patterns: --// integer: ^-?([1-9][0-9]*|0[xX][0-9a-fA-F]+|0[0-7]*) --// float: ^-?((0|[1-9][0-9]*)?([.][0-9]*)?([eE][+-]?[0-9]+)?[fF]?) -+// -+// integer: ^-?([1-9][0-9]*|0[xX][0-9a-fA-F]+|0[0-7]*) -+// float: ^-?((0|[1-9][0-9]*)?([.][0-9]*)?([eE][+-]?[0-9]+)?[fF]?) -+// - // It also returns the number of parsed bytes for the given number, 0 if it is - // not a number. - func parseNumber(input []byte) number { -@@ -65,19 +83,22 @@ func parseNumber(input []byte) number { - } - - // Optional - -+ var sep int - if s[0] == '-' { - neg = true - s = s[1:] - size++ -+ // Consume any whitespace or comments between the -+ // negative sign and the rest of the number -+ lenBefore := len(s) -+ s = consume(s, 0) -+ sep = lenBefore - len(s) -+ size += sep - if len(s) == 0 { - return number{} - } - } - -- // C++ allows for whitespace and comments in between the negative sign and -- // the rest of the number. This logic currently does not but is consistent -- // with v1. -- - switch { - case s[0] == '0': - if len(s) > 1 { -@@ -114,7 +135,7 @@ func parseNumber(input []byte) number { - if len(s) > 0 && !isDelim(s[0]) { - return number{} - } -- return number{kind: kind, neg: neg, size: size} -+ return number{kind: kind, neg: neg, size: size, sep: sep} - } - } - s = s[1:] -@@ -186,5 +207,5 @@ func parseNumber(input []byte) number { - return number{} - } - -- return number{kind: kind, neg: neg, size: size} -+ return number{kind: kind, neg: neg, size: size, sep: sep} - } -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go b/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go -index 0ce8d6f..7ae6c2a 100644 ---- a/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go -+++ b/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go -@@ -24,6 +24,6 @@ - // the Go implementation should as well. - // - // The text format is almost a superset of JSON except: --// * message keys are not quoted strings, but identifiers --// * the top-level value must be a message without the delimiters -+// - message keys are not quoted strings, but identifiers -+// - the top-level value must be a message without the delimiters - package text -diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/build.go b/vendor/google.golang.org/protobuf/internal/filedesc/build.go -index b293b69..7cac1c1 100644 ---- a/vendor/google.golang.org/protobuf/internal/filedesc/build.go -+++ b/vendor/google.golang.org/protobuf/internal/filedesc/build.go -@@ -12,8 +12,7 @@ import ( - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/genid" - "google.golang.org/protobuf/reflect/protoreflect" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- preg "google.golang.org/protobuf/reflect/protoregistry" -+ "google.golang.org/protobuf/reflect/protoregistry" - ) - - // Builder construct a protoreflect.FileDescriptor from the raw descriptor. -@@ -38,7 +37,7 @@ type Builder struct { - // TypeResolver resolves extension field types for descriptor options. - // If nil, it uses protoregistry.GlobalTypes. - TypeResolver interface { -- preg.ExtensionTypeResolver -+ protoregistry.ExtensionTypeResolver - } - - // FileRegistry is use to lookup file, enum, and message dependencies. -@@ -46,8 +45,8 @@ type Builder struct { - // If nil, it uses protoregistry.GlobalFiles. - FileRegistry interface { - FindFileByPath(string) (protoreflect.FileDescriptor, error) -- FindDescriptorByName(pref.FullName) (pref.Descriptor, error) -- RegisterFile(pref.FileDescriptor) error -+ FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error) -+ RegisterFile(protoreflect.FileDescriptor) error - } - } - -@@ -55,8 +54,8 @@ type Builder struct { - // If so, it permits looking up an enum or message dependency based on the - // sub-list and element index into filetype.Builder.DependencyIndexes. - type resolverByIndex interface { -- FindEnumByIndex(int32, int32, []Enum, []Message) pref.EnumDescriptor -- FindMessageByIndex(int32, int32, []Enum, []Message) pref.MessageDescriptor -+ FindEnumByIndex(int32, int32, []Enum, []Message) protoreflect.EnumDescriptor -+ FindMessageByIndex(int32, int32, []Enum, []Message) protoreflect.MessageDescriptor - } - - // Indexes of each sub-list in filetype.Builder.DependencyIndexes. -@@ -70,7 +69,7 @@ const ( - - // Out is the output of the Builder. - type Out struct { -- File pref.FileDescriptor -+ File protoreflect.FileDescriptor - - // Enums is all enum descriptors in "flattened ordering". - Enums []Enum -@@ -97,10 +96,10 @@ func (db Builder) Build() (out Out) { - - // Initialize resolvers and registries if unpopulated. - if db.TypeResolver == nil { -- db.TypeResolver = preg.GlobalTypes -+ db.TypeResolver = protoregistry.GlobalTypes - } - if db.FileRegistry == nil { -- db.FileRegistry = preg.GlobalFiles -+ db.FileRegistry = protoregistry.GlobalFiles - } - - fd := newRawFile(db) -diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go -index 98ab142..7c3689b 100644 ---- a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go -+++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go -@@ -17,7 +17,7 @@ import ( - "google.golang.org/protobuf/internal/genid" - "google.golang.org/protobuf/internal/pragma" - "google.golang.org/protobuf/internal/strs" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - ) - -@@ -43,9 +43,9 @@ type ( - L2 *FileL2 - } - FileL1 struct { -- Syntax pref.Syntax -+ Syntax protoreflect.Syntax - Path string -- Package pref.FullName -+ Package protoreflect.FullName - - Enums Enums - Messages Messages -@@ -53,36 +53,36 @@ type ( - Services Services - } - FileL2 struct { -- Options func() pref.ProtoMessage -+ Options func() protoreflect.ProtoMessage - Imports FileImports - Locations SourceLocations - } - ) - --func (fd *File) ParentFile() pref.FileDescriptor { return fd } --func (fd *File) Parent() pref.Descriptor { return nil } --func (fd *File) Index() int { return 0 } --func (fd *File) Syntax() pref.Syntax { return fd.L1.Syntax } --func (fd *File) Name() pref.Name { return fd.L1.Package.Name() } --func (fd *File) FullName() pref.FullName { return fd.L1.Package } --func (fd *File) IsPlaceholder() bool { return false } --func (fd *File) Options() pref.ProtoMessage { -+func (fd *File) ParentFile() protoreflect.FileDescriptor { return fd } -+func (fd *File) Parent() protoreflect.Descriptor { return nil } -+func (fd *File) Index() int { return 0 } -+func (fd *File) Syntax() protoreflect.Syntax { return fd.L1.Syntax } -+func (fd *File) Name() protoreflect.Name { return fd.L1.Package.Name() } -+func (fd *File) FullName() protoreflect.FullName { return fd.L1.Package } -+func (fd *File) IsPlaceholder() bool { return false } -+func (fd *File) Options() protoreflect.ProtoMessage { - if f := fd.lazyInit().Options; f != nil { - return f() - } - return descopts.File - } --func (fd *File) Path() string { return fd.L1.Path } --func (fd *File) Package() pref.FullName { return fd.L1.Package } --func (fd *File) Imports() pref.FileImports { return &fd.lazyInit().Imports } --func (fd *File) Enums() pref.EnumDescriptors { return &fd.L1.Enums } --func (fd *File) Messages() pref.MessageDescriptors { return &fd.L1.Messages } --func (fd *File) Extensions() pref.ExtensionDescriptors { return &fd.L1.Extensions } --func (fd *File) Services() pref.ServiceDescriptors { return &fd.L1.Services } --func (fd *File) SourceLocations() pref.SourceLocations { return &fd.lazyInit().Locations } --func (fd *File) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } --func (fd *File) ProtoType(pref.FileDescriptor) {} --func (fd *File) ProtoInternal(pragma.DoNotImplement) {} -+func (fd *File) Path() string { return fd.L1.Path } -+func (fd *File) Package() protoreflect.FullName { return fd.L1.Package } -+func (fd *File) Imports() protoreflect.FileImports { return &fd.lazyInit().Imports } -+func (fd *File) Enums() protoreflect.EnumDescriptors { return &fd.L1.Enums } -+func (fd *File) Messages() protoreflect.MessageDescriptors { return &fd.L1.Messages } -+func (fd *File) Extensions() protoreflect.ExtensionDescriptors { return &fd.L1.Extensions } -+func (fd *File) Services() protoreflect.ServiceDescriptors { return &fd.L1.Services } -+func (fd *File) SourceLocations() protoreflect.SourceLocations { return &fd.lazyInit().Locations } -+func (fd *File) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } -+func (fd *File) ProtoType(protoreflect.FileDescriptor) {} -+func (fd *File) ProtoInternal(pragma.DoNotImplement) {} - - func (fd *File) lazyInit() *FileL2 { - if atomic.LoadUint32(&fd.once) == 0 { -@@ -119,7 +119,7 @@ type ( - eagerValues bool // controls whether EnumL2.Values is already populated - } - EnumL2 struct { -- Options func() pref.ProtoMessage -+ Options func() protoreflect.ProtoMessage - Values EnumValues - ReservedNames Names - ReservedRanges EnumRanges -@@ -130,41 +130,41 @@ type ( - L1 EnumValueL1 - } - EnumValueL1 struct { -- Options func() pref.ProtoMessage -- Number pref.EnumNumber -+ Options func() protoreflect.ProtoMessage -+ Number protoreflect.EnumNumber - } - ) - --func (ed *Enum) Options() pref.ProtoMessage { -+func (ed *Enum) Options() protoreflect.ProtoMessage { - if f := ed.lazyInit().Options; f != nil { - return f() - } - return descopts.Enum - } --func (ed *Enum) Values() pref.EnumValueDescriptors { -+func (ed *Enum) Values() protoreflect.EnumValueDescriptors { - if ed.L1.eagerValues { - return &ed.L2.Values - } - return &ed.lazyInit().Values - } --func (ed *Enum) ReservedNames() pref.Names { return &ed.lazyInit().ReservedNames } --func (ed *Enum) ReservedRanges() pref.EnumRanges { return &ed.lazyInit().ReservedRanges } --func (ed *Enum) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } --func (ed *Enum) ProtoType(pref.EnumDescriptor) {} -+func (ed *Enum) ReservedNames() protoreflect.Names { return &ed.lazyInit().ReservedNames } -+func (ed *Enum) ReservedRanges() protoreflect.EnumRanges { return &ed.lazyInit().ReservedRanges } -+func (ed *Enum) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } -+func (ed *Enum) ProtoType(protoreflect.EnumDescriptor) {} - func (ed *Enum) lazyInit() *EnumL2 { - ed.L0.ParentFile.lazyInit() // implicitly initializes L2 - return ed.L2 - } - --func (ed *EnumValue) Options() pref.ProtoMessage { -+func (ed *EnumValue) Options() protoreflect.ProtoMessage { - if f := ed.L1.Options; f != nil { - return f() - } - return descopts.EnumValue - } --func (ed *EnumValue) Number() pref.EnumNumber { return ed.L1.Number } --func (ed *EnumValue) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } --func (ed *EnumValue) ProtoType(pref.EnumValueDescriptor) {} -+func (ed *EnumValue) Number() protoreflect.EnumNumber { return ed.L1.Number } -+func (ed *EnumValue) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } -+func (ed *EnumValue) ProtoType(protoreflect.EnumValueDescriptor) {} - - type ( - Message struct { -@@ -180,14 +180,14 @@ type ( - IsMessageSet bool // promoted from google.protobuf.MessageOptions - } - MessageL2 struct { -- Options func() pref.ProtoMessage -+ Options func() protoreflect.ProtoMessage - Fields Fields - Oneofs Oneofs - ReservedNames Names - ReservedRanges FieldRanges - RequiredNumbers FieldNumbers // must be consistent with Fields.Cardinality - ExtensionRanges FieldRanges -- ExtensionRangeOptions []func() pref.ProtoMessage // must be same length as ExtensionRanges -+ ExtensionRangeOptions []func() protoreflect.ProtoMessage // must be same length as ExtensionRanges - } - - Field struct { -@@ -195,10 +195,10 @@ type ( - L1 FieldL1 - } - FieldL1 struct { -- Options func() pref.ProtoMessage -- Number pref.FieldNumber -- Cardinality pref.Cardinality // must be consistent with Message.RequiredNumbers -- Kind pref.Kind -+ Options func() protoreflect.ProtoMessage -+ Number protoreflect.FieldNumber -+ Cardinality protoreflect.Cardinality // must be consistent with Message.RequiredNumbers -+ Kind protoreflect.Kind - StringName stringName - IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto - IsWeak bool // promoted from google.protobuf.FieldOptions -@@ -207,9 +207,9 @@ type ( - HasEnforceUTF8 bool // promoted from google.protobuf.FieldOptions - EnforceUTF8 bool // promoted from google.protobuf.FieldOptions - Default defaultValue -- ContainingOneof pref.OneofDescriptor // must be consistent with Message.Oneofs.Fields -- Enum pref.EnumDescriptor -- Message pref.MessageDescriptor -+ ContainingOneof protoreflect.OneofDescriptor // must be consistent with Message.Oneofs.Fields -+ Enum protoreflect.EnumDescriptor -+ Message protoreflect.MessageDescriptor - } - - Oneof struct { -@@ -217,35 +217,35 @@ type ( - L1 OneofL1 - } - OneofL1 struct { -- Options func() pref.ProtoMessage -+ Options func() protoreflect.ProtoMessage - Fields OneofFields // must be consistent with Message.Fields.ContainingOneof - } - ) - --func (md *Message) Options() pref.ProtoMessage { -+func (md *Message) Options() protoreflect.ProtoMessage { - if f := md.lazyInit().Options; f != nil { - return f() - } - return descopts.Message - } --func (md *Message) IsMapEntry() bool { return md.L1.IsMapEntry } --func (md *Message) Fields() pref.FieldDescriptors { return &md.lazyInit().Fields } --func (md *Message) Oneofs() pref.OneofDescriptors { return &md.lazyInit().Oneofs } --func (md *Message) ReservedNames() pref.Names { return &md.lazyInit().ReservedNames } --func (md *Message) ReservedRanges() pref.FieldRanges { return &md.lazyInit().ReservedRanges } --func (md *Message) RequiredNumbers() pref.FieldNumbers { return &md.lazyInit().RequiredNumbers } --func (md *Message) ExtensionRanges() pref.FieldRanges { return &md.lazyInit().ExtensionRanges } --func (md *Message) ExtensionRangeOptions(i int) pref.ProtoMessage { -+func (md *Message) IsMapEntry() bool { return md.L1.IsMapEntry } -+func (md *Message) Fields() protoreflect.FieldDescriptors { return &md.lazyInit().Fields } -+func (md *Message) Oneofs() protoreflect.OneofDescriptors { return &md.lazyInit().Oneofs } -+func (md *Message) ReservedNames() protoreflect.Names { return &md.lazyInit().ReservedNames } -+func (md *Message) ReservedRanges() protoreflect.FieldRanges { return &md.lazyInit().ReservedRanges } -+func (md *Message) RequiredNumbers() protoreflect.FieldNumbers { return &md.lazyInit().RequiredNumbers } -+func (md *Message) ExtensionRanges() protoreflect.FieldRanges { return &md.lazyInit().ExtensionRanges } -+func (md *Message) ExtensionRangeOptions(i int) protoreflect.ProtoMessage { - if f := md.lazyInit().ExtensionRangeOptions[i]; f != nil { - return f() - } - return descopts.ExtensionRange - } --func (md *Message) Enums() pref.EnumDescriptors { return &md.L1.Enums } --func (md *Message) Messages() pref.MessageDescriptors { return &md.L1.Messages } --func (md *Message) Extensions() pref.ExtensionDescriptors { return &md.L1.Extensions } --func (md *Message) ProtoType(pref.MessageDescriptor) {} --func (md *Message) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } -+func (md *Message) Enums() protoreflect.EnumDescriptors { return &md.L1.Enums } -+func (md *Message) Messages() protoreflect.MessageDescriptors { return &md.L1.Messages } -+func (md *Message) Extensions() protoreflect.ExtensionDescriptors { return &md.L1.Extensions } -+func (md *Message) ProtoType(protoreflect.MessageDescriptor) {} -+func (md *Message) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } - func (md *Message) lazyInit() *MessageL2 { - md.L0.ParentFile.lazyInit() // implicitly initializes L2 - return md.L2 -@@ -260,28 +260,28 @@ func (md *Message) IsMessageSet() bool { - return md.L1.IsMessageSet - } - --func (fd *Field) Options() pref.ProtoMessage { -+func (fd *Field) Options() protoreflect.ProtoMessage { - if f := fd.L1.Options; f != nil { - return f() - } - return descopts.Field - } --func (fd *Field) Number() pref.FieldNumber { return fd.L1.Number } --func (fd *Field) Cardinality() pref.Cardinality { return fd.L1.Cardinality } --func (fd *Field) Kind() pref.Kind { return fd.L1.Kind } --func (fd *Field) HasJSONName() bool { return fd.L1.StringName.hasJSON } --func (fd *Field) JSONName() string { return fd.L1.StringName.getJSON(fd) } --func (fd *Field) TextName() string { return fd.L1.StringName.getText(fd) } -+func (fd *Field) Number() protoreflect.FieldNumber { return fd.L1.Number } -+func (fd *Field) Cardinality() protoreflect.Cardinality { return fd.L1.Cardinality } -+func (fd *Field) Kind() protoreflect.Kind { return fd.L1.Kind } -+func (fd *Field) HasJSONName() bool { return fd.L1.StringName.hasJSON } -+func (fd *Field) JSONName() string { return fd.L1.StringName.getJSON(fd) } -+func (fd *Field) TextName() string { return fd.L1.StringName.getText(fd) } - func (fd *Field) HasPresence() bool { -- return fd.L1.Cardinality != pref.Repeated && (fd.L0.ParentFile.L1.Syntax == pref.Proto2 || fd.L1.Message != nil || fd.L1.ContainingOneof != nil) -+ return fd.L1.Cardinality != protoreflect.Repeated && (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 || fd.L1.Message != nil || fd.L1.ContainingOneof != nil) - } - func (fd *Field) HasOptionalKeyword() bool { -- return (fd.L0.ParentFile.L1.Syntax == pref.Proto2 && fd.L1.Cardinality == pref.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional -+ return (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && fd.L1.Cardinality == protoreflect.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional - } - func (fd *Field) IsPacked() bool { -- if !fd.L1.HasPacked && fd.L0.ParentFile.L1.Syntax != pref.Proto2 && fd.L1.Cardinality == pref.Repeated { -+ if !fd.L1.HasPacked && fd.L0.ParentFile.L1.Syntax != protoreflect.Proto2 && fd.L1.Cardinality == protoreflect.Repeated { - switch fd.L1.Kind { -- case pref.StringKind, pref.BytesKind, pref.MessageKind, pref.GroupKind: -+ case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind, protoreflect.GroupKind: - default: - return true - } -@@ -290,40 +290,40 @@ func (fd *Field) IsPacked() bool { - } - func (fd *Field) IsExtension() bool { return false } - func (fd *Field) IsWeak() bool { return fd.L1.IsWeak } --func (fd *Field) IsList() bool { return fd.Cardinality() == pref.Repeated && !fd.IsMap() } -+func (fd *Field) IsList() bool { return fd.Cardinality() == protoreflect.Repeated && !fd.IsMap() } - func (fd *Field) IsMap() bool { return fd.Message() != nil && fd.Message().IsMapEntry() } --func (fd *Field) MapKey() pref.FieldDescriptor { -+func (fd *Field) MapKey() protoreflect.FieldDescriptor { - if !fd.IsMap() { - return nil - } - return fd.Message().Fields().ByNumber(genid.MapEntry_Key_field_number) - } --func (fd *Field) MapValue() pref.FieldDescriptor { -+func (fd *Field) MapValue() protoreflect.FieldDescriptor { - if !fd.IsMap() { - return nil - } - return fd.Message().Fields().ByNumber(genid.MapEntry_Value_field_number) - } --func (fd *Field) HasDefault() bool { return fd.L1.Default.has } --func (fd *Field) Default() pref.Value { return fd.L1.Default.get(fd) } --func (fd *Field) DefaultEnumValue() pref.EnumValueDescriptor { return fd.L1.Default.enum } --func (fd *Field) ContainingOneof() pref.OneofDescriptor { return fd.L1.ContainingOneof } --func (fd *Field) ContainingMessage() pref.MessageDescriptor { -- return fd.L0.Parent.(pref.MessageDescriptor) -+func (fd *Field) HasDefault() bool { return fd.L1.Default.has } -+func (fd *Field) Default() protoreflect.Value { return fd.L1.Default.get(fd) } -+func (fd *Field) DefaultEnumValue() protoreflect.EnumValueDescriptor { return fd.L1.Default.enum } -+func (fd *Field) ContainingOneof() protoreflect.OneofDescriptor { return fd.L1.ContainingOneof } -+func (fd *Field) ContainingMessage() protoreflect.MessageDescriptor { -+ return fd.L0.Parent.(protoreflect.MessageDescriptor) - } --func (fd *Field) Enum() pref.EnumDescriptor { -+func (fd *Field) Enum() protoreflect.EnumDescriptor { - return fd.L1.Enum - } --func (fd *Field) Message() pref.MessageDescriptor { -+func (fd *Field) Message() protoreflect.MessageDescriptor { - if fd.L1.IsWeak { - if d, _ := protoregistry.GlobalFiles.FindDescriptorByName(fd.L1.Message.FullName()); d != nil { -- return d.(pref.MessageDescriptor) -+ return d.(protoreflect.MessageDescriptor) - } - } - return fd.L1.Message - } --func (fd *Field) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } --func (fd *Field) ProtoType(pref.FieldDescriptor) {} -+func (fd *Field) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } -+func (fd *Field) ProtoType(protoreflect.FieldDescriptor) {} - - // EnforceUTF8 is a pseudo-internal API to determine whether to enforce UTF-8 - // validation for the string field. This exists for Google-internal use only -@@ -336,21 +336,21 @@ func (fd *Field) EnforceUTF8() bool { - if fd.L1.HasEnforceUTF8 { - return fd.L1.EnforceUTF8 - } -- return fd.L0.ParentFile.L1.Syntax == pref.Proto3 -+ return fd.L0.ParentFile.L1.Syntax == protoreflect.Proto3 - } - - func (od *Oneof) IsSynthetic() bool { -- return od.L0.ParentFile.L1.Syntax == pref.Proto3 && len(od.L1.Fields.List) == 1 && od.L1.Fields.List[0].HasOptionalKeyword() -+ return od.L0.ParentFile.L1.Syntax == protoreflect.Proto3 && len(od.L1.Fields.List) == 1 && od.L1.Fields.List[0].HasOptionalKeyword() - } --func (od *Oneof) Options() pref.ProtoMessage { -+func (od *Oneof) Options() protoreflect.ProtoMessage { - if f := od.L1.Options; f != nil { - return f() - } - return descopts.Oneof - } --func (od *Oneof) Fields() pref.FieldDescriptors { return &od.L1.Fields } --func (od *Oneof) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, od) } --func (od *Oneof) ProtoType(pref.OneofDescriptor) {} -+func (od *Oneof) Fields() protoreflect.FieldDescriptors { return &od.L1.Fields } -+func (od *Oneof) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, od) } -+func (od *Oneof) ProtoType(protoreflect.OneofDescriptor) {} - - type ( - Extension struct { -@@ -359,55 +359,57 @@ type ( - L2 *ExtensionL2 // protected by fileDesc.once - } - ExtensionL1 struct { -- Number pref.FieldNumber -- Extendee pref.MessageDescriptor -- Cardinality pref.Cardinality -- Kind pref.Kind -+ Number protoreflect.FieldNumber -+ Extendee protoreflect.MessageDescriptor -+ Cardinality protoreflect.Cardinality -+ Kind protoreflect.Kind - } - ExtensionL2 struct { -- Options func() pref.ProtoMessage -+ Options func() protoreflect.ProtoMessage - StringName stringName - IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto - IsPacked bool // promoted from google.protobuf.FieldOptions - Default defaultValue -- Enum pref.EnumDescriptor -- Message pref.MessageDescriptor -+ Enum protoreflect.EnumDescriptor -+ Message protoreflect.MessageDescriptor - } - ) - --func (xd *Extension) Options() pref.ProtoMessage { -+func (xd *Extension) Options() protoreflect.ProtoMessage { - if f := xd.lazyInit().Options; f != nil { - return f() - } - return descopts.Field - } --func (xd *Extension) Number() pref.FieldNumber { return xd.L1.Number } --func (xd *Extension) Cardinality() pref.Cardinality { return xd.L1.Cardinality } --func (xd *Extension) Kind() pref.Kind { return xd.L1.Kind } --func (xd *Extension) HasJSONName() bool { return xd.lazyInit().StringName.hasJSON } --func (xd *Extension) JSONName() string { return xd.lazyInit().StringName.getJSON(xd) } --func (xd *Extension) TextName() string { return xd.lazyInit().StringName.getText(xd) } --func (xd *Extension) HasPresence() bool { return xd.L1.Cardinality != pref.Repeated } -+func (xd *Extension) Number() protoreflect.FieldNumber { return xd.L1.Number } -+func (xd *Extension) Cardinality() protoreflect.Cardinality { return xd.L1.Cardinality } -+func (xd *Extension) Kind() protoreflect.Kind { return xd.L1.Kind } -+func (xd *Extension) HasJSONName() bool { return xd.lazyInit().StringName.hasJSON } -+func (xd *Extension) JSONName() string { return xd.lazyInit().StringName.getJSON(xd) } -+func (xd *Extension) TextName() string { return xd.lazyInit().StringName.getText(xd) } -+func (xd *Extension) HasPresence() bool { return xd.L1.Cardinality != protoreflect.Repeated } - func (xd *Extension) HasOptionalKeyword() bool { -- return (xd.L0.ParentFile.L1.Syntax == pref.Proto2 && xd.L1.Cardinality == pref.Optional) || xd.lazyInit().IsProto3Optional --} --func (xd *Extension) IsPacked() bool { return xd.lazyInit().IsPacked } --func (xd *Extension) IsExtension() bool { return true } --func (xd *Extension) IsWeak() bool { return false } --func (xd *Extension) IsList() bool { return xd.Cardinality() == pref.Repeated } --func (xd *Extension) IsMap() bool { return false } --func (xd *Extension) MapKey() pref.FieldDescriptor { return nil } --func (xd *Extension) MapValue() pref.FieldDescriptor { return nil } --func (xd *Extension) HasDefault() bool { return xd.lazyInit().Default.has } --func (xd *Extension) Default() pref.Value { return xd.lazyInit().Default.get(xd) } --func (xd *Extension) DefaultEnumValue() pref.EnumValueDescriptor { return xd.lazyInit().Default.enum } --func (xd *Extension) ContainingOneof() pref.OneofDescriptor { return nil } --func (xd *Extension) ContainingMessage() pref.MessageDescriptor { return xd.L1.Extendee } --func (xd *Extension) Enum() pref.EnumDescriptor { return xd.lazyInit().Enum } --func (xd *Extension) Message() pref.MessageDescriptor { return xd.lazyInit().Message } --func (xd *Extension) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, xd) } --func (xd *Extension) ProtoType(pref.FieldDescriptor) {} --func (xd *Extension) ProtoInternal(pragma.DoNotImplement) {} -+ return (xd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && xd.L1.Cardinality == protoreflect.Optional) || xd.lazyInit().IsProto3Optional -+} -+func (xd *Extension) IsPacked() bool { return xd.lazyInit().IsPacked } -+func (xd *Extension) IsExtension() bool { return true } -+func (xd *Extension) IsWeak() bool { return false } -+func (xd *Extension) IsList() bool { return xd.Cardinality() == protoreflect.Repeated } -+func (xd *Extension) IsMap() bool { return false } -+func (xd *Extension) MapKey() protoreflect.FieldDescriptor { return nil } -+func (xd *Extension) MapValue() protoreflect.FieldDescriptor { return nil } -+func (xd *Extension) HasDefault() bool { return xd.lazyInit().Default.has } -+func (xd *Extension) Default() protoreflect.Value { return xd.lazyInit().Default.get(xd) } -+func (xd *Extension) DefaultEnumValue() protoreflect.EnumValueDescriptor { -+ return xd.lazyInit().Default.enum -+} -+func (xd *Extension) ContainingOneof() protoreflect.OneofDescriptor { return nil } -+func (xd *Extension) ContainingMessage() protoreflect.MessageDescriptor { return xd.L1.Extendee } -+func (xd *Extension) Enum() protoreflect.EnumDescriptor { return xd.lazyInit().Enum } -+func (xd *Extension) Message() protoreflect.MessageDescriptor { return xd.lazyInit().Message } -+func (xd *Extension) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, xd) } -+func (xd *Extension) ProtoType(protoreflect.FieldDescriptor) {} -+func (xd *Extension) ProtoInternal(pragma.DoNotImplement) {} - func (xd *Extension) lazyInit() *ExtensionL2 { - xd.L0.ParentFile.lazyInit() // implicitly initializes L2 - return xd.L2 -@@ -421,7 +423,7 @@ type ( - } - ServiceL1 struct{} - ServiceL2 struct { -- Options func() pref.ProtoMessage -+ Options func() protoreflect.ProtoMessage - Methods Methods - } - -@@ -430,48 +432,48 @@ type ( - L1 MethodL1 - } - MethodL1 struct { -- Options func() pref.ProtoMessage -- Input pref.MessageDescriptor -- Output pref.MessageDescriptor -+ Options func() protoreflect.ProtoMessage -+ Input protoreflect.MessageDescriptor -+ Output protoreflect.MessageDescriptor - IsStreamingClient bool - IsStreamingServer bool - } - ) - --func (sd *Service) Options() pref.ProtoMessage { -+func (sd *Service) Options() protoreflect.ProtoMessage { - if f := sd.lazyInit().Options; f != nil { - return f() - } - return descopts.Service - } --func (sd *Service) Methods() pref.MethodDescriptors { return &sd.lazyInit().Methods } --func (sd *Service) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, sd) } --func (sd *Service) ProtoType(pref.ServiceDescriptor) {} --func (sd *Service) ProtoInternal(pragma.DoNotImplement) {} -+func (sd *Service) Methods() protoreflect.MethodDescriptors { return &sd.lazyInit().Methods } -+func (sd *Service) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, sd) } -+func (sd *Service) ProtoType(protoreflect.ServiceDescriptor) {} -+func (sd *Service) ProtoInternal(pragma.DoNotImplement) {} - func (sd *Service) lazyInit() *ServiceL2 { - sd.L0.ParentFile.lazyInit() // implicitly initializes L2 - return sd.L2 - } - --func (md *Method) Options() pref.ProtoMessage { -+func (md *Method) Options() protoreflect.ProtoMessage { - if f := md.L1.Options; f != nil { - return f() - } - return descopts.Method - } --func (md *Method) Input() pref.MessageDescriptor { return md.L1.Input } --func (md *Method) Output() pref.MessageDescriptor { return md.L1.Output } --func (md *Method) IsStreamingClient() bool { return md.L1.IsStreamingClient } --func (md *Method) IsStreamingServer() bool { return md.L1.IsStreamingServer } --func (md *Method) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } --func (md *Method) ProtoType(pref.MethodDescriptor) {} --func (md *Method) ProtoInternal(pragma.DoNotImplement) {} -+func (md *Method) Input() protoreflect.MessageDescriptor { return md.L1.Input } -+func (md *Method) Output() protoreflect.MessageDescriptor { return md.L1.Output } -+func (md *Method) IsStreamingClient() bool { return md.L1.IsStreamingClient } -+func (md *Method) IsStreamingServer() bool { return md.L1.IsStreamingServer } -+func (md *Method) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } -+func (md *Method) ProtoType(protoreflect.MethodDescriptor) {} -+func (md *Method) ProtoInternal(pragma.DoNotImplement) {} - - // Surrogate files are can be used to create standalone descriptors - // where the syntax is only information derived from the parent file. - var ( -- SurrogateProto2 = &File{L1: FileL1{Syntax: pref.Proto2}, L2: &FileL2{}} -- SurrogateProto3 = &File{L1: FileL1{Syntax: pref.Proto3}, L2: &FileL2{}} -+ SurrogateProto2 = &File{L1: FileL1{Syntax: protoreflect.Proto2}, L2: &FileL2{}} -+ SurrogateProto3 = &File{L1: FileL1{Syntax: protoreflect.Proto3}, L2: &FileL2{}} - ) - - type ( -@@ -479,24 +481,24 @@ type ( - L0 BaseL0 - } - BaseL0 struct { -- FullName pref.FullName // must be populated -- ParentFile *File // must be populated -- Parent pref.Descriptor -+ FullName protoreflect.FullName // must be populated -+ ParentFile *File // must be populated -+ Parent protoreflect.Descriptor - Index int - } - ) - --func (d *Base) Name() pref.Name { return d.L0.FullName.Name() } --func (d *Base) FullName() pref.FullName { return d.L0.FullName } --func (d *Base) ParentFile() pref.FileDescriptor { -+func (d *Base) Name() protoreflect.Name { return d.L0.FullName.Name() } -+func (d *Base) FullName() protoreflect.FullName { return d.L0.FullName } -+func (d *Base) ParentFile() protoreflect.FileDescriptor { - if d.L0.ParentFile == SurrogateProto2 || d.L0.ParentFile == SurrogateProto3 { - return nil // surrogate files are not real parents - } - return d.L0.ParentFile - } --func (d *Base) Parent() pref.Descriptor { return d.L0.Parent } -+func (d *Base) Parent() protoreflect.Descriptor { return d.L0.Parent } - func (d *Base) Index() int { return d.L0.Index } --func (d *Base) Syntax() pref.Syntax { return d.L0.ParentFile.Syntax() } -+func (d *Base) Syntax() protoreflect.Syntax { return d.L0.ParentFile.Syntax() } - func (d *Base) IsPlaceholder() bool { return false } - func (d *Base) ProtoInternal(pragma.DoNotImplement) {} - -@@ -513,7 +515,7 @@ func (s *stringName) InitJSON(name string) { - s.nameJSON = name - } - --func (s *stringName) lazyInit(fd pref.FieldDescriptor) *stringName { -+func (s *stringName) lazyInit(fd protoreflect.FieldDescriptor) *stringName { - s.once.Do(func() { - if fd.IsExtension() { - // For extensions, JSON and text are formatted the same way. -@@ -533,7 +535,7 @@ func (s *stringName) lazyInit(fd pref.FieldDescriptor) *stringName { - - // Format the text name. - s.nameText = string(fd.Name()) -- if fd.Kind() == pref.GroupKind { -+ if fd.Kind() == protoreflect.GroupKind { - s.nameText = string(fd.Message().Name()) - } - } -@@ -541,10 +543,10 @@ func (s *stringName) lazyInit(fd pref.FieldDescriptor) *stringName { - return s - } - --func (s *stringName) getJSON(fd pref.FieldDescriptor) string { return s.lazyInit(fd).nameJSON } --func (s *stringName) getText(fd pref.FieldDescriptor) string { return s.lazyInit(fd).nameText } -+func (s *stringName) getJSON(fd protoreflect.FieldDescriptor) string { return s.lazyInit(fd).nameJSON } -+func (s *stringName) getText(fd protoreflect.FieldDescriptor) string { return s.lazyInit(fd).nameText } - --func DefaultValue(v pref.Value, ev pref.EnumValueDescriptor) defaultValue { -+func DefaultValue(v protoreflect.Value, ev protoreflect.EnumValueDescriptor) defaultValue { - dv := defaultValue{has: v.IsValid(), val: v, enum: ev} - if b, ok := v.Interface().([]byte); ok { - // Store a copy of the default bytes, so that we can detect -@@ -554,9 +556,9 @@ func DefaultValue(v pref.Value, ev pref.EnumValueDescriptor) defaultValue { - return dv - } - --func unmarshalDefault(b []byte, k pref.Kind, pf *File, ed pref.EnumDescriptor) defaultValue { -- var evs pref.EnumValueDescriptors -- if k == pref.EnumKind { -+func unmarshalDefault(b []byte, k protoreflect.Kind, pf *File, ed protoreflect.EnumDescriptor) defaultValue { -+ var evs protoreflect.EnumValueDescriptors -+ if k == protoreflect.EnumKind { - // If the enum is declared within the same file, be careful not to - // blindly call the Values method, lest we bind ourselves in a deadlock. - if e, ok := ed.(*Enum); ok && e.L0.ParentFile == pf { -@@ -567,9 +569,9 @@ func unmarshalDefault(b []byte, k pref.Kind, pf *File, ed pref.EnumDescriptor) d - - // If we are unable to resolve the enum dependency, use a placeholder - // enum value since we will not be able to parse the default value. -- if ed.IsPlaceholder() && pref.Name(b).IsValid() { -- v := pref.ValueOfEnum(0) -- ev := PlaceholderEnumValue(ed.FullName().Parent().Append(pref.Name(b))) -+ if ed.IsPlaceholder() && protoreflect.Name(b).IsValid() { -+ v := protoreflect.ValueOfEnum(0) -+ ev := PlaceholderEnumValue(ed.FullName().Parent().Append(protoreflect.Name(b))) - return DefaultValue(v, ev) - } - } -@@ -583,41 +585,41 @@ func unmarshalDefault(b []byte, k pref.Kind, pf *File, ed pref.EnumDescriptor) d - - type defaultValue struct { - has bool -- val pref.Value -- enum pref.EnumValueDescriptor -+ val protoreflect.Value -+ enum protoreflect.EnumValueDescriptor - bytes []byte - } - --func (dv *defaultValue) get(fd pref.FieldDescriptor) pref.Value { -+func (dv *defaultValue) get(fd protoreflect.FieldDescriptor) protoreflect.Value { - // Return the zero value as the default if unpopulated. - if !dv.has { -- if fd.Cardinality() == pref.Repeated { -- return pref.Value{} -+ if fd.Cardinality() == protoreflect.Repeated { -+ return protoreflect.Value{} - } - switch fd.Kind() { -- case pref.BoolKind: -- return pref.ValueOfBool(false) -- case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: -- return pref.ValueOfInt32(0) -- case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: -- return pref.ValueOfInt64(0) -- case pref.Uint32Kind, pref.Fixed32Kind: -- return pref.ValueOfUint32(0) -- case pref.Uint64Kind, pref.Fixed64Kind: -- return pref.ValueOfUint64(0) -- case pref.FloatKind: -- return pref.ValueOfFloat32(0) -- case pref.DoubleKind: -- return pref.ValueOfFloat64(0) -- case pref.StringKind: -- return pref.ValueOfString("") -- case pref.BytesKind: -- return pref.ValueOfBytes(nil) -- case pref.EnumKind: -+ case protoreflect.BoolKind: -+ return protoreflect.ValueOfBool(false) -+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: -+ return protoreflect.ValueOfInt32(0) -+ case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: -+ return protoreflect.ValueOfInt64(0) -+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: -+ return protoreflect.ValueOfUint32(0) -+ case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: -+ return protoreflect.ValueOfUint64(0) -+ case protoreflect.FloatKind: -+ return protoreflect.ValueOfFloat32(0) -+ case protoreflect.DoubleKind: -+ return protoreflect.ValueOfFloat64(0) -+ case protoreflect.StringKind: -+ return protoreflect.ValueOfString("") -+ case protoreflect.BytesKind: -+ return protoreflect.ValueOfBytes(nil) -+ case protoreflect.EnumKind: - if evs := fd.Enum().Values(); evs.Len() > 0 { -- return pref.ValueOfEnum(evs.Get(0).Number()) -+ return protoreflect.ValueOfEnum(evs.Get(0).Number()) - } -- return pref.ValueOfEnum(0) -+ return protoreflect.ValueOfEnum(0) - } - } - -diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go -index 66e1fee..4a1584c 100644 ---- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go -+++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go -@@ -10,7 +10,7 @@ import ( - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/genid" - "google.golang.org/protobuf/internal/strs" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - // fileRaw is a data struct used when initializing a file descriptor from -@@ -95,7 +95,7 @@ func (fd *File) unmarshalSeed(b []byte) { - sb := getBuilder() - defer putBuilder(sb) - -- var prevField pref.FieldNumber -+ var prevField protoreflect.FieldNumber - var numEnums, numMessages, numExtensions, numServices int - var posEnums, posMessages, posExtensions, posServices int - b0 := b -@@ -110,16 +110,16 @@ func (fd *File) unmarshalSeed(b []byte) { - case genid.FileDescriptorProto_Syntax_field_number: - switch string(v) { - case "proto2": -- fd.L1.Syntax = pref.Proto2 -+ fd.L1.Syntax = protoreflect.Proto2 - case "proto3": -- fd.L1.Syntax = pref.Proto3 -+ fd.L1.Syntax = protoreflect.Proto3 - default: - panic("invalid syntax") - } - case genid.FileDescriptorProto_Name_field_number: - fd.L1.Path = sb.MakeString(v) - case genid.FileDescriptorProto_Package_field_number: -- fd.L1.Package = pref.FullName(sb.MakeString(v)) -+ fd.L1.Package = protoreflect.FullName(sb.MakeString(v)) - case genid.FileDescriptorProto_EnumType_field_number: - if prevField != genid.FileDescriptorProto_EnumType_field_number { - if numEnums > 0 { -@@ -163,7 +163,7 @@ func (fd *File) unmarshalSeed(b []byte) { - - // If syntax is missing, it is assumed to be proto2. - if fd.L1.Syntax == 0 { -- fd.L1.Syntax = pref.Proto2 -+ fd.L1.Syntax = protoreflect.Proto2 - } - - // Must allocate all declarations before parsing each descriptor type -@@ -219,7 +219,7 @@ func (fd *File) unmarshalSeed(b []byte) { - } - } - --func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { -+func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { - ed.L0.ParentFile = pf - ed.L0.Parent = pd - ed.L0.Index = i -@@ -271,12 +271,12 @@ func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Desc - } - } - --func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { -+func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { - md.L0.ParentFile = pf - md.L0.Parent = pd - md.L0.Index = i - -- var prevField pref.FieldNumber -+ var prevField protoreflect.FieldNumber - var numEnums, numMessages, numExtensions int - var posEnums, posMessages, posExtensions int - b0 := b -@@ -387,7 +387,7 @@ func (md *Message) unmarshalSeedOptions(b []byte) { - } - } - --func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { -+func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { - xd.L0.ParentFile = pf - xd.L0.Parent = pd - xd.L0.Index = i -@@ -401,11 +401,11 @@ func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref - b = b[m:] - switch num { - case genid.FieldDescriptorProto_Number_field_number: -- xd.L1.Number = pref.FieldNumber(v) -+ xd.L1.Number = protoreflect.FieldNumber(v) - case genid.FieldDescriptorProto_Label_field_number: -- xd.L1.Cardinality = pref.Cardinality(v) -+ xd.L1.Cardinality = protoreflect.Cardinality(v) - case genid.FieldDescriptorProto_Type_field_number: -- xd.L1.Kind = pref.Kind(v) -+ xd.L1.Kind = protoreflect.Kind(v) - } - case protowire.BytesType: - v, m := protowire.ConsumeBytes(b) -@@ -423,7 +423,7 @@ func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref - } - } - --func (sd *Service) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { -+func (sd *Service) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { - sd.L0.ParentFile = pf - sd.L0.Parent = pd - sd.L0.Index = i -@@ -459,13 +459,13 @@ func putBuilder(b *strs.Builder) { - - // makeFullName converts b to a protoreflect.FullName, - // where b must start with a leading dot. --func makeFullName(sb *strs.Builder, b []byte) pref.FullName { -+func makeFullName(sb *strs.Builder, b []byte) protoreflect.FullName { - if len(b) == 0 || b[0] != '.' { - panic("name reference must be fully qualified") - } -- return pref.FullName(sb.MakeString(b[1:])) -+ return protoreflect.FullName(sb.MakeString(b[1:])) - } - --func appendFullName(sb *strs.Builder, prefix pref.FullName, suffix []byte) pref.FullName { -- return sb.AppendFullName(prefix, pref.Name(strs.UnsafeString(suffix))) -+func appendFullName(sb *strs.Builder, prefix protoreflect.FullName, suffix []byte) protoreflect.FullName { -+ return sb.AppendFullName(prefix, protoreflect.Name(strs.UnsafeString(suffix))) - } -diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go -index 198451e..736a19a 100644 ---- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go -+++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go -@@ -13,7 +13,7 @@ import ( - "google.golang.org/protobuf/internal/genid" - "google.golang.org/protobuf/internal/strs" - "google.golang.org/protobuf/proto" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - func (fd *File) lazyRawInit() { -@@ -39,10 +39,10 @@ func (file *File) resolveMessages() { - - // Resolve message field dependency. - switch fd.L1.Kind { -- case pref.EnumKind: -+ case protoreflect.EnumKind: - fd.L1.Enum = file.resolveEnumDependency(fd.L1.Enum, listFieldDeps, depIdx) - depIdx++ -- case pref.MessageKind, pref.GroupKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind: - fd.L1.Message = file.resolveMessageDependency(fd.L1.Message, listFieldDeps, depIdx) - depIdx++ - } -@@ -62,10 +62,10 @@ func (file *File) resolveExtensions() { - - // Resolve extension field dependency. - switch xd.L1.Kind { -- case pref.EnumKind: -+ case protoreflect.EnumKind: - xd.L2.Enum = file.resolveEnumDependency(xd.L2.Enum, listExtDeps, depIdx) - depIdx++ -- case pref.MessageKind, pref.GroupKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind: - xd.L2.Message = file.resolveMessageDependency(xd.L2.Message, listExtDeps, depIdx) - depIdx++ - } -@@ -92,7 +92,7 @@ func (file *File) resolveServices() { - } - } - --func (file *File) resolveEnumDependency(ed pref.EnumDescriptor, i, j int32) pref.EnumDescriptor { -+func (file *File) resolveEnumDependency(ed protoreflect.EnumDescriptor, i, j int32) protoreflect.EnumDescriptor { - r := file.builder.FileRegistry - if r, ok := r.(resolverByIndex); ok { - if ed2 := r.FindEnumByIndex(i, j, file.allEnums, file.allMessages); ed2 != nil { -@@ -105,12 +105,12 @@ func (file *File) resolveEnumDependency(ed pref.EnumDescriptor, i, j int32) pref - } - } - if d, _ := r.FindDescriptorByName(ed.FullName()); d != nil { -- return d.(pref.EnumDescriptor) -+ return d.(protoreflect.EnumDescriptor) - } - return ed - } - --func (file *File) resolveMessageDependency(md pref.MessageDescriptor, i, j int32) pref.MessageDescriptor { -+func (file *File) resolveMessageDependency(md protoreflect.MessageDescriptor, i, j int32) protoreflect.MessageDescriptor { - r := file.builder.FileRegistry - if r, ok := r.(resolverByIndex); ok { - if md2 := r.FindMessageByIndex(i, j, file.allEnums, file.allMessages); md2 != nil { -@@ -123,7 +123,7 @@ func (file *File) resolveMessageDependency(md pref.MessageDescriptor, i, j int32 - } - } - if d, _ := r.FindDescriptorByName(md.FullName()); d != nil { -- return d.(pref.MessageDescriptor) -+ return d.(protoreflect.MessageDescriptor) - } - return md - } -@@ -158,7 +158,7 @@ func (fd *File) unmarshalFull(b []byte) { - if imp == nil { - imp = PlaceholderFile(path) - } -- fd.L2.Imports = append(fd.L2.Imports, pref.FileImport{FileDescriptor: imp}) -+ fd.L2.Imports = append(fd.L2.Imports, protoreflect.FileImport{FileDescriptor: imp}) - case genid.FileDescriptorProto_EnumType_field_number: - fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb) - enumIdx++ -@@ -199,7 +199,7 @@ func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) { - case genid.EnumDescriptorProto_Value_field_number: - rawValues = append(rawValues, v) - case genid.EnumDescriptorProto_ReservedName_field_number: -- ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, pref.Name(sb.MakeString(v))) -+ ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v))) - case genid.EnumDescriptorProto_ReservedRange_field_number: - ed.L2.ReservedRanges.List = append(ed.L2.ReservedRanges.List, unmarshalEnumReservedRange(v)) - case genid.EnumDescriptorProto_Options_field_number: -@@ -219,7 +219,7 @@ func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) { - ed.L2.Options = ed.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Enum, rawOptions) - } - --func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) { -+func unmarshalEnumReservedRange(b []byte) (r [2]protoreflect.EnumNumber) { - for len(b) > 0 { - num, typ, n := protowire.ConsumeTag(b) - b = b[n:] -@@ -229,9 +229,9 @@ func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) { - b = b[m:] - switch num { - case genid.EnumDescriptorProto_EnumReservedRange_Start_field_number: -- r[0] = pref.EnumNumber(v) -+ r[0] = protoreflect.EnumNumber(v) - case genid.EnumDescriptorProto_EnumReservedRange_End_field_number: -- r[1] = pref.EnumNumber(v) -+ r[1] = protoreflect.EnumNumber(v) - } - default: - m := protowire.ConsumeFieldValue(num, typ, b) -@@ -241,7 +241,7 @@ func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) { - return r - } - --func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { -+func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { - vd.L0.ParentFile = pf - vd.L0.Parent = pd - vd.L0.Index = i -@@ -256,7 +256,7 @@ func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref - b = b[m:] - switch num { - case genid.EnumValueDescriptorProto_Number_field_number: -- vd.L1.Number = pref.EnumNumber(v) -+ vd.L1.Number = protoreflect.EnumNumber(v) - } - case protowire.BytesType: - v, m := protowire.ConsumeBytes(b) -@@ -294,7 +294,7 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) { - case genid.DescriptorProto_OneofDecl_field_number: - rawOneofs = append(rawOneofs, v) - case genid.DescriptorProto_ReservedName_field_number: -- md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, pref.Name(sb.MakeString(v))) -+ md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v))) - case genid.DescriptorProto_ReservedRange_field_number: - md.L2.ReservedRanges.List = append(md.L2.ReservedRanges.List, unmarshalMessageReservedRange(v)) - case genid.DescriptorProto_ExtensionRange_field_number: -@@ -326,7 +326,7 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) { - for i, b := range rawFields { - fd := &md.L2.Fields.List[i] - fd.unmarshalFull(b, sb, md.L0.ParentFile, md, i) -- if fd.L1.Cardinality == pref.Required { -+ if fd.L1.Cardinality == protoreflect.Required { - md.L2.RequiredNumbers.List = append(md.L2.RequiredNumbers.List, fd.L1.Number) - } - } -@@ -359,7 +359,7 @@ func (md *Message) unmarshalOptions(b []byte) { - } - } - --func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) { -+func unmarshalMessageReservedRange(b []byte) (r [2]protoreflect.FieldNumber) { - for len(b) > 0 { - num, typ, n := protowire.ConsumeTag(b) - b = b[n:] -@@ -369,9 +369,9 @@ func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) { - b = b[m:] - switch num { - case genid.DescriptorProto_ReservedRange_Start_field_number: -- r[0] = pref.FieldNumber(v) -+ r[0] = protoreflect.FieldNumber(v) - case genid.DescriptorProto_ReservedRange_End_field_number: -- r[1] = pref.FieldNumber(v) -+ r[1] = protoreflect.FieldNumber(v) - } - default: - m := protowire.ConsumeFieldValue(num, typ, b) -@@ -381,7 +381,7 @@ func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) { - return r - } - --func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions []byte) { -+func unmarshalMessageExtensionRange(b []byte) (r [2]protoreflect.FieldNumber, rawOptions []byte) { - for len(b) > 0 { - num, typ, n := protowire.ConsumeTag(b) - b = b[n:] -@@ -391,9 +391,9 @@ func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions - b = b[m:] - switch num { - case genid.DescriptorProto_ExtensionRange_Start_field_number: -- r[0] = pref.FieldNumber(v) -+ r[0] = protoreflect.FieldNumber(v) - case genid.DescriptorProto_ExtensionRange_End_field_number: -- r[1] = pref.FieldNumber(v) -+ r[1] = protoreflect.FieldNumber(v) - } - case protowire.BytesType: - v, m := protowire.ConsumeBytes(b) -@@ -410,7 +410,7 @@ func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions - return r, rawOptions - } - --func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { -+func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { - fd.L0.ParentFile = pf - fd.L0.Parent = pd - fd.L0.Index = i -@@ -426,11 +426,11 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des - b = b[m:] - switch num { - case genid.FieldDescriptorProto_Number_field_number: -- fd.L1.Number = pref.FieldNumber(v) -+ fd.L1.Number = protoreflect.FieldNumber(v) - case genid.FieldDescriptorProto_Label_field_number: -- fd.L1.Cardinality = pref.Cardinality(v) -+ fd.L1.Cardinality = protoreflect.Cardinality(v) - case genid.FieldDescriptorProto_Type_field_number: -- fd.L1.Kind = pref.Kind(v) -+ fd.L1.Kind = protoreflect.Kind(v) - case genid.FieldDescriptorProto_OneofIndex_field_number: - // In Message.unmarshalFull, we allocate slices for both - // the field and oneof descriptors before unmarshaling either -@@ -453,7 +453,7 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des - case genid.FieldDescriptorProto_JsonName_field_number: - fd.L1.StringName.InitJSON(sb.MakeString(v)) - case genid.FieldDescriptorProto_DefaultValue_field_number: -- fd.L1.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages -+ fd.L1.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages - case genid.FieldDescriptorProto_TypeName_field_number: - rawTypeName = v - case genid.FieldDescriptorProto_Options_field_number: -@@ -468,9 +468,9 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des - if rawTypeName != nil { - name := makeFullName(sb, rawTypeName) - switch fd.L1.Kind { -- case pref.EnumKind: -+ case protoreflect.EnumKind: - fd.L1.Enum = PlaceholderEnum(name) -- case pref.MessageKind, pref.GroupKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind: - fd.L1.Message = PlaceholderMessage(name) - } - } -@@ -504,7 +504,7 @@ func (fd *Field) unmarshalOptions(b []byte) { - } - } - --func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { -+func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { - od.L0.ParentFile = pf - od.L0.Parent = pd - od.L0.Index = i -@@ -553,7 +553,7 @@ func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) { - case genid.FieldDescriptorProto_JsonName_field_number: - xd.L2.StringName.InitJSON(sb.MakeString(v)) - case genid.FieldDescriptorProto_DefaultValue_field_number: -- xd.L2.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions -+ xd.L2.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions - case genid.FieldDescriptorProto_TypeName_field_number: - rawTypeName = v - case genid.FieldDescriptorProto_Options_field_number: -@@ -568,9 +568,9 @@ func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) { - if rawTypeName != nil { - name := makeFullName(sb, rawTypeName) - switch xd.L1.Kind { -- case pref.EnumKind: -+ case protoreflect.EnumKind: - xd.L2.Enum = PlaceholderEnum(name) -- case pref.MessageKind, pref.GroupKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind: - xd.L2.Message = PlaceholderMessage(name) - } - } -@@ -627,7 +627,7 @@ func (sd *Service) unmarshalFull(b []byte, sb *strs.Builder) { - sd.L2.Options = sd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Service, rawOptions) - } - --func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { -+func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { - md.L0.ParentFile = pf - md.L0.Parent = pd - md.L0.Index = i -@@ -680,18 +680,18 @@ func appendOptions(dst, src []byte) []byte { - // - // The type of message to unmarshal to is passed as a pointer since the - // vars in descopts may not yet be populated at the time this function is called. --func (db *Builder) optionsUnmarshaler(p *pref.ProtoMessage, b []byte) func() pref.ProtoMessage { -+func (db *Builder) optionsUnmarshaler(p *protoreflect.ProtoMessage, b []byte) func() protoreflect.ProtoMessage { - if b == nil { - return nil - } -- var opts pref.ProtoMessage -+ var opts protoreflect.ProtoMessage - var once sync.Once -- return func() pref.ProtoMessage { -+ return func() protoreflect.ProtoMessage { - once.Do(func() { - if *p == nil { - panic("Descriptor.Options called without importing the descriptor package") - } -- opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(pref.ProtoMessage) -+ opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(protoreflect.ProtoMessage) - if err := (proto.UnmarshalOptions{ - AllowPartial: true, - Resolver: db.TypeResolver, -diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go -index aa294ff..e3b6587 100644 ---- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go -+++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go -@@ -17,31 +17,30 @@ import ( - "google.golang.org/protobuf/internal/errors" - "google.golang.org/protobuf/internal/pragma" - "google.golang.org/protobuf/reflect/protoreflect" -- pref "google.golang.org/protobuf/reflect/protoreflect" - ) - --type FileImports []pref.FileImport -+type FileImports []protoreflect.FileImport - - func (p *FileImports) Len() int { return len(*p) } --func (p *FileImports) Get(i int) pref.FileImport { return (*p)[i] } -+func (p *FileImports) Get(i int) protoreflect.FileImport { return (*p)[i] } - func (p *FileImports) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } - func (p *FileImports) ProtoInternal(pragma.DoNotImplement) {} - - type Names struct { -- List []pref.Name -+ List []protoreflect.Name - once sync.Once -- has map[pref.Name]int // protected by once -+ has map[protoreflect.Name]int // protected by once - } - - func (p *Names) Len() int { return len(p.List) } --func (p *Names) Get(i int) pref.Name { return p.List[i] } --func (p *Names) Has(s pref.Name) bool { return p.lazyInit().has[s] > 0 } -+func (p *Names) Get(i int) protoreflect.Name { return p.List[i] } -+func (p *Names) Has(s protoreflect.Name) bool { return p.lazyInit().has[s] > 0 } - func (p *Names) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } - func (p *Names) ProtoInternal(pragma.DoNotImplement) {} - func (p *Names) lazyInit() *Names { - p.once.Do(func() { - if len(p.List) > 0 { -- p.has = make(map[pref.Name]int, len(p.List)) -+ p.has = make(map[protoreflect.Name]int, len(p.List)) - for _, s := range p.List { - p.has[s] = p.has[s] + 1 - } -@@ -67,14 +66,14 @@ func (p *Names) CheckValid() error { - } - - type EnumRanges struct { -- List [][2]pref.EnumNumber // start inclusive; end inclusive -+ List [][2]protoreflect.EnumNumber // start inclusive; end inclusive - once sync.Once -- sorted [][2]pref.EnumNumber // protected by once -+ sorted [][2]protoreflect.EnumNumber // protected by once - } - --func (p *EnumRanges) Len() int { return len(p.List) } --func (p *EnumRanges) Get(i int) [2]pref.EnumNumber { return p.List[i] } --func (p *EnumRanges) Has(n pref.EnumNumber) bool { -+func (p *EnumRanges) Len() int { return len(p.List) } -+func (p *EnumRanges) Get(i int) [2]protoreflect.EnumNumber { return p.List[i] } -+func (p *EnumRanges) Has(n protoreflect.EnumNumber) bool { - for ls := p.lazyInit().sorted; len(ls) > 0; { - i := len(ls) / 2 - switch r := enumRange(ls[i]); { -@@ -129,14 +128,14 @@ func (r enumRange) String() string { - } - - type FieldRanges struct { -- List [][2]pref.FieldNumber // start inclusive; end exclusive -+ List [][2]protoreflect.FieldNumber // start inclusive; end exclusive - once sync.Once -- sorted [][2]pref.FieldNumber // protected by once -+ sorted [][2]protoreflect.FieldNumber // protected by once - } - --func (p *FieldRanges) Len() int { return len(p.List) } --func (p *FieldRanges) Get(i int) [2]pref.FieldNumber { return p.List[i] } --func (p *FieldRanges) Has(n pref.FieldNumber) bool { -+func (p *FieldRanges) Len() int { return len(p.List) } -+func (p *FieldRanges) Get(i int) [2]protoreflect.FieldNumber { return p.List[i] } -+func (p *FieldRanges) Has(n protoreflect.FieldNumber) bool { - for ls := p.lazyInit().sorted; len(ls) > 0; { - i := len(ls) / 2 - switch r := fieldRange(ls[i]); { -@@ -221,17 +220,17 @@ func (r fieldRange) String() string { - } - - type FieldNumbers struct { -- List []pref.FieldNumber -+ List []protoreflect.FieldNumber - once sync.Once -- has map[pref.FieldNumber]struct{} // protected by once -+ has map[protoreflect.FieldNumber]struct{} // protected by once - } - --func (p *FieldNumbers) Len() int { return len(p.List) } --func (p *FieldNumbers) Get(i int) pref.FieldNumber { return p.List[i] } --func (p *FieldNumbers) Has(n pref.FieldNumber) bool { -+func (p *FieldNumbers) Len() int { return len(p.List) } -+func (p *FieldNumbers) Get(i int) protoreflect.FieldNumber { return p.List[i] } -+func (p *FieldNumbers) Has(n protoreflect.FieldNumber) bool { - p.once.Do(func() { - if len(p.List) > 0 { -- p.has = make(map[pref.FieldNumber]struct{}, len(p.List)) -+ p.has = make(map[protoreflect.FieldNumber]struct{}, len(p.List)) - for _, n := range p.List { - p.has[n] = struct{}{} - } -@@ -244,30 +243,38 @@ func (p *FieldNumbers) Format(s fmt.State, r rune) { descfmt.FormatList - func (p *FieldNumbers) ProtoInternal(pragma.DoNotImplement) {} - - type OneofFields struct { -- List []pref.FieldDescriptor -+ List []protoreflect.FieldDescriptor - once sync.Once -- byName map[pref.Name]pref.FieldDescriptor // protected by once -- byJSON map[string]pref.FieldDescriptor // protected by once -- byText map[string]pref.FieldDescriptor // protected by once -- byNum map[pref.FieldNumber]pref.FieldDescriptor // protected by once -+ byName map[protoreflect.Name]protoreflect.FieldDescriptor // protected by once -+ byJSON map[string]protoreflect.FieldDescriptor // protected by once -+ byText map[string]protoreflect.FieldDescriptor // protected by once -+ byNum map[protoreflect.FieldNumber]protoreflect.FieldDescriptor // protected by once - } - --func (p *OneofFields) Len() int { return len(p.List) } --func (p *OneofFields) Get(i int) pref.FieldDescriptor { return p.List[i] } --func (p *OneofFields) ByName(s pref.Name) pref.FieldDescriptor { return p.lazyInit().byName[s] } --func (p *OneofFields) ByJSONName(s string) pref.FieldDescriptor { return p.lazyInit().byJSON[s] } --func (p *OneofFields) ByTextName(s string) pref.FieldDescriptor { return p.lazyInit().byText[s] } --func (p *OneofFields) ByNumber(n pref.FieldNumber) pref.FieldDescriptor { return p.lazyInit().byNum[n] } --func (p *OneofFields) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } --func (p *OneofFields) ProtoInternal(pragma.DoNotImplement) {} -+func (p *OneofFields) Len() int { return len(p.List) } -+func (p *OneofFields) Get(i int) protoreflect.FieldDescriptor { return p.List[i] } -+func (p *OneofFields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor { -+ return p.lazyInit().byName[s] -+} -+func (p *OneofFields) ByJSONName(s string) protoreflect.FieldDescriptor { -+ return p.lazyInit().byJSON[s] -+} -+func (p *OneofFields) ByTextName(s string) protoreflect.FieldDescriptor { -+ return p.lazyInit().byText[s] -+} -+func (p *OneofFields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor { -+ return p.lazyInit().byNum[n] -+} -+func (p *OneofFields) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } -+func (p *OneofFields) ProtoInternal(pragma.DoNotImplement) {} - - func (p *OneofFields) lazyInit() *OneofFields { - p.once.Do(func() { - if len(p.List) > 0 { -- p.byName = make(map[pref.Name]pref.FieldDescriptor, len(p.List)) -- p.byJSON = make(map[string]pref.FieldDescriptor, len(p.List)) -- p.byText = make(map[string]pref.FieldDescriptor, len(p.List)) -- p.byNum = make(map[pref.FieldNumber]pref.FieldDescriptor, len(p.List)) -+ p.byName = make(map[protoreflect.Name]protoreflect.FieldDescriptor, len(p.List)) -+ p.byJSON = make(map[string]protoreflect.FieldDescriptor, len(p.List)) -+ p.byText = make(map[string]protoreflect.FieldDescriptor, len(p.List)) -+ p.byNum = make(map[protoreflect.FieldNumber]protoreflect.FieldDescriptor, len(p.List)) - for _, f := range p.List { - // Field names and numbers are guaranteed to be unique. - p.byName[f.Name()] = f -@@ -284,123 +291,123 @@ type SourceLocations struct { - // List is a list of SourceLocations. - // The SourceLocation.Next field does not need to be populated - // as it will be lazily populated upon first need. -- List []pref.SourceLocation -+ List []protoreflect.SourceLocation - - // File is the parent file descriptor that these locations are relative to. - // If non-nil, ByDescriptor verifies that the provided descriptor - // is a child of this file descriptor. -- File pref.FileDescriptor -+ File protoreflect.FileDescriptor - - once sync.Once - byPath map[pathKey]int - } - --func (p *SourceLocations) Len() int { return len(p.List) } --func (p *SourceLocations) Get(i int) pref.SourceLocation { return p.lazyInit().List[i] } --func (p *SourceLocations) byKey(k pathKey) pref.SourceLocation { -+func (p *SourceLocations) Len() int { return len(p.List) } -+func (p *SourceLocations) Get(i int) protoreflect.SourceLocation { return p.lazyInit().List[i] } -+func (p *SourceLocations) byKey(k pathKey) protoreflect.SourceLocation { - if i, ok := p.lazyInit().byPath[k]; ok { - return p.List[i] - } -- return pref.SourceLocation{} -+ return protoreflect.SourceLocation{} - } --func (p *SourceLocations) ByPath(path pref.SourcePath) pref.SourceLocation { -+func (p *SourceLocations) ByPath(path protoreflect.SourcePath) protoreflect.SourceLocation { - return p.byKey(newPathKey(path)) - } --func (p *SourceLocations) ByDescriptor(desc pref.Descriptor) pref.SourceLocation { -+func (p *SourceLocations) ByDescriptor(desc protoreflect.Descriptor) protoreflect.SourceLocation { - if p.File != nil && desc != nil && p.File != desc.ParentFile() { -- return pref.SourceLocation{} // mismatching parent files -+ return protoreflect.SourceLocation{} // mismatching parent files - } - var pathArr [16]int32 - path := pathArr[:0] - for { - switch desc.(type) { -- case pref.FileDescriptor: -+ case protoreflect.FileDescriptor: - // Reverse the path since it was constructed in reverse. - for i, j := 0, len(path)-1; i < j; i, j = i+1, j-1 { - path[i], path[j] = path[j], path[i] - } - return p.byKey(newPathKey(path)) -- case pref.MessageDescriptor: -+ case protoreflect.MessageDescriptor: - path = append(path, int32(desc.Index())) - desc = desc.Parent() - switch desc.(type) { -- case pref.FileDescriptor: -+ case protoreflect.FileDescriptor: - path = append(path, int32(genid.FileDescriptorProto_MessageType_field_number)) -- case pref.MessageDescriptor: -+ case protoreflect.MessageDescriptor: - path = append(path, int32(genid.DescriptorProto_NestedType_field_number)) - default: -- return pref.SourceLocation{} -+ return protoreflect.SourceLocation{} - } -- case pref.FieldDescriptor: -- isExtension := desc.(pref.FieldDescriptor).IsExtension() -+ case protoreflect.FieldDescriptor: -+ isExtension := desc.(protoreflect.FieldDescriptor).IsExtension() - path = append(path, int32(desc.Index())) - desc = desc.Parent() - if isExtension { - switch desc.(type) { -- case pref.FileDescriptor: -+ case protoreflect.FileDescriptor: - path = append(path, int32(genid.FileDescriptorProto_Extension_field_number)) -- case pref.MessageDescriptor: -+ case protoreflect.MessageDescriptor: - path = append(path, int32(genid.DescriptorProto_Extension_field_number)) - default: -- return pref.SourceLocation{} -+ return protoreflect.SourceLocation{} - } - } else { - switch desc.(type) { -- case pref.MessageDescriptor: -+ case protoreflect.MessageDescriptor: - path = append(path, int32(genid.DescriptorProto_Field_field_number)) - default: -- return pref.SourceLocation{} -+ return protoreflect.SourceLocation{} - } - } -- case pref.OneofDescriptor: -+ case protoreflect.OneofDescriptor: - path = append(path, int32(desc.Index())) - desc = desc.Parent() - switch desc.(type) { -- case pref.MessageDescriptor: -+ case protoreflect.MessageDescriptor: - path = append(path, int32(genid.DescriptorProto_OneofDecl_field_number)) - default: -- return pref.SourceLocation{} -+ return protoreflect.SourceLocation{} - } -- case pref.EnumDescriptor: -+ case protoreflect.EnumDescriptor: - path = append(path, int32(desc.Index())) - desc = desc.Parent() - switch desc.(type) { -- case pref.FileDescriptor: -+ case protoreflect.FileDescriptor: - path = append(path, int32(genid.FileDescriptorProto_EnumType_field_number)) -- case pref.MessageDescriptor: -+ case protoreflect.MessageDescriptor: - path = append(path, int32(genid.DescriptorProto_EnumType_field_number)) - default: -- return pref.SourceLocation{} -+ return protoreflect.SourceLocation{} - } -- case pref.EnumValueDescriptor: -+ case protoreflect.EnumValueDescriptor: - path = append(path, int32(desc.Index())) - desc = desc.Parent() - switch desc.(type) { -- case pref.EnumDescriptor: -+ case protoreflect.EnumDescriptor: - path = append(path, int32(genid.EnumDescriptorProto_Value_field_number)) - default: -- return pref.SourceLocation{} -+ return protoreflect.SourceLocation{} - } -- case pref.ServiceDescriptor: -+ case protoreflect.ServiceDescriptor: - path = append(path, int32(desc.Index())) - desc = desc.Parent() - switch desc.(type) { -- case pref.FileDescriptor: -+ case protoreflect.FileDescriptor: - path = append(path, int32(genid.FileDescriptorProto_Service_field_number)) - default: -- return pref.SourceLocation{} -+ return protoreflect.SourceLocation{} - } -- case pref.MethodDescriptor: -+ case protoreflect.MethodDescriptor: - path = append(path, int32(desc.Index())) - desc = desc.Parent() - switch desc.(type) { -- case pref.ServiceDescriptor: -+ case protoreflect.ServiceDescriptor: - path = append(path, int32(genid.ServiceDescriptorProto_Method_field_number)) - default: -- return pref.SourceLocation{} -+ return protoreflect.SourceLocation{} - } - default: -- return pref.SourceLocation{} -+ return protoreflect.SourceLocation{} - } - } - } -@@ -435,7 +442,7 @@ type pathKey struct { - str string // used if the path does not fit in arr - } - --func newPathKey(p pref.SourcePath) (k pathKey) { -+func newPathKey(p protoreflect.SourcePath) (k pathKey) { - if len(p) < len(k.arr) { - for i, ps := range p { - if ps < 0 || math.MaxUint8 <= ps { -diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go b/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go -index dbf2c60..28240eb 100644 ---- a/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go -+++ b/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go -@@ -7,7 +7,7 @@ package filedesc - import ( - "google.golang.org/protobuf/internal/descopts" - "google.golang.org/protobuf/internal/pragma" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - var ( -@@ -30,78 +30,80 @@ var ( - // PlaceholderFile is a placeholder, representing only the file path. - type PlaceholderFile string - --func (f PlaceholderFile) ParentFile() pref.FileDescriptor { return f } --func (f PlaceholderFile) Parent() pref.Descriptor { return nil } --func (f PlaceholderFile) Index() int { return 0 } --func (f PlaceholderFile) Syntax() pref.Syntax { return 0 } --func (f PlaceholderFile) Name() pref.Name { return "" } --func (f PlaceholderFile) FullName() pref.FullName { return "" } --func (f PlaceholderFile) IsPlaceholder() bool { return true } --func (f PlaceholderFile) Options() pref.ProtoMessage { return descopts.File } --func (f PlaceholderFile) Path() string { return string(f) } --func (f PlaceholderFile) Package() pref.FullName { return "" } --func (f PlaceholderFile) Imports() pref.FileImports { return emptyFiles } --func (f PlaceholderFile) Messages() pref.MessageDescriptors { return emptyMessages } --func (f PlaceholderFile) Enums() pref.EnumDescriptors { return emptyEnums } --func (f PlaceholderFile) Extensions() pref.ExtensionDescriptors { return emptyExtensions } --func (f PlaceholderFile) Services() pref.ServiceDescriptors { return emptyServices } --func (f PlaceholderFile) SourceLocations() pref.SourceLocations { return emptySourceLocations } --func (f PlaceholderFile) ProtoType(pref.FileDescriptor) { return } --func (f PlaceholderFile) ProtoInternal(pragma.DoNotImplement) { return } -+func (f PlaceholderFile) ParentFile() protoreflect.FileDescriptor { return f } -+func (f PlaceholderFile) Parent() protoreflect.Descriptor { return nil } -+func (f PlaceholderFile) Index() int { return 0 } -+func (f PlaceholderFile) Syntax() protoreflect.Syntax { return 0 } -+func (f PlaceholderFile) Name() protoreflect.Name { return "" } -+func (f PlaceholderFile) FullName() protoreflect.FullName { return "" } -+func (f PlaceholderFile) IsPlaceholder() bool { return true } -+func (f PlaceholderFile) Options() protoreflect.ProtoMessage { return descopts.File } -+func (f PlaceholderFile) Path() string { return string(f) } -+func (f PlaceholderFile) Package() protoreflect.FullName { return "" } -+func (f PlaceholderFile) Imports() protoreflect.FileImports { return emptyFiles } -+func (f PlaceholderFile) Messages() protoreflect.MessageDescriptors { return emptyMessages } -+func (f PlaceholderFile) Enums() protoreflect.EnumDescriptors { return emptyEnums } -+func (f PlaceholderFile) Extensions() protoreflect.ExtensionDescriptors { return emptyExtensions } -+func (f PlaceholderFile) Services() protoreflect.ServiceDescriptors { return emptyServices } -+func (f PlaceholderFile) SourceLocations() protoreflect.SourceLocations { return emptySourceLocations } -+func (f PlaceholderFile) ProtoType(protoreflect.FileDescriptor) { return } -+func (f PlaceholderFile) ProtoInternal(pragma.DoNotImplement) { return } - - // PlaceholderEnum is a placeholder, representing only the full name. --type PlaceholderEnum pref.FullName -+type PlaceholderEnum protoreflect.FullName - --func (e PlaceholderEnum) ParentFile() pref.FileDescriptor { return nil } --func (e PlaceholderEnum) Parent() pref.Descriptor { return nil } --func (e PlaceholderEnum) Index() int { return 0 } --func (e PlaceholderEnum) Syntax() pref.Syntax { return 0 } --func (e PlaceholderEnum) Name() pref.Name { return pref.FullName(e).Name() } --func (e PlaceholderEnum) FullName() pref.FullName { return pref.FullName(e) } --func (e PlaceholderEnum) IsPlaceholder() bool { return true } --func (e PlaceholderEnum) Options() pref.ProtoMessage { return descopts.Enum } --func (e PlaceholderEnum) Values() pref.EnumValueDescriptors { return emptyEnumValues } --func (e PlaceholderEnum) ReservedNames() pref.Names { return emptyNames } --func (e PlaceholderEnum) ReservedRanges() pref.EnumRanges { return emptyEnumRanges } --func (e PlaceholderEnum) ProtoType(pref.EnumDescriptor) { return } --func (e PlaceholderEnum) ProtoInternal(pragma.DoNotImplement) { return } -+func (e PlaceholderEnum) ParentFile() protoreflect.FileDescriptor { return nil } -+func (e PlaceholderEnum) Parent() protoreflect.Descriptor { return nil } -+func (e PlaceholderEnum) Index() int { return 0 } -+func (e PlaceholderEnum) Syntax() protoreflect.Syntax { return 0 } -+func (e PlaceholderEnum) Name() protoreflect.Name { return protoreflect.FullName(e).Name() } -+func (e PlaceholderEnum) FullName() protoreflect.FullName { return protoreflect.FullName(e) } -+func (e PlaceholderEnum) IsPlaceholder() bool { return true } -+func (e PlaceholderEnum) Options() protoreflect.ProtoMessage { return descopts.Enum } -+func (e PlaceholderEnum) Values() protoreflect.EnumValueDescriptors { return emptyEnumValues } -+func (e PlaceholderEnum) ReservedNames() protoreflect.Names { return emptyNames } -+func (e PlaceholderEnum) ReservedRanges() protoreflect.EnumRanges { return emptyEnumRanges } -+func (e PlaceholderEnum) ProtoType(protoreflect.EnumDescriptor) { return } -+func (e PlaceholderEnum) ProtoInternal(pragma.DoNotImplement) { return } - - // PlaceholderEnumValue is a placeholder, representing only the full name. --type PlaceholderEnumValue pref.FullName -+type PlaceholderEnumValue protoreflect.FullName - --func (e PlaceholderEnumValue) ParentFile() pref.FileDescriptor { return nil } --func (e PlaceholderEnumValue) Parent() pref.Descriptor { return nil } --func (e PlaceholderEnumValue) Index() int { return 0 } --func (e PlaceholderEnumValue) Syntax() pref.Syntax { return 0 } --func (e PlaceholderEnumValue) Name() pref.Name { return pref.FullName(e).Name() } --func (e PlaceholderEnumValue) FullName() pref.FullName { return pref.FullName(e) } --func (e PlaceholderEnumValue) IsPlaceholder() bool { return true } --func (e PlaceholderEnumValue) Options() pref.ProtoMessage { return descopts.EnumValue } --func (e PlaceholderEnumValue) Number() pref.EnumNumber { return 0 } --func (e PlaceholderEnumValue) ProtoType(pref.EnumValueDescriptor) { return } --func (e PlaceholderEnumValue) ProtoInternal(pragma.DoNotImplement) { return } -+func (e PlaceholderEnumValue) ParentFile() protoreflect.FileDescriptor { return nil } -+func (e PlaceholderEnumValue) Parent() protoreflect.Descriptor { return nil } -+func (e PlaceholderEnumValue) Index() int { return 0 } -+func (e PlaceholderEnumValue) Syntax() protoreflect.Syntax { return 0 } -+func (e PlaceholderEnumValue) Name() protoreflect.Name { return protoreflect.FullName(e).Name() } -+func (e PlaceholderEnumValue) FullName() protoreflect.FullName { return protoreflect.FullName(e) } -+func (e PlaceholderEnumValue) IsPlaceholder() bool { return true } -+func (e PlaceholderEnumValue) Options() protoreflect.ProtoMessage { return descopts.EnumValue } -+func (e PlaceholderEnumValue) Number() protoreflect.EnumNumber { return 0 } -+func (e PlaceholderEnumValue) ProtoType(protoreflect.EnumValueDescriptor) { return } -+func (e PlaceholderEnumValue) ProtoInternal(pragma.DoNotImplement) { return } - - // PlaceholderMessage is a placeholder, representing only the full name. --type PlaceholderMessage pref.FullName -+type PlaceholderMessage protoreflect.FullName - --func (m PlaceholderMessage) ParentFile() pref.FileDescriptor { return nil } --func (m PlaceholderMessage) Parent() pref.Descriptor { return nil } --func (m PlaceholderMessage) Index() int { return 0 } --func (m PlaceholderMessage) Syntax() pref.Syntax { return 0 } --func (m PlaceholderMessage) Name() pref.Name { return pref.FullName(m).Name() } --func (m PlaceholderMessage) FullName() pref.FullName { return pref.FullName(m) } --func (m PlaceholderMessage) IsPlaceholder() bool { return true } --func (m PlaceholderMessage) Options() pref.ProtoMessage { return descopts.Message } --func (m PlaceholderMessage) IsMapEntry() bool { return false } --func (m PlaceholderMessage) Fields() pref.FieldDescriptors { return emptyFields } --func (m PlaceholderMessage) Oneofs() pref.OneofDescriptors { return emptyOneofs } --func (m PlaceholderMessage) ReservedNames() pref.Names { return emptyNames } --func (m PlaceholderMessage) ReservedRanges() pref.FieldRanges { return emptyFieldRanges } --func (m PlaceholderMessage) RequiredNumbers() pref.FieldNumbers { return emptyFieldNumbers } --func (m PlaceholderMessage) ExtensionRanges() pref.FieldRanges { return emptyFieldRanges } --func (m PlaceholderMessage) ExtensionRangeOptions(int) pref.ProtoMessage { panic("index out of range") } --func (m PlaceholderMessage) Messages() pref.MessageDescriptors { return emptyMessages } --func (m PlaceholderMessage) Enums() pref.EnumDescriptors { return emptyEnums } --func (m PlaceholderMessage) Extensions() pref.ExtensionDescriptors { return emptyExtensions } --func (m PlaceholderMessage) ProtoType(pref.MessageDescriptor) { return } --func (m PlaceholderMessage) ProtoInternal(pragma.DoNotImplement) { return } -+func (m PlaceholderMessage) ParentFile() protoreflect.FileDescriptor { return nil } -+func (m PlaceholderMessage) Parent() protoreflect.Descriptor { return nil } -+func (m PlaceholderMessage) Index() int { return 0 } -+func (m PlaceholderMessage) Syntax() protoreflect.Syntax { return 0 } -+func (m PlaceholderMessage) Name() protoreflect.Name { return protoreflect.FullName(m).Name() } -+func (m PlaceholderMessage) FullName() protoreflect.FullName { return protoreflect.FullName(m) } -+func (m PlaceholderMessage) IsPlaceholder() bool { return true } -+func (m PlaceholderMessage) Options() protoreflect.ProtoMessage { return descopts.Message } -+func (m PlaceholderMessage) IsMapEntry() bool { return false } -+func (m PlaceholderMessage) Fields() protoreflect.FieldDescriptors { return emptyFields } -+func (m PlaceholderMessage) Oneofs() protoreflect.OneofDescriptors { return emptyOneofs } -+func (m PlaceholderMessage) ReservedNames() protoreflect.Names { return emptyNames } -+func (m PlaceholderMessage) ReservedRanges() protoreflect.FieldRanges { return emptyFieldRanges } -+func (m PlaceholderMessage) RequiredNumbers() protoreflect.FieldNumbers { return emptyFieldNumbers } -+func (m PlaceholderMessage) ExtensionRanges() protoreflect.FieldRanges { return emptyFieldRanges } -+func (m PlaceholderMessage) ExtensionRangeOptions(int) protoreflect.ProtoMessage { -+ panic("index out of range") -+} -+func (m PlaceholderMessage) Messages() protoreflect.MessageDescriptors { return emptyMessages } -+func (m PlaceholderMessage) Enums() protoreflect.EnumDescriptors { return emptyEnums } -+func (m PlaceholderMessage) Extensions() protoreflect.ExtensionDescriptors { return emptyExtensions } -+func (m PlaceholderMessage) ProtoType(protoreflect.MessageDescriptor) { return } -+func (m PlaceholderMessage) ProtoInternal(pragma.DoNotImplement) { return } -diff --git a/vendor/google.golang.org/protobuf/internal/filetype/build.go b/vendor/google.golang.org/protobuf/internal/filetype/build.go -index 0a0dd35..f0e38c4 100644 ---- a/vendor/google.golang.org/protobuf/internal/filetype/build.go -+++ b/vendor/google.golang.org/protobuf/internal/filetype/build.go -@@ -10,17 +10,16 @@ import ( - "reflect" - - "google.golang.org/protobuf/internal/descopts" -- fdesc "google.golang.org/protobuf/internal/filedesc" -+ "google.golang.org/protobuf/internal/filedesc" - pimpl "google.golang.org/protobuf/internal/impl" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- preg "google.golang.org/protobuf/reflect/protoregistry" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoregistry" - ) - - // Builder constructs type descriptors from a raw file descriptor - // and associated Go types for each enum and message declaration. - // --// --// Flattened Ordering -+// # Flattened Ordering - // - // The protobuf type system represents declarations as a tree. Certain nodes in - // the tree require us to either associate it with a concrete Go type or to -@@ -52,7 +51,7 @@ import ( - // that children themselves may have. - type Builder struct { - // File is the underlying file descriptor builder. -- File fdesc.Builder -+ File filedesc.Builder - - // GoTypes is a unique set of the Go types for all declarations and - // dependencies. Each type is represented as a zero value of the Go type. -@@ -108,22 +107,22 @@ type Builder struct { - // TypeRegistry is the registry to register each type descriptor. - // If nil, it uses protoregistry.GlobalTypes. - TypeRegistry interface { -- RegisterMessage(pref.MessageType) error -- RegisterEnum(pref.EnumType) error -- RegisterExtension(pref.ExtensionType) error -+ RegisterMessage(protoreflect.MessageType) error -+ RegisterEnum(protoreflect.EnumType) error -+ RegisterExtension(protoreflect.ExtensionType) error - } - } - - // Out is the output of the builder. - type Out struct { -- File pref.FileDescriptor -+ File protoreflect.FileDescriptor - } - - func (tb Builder) Build() (out Out) { - // Replace the resolver with one that resolves dependencies by index, - // which is faster and more reliable than relying on the global registry. - if tb.File.FileRegistry == nil { -- tb.File.FileRegistry = preg.GlobalFiles -+ tb.File.FileRegistry = protoregistry.GlobalFiles - } - tb.File.FileRegistry = &resolverByIndex{ - goTypes: tb.GoTypes, -@@ -133,7 +132,7 @@ func (tb Builder) Build() (out Out) { - - // Initialize registry if unpopulated. - if tb.TypeRegistry == nil { -- tb.TypeRegistry = preg.GlobalTypes -+ tb.TypeRegistry = protoregistry.GlobalTypes - } - - fbOut := tb.File.Build() -@@ -183,23 +182,23 @@ func (tb Builder) Build() (out Out) { - for i := range fbOut.Messages { - switch fbOut.Messages[i].Name() { - case "FileOptions": -- descopts.File = messageGoTypes[i].(pref.ProtoMessage) -+ descopts.File = messageGoTypes[i].(protoreflect.ProtoMessage) - case "EnumOptions": -- descopts.Enum = messageGoTypes[i].(pref.ProtoMessage) -+ descopts.Enum = messageGoTypes[i].(protoreflect.ProtoMessage) - case "EnumValueOptions": -- descopts.EnumValue = messageGoTypes[i].(pref.ProtoMessage) -+ descopts.EnumValue = messageGoTypes[i].(protoreflect.ProtoMessage) - case "MessageOptions": -- descopts.Message = messageGoTypes[i].(pref.ProtoMessage) -+ descopts.Message = messageGoTypes[i].(protoreflect.ProtoMessage) - case "FieldOptions": -- descopts.Field = messageGoTypes[i].(pref.ProtoMessage) -+ descopts.Field = messageGoTypes[i].(protoreflect.ProtoMessage) - case "OneofOptions": -- descopts.Oneof = messageGoTypes[i].(pref.ProtoMessage) -+ descopts.Oneof = messageGoTypes[i].(protoreflect.ProtoMessage) - case "ExtensionRangeOptions": -- descopts.ExtensionRange = messageGoTypes[i].(pref.ProtoMessage) -+ descopts.ExtensionRange = messageGoTypes[i].(protoreflect.ProtoMessage) - case "ServiceOptions": -- descopts.Service = messageGoTypes[i].(pref.ProtoMessage) -+ descopts.Service = messageGoTypes[i].(protoreflect.ProtoMessage) - case "MethodOptions": -- descopts.Method = messageGoTypes[i].(pref.ProtoMessage) -+ descopts.Method = messageGoTypes[i].(protoreflect.ProtoMessage) - } - } - } -@@ -216,11 +215,11 @@ func (tb Builder) Build() (out Out) { - const listExtDeps = 2 - var goType reflect.Type - switch fbOut.Extensions[i].L1.Kind { -- case pref.EnumKind: -+ case protoreflect.EnumKind: - j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx) - goType = reflect.TypeOf(tb.GoTypes[j]) - depIdx++ -- case pref.MessageKind, pref.GroupKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind: - j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx) - goType = reflect.TypeOf(tb.GoTypes[j]) - depIdx++ -@@ -242,22 +241,22 @@ func (tb Builder) Build() (out Out) { - return out - } - --var goTypeForPBKind = map[pref.Kind]reflect.Type{ -- pref.BoolKind: reflect.TypeOf(bool(false)), -- pref.Int32Kind: reflect.TypeOf(int32(0)), -- pref.Sint32Kind: reflect.TypeOf(int32(0)), -- pref.Sfixed32Kind: reflect.TypeOf(int32(0)), -- pref.Int64Kind: reflect.TypeOf(int64(0)), -- pref.Sint64Kind: reflect.TypeOf(int64(0)), -- pref.Sfixed64Kind: reflect.TypeOf(int64(0)), -- pref.Uint32Kind: reflect.TypeOf(uint32(0)), -- pref.Fixed32Kind: reflect.TypeOf(uint32(0)), -- pref.Uint64Kind: reflect.TypeOf(uint64(0)), -- pref.Fixed64Kind: reflect.TypeOf(uint64(0)), -- pref.FloatKind: reflect.TypeOf(float32(0)), -- pref.DoubleKind: reflect.TypeOf(float64(0)), -- pref.StringKind: reflect.TypeOf(string("")), -- pref.BytesKind: reflect.TypeOf([]byte(nil)), -+var goTypeForPBKind = map[protoreflect.Kind]reflect.Type{ -+ protoreflect.BoolKind: reflect.TypeOf(bool(false)), -+ protoreflect.Int32Kind: reflect.TypeOf(int32(0)), -+ protoreflect.Sint32Kind: reflect.TypeOf(int32(0)), -+ protoreflect.Sfixed32Kind: reflect.TypeOf(int32(0)), -+ protoreflect.Int64Kind: reflect.TypeOf(int64(0)), -+ protoreflect.Sint64Kind: reflect.TypeOf(int64(0)), -+ protoreflect.Sfixed64Kind: reflect.TypeOf(int64(0)), -+ protoreflect.Uint32Kind: reflect.TypeOf(uint32(0)), -+ protoreflect.Fixed32Kind: reflect.TypeOf(uint32(0)), -+ protoreflect.Uint64Kind: reflect.TypeOf(uint64(0)), -+ protoreflect.Fixed64Kind: reflect.TypeOf(uint64(0)), -+ protoreflect.FloatKind: reflect.TypeOf(float32(0)), -+ protoreflect.DoubleKind: reflect.TypeOf(float64(0)), -+ protoreflect.StringKind: reflect.TypeOf(string("")), -+ protoreflect.BytesKind: reflect.TypeOf([]byte(nil)), - } - - type depIdxs []int32 -@@ -274,13 +273,13 @@ type ( - fileRegistry - } - fileRegistry interface { -- FindFileByPath(string) (pref.FileDescriptor, error) -- FindDescriptorByName(pref.FullName) (pref.Descriptor, error) -- RegisterFile(pref.FileDescriptor) error -+ FindFileByPath(string) (protoreflect.FileDescriptor, error) -+ FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error) -+ RegisterFile(protoreflect.FileDescriptor) error - } - ) - --func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []fdesc.Enum, ms []fdesc.Message) pref.EnumDescriptor { -+func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []filedesc.Enum, ms []filedesc.Message) protoreflect.EnumDescriptor { - if depIdx := int(r.depIdxs.Get(i, j)); int(depIdx) < len(es)+len(ms) { - return &es[depIdx] - } else { -@@ -288,7 +287,7 @@ func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []fdesc.Enum, ms []fdes - } - } - --func (r *resolverByIndex) FindMessageByIndex(i, j int32, es []fdesc.Enum, ms []fdesc.Message) pref.MessageDescriptor { -+func (r *resolverByIndex) FindMessageByIndex(i, j int32, es []filedesc.Enum, ms []filedesc.Message) protoreflect.MessageDescriptor { - if depIdx := int(r.depIdxs.Get(i, j)); depIdx < len(es)+len(ms) { - return &ms[depIdx-len(es)] - } else { -diff --git a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go -index e3cdf1c..5c0e8f7 100644 ---- a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go -+++ b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go -@@ -50,6 +50,7 @@ const ( - FileDescriptorProto_Options_field_name protoreflect.Name = "options" - FileDescriptorProto_SourceCodeInfo_field_name protoreflect.Name = "source_code_info" - FileDescriptorProto_Syntax_field_name protoreflect.Name = "syntax" -+ FileDescriptorProto_Edition_field_name protoreflect.Name = "edition" - - FileDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.name" - FileDescriptorProto_Package_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.package" -@@ -63,6 +64,7 @@ const ( - FileDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.options" - FileDescriptorProto_SourceCodeInfo_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.source_code_info" - FileDescriptorProto_Syntax_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.syntax" -+ FileDescriptorProto_Edition_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.edition" - ) - - // Field numbers for google.protobuf.FileDescriptorProto. -@@ -79,6 +81,7 @@ const ( - FileDescriptorProto_Options_field_number protoreflect.FieldNumber = 8 - FileDescriptorProto_SourceCodeInfo_field_number protoreflect.FieldNumber = 9 - FileDescriptorProto_Syntax_field_number protoreflect.FieldNumber = 12 -+ FileDescriptorProto_Edition_field_number protoreflect.FieldNumber = 13 - ) - - // Names for google.protobuf.DescriptorProto. -@@ -494,26 +497,29 @@ const ( - - // Field names for google.protobuf.MessageOptions. - const ( -- MessageOptions_MessageSetWireFormat_field_name protoreflect.Name = "message_set_wire_format" -- MessageOptions_NoStandardDescriptorAccessor_field_name protoreflect.Name = "no_standard_descriptor_accessor" -- MessageOptions_Deprecated_field_name protoreflect.Name = "deprecated" -- MessageOptions_MapEntry_field_name protoreflect.Name = "map_entry" -- MessageOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" -+ MessageOptions_MessageSetWireFormat_field_name protoreflect.Name = "message_set_wire_format" -+ MessageOptions_NoStandardDescriptorAccessor_field_name protoreflect.Name = "no_standard_descriptor_accessor" -+ MessageOptions_Deprecated_field_name protoreflect.Name = "deprecated" -+ MessageOptions_MapEntry_field_name protoreflect.Name = "map_entry" -+ MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_name protoreflect.Name = "deprecated_legacy_json_field_conflicts" -+ MessageOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" - -- MessageOptions_MessageSetWireFormat_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.message_set_wire_format" -- MessageOptions_NoStandardDescriptorAccessor_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.no_standard_descriptor_accessor" -- MessageOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated" -- MessageOptions_MapEntry_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.map_entry" -- MessageOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.uninterpreted_option" -+ MessageOptions_MessageSetWireFormat_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.message_set_wire_format" -+ MessageOptions_NoStandardDescriptorAccessor_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.no_standard_descriptor_accessor" -+ MessageOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated" -+ MessageOptions_MapEntry_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.map_entry" -+ MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated_legacy_json_field_conflicts" -+ MessageOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.uninterpreted_option" - ) - - // Field numbers for google.protobuf.MessageOptions. - const ( -- MessageOptions_MessageSetWireFormat_field_number protoreflect.FieldNumber = 1 -- MessageOptions_NoStandardDescriptorAccessor_field_number protoreflect.FieldNumber = 2 -- MessageOptions_Deprecated_field_number protoreflect.FieldNumber = 3 -- MessageOptions_MapEntry_field_number protoreflect.FieldNumber = 7 -- MessageOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 -+ MessageOptions_MessageSetWireFormat_field_number protoreflect.FieldNumber = 1 -+ MessageOptions_NoStandardDescriptorAccessor_field_number protoreflect.FieldNumber = 2 -+ MessageOptions_Deprecated_field_number protoreflect.FieldNumber = 3 -+ MessageOptions_MapEntry_field_number protoreflect.FieldNumber = 7 -+ MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_number protoreflect.FieldNumber = 11 -+ MessageOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 - ) - - // Names for google.protobuf.FieldOptions. -@@ -528,16 +534,24 @@ const ( - FieldOptions_Packed_field_name protoreflect.Name = "packed" - FieldOptions_Jstype_field_name protoreflect.Name = "jstype" - FieldOptions_Lazy_field_name protoreflect.Name = "lazy" -+ FieldOptions_UnverifiedLazy_field_name protoreflect.Name = "unverified_lazy" - FieldOptions_Deprecated_field_name protoreflect.Name = "deprecated" - FieldOptions_Weak_field_name protoreflect.Name = "weak" -+ FieldOptions_DebugRedact_field_name protoreflect.Name = "debug_redact" -+ FieldOptions_Retention_field_name protoreflect.Name = "retention" -+ FieldOptions_Target_field_name protoreflect.Name = "target" - FieldOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" - - FieldOptions_Ctype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.ctype" - FieldOptions_Packed_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.packed" - FieldOptions_Jstype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.jstype" - FieldOptions_Lazy_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.lazy" -+ FieldOptions_UnverifiedLazy_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.unverified_lazy" - FieldOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.deprecated" - FieldOptions_Weak_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.weak" -+ FieldOptions_DebugRedact_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.debug_redact" -+ FieldOptions_Retention_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.retention" -+ FieldOptions_Target_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.target" - FieldOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.uninterpreted_option" - ) - -@@ -547,8 +561,12 @@ const ( - FieldOptions_Packed_field_number protoreflect.FieldNumber = 2 - FieldOptions_Jstype_field_number protoreflect.FieldNumber = 6 - FieldOptions_Lazy_field_number protoreflect.FieldNumber = 5 -+ FieldOptions_UnverifiedLazy_field_number protoreflect.FieldNumber = 15 - FieldOptions_Deprecated_field_number protoreflect.FieldNumber = 3 - FieldOptions_Weak_field_number protoreflect.FieldNumber = 10 -+ FieldOptions_DebugRedact_field_number protoreflect.FieldNumber = 16 -+ FieldOptions_Retention_field_number protoreflect.FieldNumber = 17 -+ FieldOptions_Target_field_number protoreflect.FieldNumber = 18 - FieldOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 - ) - -@@ -564,6 +582,18 @@ const ( - FieldOptions_JSType_enum_name = "JSType" - ) - -+// Full and short names for google.protobuf.FieldOptions.OptionRetention. -+const ( -+ FieldOptions_OptionRetention_enum_fullname = "google.protobuf.FieldOptions.OptionRetention" -+ FieldOptions_OptionRetention_enum_name = "OptionRetention" -+) -+ -+// Full and short names for google.protobuf.FieldOptions.OptionTargetType. -+const ( -+ FieldOptions_OptionTargetType_enum_fullname = "google.protobuf.FieldOptions.OptionTargetType" -+ FieldOptions_OptionTargetType_enum_name = "OptionTargetType" -+) -+ - // Names for google.protobuf.OneofOptions. - const ( - OneofOptions_message_name protoreflect.Name = "OneofOptions" -@@ -590,20 +620,23 @@ const ( - - // Field names for google.protobuf.EnumOptions. - const ( -- EnumOptions_AllowAlias_field_name protoreflect.Name = "allow_alias" -- EnumOptions_Deprecated_field_name protoreflect.Name = "deprecated" -- EnumOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" -+ EnumOptions_AllowAlias_field_name protoreflect.Name = "allow_alias" -+ EnumOptions_Deprecated_field_name protoreflect.Name = "deprecated" -+ EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_name protoreflect.Name = "deprecated_legacy_json_field_conflicts" -+ EnumOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" - -- EnumOptions_AllowAlias_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.allow_alias" -- EnumOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated" -- EnumOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.uninterpreted_option" -+ EnumOptions_AllowAlias_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.allow_alias" -+ EnumOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated" -+ EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated_legacy_json_field_conflicts" -+ EnumOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.uninterpreted_option" - ) - - // Field numbers for google.protobuf.EnumOptions. - const ( -- EnumOptions_AllowAlias_field_number protoreflect.FieldNumber = 2 -- EnumOptions_Deprecated_field_number protoreflect.FieldNumber = 3 -- EnumOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 -+ EnumOptions_AllowAlias_field_number protoreflect.FieldNumber = 2 -+ EnumOptions_Deprecated_field_number protoreflect.FieldNumber = 3 -+ EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_number protoreflect.FieldNumber = 6 -+ EnumOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 - ) - - // Names for google.protobuf.EnumValueOptions. -@@ -813,11 +846,13 @@ const ( - GeneratedCodeInfo_Annotation_SourceFile_field_name protoreflect.Name = "source_file" - GeneratedCodeInfo_Annotation_Begin_field_name protoreflect.Name = "begin" - GeneratedCodeInfo_Annotation_End_field_name protoreflect.Name = "end" -+ GeneratedCodeInfo_Annotation_Semantic_field_name protoreflect.Name = "semantic" - - GeneratedCodeInfo_Annotation_Path_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.path" - GeneratedCodeInfo_Annotation_SourceFile_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.source_file" - GeneratedCodeInfo_Annotation_Begin_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.begin" - GeneratedCodeInfo_Annotation_End_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.end" -+ GeneratedCodeInfo_Annotation_Semantic_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.semantic" - ) - - // Field numbers for google.protobuf.GeneratedCodeInfo.Annotation. -@@ -826,4 +861,11 @@ const ( - GeneratedCodeInfo_Annotation_SourceFile_field_number protoreflect.FieldNumber = 2 - GeneratedCodeInfo_Annotation_Begin_field_number protoreflect.FieldNumber = 3 - GeneratedCodeInfo_Annotation_End_field_number protoreflect.FieldNumber = 4 -+ GeneratedCodeInfo_Annotation_Semantic_field_number protoreflect.FieldNumber = 5 -+) -+ -+// Full and short names for google.protobuf.GeneratedCodeInfo.Annotation.Semantic. -+const ( -+ GeneratedCodeInfo_Annotation_Semantic_enum_fullname = "google.protobuf.GeneratedCodeInfo.Annotation.Semantic" -+ GeneratedCodeInfo_Annotation_Semantic_enum_name = "Semantic" - ) -diff --git a/vendor/google.golang.org/protobuf/internal/impl/api_export.go b/vendor/google.golang.org/protobuf/internal/impl/api_export.go -index abee5f3..a371f98 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/api_export.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/api_export.go -@@ -12,8 +12,8 @@ import ( - "google.golang.org/protobuf/encoding/prototext" - "google.golang.org/protobuf/internal/errors" - "google.golang.org/protobuf/proto" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- piface "google.golang.org/protobuf/runtime/protoiface" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/runtime/protoiface" - ) - - // Export is a zero-length named type that exists only to export a set of -@@ -32,11 +32,11 @@ type enum = interface{} - - // EnumOf returns the protoreflect.Enum interface over e. - // It returns nil if e is nil. --func (Export) EnumOf(e enum) pref.Enum { -+func (Export) EnumOf(e enum) protoreflect.Enum { - switch e := e.(type) { - case nil: - return nil -- case pref.Enum: -+ case protoreflect.Enum: - return e - default: - return legacyWrapEnum(reflect.ValueOf(e)) -@@ -45,11 +45,11 @@ func (Export) EnumOf(e enum) pref.Enum { - - // EnumDescriptorOf returns the protoreflect.EnumDescriptor for e. - // It returns nil if e is nil. --func (Export) EnumDescriptorOf(e enum) pref.EnumDescriptor { -+func (Export) EnumDescriptorOf(e enum) protoreflect.EnumDescriptor { - switch e := e.(type) { - case nil: - return nil -- case pref.Enum: -+ case protoreflect.Enum: - return e.Descriptor() - default: - return LegacyLoadEnumDesc(reflect.TypeOf(e)) -@@ -58,11 +58,11 @@ func (Export) EnumDescriptorOf(e enum) pref.EnumDescriptor { - - // EnumTypeOf returns the protoreflect.EnumType for e. - // It returns nil if e is nil. --func (Export) EnumTypeOf(e enum) pref.EnumType { -+func (Export) EnumTypeOf(e enum) protoreflect.EnumType { - switch e := e.(type) { - case nil: - return nil -- case pref.Enum: -+ case protoreflect.Enum: - return e.Type() - default: - return legacyLoadEnumType(reflect.TypeOf(e)) -@@ -71,7 +71,7 @@ func (Export) EnumTypeOf(e enum) pref.EnumType { - - // EnumStringOf returns the enum value as a string, either as the name if - // the number is resolvable, or the number formatted as a string. --func (Export) EnumStringOf(ed pref.EnumDescriptor, n pref.EnumNumber) string { -+func (Export) EnumStringOf(ed protoreflect.EnumDescriptor, n protoreflect.EnumNumber) string { - ev := ed.Values().ByNumber(n) - if ev != nil { - return string(ev.Name()) -@@ -84,7 +84,7 @@ func (Export) EnumStringOf(ed pref.EnumDescriptor, n pref.EnumNumber) string { - type message = interface{} - - // legacyMessageWrapper wraps a v2 message as a v1 message. --type legacyMessageWrapper struct{ m pref.ProtoMessage } -+type legacyMessageWrapper struct{ m protoreflect.ProtoMessage } - - func (m legacyMessageWrapper) Reset() { proto.Reset(m.m) } - func (m legacyMessageWrapper) String() string { return Export{}.MessageStringOf(m.m) } -@@ -92,30 +92,30 @@ func (m legacyMessageWrapper) ProtoMessage() {} - - // ProtoMessageV1Of converts either a v1 or v2 message to a v1 message. - // It returns nil if m is nil. --func (Export) ProtoMessageV1Of(m message) piface.MessageV1 { -+func (Export) ProtoMessageV1Of(m message) protoiface.MessageV1 { - switch mv := m.(type) { - case nil: - return nil -- case piface.MessageV1: -+ case protoiface.MessageV1: - return mv - case unwrapper: - return Export{}.ProtoMessageV1Of(mv.protoUnwrap()) -- case pref.ProtoMessage: -+ case protoreflect.ProtoMessage: - return legacyMessageWrapper{mv} - default: - panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) - } - } - --func (Export) protoMessageV2Of(m message) pref.ProtoMessage { -+func (Export) protoMessageV2Of(m message) protoreflect.ProtoMessage { - switch mv := m.(type) { - case nil: - return nil -- case pref.ProtoMessage: -+ case protoreflect.ProtoMessage: - return mv - case legacyMessageWrapper: - return mv.m -- case piface.MessageV1: -+ case protoiface.MessageV1: - return nil - default: - panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) -@@ -124,7 +124,7 @@ func (Export) protoMessageV2Of(m message) pref.ProtoMessage { - - // ProtoMessageV2Of converts either a v1 or v2 message to a v2 message. - // It returns nil if m is nil. --func (Export) ProtoMessageV2Of(m message) pref.ProtoMessage { -+func (Export) ProtoMessageV2Of(m message) protoreflect.ProtoMessage { - if m == nil { - return nil - } -@@ -136,7 +136,7 @@ func (Export) ProtoMessageV2Of(m message) pref.ProtoMessage { - - // MessageOf returns the protoreflect.Message interface over m. - // It returns nil if m is nil. --func (Export) MessageOf(m message) pref.Message { -+func (Export) MessageOf(m message) protoreflect.Message { - if m == nil { - return nil - } -@@ -148,7 +148,7 @@ func (Export) MessageOf(m message) pref.Message { - - // MessageDescriptorOf returns the protoreflect.MessageDescriptor for m. - // It returns nil if m is nil. --func (Export) MessageDescriptorOf(m message) pref.MessageDescriptor { -+func (Export) MessageDescriptorOf(m message) protoreflect.MessageDescriptor { - if m == nil { - return nil - } -@@ -160,7 +160,7 @@ func (Export) MessageDescriptorOf(m message) pref.MessageDescriptor { - - // MessageTypeOf returns the protoreflect.MessageType for m. - // It returns nil if m is nil. --func (Export) MessageTypeOf(m message) pref.MessageType { -+func (Export) MessageTypeOf(m message) protoreflect.MessageType { - if m == nil { - return nil - } -@@ -172,6 +172,6 @@ func (Export) MessageTypeOf(m message) pref.MessageType { - - // MessageStringOf returns the message value as a string, - // which is the message serialized in the protobuf text format. --func (Export) MessageStringOf(m pref.ProtoMessage) string { -+func (Export) MessageStringOf(m protoreflect.ProtoMessage) string { - return prototext.MarshalOptions{Multiline: false}.Format(m) - } -diff --git a/vendor/google.golang.org/protobuf/internal/impl/checkinit.go b/vendor/google.golang.org/protobuf/internal/impl/checkinit.go -index b82341e..bff041e 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/checkinit.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/checkinit.go -@@ -8,18 +8,18 @@ import ( - "sync" - - "google.golang.org/protobuf/internal/errors" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- piface "google.golang.org/protobuf/runtime/protoiface" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/runtime/protoiface" - ) - --func (mi *MessageInfo) checkInitialized(in piface.CheckInitializedInput) (piface.CheckInitializedOutput, error) { -+func (mi *MessageInfo) checkInitialized(in protoiface.CheckInitializedInput) (protoiface.CheckInitializedOutput, error) { - var p pointer - if ms, ok := in.Message.(*messageState); ok { - p = ms.pointer() - } else { - p = in.Message.(*messageReflectWrapper).pointer() - } -- return piface.CheckInitializedOutput{}, mi.checkInitializedPointer(p) -+ return protoiface.CheckInitializedOutput{}, mi.checkInitializedPointer(p) - } - - func (mi *MessageInfo) checkInitializedPointer(p pointer) error { -@@ -90,7 +90,7 @@ var ( - // needsInitCheck reports whether a message needs to be checked for partial initialization. - // - // It returns true if the message transitively includes any required or extension fields. --func needsInitCheck(md pref.MessageDescriptor) bool { -+func needsInitCheck(md protoreflect.MessageDescriptor) bool { - if v, ok := needsInitCheckMap.Load(md); ok { - if has, ok := v.(bool); ok { - return has -@@ -101,7 +101,7 @@ func needsInitCheck(md pref.MessageDescriptor) bool { - return needsInitCheckLocked(md) - } - --func needsInitCheckLocked(md pref.MessageDescriptor) (has bool) { -+func needsInitCheckLocked(md protoreflect.MessageDescriptor) (has bool) { - if v, ok := needsInitCheckMap.Load(md); ok { - // If has is true, we've previously determined that this message - // needs init checks. -diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go b/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go -index 08d3517..e74cefd 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go -@@ -10,7 +10,7 @@ import ( - - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/errors" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - type extensionFieldInfo struct { -@@ -23,7 +23,7 @@ type extensionFieldInfo struct { - - var legacyExtensionFieldInfoCache sync.Map // map[protoreflect.ExtensionType]*extensionFieldInfo - --func getExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { -+func getExtensionFieldInfo(xt protoreflect.ExtensionType) *extensionFieldInfo { - if xi, ok := xt.(*ExtensionInfo); ok { - xi.lazyInit() - return xi.info -@@ -32,7 +32,7 @@ func getExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { - } - - // legacyLoadExtensionFieldInfo dynamically loads a *ExtensionInfo for xt. --func legacyLoadExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { -+func legacyLoadExtensionFieldInfo(xt protoreflect.ExtensionType) *extensionFieldInfo { - if xi, ok := legacyExtensionFieldInfoCache.Load(xt); ok { - return xi.(*extensionFieldInfo) - } -@@ -43,7 +43,7 @@ func legacyLoadExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { - return e - } - --func makeExtensionFieldInfo(xd pref.ExtensionDescriptor) *extensionFieldInfo { -+func makeExtensionFieldInfo(xd protoreflect.ExtensionDescriptor) *extensionFieldInfo { - var wiretag uint64 - if !xd.IsPacked() { - wiretag = protowire.EncodeTag(xd.Number(), wireTypes[xd.Kind()]) -@@ -59,10 +59,10 @@ func makeExtensionFieldInfo(xd pref.ExtensionDescriptor) *extensionFieldInfo { - // This is true for composite types, where we pass in a message, list, or map to fill in, - // and for enums, where we pass in a prototype value to specify the concrete enum type. - switch xd.Kind() { -- case pref.MessageKind, pref.GroupKind, pref.EnumKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind, protoreflect.EnumKind: - e.unmarshalNeedsValue = true - default: -- if xd.Cardinality() == pref.Repeated { -+ if xd.Cardinality() == protoreflect.Repeated { - e.unmarshalNeedsValue = true - } - } -@@ -73,21 +73,21 @@ type lazyExtensionValue struct { - atomicOnce uint32 // atomically set if value is valid - mu sync.Mutex - xi *extensionFieldInfo -- value pref.Value -+ value protoreflect.Value - b []byte -- fn func() pref.Value -+ fn func() protoreflect.Value - } - - type ExtensionField struct { -- typ pref.ExtensionType -+ typ protoreflect.ExtensionType - - // value is either the value of GetValue, - // or a *lazyExtensionValue that then returns the value of GetValue. -- value pref.Value -+ value protoreflect.Value - lazy *lazyExtensionValue - } - --func (f *ExtensionField) appendLazyBytes(xt pref.ExtensionType, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, b []byte) { -+func (f *ExtensionField) appendLazyBytes(xt protoreflect.ExtensionType, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, b []byte) { - if f.lazy == nil { - f.lazy = &lazyExtensionValue{xi: xi} - } -@@ -97,7 +97,7 @@ func (f *ExtensionField) appendLazyBytes(xt pref.ExtensionType, xi *extensionFie - f.lazy.b = append(f.lazy.b, b...) - } - --func (f *ExtensionField) canLazy(xt pref.ExtensionType) bool { -+func (f *ExtensionField) canLazy(xt protoreflect.ExtensionType) bool { - if f.typ == nil { - return true - } -@@ -154,7 +154,7 @@ func (f *ExtensionField) lazyInit() { - - // Set sets the type and value of the extension field. - // This must not be called concurrently. --func (f *ExtensionField) Set(t pref.ExtensionType, v pref.Value) { -+func (f *ExtensionField) Set(t protoreflect.ExtensionType, v protoreflect.Value) { - f.typ = t - f.value = v - f.lazy = nil -@@ -162,14 +162,14 @@ func (f *ExtensionField) Set(t pref.ExtensionType, v pref.Value) { - - // SetLazy sets the type and a value that is to be lazily evaluated upon first use. - // This must not be called concurrently. --func (f *ExtensionField) SetLazy(t pref.ExtensionType, fn func() pref.Value) { -+func (f *ExtensionField) SetLazy(t protoreflect.ExtensionType, fn func() protoreflect.Value) { - f.typ = t - f.lazy = &lazyExtensionValue{fn: fn} - } - - // Value returns the value of the extension field. - // This may be called concurrently. --func (f *ExtensionField) Value() pref.Value { -+func (f *ExtensionField) Value() protoreflect.Value { - if f.lazy != nil { - if atomic.LoadUint32(&f.lazy.atomicOnce) == 0 { - f.lazyInit() -@@ -181,7 +181,7 @@ func (f *ExtensionField) Value() pref.Value { - - // Type returns the type of the extension field. - // This may be called concurrently. --func (f ExtensionField) Type() pref.ExtensionType { -+func (f ExtensionField) Type() protoreflect.ExtensionType { - return f.typ - } - -@@ -193,7 +193,7 @@ func (f ExtensionField) IsSet() bool { - - // IsLazy reports whether a field is lazily encoded. - // It is exported for testing. --func IsLazy(m pref.Message, fd pref.FieldDescriptor) bool { -+func IsLazy(m protoreflect.Message, fd protoreflect.FieldDescriptor) bool { - var mi *MessageInfo - var p pointer - switch m := m.(type) { -@@ -206,7 +206,7 @@ func IsLazy(m pref.Message, fd pref.FieldDescriptor) bool { - default: - return false - } -- xd, ok := fd.(pref.ExtensionTypeDescriptor) -+ xd, ok := fd.(protoreflect.ExtensionTypeDescriptor) - if !ok { - return false - } -diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_field.go b/vendor/google.golang.org/protobuf/internal/impl/codec_field.go -index cb4b482..3fadd24 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/codec_field.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/codec_field.go -@@ -12,9 +12,9 @@ import ( - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/errors" - "google.golang.org/protobuf/proto" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- preg "google.golang.org/protobuf/reflect/protoregistry" -- piface "google.golang.org/protobuf/runtime/protoiface" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoregistry" -+ "google.golang.org/protobuf/runtime/protoiface" - ) - - type errInvalidUTF8 struct{} -@@ -30,7 +30,7 @@ func (errInvalidUTF8) Unwrap() error { return errors.Error } - // to the appropriate field-specific function as necessary. - // - // The unmarshal function is set on each field individually as usual. --func (mi *MessageInfo) initOneofFieldCoders(od pref.OneofDescriptor, si structInfo) { -+func (mi *MessageInfo) initOneofFieldCoders(od protoreflect.OneofDescriptor, si structInfo) { - fs := si.oneofsByName[od.Name()] - ft := fs.Type - oneofFields := make(map[reflect.Type]*coderFieldInfo) -@@ -118,13 +118,13 @@ func (mi *MessageInfo) initOneofFieldCoders(od pref.OneofDescriptor, si structIn - } - } - --func makeWeakMessageFieldCoder(fd pref.FieldDescriptor) pointerCoderFuncs { -+func makeWeakMessageFieldCoder(fd protoreflect.FieldDescriptor) pointerCoderFuncs { - var once sync.Once -- var messageType pref.MessageType -+ var messageType protoreflect.MessageType - lazyInit := func() { - once.Do(func() { - messageName := fd.Message().FullName() -- messageType, _ = preg.GlobalTypes.FindMessageByName(messageName) -+ messageType, _ = protoregistry.GlobalTypes.FindMessageByName(messageName) - }) - } - -@@ -190,7 +190,7 @@ func makeWeakMessageFieldCoder(fd pref.FieldDescriptor) pointerCoderFuncs { - } - } - --func makeMessageFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { -+func makeMessageFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { - if mi := getMessageInfo(ft); mi != nil { - funcs := pointerCoderFuncs{ - size: sizeMessageInfo, -@@ -280,7 +280,7 @@ func consumeMessage(b []byte, m proto.Message, wtyp protowire.Type, opts unmarsh - if n < 0 { - return out, errDecode - } -- o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ -+ o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ - Buf: v, - Message: m.ProtoReflect(), - }) -@@ -288,27 +288,27 @@ func consumeMessage(b []byte, m proto.Message, wtyp protowire.Type, opts unmarsh - return out, err - } - out.n = n -- out.initialized = o.Flags&piface.UnmarshalInitialized != 0 -+ out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 - return out, nil - } - --func sizeMessageValue(v pref.Value, tagsize int, opts marshalOptions) int { -+func sizeMessageValue(v protoreflect.Value, tagsize int, opts marshalOptions) int { - m := v.Message().Interface() - return sizeMessage(m, tagsize, opts) - } - --func appendMessageValue(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { -+func appendMessageValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { - m := v.Message().Interface() - return appendMessage(b, m, wiretag, opts) - } - --func consumeMessageValue(b []byte, v pref.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) { -+func consumeMessageValue(b []byte, v protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) { - m := v.Message().Interface() - out, err := consumeMessage(b, m, wtyp, opts) - return v, out, err - } - --func isInitMessageValue(v pref.Value) error { -+func isInitMessageValue(v protoreflect.Value) error { - m := v.Message().Interface() - return proto.CheckInitialized(m) - } -@@ -321,17 +321,17 @@ var coderMessageValue = valueCoderFuncs{ - merge: mergeMessageValue, - } - --func sizeGroupValue(v pref.Value, tagsize int, opts marshalOptions) int { -+func sizeGroupValue(v protoreflect.Value, tagsize int, opts marshalOptions) int { - m := v.Message().Interface() - return sizeGroup(m, tagsize, opts) - } - --func appendGroupValue(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { -+func appendGroupValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { - m := v.Message().Interface() - return appendGroup(b, m, wiretag, opts) - } - --func consumeGroupValue(b []byte, v pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) { -+func consumeGroupValue(b []byte, v protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) { - m := v.Message().Interface() - out, err := consumeGroup(b, m, num, wtyp, opts) - return v, out, err -@@ -345,7 +345,7 @@ var coderGroupValue = valueCoderFuncs{ - merge: mergeMessageValue, - } - --func makeGroupFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { -+func makeGroupFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { - num := fd.Number() - if mi := getMessageInfo(ft); mi != nil { - funcs := pointerCoderFuncs{ -@@ -424,7 +424,7 @@ func consumeGroup(b []byte, m proto.Message, num protowire.Number, wtyp protowir - if n < 0 { - return out, errDecode - } -- o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ -+ o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ - Buf: b, - Message: m.ProtoReflect(), - }) -@@ -432,11 +432,11 @@ func consumeGroup(b []byte, m proto.Message, num protowire.Number, wtyp protowir - return out, err - } - out.n = n -- out.initialized = o.Flags&piface.UnmarshalInitialized != 0 -+ out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 - return out, nil - } - --func makeMessageSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { -+func makeMessageSliceFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { - if mi := getMessageInfo(ft); mi != nil { - funcs := pointerCoderFuncs{ - size: sizeMessageSliceInfo, -@@ -555,7 +555,7 @@ func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp protowir - return out, errDecode - } - mp := reflect.New(goType.Elem()) -- o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ -+ o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ - Buf: v, - Message: asMessage(mp).ProtoReflect(), - }) -@@ -564,7 +564,7 @@ func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp protowir - } - p.AppendPointerSlice(pointerOfValue(mp)) - out.n = n -- out.initialized = o.Flags&piface.UnmarshalInitialized != 0 -+ out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 - return out, nil - } - -@@ -581,7 +581,7 @@ func isInitMessageSlice(p pointer, goType reflect.Type) error { - - // Slices of messages - --func sizeMessageSliceValue(listv pref.Value, tagsize int, opts marshalOptions) int { -+func sizeMessageSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) int { - list := listv.List() - n := 0 - for i, llen := 0, list.Len(); i < llen; i++ { -@@ -591,7 +591,7 @@ func sizeMessageSliceValue(listv pref.Value, tagsize int, opts marshalOptions) i - return n - } - --func appendMessageSliceValue(b []byte, listv pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { -+func appendMessageSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { - list := listv.List() - mopts := opts.Options() - for i, llen := 0, list.Len(); i < llen; i++ { -@@ -608,30 +608,30 @@ func appendMessageSliceValue(b []byte, listv pref.Value, wiretag uint64, opts ma - return b, nil - } - --func consumeMessageSliceValue(b []byte, listv pref.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) { -+func consumeMessageSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) { - list := listv.List() - if wtyp != protowire.BytesType { -- return pref.Value{}, out, errUnknown -+ return protoreflect.Value{}, out, errUnknown - } - v, n := protowire.ConsumeBytes(b) - if n < 0 { -- return pref.Value{}, out, errDecode -+ return protoreflect.Value{}, out, errDecode - } - m := list.NewElement() -- o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ -+ o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ - Buf: v, - Message: m.Message(), - }) - if err != nil { -- return pref.Value{}, out, err -+ return protoreflect.Value{}, out, err - } - list.Append(m) - out.n = n -- out.initialized = o.Flags&piface.UnmarshalInitialized != 0 -+ out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 - return listv, out, nil - } - --func isInitMessageSliceValue(listv pref.Value) error { -+func isInitMessageSliceValue(listv protoreflect.Value) error { - list := listv.List() - for i, llen := 0, list.Len(); i < llen; i++ { - m := list.Get(i).Message().Interface() -@@ -650,7 +650,7 @@ var coderMessageSliceValue = valueCoderFuncs{ - merge: mergeMessageListValue, - } - --func sizeGroupSliceValue(listv pref.Value, tagsize int, opts marshalOptions) int { -+func sizeGroupSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) int { - list := listv.List() - n := 0 - for i, llen := 0, list.Len(); i < llen; i++ { -@@ -660,7 +660,7 @@ func sizeGroupSliceValue(listv pref.Value, tagsize int, opts marshalOptions) int - return n - } - --func appendGroupSliceValue(b []byte, listv pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { -+func appendGroupSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { - list := listv.List() - mopts := opts.Options() - for i, llen := 0, list.Len(); i < llen; i++ { -@@ -676,26 +676,26 @@ func appendGroupSliceValue(b []byte, listv pref.Value, wiretag uint64, opts mars - return b, nil - } - --func consumeGroupSliceValue(b []byte, listv pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) { -+func consumeGroupSliceValue(b []byte, listv protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) { - list := listv.List() - if wtyp != protowire.StartGroupType { -- return pref.Value{}, out, errUnknown -+ return protoreflect.Value{}, out, errUnknown - } - b, n := protowire.ConsumeGroup(num, b) - if n < 0 { -- return pref.Value{}, out, errDecode -+ return protoreflect.Value{}, out, errDecode - } - m := list.NewElement() -- o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ -+ o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ - Buf: b, - Message: m.Message(), - }) - if err != nil { -- return pref.Value{}, out, err -+ return protoreflect.Value{}, out, err - } - list.Append(m) - out.n = n -- out.initialized = o.Flags&piface.UnmarshalInitialized != 0 -+ out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 - return listv, out, nil - } - -@@ -707,7 +707,7 @@ var coderGroupSliceValue = valueCoderFuncs{ - merge: mergeMessageListValue, - } - --func makeGroupSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { -+func makeGroupSliceFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { - num := fd.Number() - if mi := getMessageInfo(ft); mi != nil { - funcs := pointerCoderFuncs{ -@@ -772,7 +772,7 @@ func consumeGroupSlice(b []byte, p pointer, num protowire.Number, wtyp protowire - return out, errDecode - } - mp := reflect.New(goType.Elem()) -- o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ -+ o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ - Buf: b, - Message: asMessage(mp).ProtoReflect(), - }) -@@ -781,7 +781,7 @@ func consumeGroupSlice(b []byte, p pointer, num protowire.Number, wtyp protowire - } - p.AppendPointerSlice(pointerOfValue(mp)) - out.n = n -- out.initialized = o.Flags&piface.UnmarshalInitialized != 0 -+ out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 - return out, nil - } - -@@ -822,8 +822,8 @@ func consumeGroupSliceInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFie - return out, nil - } - --func asMessage(v reflect.Value) pref.ProtoMessage { -- if m, ok := v.Interface().(pref.ProtoMessage); ok { -+func asMessage(v reflect.Value) protoreflect.ProtoMessage { -+ if m, ok := v.Interface().(protoreflect.ProtoMessage); ok { - return m - } - return legacyWrapMessage(v).Interface() -diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_map.go b/vendor/google.golang.org/protobuf/internal/impl/codec_map.go -index c1245fe..111b9d1 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/codec_map.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/codec_map.go -@@ -10,7 +10,7 @@ import ( - - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/genid" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - type mapInfo struct { -@@ -19,12 +19,12 @@ type mapInfo struct { - valWiretag uint64 - keyFuncs valueCoderFuncs - valFuncs valueCoderFuncs -- keyZero pref.Value -- keyKind pref.Kind -+ keyZero protoreflect.Value -+ keyKind protoreflect.Kind - conv *mapConverter - } - --func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) { -+func encoderFuncsForMap(fd protoreflect.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) { - // TODO: Consider generating specialized map coders. - keyField := fd.MapKey() - valField := fd.MapValue() -@@ -44,7 +44,7 @@ func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage - keyKind: keyField.Kind(), - conv: conv, - } -- if valField.Kind() == pref.MessageKind { -+ if valField.Kind() == protoreflect.MessageKind { - valueMessage = getMessageInfo(ft.Elem()) - } - -@@ -68,9 +68,9 @@ func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage - }, - } - switch valField.Kind() { -- case pref.MessageKind: -+ case protoreflect.MessageKind: - funcs.merge = mergeMapOfMessage -- case pref.BytesKind: -+ case protoreflect.BytesKind: - funcs.merge = mergeMapOfBytes - default: - funcs.merge = mergeMap -@@ -135,7 +135,7 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo - err := errUnknown - switch num { - case genid.MapEntry_Key_field_number: -- var v pref.Value -+ var v protoreflect.Value - var o unmarshalOutput - v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) - if err != nil { -@@ -144,7 +144,7 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo - key = v - n = o.n - case genid.MapEntry_Value_field_number: -- var v pref.Value -+ var v protoreflect.Value - var o unmarshalOutput - v, o, err = mapi.valFuncs.unmarshal(b, val, num, wtyp, opts) - if err != nil { -@@ -192,7 +192,7 @@ func consumeMapOfMessage(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi - err := errUnknown - switch num { - case 1: -- var v pref.Value -+ var v protoreflect.Value - var o unmarshalOutput - v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) - if err != nil { -diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_message.go b/vendor/google.golang.org/protobuf/internal/impl/codec_message.go -index cd40527..6b2fdbb 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/codec_message.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/codec_message.go -@@ -12,15 +12,15 @@ import ( - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/encoding/messageset" - "google.golang.org/protobuf/internal/order" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- piface "google.golang.org/protobuf/runtime/protoiface" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/runtime/protoiface" - ) - - // coderMessageInfo contains per-message information used by the fast-path functions. - // This is a different type from MessageInfo to keep MessageInfo as general-purpose as - // possible. - type coderMessageInfo struct { -- methods piface.Methods -+ methods protoiface.Methods - - orderedCoderFields []*coderFieldInfo - denseCoderFields []*coderFieldInfo -@@ -38,13 +38,13 @@ type coderFieldInfo struct { - funcs pointerCoderFuncs // fast-path per-field functions - mi *MessageInfo // field's message - ft reflect.Type -- validation validationInfo // information used by message validation -- num pref.FieldNumber // field number -- offset offset // struct field offset -- wiretag uint64 // field tag (number + wire type) -- tagsize int // size of the varint-encoded tag -- isPointer bool // true if IsNil may be called on the struct field -- isRequired bool // true if field is required -+ validation validationInfo // information used by message validation -+ num protoreflect.FieldNumber // field number -+ offset offset // struct field offset -+ wiretag uint64 // field tag (number + wire type) -+ tagsize int // size of the varint-encoded tag -+ isPointer bool // true if IsNil may be called on the struct field -+ isRequired bool // true if field is required - } - - func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { -@@ -125,8 +125,8 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { - funcs: funcs, - mi: childMessage, - validation: newFieldValidationInfo(mi, si, fd, ft), -- isPointer: fd.Cardinality() == pref.Repeated || fd.HasPresence(), -- isRequired: fd.Cardinality() == pref.Required, -+ isPointer: fd.Cardinality() == protoreflect.Repeated || fd.HasPresence(), -+ isRequired: fd.Cardinality() == protoreflect.Required, - } - mi.orderedCoderFields = append(mi.orderedCoderFields, cf) - mi.coderFields[cf.num] = cf -@@ -149,7 +149,7 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { - return mi.orderedCoderFields[i].num < mi.orderedCoderFields[j].num - }) - -- var maxDense pref.FieldNumber -+ var maxDense protoreflect.FieldNumber - for _, cf := range mi.orderedCoderFields { - if cf.num >= 16 && cf.num >= 2*maxDense { - break -@@ -175,12 +175,12 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { - - mi.needsInitCheck = needsInitCheck(mi.Desc) - if mi.methods.Marshal == nil && mi.methods.Size == nil { -- mi.methods.Flags |= piface.SupportMarshalDeterministic -+ mi.methods.Flags |= protoiface.SupportMarshalDeterministic - mi.methods.Marshal = mi.marshal - mi.methods.Size = mi.size - } - if mi.methods.Unmarshal == nil { -- mi.methods.Flags |= piface.SupportUnmarshalDiscardUnknown -+ mi.methods.Flags |= protoiface.SupportUnmarshalDiscardUnknown - mi.methods.Unmarshal = mi.unmarshal - } - if mi.methods.CheckInitialized == nil { -diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go b/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go -index e899712..576dcf3 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go -@@ -10,7 +10,7 @@ import ( - - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/strs" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - // pointerCoderFuncs is a set of pointer encoding functions. -@@ -25,83 +25,83 @@ type pointerCoderFuncs struct { - - // valueCoderFuncs is a set of protoreflect.Value encoding functions. - type valueCoderFuncs struct { -- size func(v pref.Value, tagsize int, opts marshalOptions) int -- marshal func(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) -- unmarshal func(b []byte, v pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) -- isInit func(v pref.Value) error -- merge func(dst, src pref.Value, opts mergeOptions) pref.Value -+ size func(v protoreflect.Value, tagsize int, opts marshalOptions) int -+ marshal func(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) -+ unmarshal func(b []byte, v protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) -+ isInit func(v protoreflect.Value) error -+ merge func(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value - } - - // fieldCoder returns pointer functions for a field, used for operating on - // struct fields. --func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) { -+func fieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) { - switch { - case fd.IsMap(): - return encoderFuncsForMap(fd, ft) -- case fd.Cardinality() == pref.Repeated && !fd.IsPacked(): -+ case fd.Cardinality() == protoreflect.Repeated && !fd.IsPacked(): - // Repeated fields (not packed). - if ft.Kind() != reflect.Slice { - break - } - ft := ft.Elem() - switch fd.Kind() { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - if ft.Kind() == reflect.Bool { - return nil, coderBoolSlice - } -- case pref.EnumKind: -+ case protoreflect.EnumKind: - if ft.Kind() == reflect.Int32 { - return nil, coderEnumSlice - } -- case pref.Int32Kind: -+ case protoreflect.Int32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderInt32Slice - } -- case pref.Sint32Kind: -+ case protoreflect.Sint32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderSint32Slice - } -- case pref.Uint32Kind: -+ case protoreflect.Uint32Kind: - if ft.Kind() == reflect.Uint32 { - return nil, coderUint32Slice - } -- case pref.Int64Kind: -+ case protoreflect.Int64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderInt64Slice - } -- case pref.Sint64Kind: -+ case protoreflect.Sint64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderSint64Slice - } -- case pref.Uint64Kind: -+ case protoreflect.Uint64Kind: - if ft.Kind() == reflect.Uint64 { - return nil, coderUint64Slice - } -- case pref.Sfixed32Kind: -+ case protoreflect.Sfixed32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderSfixed32Slice - } -- case pref.Fixed32Kind: -+ case protoreflect.Fixed32Kind: - if ft.Kind() == reflect.Uint32 { - return nil, coderFixed32Slice - } -- case pref.FloatKind: -+ case protoreflect.FloatKind: - if ft.Kind() == reflect.Float32 { - return nil, coderFloatSlice - } -- case pref.Sfixed64Kind: -+ case protoreflect.Sfixed64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderSfixed64Slice - } -- case pref.Fixed64Kind: -+ case protoreflect.Fixed64Kind: - if ft.Kind() == reflect.Uint64 { - return nil, coderFixed64Slice - } -- case pref.DoubleKind: -+ case protoreflect.DoubleKind: - if ft.Kind() == reflect.Float64 { - return nil, coderDoubleSlice - } -- case pref.StringKind: -+ case protoreflect.StringKind: - if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { - return nil, coderStringSliceValidateUTF8 - } -@@ -114,19 +114,19 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer - if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { - return nil, coderBytesSlice - } -- case pref.BytesKind: -+ case protoreflect.BytesKind: - if ft.Kind() == reflect.String { - return nil, coderStringSlice - } - if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { - return nil, coderBytesSlice - } -- case pref.MessageKind: -+ case protoreflect.MessageKind: - return getMessageInfo(ft), makeMessageSliceFieldCoder(fd, ft) -- case pref.GroupKind: -+ case protoreflect.GroupKind: - return getMessageInfo(ft), makeGroupSliceFieldCoder(fd, ft) - } -- case fd.Cardinality() == pref.Repeated && fd.IsPacked(): -+ case fd.Cardinality() == protoreflect.Repeated && fd.IsPacked(): - // Packed repeated fields. - // - // Only repeated fields of primitive numeric types -@@ -136,128 +136,128 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer - } - ft := ft.Elem() - switch fd.Kind() { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - if ft.Kind() == reflect.Bool { - return nil, coderBoolPackedSlice - } -- case pref.EnumKind: -+ case protoreflect.EnumKind: - if ft.Kind() == reflect.Int32 { - return nil, coderEnumPackedSlice - } -- case pref.Int32Kind: -+ case protoreflect.Int32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderInt32PackedSlice - } -- case pref.Sint32Kind: -+ case protoreflect.Sint32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderSint32PackedSlice - } -- case pref.Uint32Kind: -+ case protoreflect.Uint32Kind: - if ft.Kind() == reflect.Uint32 { - return nil, coderUint32PackedSlice - } -- case pref.Int64Kind: -+ case protoreflect.Int64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderInt64PackedSlice - } -- case pref.Sint64Kind: -+ case protoreflect.Sint64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderSint64PackedSlice - } -- case pref.Uint64Kind: -+ case protoreflect.Uint64Kind: - if ft.Kind() == reflect.Uint64 { - return nil, coderUint64PackedSlice - } -- case pref.Sfixed32Kind: -+ case protoreflect.Sfixed32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderSfixed32PackedSlice - } -- case pref.Fixed32Kind: -+ case protoreflect.Fixed32Kind: - if ft.Kind() == reflect.Uint32 { - return nil, coderFixed32PackedSlice - } -- case pref.FloatKind: -+ case protoreflect.FloatKind: - if ft.Kind() == reflect.Float32 { - return nil, coderFloatPackedSlice - } -- case pref.Sfixed64Kind: -+ case protoreflect.Sfixed64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderSfixed64PackedSlice - } -- case pref.Fixed64Kind: -+ case protoreflect.Fixed64Kind: - if ft.Kind() == reflect.Uint64 { - return nil, coderFixed64PackedSlice - } -- case pref.DoubleKind: -+ case protoreflect.DoubleKind: - if ft.Kind() == reflect.Float64 { - return nil, coderDoublePackedSlice - } - } -- case fd.Kind() == pref.MessageKind: -+ case fd.Kind() == protoreflect.MessageKind: - return getMessageInfo(ft), makeMessageFieldCoder(fd, ft) -- case fd.Kind() == pref.GroupKind: -+ case fd.Kind() == protoreflect.GroupKind: - return getMessageInfo(ft), makeGroupFieldCoder(fd, ft) -- case fd.Syntax() == pref.Proto3 && fd.ContainingOneof() == nil: -+ case fd.Syntax() == protoreflect.Proto3 && fd.ContainingOneof() == nil: - // Populated oneof fields always encode even if set to the zero value, - // which normally are not encoded in proto3. - switch fd.Kind() { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - if ft.Kind() == reflect.Bool { - return nil, coderBoolNoZero - } -- case pref.EnumKind: -+ case protoreflect.EnumKind: - if ft.Kind() == reflect.Int32 { - return nil, coderEnumNoZero - } -- case pref.Int32Kind: -+ case protoreflect.Int32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderInt32NoZero - } -- case pref.Sint32Kind: -+ case protoreflect.Sint32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderSint32NoZero - } -- case pref.Uint32Kind: -+ case protoreflect.Uint32Kind: - if ft.Kind() == reflect.Uint32 { - return nil, coderUint32NoZero - } -- case pref.Int64Kind: -+ case protoreflect.Int64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderInt64NoZero - } -- case pref.Sint64Kind: -+ case protoreflect.Sint64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderSint64NoZero - } -- case pref.Uint64Kind: -+ case protoreflect.Uint64Kind: - if ft.Kind() == reflect.Uint64 { - return nil, coderUint64NoZero - } -- case pref.Sfixed32Kind: -+ case protoreflect.Sfixed32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderSfixed32NoZero - } -- case pref.Fixed32Kind: -+ case protoreflect.Fixed32Kind: - if ft.Kind() == reflect.Uint32 { - return nil, coderFixed32NoZero - } -- case pref.FloatKind: -+ case protoreflect.FloatKind: - if ft.Kind() == reflect.Float32 { - return nil, coderFloatNoZero - } -- case pref.Sfixed64Kind: -+ case protoreflect.Sfixed64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderSfixed64NoZero - } -- case pref.Fixed64Kind: -+ case protoreflect.Fixed64Kind: - if ft.Kind() == reflect.Uint64 { - return nil, coderFixed64NoZero - } -- case pref.DoubleKind: -+ case protoreflect.DoubleKind: - if ft.Kind() == reflect.Float64 { - return nil, coderDoubleNoZero - } -- case pref.StringKind: -+ case protoreflect.StringKind: - if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { - return nil, coderStringNoZeroValidateUTF8 - } -@@ -270,7 +270,7 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer - if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { - return nil, coderBytesNoZero - } -- case pref.BytesKind: -+ case protoreflect.BytesKind: - if ft.Kind() == reflect.String { - return nil, coderStringNoZero - } -@@ -281,133 +281,133 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer - case ft.Kind() == reflect.Ptr: - ft := ft.Elem() - switch fd.Kind() { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - if ft.Kind() == reflect.Bool { - return nil, coderBoolPtr - } -- case pref.EnumKind: -+ case protoreflect.EnumKind: - if ft.Kind() == reflect.Int32 { - return nil, coderEnumPtr - } -- case pref.Int32Kind: -+ case protoreflect.Int32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderInt32Ptr - } -- case pref.Sint32Kind: -+ case protoreflect.Sint32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderSint32Ptr - } -- case pref.Uint32Kind: -+ case protoreflect.Uint32Kind: - if ft.Kind() == reflect.Uint32 { - return nil, coderUint32Ptr - } -- case pref.Int64Kind: -+ case protoreflect.Int64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderInt64Ptr - } -- case pref.Sint64Kind: -+ case protoreflect.Sint64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderSint64Ptr - } -- case pref.Uint64Kind: -+ case protoreflect.Uint64Kind: - if ft.Kind() == reflect.Uint64 { - return nil, coderUint64Ptr - } -- case pref.Sfixed32Kind: -+ case protoreflect.Sfixed32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderSfixed32Ptr - } -- case pref.Fixed32Kind: -+ case protoreflect.Fixed32Kind: - if ft.Kind() == reflect.Uint32 { - return nil, coderFixed32Ptr - } -- case pref.FloatKind: -+ case protoreflect.FloatKind: - if ft.Kind() == reflect.Float32 { - return nil, coderFloatPtr - } -- case pref.Sfixed64Kind: -+ case protoreflect.Sfixed64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderSfixed64Ptr - } -- case pref.Fixed64Kind: -+ case protoreflect.Fixed64Kind: - if ft.Kind() == reflect.Uint64 { - return nil, coderFixed64Ptr - } -- case pref.DoubleKind: -+ case protoreflect.DoubleKind: - if ft.Kind() == reflect.Float64 { - return nil, coderDoublePtr - } -- case pref.StringKind: -+ case protoreflect.StringKind: - if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { - return nil, coderStringPtrValidateUTF8 - } - if ft.Kind() == reflect.String { - return nil, coderStringPtr - } -- case pref.BytesKind: -+ case protoreflect.BytesKind: - if ft.Kind() == reflect.String { - return nil, coderStringPtr - } - } - default: - switch fd.Kind() { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - if ft.Kind() == reflect.Bool { - return nil, coderBool - } -- case pref.EnumKind: -+ case protoreflect.EnumKind: - if ft.Kind() == reflect.Int32 { - return nil, coderEnum - } -- case pref.Int32Kind: -+ case protoreflect.Int32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderInt32 - } -- case pref.Sint32Kind: -+ case protoreflect.Sint32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderSint32 - } -- case pref.Uint32Kind: -+ case protoreflect.Uint32Kind: - if ft.Kind() == reflect.Uint32 { - return nil, coderUint32 - } -- case pref.Int64Kind: -+ case protoreflect.Int64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderInt64 - } -- case pref.Sint64Kind: -+ case protoreflect.Sint64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderSint64 - } -- case pref.Uint64Kind: -+ case protoreflect.Uint64Kind: - if ft.Kind() == reflect.Uint64 { - return nil, coderUint64 - } -- case pref.Sfixed32Kind: -+ case protoreflect.Sfixed32Kind: - if ft.Kind() == reflect.Int32 { - return nil, coderSfixed32 - } -- case pref.Fixed32Kind: -+ case protoreflect.Fixed32Kind: - if ft.Kind() == reflect.Uint32 { - return nil, coderFixed32 - } -- case pref.FloatKind: -+ case protoreflect.FloatKind: - if ft.Kind() == reflect.Float32 { - return nil, coderFloat - } -- case pref.Sfixed64Kind: -+ case protoreflect.Sfixed64Kind: - if ft.Kind() == reflect.Int64 { - return nil, coderSfixed64 - } -- case pref.Fixed64Kind: -+ case protoreflect.Fixed64Kind: - if ft.Kind() == reflect.Uint64 { - return nil, coderFixed64 - } -- case pref.DoubleKind: -+ case protoreflect.DoubleKind: - if ft.Kind() == reflect.Float64 { - return nil, coderDouble - } -- case pref.StringKind: -+ case protoreflect.StringKind: - if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { - return nil, coderStringValidateUTF8 - } -@@ -420,7 +420,7 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer - if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { - return nil, coderBytes - } -- case pref.BytesKind: -+ case protoreflect.BytesKind: - if ft.Kind() == reflect.String { - return nil, coderString - } -@@ -434,122 +434,122 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer - - // encoderFuncsForValue returns value functions for a field, used for - // extension values and map encoding. --func encoderFuncsForValue(fd pref.FieldDescriptor) valueCoderFuncs { -+func encoderFuncsForValue(fd protoreflect.FieldDescriptor) valueCoderFuncs { - switch { -- case fd.Cardinality() == pref.Repeated && !fd.IsPacked(): -+ case fd.Cardinality() == protoreflect.Repeated && !fd.IsPacked(): - switch fd.Kind() { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - return coderBoolSliceValue -- case pref.EnumKind: -+ case protoreflect.EnumKind: - return coderEnumSliceValue -- case pref.Int32Kind: -+ case protoreflect.Int32Kind: - return coderInt32SliceValue -- case pref.Sint32Kind: -+ case protoreflect.Sint32Kind: - return coderSint32SliceValue -- case pref.Uint32Kind: -+ case protoreflect.Uint32Kind: - return coderUint32SliceValue -- case pref.Int64Kind: -+ case protoreflect.Int64Kind: - return coderInt64SliceValue -- case pref.Sint64Kind: -+ case protoreflect.Sint64Kind: - return coderSint64SliceValue -- case pref.Uint64Kind: -+ case protoreflect.Uint64Kind: - return coderUint64SliceValue -- case pref.Sfixed32Kind: -+ case protoreflect.Sfixed32Kind: - return coderSfixed32SliceValue -- case pref.Fixed32Kind: -+ case protoreflect.Fixed32Kind: - return coderFixed32SliceValue -- case pref.FloatKind: -+ case protoreflect.FloatKind: - return coderFloatSliceValue -- case pref.Sfixed64Kind: -+ case protoreflect.Sfixed64Kind: - return coderSfixed64SliceValue -- case pref.Fixed64Kind: -+ case protoreflect.Fixed64Kind: - return coderFixed64SliceValue -- case pref.DoubleKind: -+ case protoreflect.DoubleKind: - return coderDoubleSliceValue -- case pref.StringKind: -+ case protoreflect.StringKind: - // We don't have a UTF-8 validating coder for repeated string fields. - // Value coders are used for extensions and maps. - // Extensions are never proto3, and maps never contain lists. - return coderStringSliceValue -- case pref.BytesKind: -+ case protoreflect.BytesKind: - return coderBytesSliceValue -- case pref.MessageKind: -+ case protoreflect.MessageKind: - return coderMessageSliceValue -- case pref.GroupKind: -+ case protoreflect.GroupKind: - return coderGroupSliceValue - } -- case fd.Cardinality() == pref.Repeated && fd.IsPacked(): -+ case fd.Cardinality() == protoreflect.Repeated && fd.IsPacked(): - switch fd.Kind() { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - return coderBoolPackedSliceValue -- case pref.EnumKind: -+ case protoreflect.EnumKind: - return coderEnumPackedSliceValue -- case pref.Int32Kind: -+ case protoreflect.Int32Kind: - return coderInt32PackedSliceValue -- case pref.Sint32Kind: -+ case protoreflect.Sint32Kind: - return coderSint32PackedSliceValue -- case pref.Uint32Kind: -+ case protoreflect.Uint32Kind: - return coderUint32PackedSliceValue -- case pref.Int64Kind: -+ case protoreflect.Int64Kind: - return coderInt64PackedSliceValue -- case pref.Sint64Kind: -+ case protoreflect.Sint64Kind: - return coderSint64PackedSliceValue -- case pref.Uint64Kind: -+ case protoreflect.Uint64Kind: - return coderUint64PackedSliceValue -- case pref.Sfixed32Kind: -+ case protoreflect.Sfixed32Kind: - return coderSfixed32PackedSliceValue -- case pref.Fixed32Kind: -+ case protoreflect.Fixed32Kind: - return coderFixed32PackedSliceValue -- case pref.FloatKind: -+ case protoreflect.FloatKind: - return coderFloatPackedSliceValue -- case pref.Sfixed64Kind: -+ case protoreflect.Sfixed64Kind: - return coderSfixed64PackedSliceValue -- case pref.Fixed64Kind: -+ case protoreflect.Fixed64Kind: - return coderFixed64PackedSliceValue -- case pref.DoubleKind: -+ case protoreflect.DoubleKind: - return coderDoublePackedSliceValue - } - default: - switch fd.Kind() { - default: -- case pref.BoolKind: -+ case protoreflect.BoolKind: - return coderBoolValue -- case pref.EnumKind: -+ case protoreflect.EnumKind: - return coderEnumValue -- case pref.Int32Kind: -+ case protoreflect.Int32Kind: - return coderInt32Value -- case pref.Sint32Kind: -+ case protoreflect.Sint32Kind: - return coderSint32Value -- case pref.Uint32Kind: -+ case protoreflect.Uint32Kind: - return coderUint32Value -- case pref.Int64Kind: -+ case protoreflect.Int64Kind: - return coderInt64Value -- case pref.Sint64Kind: -+ case protoreflect.Sint64Kind: - return coderSint64Value -- case pref.Uint64Kind: -+ case protoreflect.Uint64Kind: - return coderUint64Value -- case pref.Sfixed32Kind: -+ case protoreflect.Sfixed32Kind: - return coderSfixed32Value -- case pref.Fixed32Kind: -+ case protoreflect.Fixed32Kind: - return coderFixed32Value -- case pref.FloatKind: -+ case protoreflect.FloatKind: - return coderFloatValue -- case pref.Sfixed64Kind: -+ case protoreflect.Sfixed64Kind: - return coderSfixed64Value -- case pref.Fixed64Kind: -+ case protoreflect.Fixed64Kind: - return coderFixed64Value -- case pref.DoubleKind: -+ case protoreflect.DoubleKind: - return coderDoubleValue -- case pref.StringKind: -+ case protoreflect.StringKind: - if strs.EnforceUTF8(fd) { - return coderStringValueValidateUTF8 - } - return coderStringValue -- case pref.BytesKind: -+ case protoreflect.BytesKind: - return coderBytesValue -- case pref.MessageKind: -+ case protoreflect.MessageKind: - return coderMessageValue -- case pref.GroupKind: -+ case protoreflect.GroupKind: - return coderGroupValue - } - } -diff --git a/vendor/google.golang.org/protobuf/internal/impl/convert.go b/vendor/google.golang.org/protobuf/internal/impl/convert.go -index acd61bb..185ef2e 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/convert.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/convert.go -@@ -8,7 +8,7 @@ import ( - "fmt" - "reflect" - -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - // unwrapper unwraps the value to the underlying value. -@@ -20,13 +20,13 @@ type unwrapper interface { - // A Converter coverts to/from Go reflect.Value types and protobuf protoreflect.Value types. - type Converter interface { - // PBValueOf converts a reflect.Value to a protoreflect.Value. -- PBValueOf(reflect.Value) pref.Value -+ PBValueOf(reflect.Value) protoreflect.Value - - // GoValueOf converts a protoreflect.Value to a reflect.Value. -- GoValueOf(pref.Value) reflect.Value -+ GoValueOf(protoreflect.Value) reflect.Value - - // IsValidPB returns whether a protoreflect.Value is compatible with this type. -- IsValidPB(pref.Value) bool -+ IsValidPB(protoreflect.Value) bool - - // IsValidGo returns whether a reflect.Value is compatible with this type. - IsValidGo(reflect.Value) bool -@@ -34,12 +34,12 @@ type Converter interface { - // New returns a new field value. - // For scalars, it returns the default value of the field. - // For composite types, it returns a new mutable value. -- New() pref.Value -+ New() protoreflect.Value - - // Zero returns a new field value. - // For scalars, it returns the default value of the field. - // For composite types, it returns an immutable, empty value. -- Zero() pref.Value -+ Zero() protoreflect.Value - } - - // NewConverter matches a Go type with a protobuf field and returns a Converter -@@ -50,7 +50,7 @@ type Converter interface { - // This matcher deliberately supports a wider range of Go types than what - // protoc-gen-go historically generated to be able to automatically wrap some - // v1 messages generated by other forks of protoc-gen-go. --func NewConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { -+func NewConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter { - switch { - case fd.IsList(): - return newListConverter(t, fd) -@@ -59,7 +59,6 @@ func NewConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { - default: - return newSingularConverter(t, fd) - } -- panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) - } - - var ( -@@ -76,68 +75,68 @@ var ( - ) - - var ( -- boolZero = pref.ValueOfBool(false) -- int32Zero = pref.ValueOfInt32(0) -- int64Zero = pref.ValueOfInt64(0) -- uint32Zero = pref.ValueOfUint32(0) -- uint64Zero = pref.ValueOfUint64(0) -- float32Zero = pref.ValueOfFloat32(0) -- float64Zero = pref.ValueOfFloat64(0) -- stringZero = pref.ValueOfString("") -- bytesZero = pref.ValueOfBytes(nil) -+ boolZero = protoreflect.ValueOfBool(false) -+ int32Zero = protoreflect.ValueOfInt32(0) -+ int64Zero = protoreflect.ValueOfInt64(0) -+ uint32Zero = protoreflect.ValueOfUint32(0) -+ uint64Zero = protoreflect.ValueOfUint64(0) -+ float32Zero = protoreflect.ValueOfFloat32(0) -+ float64Zero = protoreflect.ValueOfFloat64(0) -+ stringZero = protoreflect.ValueOfString("") -+ bytesZero = protoreflect.ValueOfBytes(nil) - ) - --func newSingularConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { -- defVal := func(fd pref.FieldDescriptor, zero pref.Value) pref.Value { -- if fd.Cardinality() == pref.Repeated { -+func newSingularConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter { -+ defVal := func(fd protoreflect.FieldDescriptor, zero protoreflect.Value) protoreflect.Value { -+ if fd.Cardinality() == protoreflect.Repeated { - // Default isn't defined for repeated fields. - return zero - } - return fd.Default() - } - switch fd.Kind() { -- case pref.BoolKind: -+ case protoreflect.BoolKind: - if t.Kind() == reflect.Bool { - return &boolConverter{t, defVal(fd, boolZero)} - } -- case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: -+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: - if t.Kind() == reflect.Int32 { - return &int32Converter{t, defVal(fd, int32Zero)} - } -- case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: -+ case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - if t.Kind() == reflect.Int64 { - return &int64Converter{t, defVal(fd, int64Zero)} - } -- case pref.Uint32Kind, pref.Fixed32Kind: -+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: - if t.Kind() == reflect.Uint32 { - return &uint32Converter{t, defVal(fd, uint32Zero)} - } -- case pref.Uint64Kind, pref.Fixed64Kind: -+ case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - if t.Kind() == reflect.Uint64 { - return &uint64Converter{t, defVal(fd, uint64Zero)} - } -- case pref.FloatKind: -+ case protoreflect.FloatKind: - if t.Kind() == reflect.Float32 { - return &float32Converter{t, defVal(fd, float32Zero)} - } -- case pref.DoubleKind: -+ case protoreflect.DoubleKind: - if t.Kind() == reflect.Float64 { - return &float64Converter{t, defVal(fd, float64Zero)} - } -- case pref.StringKind: -+ case protoreflect.StringKind: - if t.Kind() == reflect.String || (t.Kind() == reflect.Slice && t.Elem() == byteType) { - return &stringConverter{t, defVal(fd, stringZero)} - } -- case pref.BytesKind: -+ case protoreflect.BytesKind: - if t.Kind() == reflect.String || (t.Kind() == reflect.Slice && t.Elem() == byteType) { - return &bytesConverter{t, defVal(fd, bytesZero)} - } -- case pref.EnumKind: -+ case protoreflect.EnumKind: - // Handle enums, which must be a named int32 type. - if t.Kind() == reflect.Int32 { - return newEnumConverter(t, fd) - } -- case pref.MessageKind, pref.GroupKind: -+ case protoreflect.MessageKind, protoreflect.GroupKind: - return newMessageConverter(t) - } - panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) -@@ -145,184 +144,184 @@ func newSingularConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { - - type boolConverter struct { - goType reflect.Type -- def pref.Value -+ def protoreflect.Value - } - --func (c *boolConverter) PBValueOf(v reflect.Value) pref.Value { -+func (c *boolConverter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -- return pref.ValueOfBool(v.Bool()) -+ return protoreflect.ValueOfBool(v.Bool()) - } --func (c *boolConverter) GoValueOf(v pref.Value) reflect.Value { -+func (c *boolConverter) GoValueOf(v protoreflect.Value) reflect.Value { - return reflect.ValueOf(v.Bool()).Convert(c.goType) - } --func (c *boolConverter) IsValidPB(v pref.Value) bool { -+func (c *boolConverter) IsValidPB(v protoreflect.Value) bool { - _, ok := v.Interface().(bool) - return ok - } - func (c *boolConverter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } --func (c *boolConverter) New() pref.Value { return c.def } --func (c *boolConverter) Zero() pref.Value { return c.def } -+func (c *boolConverter) New() protoreflect.Value { return c.def } -+func (c *boolConverter) Zero() protoreflect.Value { return c.def } - - type int32Converter struct { - goType reflect.Type -- def pref.Value -+ def protoreflect.Value - } - --func (c *int32Converter) PBValueOf(v reflect.Value) pref.Value { -+func (c *int32Converter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -- return pref.ValueOfInt32(int32(v.Int())) -+ return protoreflect.ValueOfInt32(int32(v.Int())) - } --func (c *int32Converter) GoValueOf(v pref.Value) reflect.Value { -+func (c *int32Converter) GoValueOf(v protoreflect.Value) reflect.Value { - return reflect.ValueOf(int32(v.Int())).Convert(c.goType) - } --func (c *int32Converter) IsValidPB(v pref.Value) bool { -+func (c *int32Converter) IsValidPB(v protoreflect.Value) bool { - _, ok := v.Interface().(int32) - return ok - } - func (c *int32Converter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } --func (c *int32Converter) New() pref.Value { return c.def } --func (c *int32Converter) Zero() pref.Value { return c.def } -+func (c *int32Converter) New() protoreflect.Value { return c.def } -+func (c *int32Converter) Zero() protoreflect.Value { return c.def } - - type int64Converter struct { - goType reflect.Type -- def pref.Value -+ def protoreflect.Value - } - --func (c *int64Converter) PBValueOf(v reflect.Value) pref.Value { -+func (c *int64Converter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -- return pref.ValueOfInt64(int64(v.Int())) -+ return protoreflect.ValueOfInt64(int64(v.Int())) - } --func (c *int64Converter) GoValueOf(v pref.Value) reflect.Value { -+func (c *int64Converter) GoValueOf(v protoreflect.Value) reflect.Value { - return reflect.ValueOf(int64(v.Int())).Convert(c.goType) - } --func (c *int64Converter) IsValidPB(v pref.Value) bool { -+func (c *int64Converter) IsValidPB(v protoreflect.Value) bool { - _, ok := v.Interface().(int64) - return ok - } - func (c *int64Converter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } --func (c *int64Converter) New() pref.Value { return c.def } --func (c *int64Converter) Zero() pref.Value { return c.def } -+func (c *int64Converter) New() protoreflect.Value { return c.def } -+func (c *int64Converter) Zero() protoreflect.Value { return c.def } - - type uint32Converter struct { - goType reflect.Type -- def pref.Value -+ def protoreflect.Value - } - --func (c *uint32Converter) PBValueOf(v reflect.Value) pref.Value { -+func (c *uint32Converter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -- return pref.ValueOfUint32(uint32(v.Uint())) -+ return protoreflect.ValueOfUint32(uint32(v.Uint())) - } --func (c *uint32Converter) GoValueOf(v pref.Value) reflect.Value { -+func (c *uint32Converter) GoValueOf(v protoreflect.Value) reflect.Value { - return reflect.ValueOf(uint32(v.Uint())).Convert(c.goType) - } --func (c *uint32Converter) IsValidPB(v pref.Value) bool { -+func (c *uint32Converter) IsValidPB(v protoreflect.Value) bool { - _, ok := v.Interface().(uint32) - return ok - } - func (c *uint32Converter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } --func (c *uint32Converter) New() pref.Value { return c.def } --func (c *uint32Converter) Zero() pref.Value { return c.def } -+func (c *uint32Converter) New() protoreflect.Value { return c.def } -+func (c *uint32Converter) Zero() protoreflect.Value { return c.def } - - type uint64Converter struct { - goType reflect.Type -- def pref.Value -+ def protoreflect.Value - } - --func (c *uint64Converter) PBValueOf(v reflect.Value) pref.Value { -+func (c *uint64Converter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -- return pref.ValueOfUint64(uint64(v.Uint())) -+ return protoreflect.ValueOfUint64(uint64(v.Uint())) - } --func (c *uint64Converter) GoValueOf(v pref.Value) reflect.Value { -+func (c *uint64Converter) GoValueOf(v protoreflect.Value) reflect.Value { - return reflect.ValueOf(uint64(v.Uint())).Convert(c.goType) - } --func (c *uint64Converter) IsValidPB(v pref.Value) bool { -+func (c *uint64Converter) IsValidPB(v protoreflect.Value) bool { - _, ok := v.Interface().(uint64) - return ok - } - func (c *uint64Converter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } --func (c *uint64Converter) New() pref.Value { return c.def } --func (c *uint64Converter) Zero() pref.Value { return c.def } -+func (c *uint64Converter) New() protoreflect.Value { return c.def } -+func (c *uint64Converter) Zero() protoreflect.Value { return c.def } - - type float32Converter struct { - goType reflect.Type -- def pref.Value -+ def protoreflect.Value - } - --func (c *float32Converter) PBValueOf(v reflect.Value) pref.Value { -+func (c *float32Converter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -- return pref.ValueOfFloat32(float32(v.Float())) -+ return protoreflect.ValueOfFloat32(float32(v.Float())) - } --func (c *float32Converter) GoValueOf(v pref.Value) reflect.Value { -+func (c *float32Converter) GoValueOf(v protoreflect.Value) reflect.Value { - return reflect.ValueOf(float32(v.Float())).Convert(c.goType) - } --func (c *float32Converter) IsValidPB(v pref.Value) bool { -+func (c *float32Converter) IsValidPB(v protoreflect.Value) bool { - _, ok := v.Interface().(float32) - return ok - } - func (c *float32Converter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } --func (c *float32Converter) New() pref.Value { return c.def } --func (c *float32Converter) Zero() pref.Value { return c.def } -+func (c *float32Converter) New() protoreflect.Value { return c.def } -+func (c *float32Converter) Zero() protoreflect.Value { return c.def } - - type float64Converter struct { - goType reflect.Type -- def pref.Value -+ def protoreflect.Value - } - --func (c *float64Converter) PBValueOf(v reflect.Value) pref.Value { -+func (c *float64Converter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -- return pref.ValueOfFloat64(float64(v.Float())) -+ return protoreflect.ValueOfFloat64(float64(v.Float())) - } --func (c *float64Converter) GoValueOf(v pref.Value) reflect.Value { -+func (c *float64Converter) GoValueOf(v protoreflect.Value) reflect.Value { - return reflect.ValueOf(float64(v.Float())).Convert(c.goType) - } --func (c *float64Converter) IsValidPB(v pref.Value) bool { -+func (c *float64Converter) IsValidPB(v protoreflect.Value) bool { - _, ok := v.Interface().(float64) - return ok - } - func (c *float64Converter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } --func (c *float64Converter) New() pref.Value { return c.def } --func (c *float64Converter) Zero() pref.Value { return c.def } -+func (c *float64Converter) New() protoreflect.Value { return c.def } -+func (c *float64Converter) Zero() protoreflect.Value { return c.def } - - type stringConverter struct { - goType reflect.Type -- def pref.Value -+ def protoreflect.Value - } - --func (c *stringConverter) PBValueOf(v reflect.Value) pref.Value { -+func (c *stringConverter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -- return pref.ValueOfString(v.Convert(stringType).String()) -+ return protoreflect.ValueOfString(v.Convert(stringType).String()) - } --func (c *stringConverter) GoValueOf(v pref.Value) reflect.Value { -+func (c *stringConverter) GoValueOf(v protoreflect.Value) reflect.Value { - // pref.Value.String never panics, so we go through an interface - // conversion here to check the type. - s := v.Interface().(string) -@@ -331,71 +330,71 @@ func (c *stringConverter) GoValueOf(v pref.Value) reflect.Value { - } - return reflect.ValueOf(s).Convert(c.goType) - } --func (c *stringConverter) IsValidPB(v pref.Value) bool { -+func (c *stringConverter) IsValidPB(v protoreflect.Value) bool { - _, ok := v.Interface().(string) - return ok - } - func (c *stringConverter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } --func (c *stringConverter) New() pref.Value { return c.def } --func (c *stringConverter) Zero() pref.Value { return c.def } -+func (c *stringConverter) New() protoreflect.Value { return c.def } -+func (c *stringConverter) Zero() protoreflect.Value { return c.def } - - type bytesConverter struct { - goType reflect.Type -- def pref.Value -+ def protoreflect.Value - } - --func (c *bytesConverter) PBValueOf(v reflect.Value) pref.Value { -+func (c *bytesConverter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } - if c.goType.Kind() == reflect.String && v.Len() == 0 { -- return pref.ValueOfBytes(nil) // ensure empty string is []byte(nil) -+ return protoreflect.ValueOfBytes(nil) // ensure empty string is []byte(nil) - } -- return pref.ValueOfBytes(v.Convert(bytesType).Bytes()) -+ return protoreflect.ValueOfBytes(v.Convert(bytesType).Bytes()) - } --func (c *bytesConverter) GoValueOf(v pref.Value) reflect.Value { -+func (c *bytesConverter) GoValueOf(v protoreflect.Value) reflect.Value { - return reflect.ValueOf(v.Bytes()).Convert(c.goType) - } --func (c *bytesConverter) IsValidPB(v pref.Value) bool { -+func (c *bytesConverter) IsValidPB(v protoreflect.Value) bool { - _, ok := v.Interface().([]byte) - return ok - } - func (c *bytesConverter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } --func (c *bytesConverter) New() pref.Value { return c.def } --func (c *bytesConverter) Zero() pref.Value { return c.def } -+func (c *bytesConverter) New() protoreflect.Value { return c.def } -+func (c *bytesConverter) Zero() protoreflect.Value { return c.def } - - type enumConverter struct { - goType reflect.Type -- def pref.Value -+ def protoreflect.Value - } - --func newEnumConverter(goType reflect.Type, fd pref.FieldDescriptor) Converter { -- var def pref.Value -- if fd.Cardinality() == pref.Repeated { -- def = pref.ValueOfEnum(fd.Enum().Values().Get(0).Number()) -+func newEnumConverter(goType reflect.Type, fd protoreflect.FieldDescriptor) Converter { -+ var def protoreflect.Value -+ if fd.Cardinality() == protoreflect.Repeated { -+ def = protoreflect.ValueOfEnum(fd.Enum().Values().Get(0).Number()) - } else { - def = fd.Default() - } - return &enumConverter{goType, def} - } - --func (c *enumConverter) PBValueOf(v reflect.Value) pref.Value { -+func (c *enumConverter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -- return pref.ValueOfEnum(pref.EnumNumber(v.Int())) -+ return protoreflect.ValueOfEnum(protoreflect.EnumNumber(v.Int())) - } - --func (c *enumConverter) GoValueOf(v pref.Value) reflect.Value { -+func (c *enumConverter) GoValueOf(v protoreflect.Value) reflect.Value { - return reflect.ValueOf(v.Enum()).Convert(c.goType) - } - --func (c *enumConverter) IsValidPB(v pref.Value) bool { -- _, ok := v.Interface().(pref.EnumNumber) -+func (c *enumConverter) IsValidPB(v protoreflect.Value) bool { -+ _, ok := v.Interface().(protoreflect.EnumNumber) - return ok - } - -@@ -403,11 +402,11 @@ func (c *enumConverter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } - --func (c *enumConverter) New() pref.Value { -+func (c *enumConverter) New() protoreflect.Value { - return c.def - } - --func (c *enumConverter) Zero() pref.Value { -+func (c *enumConverter) Zero() protoreflect.Value { - return c.def - } - -@@ -419,7 +418,7 @@ func newMessageConverter(goType reflect.Type) Converter { - return &messageConverter{goType} - } - --func (c *messageConverter) PBValueOf(v reflect.Value) pref.Value { -+func (c *messageConverter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -@@ -430,13 +429,13 @@ func (c *messageConverter) PBValueOf(v reflect.Value) pref.Value { - v = reflect.Zero(reflect.PtrTo(v.Type())) - } - } -- if m, ok := v.Interface().(pref.ProtoMessage); ok { -- return pref.ValueOfMessage(m.ProtoReflect()) -+ if m, ok := v.Interface().(protoreflect.ProtoMessage); ok { -+ return protoreflect.ValueOfMessage(m.ProtoReflect()) - } -- return pref.ValueOfMessage(legacyWrapMessage(v)) -+ return protoreflect.ValueOfMessage(legacyWrapMessage(v)) - } - --func (c *messageConverter) GoValueOf(v pref.Value) reflect.Value { -+func (c *messageConverter) GoValueOf(v protoreflect.Value) reflect.Value { - m := v.Message() - var rv reflect.Value - if u, ok := m.(unwrapper); ok { -@@ -460,7 +459,7 @@ func (c *messageConverter) GoValueOf(v pref.Value) reflect.Value { - return rv - } - --func (c *messageConverter) IsValidPB(v pref.Value) bool { -+func (c *messageConverter) IsValidPB(v protoreflect.Value) bool { - m := v.Message() - var rv reflect.Value - if u, ok := m.(unwrapper); ok { -@@ -478,14 +477,14 @@ func (c *messageConverter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } - --func (c *messageConverter) New() pref.Value { -+func (c *messageConverter) New() protoreflect.Value { - if c.isNonPointer() { - return c.PBValueOf(reflect.New(c.goType).Elem()) - } - return c.PBValueOf(reflect.New(c.goType.Elem())) - } - --func (c *messageConverter) Zero() pref.Value { -+func (c *messageConverter) Zero() protoreflect.Value { - return c.PBValueOf(reflect.Zero(c.goType)) - } - -diff --git a/vendor/google.golang.org/protobuf/internal/impl/convert_list.go b/vendor/google.golang.org/protobuf/internal/impl/convert_list.go -index 6fccab5..f891365 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/convert_list.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/convert_list.go -@@ -8,10 +8,10 @@ import ( - "fmt" - "reflect" - -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - --func newListConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { -+func newListConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter { - switch { - case t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Slice: - return &listPtrConverter{t, newSingularConverter(t.Elem().Elem(), fd)} -@@ -26,16 +26,16 @@ type listConverter struct { - c Converter - } - --func (c *listConverter) PBValueOf(v reflect.Value) pref.Value { -+func (c *listConverter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } - pv := reflect.New(c.goType) - pv.Elem().Set(v) -- return pref.ValueOfList(&listReflect{pv, c.c}) -+ return protoreflect.ValueOfList(&listReflect{pv, c.c}) - } - --func (c *listConverter) GoValueOf(v pref.Value) reflect.Value { -+func (c *listConverter) GoValueOf(v protoreflect.Value) reflect.Value { - rv := v.List().(*listReflect).v - if rv.IsNil() { - return reflect.Zero(c.goType) -@@ -43,7 +43,7 @@ func (c *listConverter) GoValueOf(v pref.Value) reflect.Value { - return rv.Elem() - } - --func (c *listConverter) IsValidPB(v pref.Value) bool { -+func (c *listConverter) IsValidPB(v protoreflect.Value) bool { - list, ok := v.Interface().(*listReflect) - if !ok { - return false -@@ -55,12 +55,12 @@ func (c *listConverter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } - --func (c *listConverter) New() pref.Value { -- return pref.ValueOfList(&listReflect{reflect.New(c.goType), c.c}) -+func (c *listConverter) New() protoreflect.Value { -+ return protoreflect.ValueOfList(&listReflect{reflect.New(c.goType), c.c}) - } - --func (c *listConverter) Zero() pref.Value { -- return pref.ValueOfList(&listReflect{reflect.Zero(reflect.PtrTo(c.goType)), c.c}) -+func (c *listConverter) Zero() protoreflect.Value { -+ return protoreflect.ValueOfList(&listReflect{reflect.Zero(reflect.PtrTo(c.goType)), c.c}) - } - - type listPtrConverter struct { -@@ -68,18 +68,18 @@ type listPtrConverter struct { - c Converter - } - --func (c *listPtrConverter) PBValueOf(v reflect.Value) pref.Value { -+func (c *listPtrConverter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -- return pref.ValueOfList(&listReflect{v, c.c}) -+ return protoreflect.ValueOfList(&listReflect{v, c.c}) - } - --func (c *listPtrConverter) GoValueOf(v pref.Value) reflect.Value { -+func (c *listPtrConverter) GoValueOf(v protoreflect.Value) reflect.Value { - return v.List().(*listReflect).v - } - --func (c *listPtrConverter) IsValidPB(v pref.Value) bool { -+func (c *listPtrConverter) IsValidPB(v protoreflect.Value) bool { - list, ok := v.Interface().(*listReflect) - if !ok { - return false -@@ -91,11 +91,11 @@ func (c *listPtrConverter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } - --func (c *listPtrConverter) New() pref.Value { -+func (c *listPtrConverter) New() protoreflect.Value { - return c.PBValueOf(reflect.New(c.goType.Elem())) - } - --func (c *listPtrConverter) Zero() pref.Value { -+func (c *listPtrConverter) Zero() protoreflect.Value { - return c.PBValueOf(reflect.Zero(c.goType)) - } - -@@ -110,16 +110,16 @@ func (ls *listReflect) Len() int { - } - return ls.v.Elem().Len() - } --func (ls *listReflect) Get(i int) pref.Value { -+func (ls *listReflect) Get(i int) protoreflect.Value { - return ls.conv.PBValueOf(ls.v.Elem().Index(i)) - } --func (ls *listReflect) Set(i int, v pref.Value) { -+func (ls *listReflect) Set(i int, v protoreflect.Value) { - ls.v.Elem().Index(i).Set(ls.conv.GoValueOf(v)) - } --func (ls *listReflect) Append(v pref.Value) { -+func (ls *listReflect) Append(v protoreflect.Value) { - ls.v.Elem().Set(reflect.Append(ls.v.Elem(), ls.conv.GoValueOf(v))) - } --func (ls *listReflect) AppendMutable() pref.Value { -+func (ls *listReflect) AppendMutable() protoreflect.Value { - if _, ok := ls.conv.(*messageConverter); !ok { - panic("invalid AppendMutable on list with non-message type") - } -@@ -130,7 +130,7 @@ func (ls *listReflect) AppendMutable() pref.Value { - func (ls *listReflect) Truncate(i int) { - ls.v.Elem().Set(ls.v.Elem().Slice(0, i)) - } --func (ls *listReflect) NewElement() pref.Value { -+func (ls *listReflect) NewElement() protoreflect.Value { - return ls.conv.New() - } - func (ls *listReflect) IsValid() bool { -diff --git a/vendor/google.golang.org/protobuf/internal/impl/convert_map.go b/vendor/google.golang.org/protobuf/internal/impl/convert_map.go -index de06b25..f30b0a0 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/convert_map.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/convert_map.go -@@ -8,7 +8,7 @@ import ( - "fmt" - "reflect" - -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - type mapConverter struct { -@@ -16,7 +16,7 @@ type mapConverter struct { - keyConv, valConv Converter - } - --func newMapConverter(t reflect.Type, fd pref.FieldDescriptor) *mapConverter { -+func newMapConverter(t reflect.Type, fd protoreflect.FieldDescriptor) *mapConverter { - if t.Kind() != reflect.Map { - panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) - } -@@ -27,18 +27,18 @@ func newMapConverter(t reflect.Type, fd pref.FieldDescriptor) *mapConverter { - } - } - --func (c *mapConverter) PBValueOf(v reflect.Value) pref.Value { -+func (c *mapConverter) PBValueOf(v reflect.Value) protoreflect.Value { - if v.Type() != c.goType { - panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) - } -- return pref.ValueOfMap(&mapReflect{v, c.keyConv, c.valConv}) -+ return protoreflect.ValueOfMap(&mapReflect{v, c.keyConv, c.valConv}) - } - --func (c *mapConverter) GoValueOf(v pref.Value) reflect.Value { -+func (c *mapConverter) GoValueOf(v protoreflect.Value) reflect.Value { - return v.Map().(*mapReflect).v - } - --func (c *mapConverter) IsValidPB(v pref.Value) bool { -+func (c *mapConverter) IsValidPB(v protoreflect.Value) bool { - mapv, ok := v.Interface().(*mapReflect) - if !ok { - return false -@@ -50,11 +50,11 @@ func (c *mapConverter) IsValidGo(v reflect.Value) bool { - return v.IsValid() && v.Type() == c.goType - } - --func (c *mapConverter) New() pref.Value { -+func (c *mapConverter) New() protoreflect.Value { - return c.PBValueOf(reflect.MakeMap(c.goType)) - } - --func (c *mapConverter) Zero() pref.Value { -+func (c *mapConverter) Zero() protoreflect.Value { - return c.PBValueOf(reflect.Zero(c.goType)) - } - -@@ -67,29 +67,29 @@ type mapReflect struct { - func (ms *mapReflect) Len() int { - return ms.v.Len() - } --func (ms *mapReflect) Has(k pref.MapKey) bool { -+func (ms *mapReflect) Has(k protoreflect.MapKey) bool { - rk := ms.keyConv.GoValueOf(k.Value()) - rv := ms.v.MapIndex(rk) - return rv.IsValid() - } --func (ms *mapReflect) Get(k pref.MapKey) pref.Value { -+func (ms *mapReflect) Get(k protoreflect.MapKey) protoreflect.Value { - rk := ms.keyConv.GoValueOf(k.Value()) - rv := ms.v.MapIndex(rk) - if !rv.IsValid() { -- return pref.Value{} -+ return protoreflect.Value{} - } - return ms.valConv.PBValueOf(rv) - } --func (ms *mapReflect) Set(k pref.MapKey, v pref.Value) { -+func (ms *mapReflect) Set(k protoreflect.MapKey, v protoreflect.Value) { - rk := ms.keyConv.GoValueOf(k.Value()) - rv := ms.valConv.GoValueOf(v) - ms.v.SetMapIndex(rk, rv) - } --func (ms *mapReflect) Clear(k pref.MapKey) { -+func (ms *mapReflect) Clear(k protoreflect.MapKey) { - rk := ms.keyConv.GoValueOf(k.Value()) - ms.v.SetMapIndex(rk, reflect.Value{}) - } --func (ms *mapReflect) Mutable(k pref.MapKey) pref.Value { -+func (ms *mapReflect) Mutable(k protoreflect.MapKey) protoreflect.Value { - if _, ok := ms.valConv.(*messageConverter); !ok { - panic("invalid Mutable on map with non-message value type") - } -@@ -100,7 +100,7 @@ func (ms *mapReflect) Mutable(k pref.MapKey) pref.Value { - } - return v - } --func (ms *mapReflect) Range(f func(pref.MapKey, pref.Value) bool) { -+func (ms *mapReflect) Range(f func(protoreflect.MapKey, protoreflect.Value) bool) { - iter := mapRange(ms.v) - for iter.Next() { - k := ms.keyConv.PBValueOf(iter.Key()).MapKey() -@@ -110,7 +110,7 @@ func (ms *mapReflect) Range(f func(pref.MapKey, pref.Value) bool) { - } - } - } --func (ms *mapReflect) NewValue() pref.Value { -+func (ms *mapReflect) NewValue() protoreflect.Value { - return ms.valConv.New() - } - func (ms *mapReflect) IsValid() bool { -diff --git a/vendor/google.golang.org/protobuf/internal/impl/decode.go b/vendor/google.golang.org/protobuf/internal/impl/decode.go -index c65b032..cda0520 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/decode.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/decode.go -@@ -12,9 +12,8 @@ import ( - "google.golang.org/protobuf/internal/flags" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" -- preg "google.golang.org/protobuf/reflect/protoregistry" -+ "google.golang.org/protobuf/reflect/protoregistry" - "google.golang.org/protobuf/runtime/protoiface" -- piface "google.golang.org/protobuf/runtime/protoiface" - ) - - var errDecode = errors.New("cannot parse invalid wire-format data") -@@ -38,14 +37,16 @@ func (o unmarshalOptions) Options() proto.UnmarshalOptions { - } - } - --func (o unmarshalOptions) DiscardUnknown() bool { return o.flags&piface.UnmarshalDiscardUnknown != 0 } -+func (o unmarshalOptions) DiscardUnknown() bool { -+ return o.flags&protoiface.UnmarshalDiscardUnknown != 0 -+} - - func (o unmarshalOptions) IsDefault() bool { -- return o.flags == 0 && o.resolver == preg.GlobalTypes -+ return o.flags == 0 && o.resolver == protoregistry.GlobalTypes - } - - var lazyUnmarshalOptions = unmarshalOptions{ -- resolver: preg.GlobalTypes, -+ resolver: protoregistry.GlobalTypes, - depth: protowire.DefaultRecursionLimit, - } - -@@ -55,7 +56,7 @@ type unmarshalOutput struct { - } - - // unmarshal is protoreflect.Methods.Unmarshal. --func (mi *MessageInfo) unmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutput, error) { -+func (mi *MessageInfo) unmarshal(in protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { - var p pointer - if ms, ok := in.Message.(*messageState); ok { - p = ms.pointer() -@@ -67,11 +68,11 @@ func (mi *MessageInfo) unmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutp - resolver: in.Resolver, - depth: in.Depth, - }) -- var flags piface.UnmarshalOutputFlags -+ var flags protoiface.UnmarshalOutputFlags - if out.initialized { -- flags |= piface.UnmarshalInitialized -+ flags |= protoiface.UnmarshalInitialized - } -- return piface.UnmarshalOutput{ -+ return protoiface.UnmarshalOutput{ - Flags: flags, - }, err - } -@@ -210,7 +211,7 @@ func (mi *MessageInfo) unmarshalExtension(b []byte, num protowire.Number, wtyp p - var err error - xt, err = opts.resolver.FindExtensionByNumber(mi.Desc.FullName(), num) - if err != nil { -- if err == preg.NotFound { -+ if err == protoregistry.NotFound { - return out, errUnknown - } - return out, errors.New("%v: unable to resolve extension %v: %v", mi.Desc.FullName(), num, err) -diff --git a/vendor/google.golang.org/protobuf/internal/impl/enum.go b/vendor/google.golang.org/protobuf/internal/impl/enum.go -index 8c1eab4..5f3ef5a 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/enum.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/enum.go -@@ -7,15 +7,15 @@ package impl - import ( - "reflect" - -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - type EnumInfo struct { - GoReflectType reflect.Type // int32 kind -- Desc pref.EnumDescriptor -+ Desc protoreflect.EnumDescriptor - } - --func (t *EnumInfo) New(n pref.EnumNumber) pref.Enum { -- return reflect.ValueOf(n).Convert(t.GoReflectType).Interface().(pref.Enum) -+func (t *EnumInfo) New(n protoreflect.EnumNumber) protoreflect.Enum { -+ return reflect.ValueOf(n).Convert(t.GoReflectType).Interface().(protoreflect.Enum) - } --func (t *EnumInfo) Descriptor() pref.EnumDescriptor { return t.Desc } -+func (t *EnumInfo) Descriptor() protoreflect.EnumDescriptor { return t.Desc } -diff --git a/vendor/google.golang.org/protobuf/internal/impl/extension.go b/vendor/google.golang.org/protobuf/internal/impl/extension.go -index e904fd9..cb25b0b 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/extension.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/extension.go -@@ -9,8 +9,8 @@ import ( - "sync" - "sync/atomic" - -- pref "google.golang.org/protobuf/reflect/protoreflect" -- piface "google.golang.org/protobuf/runtime/protoiface" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/runtime/protoiface" - ) - - // ExtensionInfo implements ExtensionType. -@@ -45,7 +45,7 @@ type ExtensionInfo struct { - // since the message may no longer implement the MessageV1 interface. - // - // Deprecated: Use the ExtendedType method instead. -- ExtendedType piface.MessageV1 -+ ExtendedType protoiface.MessageV1 - - // ExtensionType is the zero value of the extension type. - // -@@ -83,31 +83,31 @@ const ( - extensionInfoFullInit = 2 - ) - --func InitExtensionInfo(xi *ExtensionInfo, xd pref.ExtensionDescriptor, goType reflect.Type) { -+func InitExtensionInfo(xi *ExtensionInfo, xd protoreflect.ExtensionDescriptor, goType reflect.Type) { - xi.goType = goType - xi.desc = extensionTypeDescriptor{xd, xi} - xi.init = extensionInfoDescInit - } - --func (xi *ExtensionInfo) New() pref.Value { -+func (xi *ExtensionInfo) New() protoreflect.Value { - return xi.lazyInit().New() - } --func (xi *ExtensionInfo) Zero() pref.Value { -+func (xi *ExtensionInfo) Zero() protoreflect.Value { - return xi.lazyInit().Zero() - } --func (xi *ExtensionInfo) ValueOf(v interface{}) pref.Value { -+func (xi *ExtensionInfo) ValueOf(v interface{}) protoreflect.Value { - return xi.lazyInit().PBValueOf(reflect.ValueOf(v)) - } --func (xi *ExtensionInfo) InterfaceOf(v pref.Value) interface{} { -+func (xi *ExtensionInfo) InterfaceOf(v protoreflect.Value) interface{} { - return xi.lazyInit().GoValueOf(v).Interface() - } --func (xi *ExtensionInfo) IsValidValue(v pref.Value) bool { -+func (xi *ExtensionInfo) IsValidValue(v protoreflect.Value) bool { - return xi.lazyInit().IsValidPB(v) - } - func (xi *ExtensionInfo) IsValidInterface(v interface{}) bool { - return xi.lazyInit().IsValidGo(reflect.ValueOf(v)) - } --func (xi *ExtensionInfo) TypeDescriptor() pref.ExtensionTypeDescriptor { -+func (xi *ExtensionInfo) TypeDescriptor() protoreflect.ExtensionTypeDescriptor { - if atomic.LoadUint32(&xi.init) < extensionInfoDescInit { - xi.lazyInitSlow() - } -@@ -144,13 +144,13 @@ func (xi *ExtensionInfo) lazyInitSlow() { - } - - type extensionTypeDescriptor struct { -- pref.ExtensionDescriptor -+ protoreflect.ExtensionDescriptor - xi *ExtensionInfo - } - --func (xtd *extensionTypeDescriptor) Type() pref.ExtensionType { -+func (xtd *extensionTypeDescriptor) Type() protoreflect.ExtensionType { - return xtd.xi - } --func (xtd *extensionTypeDescriptor) Descriptor() pref.ExtensionDescriptor { -+func (xtd *extensionTypeDescriptor) Descriptor() protoreflect.ExtensionDescriptor { - return xtd.ExtensionDescriptor - } -diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go -index f7d7ffb..c2a803b 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go -@@ -13,13 +13,12 @@ import ( - "google.golang.org/protobuf/internal/filedesc" - "google.golang.org/protobuf/internal/strs" - "google.golang.org/protobuf/reflect/protoreflect" -- pref "google.golang.org/protobuf/reflect/protoreflect" - ) - - // legacyEnumName returns the name of enums used in legacy code. - // It is neither the protobuf full name nor the qualified Go name, - // but rather an odd hybrid of both. --func legacyEnumName(ed pref.EnumDescriptor) string { -+func legacyEnumName(ed protoreflect.EnumDescriptor) string { - var protoPkg string - enumName := string(ed.FullName()) - if fd := ed.ParentFile(); fd != nil { -@@ -34,68 +33,68 @@ func legacyEnumName(ed pref.EnumDescriptor) string { - - // legacyWrapEnum wraps v as a protoreflect.Enum, - // where v must be a int32 kind and not implement the v2 API already. --func legacyWrapEnum(v reflect.Value) pref.Enum { -+func legacyWrapEnum(v reflect.Value) protoreflect.Enum { - et := legacyLoadEnumType(v.Type()) -- return et.New(pref.EnumNumber(v.Int())) -+ return et.New(protoreflect.EnumNumber(v.Int())) - } - - var legacyEnumTypeCache sync.Map // map[reflect.Type]protoreflect.EnumType - - // legacyLoadEnumType dynamically loads a protoreflect.EnumType for t, - // where t must be an int32 kind and not implement the v2 API already. --func legacyLoadEnumType(t reflect.Type) pref.EnumType { -+func legacyLoadEnumType(t reflect.Type) protoreflect.EnumType { - // Fast-path: check if a EnumType is cached for this concrete type. - if et, ok := legacyEnumTypeCache.Load(t); ok { -- return et.(pref.EnumType) -+ return et.(protoreflect.EnumType) - } - - // Slow-path: derive enum descriptor and initialize EnumType. -- var et pref.EnumType -+ var et protoreflect.EnumType - ed := LegacyLoadEnumDesc(t) - et = &legacyEnumType{ - desc: ed, - goType: t, - } - if et, ok := legacyEnumTypeCache.LoadOrStore(t, et); ok { -- return et.(pref.EnumType) -+ return et.(protoreflect.EnumType) - } - return et - } - - type legacyEnumType struct { -- desc pref.EnumDescriptor -+ desc protoreflect.EnumDescriptor - goType reflect.Type - m sync.Map // map[protoreflect.EnumNumber]proto.Enum - } - --func (t *legacyEnumType) New(n pref.EnumNumber) pref.Enum { -+func (t *legacyEnumType) New(n protoreflect.EnumNumber) protoreflect.Enum { - if e, ok := t.m.Load(n); ok { -- return e.(pref.Enum) -+ return e.(protoreflect.Enum) - } - e := &legacyEnumWrapper{num: n, pbTyp: t, goTyp: t.goType} - t.m.Store(n, e) - return e - } --func (t *legacyEnumType) Descriptor() pref.EnumDescriptor { -+func (t *legacyEnumType) Descriptor() protoreflect.EnumDescriptor { - return t.desc - } - - type legacyEnumWrapper struct { -- num pref.EnumNumber -- pbTyp pref.EnumType -+ num protoreflect.EnumNumber -+ pbTyp protoreflect.EnumType - goTyp reflect.Type - } - --func (e *legacyEnumWrapper) Descriptor() pref.EnumDescriptor { -+func (e *legacyEnumWrapper) Descriptor() protoreflect.EnumDescriptor { - return e.pbTyp.Descriptor() - } --func (e *legacyEnumWrapper) Type() pref.EnumType { -+func (e *legacyEnumWrapper) Type() protoreflect.EnumType { - return e.pbTyp - } --func (e *legacyEnumWrapper) Number() pref.EnumNumber { -+func (e *legacyEnumWrapper) Number() protoreflect.EnumNumber { - return e.num - } --func (e *legacyEnumWrapper) ProtoReflect() pref.Enum { -+func (e *legacyEnumWrapper) ProtoReflect() protoreflect.Enum { - return e - } - func (e *legacyEnumWrapper) protoUnwrap() interface{} { -@@ -105,8 +104,8 @@ func (e *legacyEnumWrapper) protoUnwrap() interface{} { - } - - var ( -- _ pref.Enum = (*legacyEnumWrapper)(nil) -- _ unwrapper = (*legacyEnumWrapper)(nil) -+ _ protoreflect.Enum = (*legacyEnumWrapper)(nil) -+ _ unwrapper = (*legacyEnumWrapper)(nil) - ) - - var legacyEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescriptor -@@ -115,15 +114,15 @@ var legacyEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescriptor - // which must be an int32 kind and not implement the v2 API already. - // - // This is exported for testing purposes. --func LegacyLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { -+func LegacyLoadEnumDesc(t reflect.Type) protoreflect.EnumDescriptor { - // Fast-path: check if an EnumDescriptor is cached for this concrete type. - if ed, ok := legacyEnumDescCache.Load(t); ok { -- return ed.(pref.EnumDescriptor) -+ return ed.(protoreflect.EnumDescriptor) - } - - // Slow-path: initialize EnumDescriptor from the raw descriptor. - ev := reflect.Zero(t).Interface() -- if _, ok := ev.(pref.Enum); ok { -+ if _, ok := ev.(protoreflect.Enum); ok { - panic(fmt.Sprintf("%v already implements proto.Enum", t)) - } - edV1, ok := ev.(enumV1) -@@ -132,7 +131,7 @@ func LegacyLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { - } - b, idxs := edV1.EnumDescriptor() - -- var ed pref.EnumDescriptor -+ var ed protoreflect.EnumDescriptor - if len(idxs) == 1 { - ed = legacyLoadFileDesc(b).Enums().Get(idxs[0]) - } else { -@@ -158,10 +157,10 @@ var aberrantEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescript - // We are unable to use the global enum registry since it is - // unfortunately keyed by the protobuf full name, which we also do not know. - // Thus, this produces some bogus enum descriptor based on the Go type name. --func aberrantLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { -+func aberrantLoadEnumDesc(t reflect.Type) protoreflect.EnumDescriptor { - // Fast-path: check if an EnumDescriptor is cached for this concrete type. - if ed, ok := aberrantEnumDescCache.Load(t); ok { -- return ed.(pref.EnumDescriptor) -+ return ed.(protoreflect.EnumDescriptor) - } - - // Slow-path: construct a bogus, but unique EnumDescriptor. -@@ -182,7 +181,7 @@ func aberrantLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { - // An exhaustive query is clearly impractical, but can be best-effort. - - if ed, ok := aberrantEnumDescCache.LoadOrStore(t, ed); ok { -- return ed.(pref.EnumDescriptor) -+ return ed.(protoreflect.EnumDescriptor) - } - return ed - } -@@ -192,7 +191,7 @@ func aberrantLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { - // It should be sufficiently unique within a program. - // - // This is exported for testing purposes. --func AberrantDeriveFullName(t reflect.Type) pref.FullName { -+func AberrantDeriveFullName(t reflect.Type) protoreflect.FullName { - sanitize := func(r rune) rune { - switch { - case r == '/': -@@ -215,5 +214,5 @@ func AberrantDeriveFullName(t reflect.Type) pref.FullName { - ss[i] = "x" + s - } - } -- return pref.FullName(strings.Join(ss, ".")) -+ return protoreflect.FullName(strings.Join(ss, ".")) - } -diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go -index e3fb0b5..9b64ad5 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go -@@ -12,21 +12,21 @@ import ( - "reflect" - - "google.golang.org/protobuf/internal/errors" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- piface "google.golang.org/protobuf/runtime/protoiface" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/runtime/protoiface" - ) - - // These functions exist to support exported APIs in generated protobufs. - // While these are deprecated, they cannot be removed for compatibility reasons. - - // LegacyEnumName returns the name of enums used in legacy code. --func (Export) LegacyEnumName(ed pref.EnumDescriptor) string { -+func (Export) LegacyEnumName(ed protoreflect.EnumDescriptor) string { - return legacyEnumName(ed) - } - - // LegacyMessageTypeOf returns the protoreflect.MessageType for m, - // with name used as the message name if necessary. --func (Export) LegacyMessageTypeOf(m piface.MessageV1, name pref.FullName) pref.MessageType { -+func (Export) LegacyMessageTypeOf(m protoiface.MessageV1, name protoreflect.FullName) protoreflect.MessageType { - if mv := (Export{}).protoMessageV2Of(m); mv != nil { - return mv.ProtoReflect().Type() - } -@@ -36,9 +36,9 @@ func (Export) LegacyMessageTypeOf(m piface.MessageV1, name pref.FullName) pref.M - // UnmarshalJSONEnum unmarshals an enum from a JSON-encoded input. - // The input can either be a string representing the enum value by name, - // or a number representing the enum number itself. --func (Export) UnmarshalJSONEnum(ed pref.EnumDescriptor, b []byte) (pref.EnumNumber, error) { -+func (Export) UnmarshalJSONEnum(ed protoreflect.EnumDescriptor, b []byte) (protoreflect.EnumNumber, error) { - if b[0] == '"' { -- var name pref.Name -+ var name protoreflect.Name - if err := json.Unmarshal(b, &name); err != nil { - return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) - } -@@ -48,7 +48,7 @@ func (Export) UnmarshalJSONEnum(ed pref.EnumDescriptor, b []byte) (pref.EnumNumb - } - return ev.Number(), nil - } else { -- var num pref.EnumNumber -+ var num protoreflect.EnumNumber - if err := json.Unmarshal(b, &num); err != nil { - return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) - } -@@ -81,8 +81,8 @@ func (Export) CompressGZIP(in []byte) (out []byte) { - blockHeader[0] = 0x01 // final bit per RFC 1951, section 3.2.3. - blockSize = len(in) - } -- binary.LittleEndian.PutUint16(blockHeader[1:3], uint16(blockSize)^0x0000) -- binary.LittleEndian.PutUint16(blockHeader[3:5], uint16(blockSize)^0xffff) -+ binary.LittleEndian.PutUint16(blockHeader[1:3], uint16(blockSize)) -+ binary.LittleEndian.PutUint16(blockHeader[3:5], ^uint16(blockSize)) - out = append(out, blockHeader[:]...) - out = append(out, in[:blockSize]...) - in = in[blockSize:] -diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go -index 49e7231..87b30d0 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go -@@ -12,16 +12,16 @@ import ( - ptag "google.golang.org/protobuf/internal/encoding/tag" - "google.golang.org/protobuf/internal/filedesc" - "google.golang.org/protobuf/internal/pragma" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- preg "google.golang.org/protobuf/reflect/protoregistry" -- piface "google.golang.org/protobuf/runtime/protoiface" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoregistry" -+ "google.golang.org/protobuf/runtime/protoiface" - ) - - func (xi *ExtensionInfo) initToLegacy() { - xd := xi.desc -- var parent piface.MessageV1 -+ var parent protoiface.MessageV1 - messageName := xd.ContainingMessage().FullName() -- if mt, _ := preg.GlobalTypes.FindMessageByName(messageName); mt != nil { -+ if mt, _ := protoregistry.GlobalTypes.FindMessageByName(messageName); mt != nil { - // Create a new parent message and unwrap it if possible. - mv := mt.New().Interface() - t := reflect.TypeOf(mv) -@@ -31,7 +31,7 @@ func (xi *ExtensionInfo) initToLegacy() { - - // Check whether the message implements the legacy v1 Message interface. - mz := reflect.Zero(t).Interface() -- if mz, ok := mz.(piface.MessageV1); ok { -+ if mz, ok := mz.(protoiface.MessageV1); ok { - parent = mz - } - } -@@ -46,7 +46,7 @@ func (xi *ExtensionInfo) initToLegacy() { - - // Reconstruct the legacy enum full name. - var enumName string -- if xd.Kind() == pref.EnumKind { -+ if xd.Kind() == protoreflect.EnumKind { - enumName = legacyEnumName(xd.Enum()) - } - -@@ -77,16 +77,16 @@ func (xi *ExtensionInfo) initFromLegacy() { - // field number is specified. In such a case, use a placeholder. - if xi.ExtendedType == nil || xi.ExtensionType == nil { - xd := placeholderExtension{ -- name: pref.FullName(xi.Name), -- number: pref.FieldNumber(xi.Field), -+ name: protoreflect.FullName(xi.Name), -+ number: protoreflect.FieldNumber(xi.Field), - } - xi.desc = extensionTypeDescriptor{xd, xi} - return - } - - // Resolve enum or message dependencies. -- var ed pref.EnumDescriptor -- var md pref.MessageDescriptor -+ var ed protoreflect.EnumDescriptor -+ var md protoreflect.MessageDescriptor - t := reflect.TypeOf(xi.ExtensionType) - isOptional := t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct - isRepeated := t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 -@@ -94,18 +94,18 @@ func (xi *ExtensionInfo) initFromLegacy() { - t = t.Elem() - } - switch v := reflect.Zero(t).Interface().(type) { -- case pref.Enum: -+ case protoreflect.Enum: - ed = v.Descriptor() - case enumV1: - ed = LegacyLoadEnumDesc(t) -- case pref.ProtoMessage: -+ case protoreflect.ProtoMessage: - md = v.ProtoReflect().Descriptor() - case messageV1: - md = LegacyLoadMessageDesc(t) - } - - // Derive basic field information from the struct tag. -- var evs pref.EnumValueDescriptors -+ var evs protoreflect.EnumValueDescriptors - if ed != nil { - evs = ed.Values() - } -@@ -114,8 +114,8 @@ func (xi *ExtensionInfo) initFromLegacy() { - // Construct a v2 ExtensionType. - xd := &filedesc.Extension{L2: new(filedesc.ExtensionL2)} - xd.L0.ParentFile = filedesc.SurrogateProto2 -- xd.L0.FullName = pref.FullName(xi.Name) -- xd.L1.Number = pref.FieldNumber(xi.Field) -+ xd.L0.FullName = protoreflect.FullName(xi.Name) -+ xd.L1.Number = protoreflect.FieldNumber(xi.Field) - xd.L1.Cardinality = fd.L1.Cardinality - xd.L1.Kind = fd.L1.Kind - xd.L2.IsPacked = fd.L1.IsPacked -@@ -138,39 +138,39 @@ func (xi *ExtensionInfo) initFromLegacy() { - } - - type placeholderExtension struct { -- name pref.FullName -- number pref.FieldNumber -+ name protoreflect.FullName -+ number protoreflect.FieldNumber - } - --func (x placeholderExtension) ParentFile() pref.FileDescriptor { return nil } --func (x placeholderExtension) Parent() pref.Descriptor { return nil } --func (x placeholderExtension) Index() int { return 0 } --func (x placeholderExtension) Syntax() pref.Syntax { return 0 } --func (x placeholderExtension) Name() pref.Name { return x.name.Name() } --func (x placeholderExtension) FullName() pref.FullName { return x.name } --func (x placeholderExtension) IsPlaceholder() bool { return true } --func (x placeholderExtension) Options() pref.ProtoMessage { return descopts.Field } --func (x placeholderExtension) Number() pref.FieldNumber { return x.number } --func (x placeholderExtension) Cardinality() pref.Cardinality { return 0 } --func (x placeholderExtension) Kind() pref.Kind { return 0 } --func (x placeholderExtension) HasJSONName() bool { return false } --func (x placeholderExtension) JSONName() string { return "[" + string(x.name) + "]" } --func (x placeholderExtension) TextName() string { return "[" + string(x.name) + "]" } --func (x placeholderExtension) HasPresence() bool { return false } --func (x placeholderExtension) HasOptionalKeyword() bool { return false } --func (x placeholderExtension) IsExtension() bool { return true } --func (x placeholderExtension) IsWeak() bool { return false } --func (x placeholderExtension) IsPacked() bool { return false } --func (x placeholderExtension) IsList() bool { return false } --func (x placeholderExtension) IsMap() bool { return false } --func (x placeholderExtension) MapKey() pref.FieldDescriptor { return nil } --func (x placeholderExtension) MapValue() pref.FieldDescriptor { return nil } --func (x placeholderExtension) HasDefault() bool { return false } --func (x placeholderExtension) Default() pref.Value { return pref.Value{} } --func (x placeholderExtension) DefaultEnumValue() pref.EnumValueDescriptor { return nil } --func (x placeholderExtension) ContainingOneof() pref.OneofDescriptor { return nil } --func (x placeholderExtension) ContainingMessage() pref.MessageDescriptor { return nil } --func (x placeholderExtension) Enum() pref.EnumDescriptor { return nil } --func (x placeholderExtension) Message() pref.MessageDescriptor { return nil } --func (x placeholderExtension) ProtoType(pref.FieldDescriptor) { return } --func (x placeholderExtension) ProtoInternal(pragma.DoNotImplement) { return } -+func (x placeholderExtension) ParentFile() protoreflect.FileDescriptor { return nil } -+func (x placeholderExtension) Parent() protoreflect.Descriptor { return nil } -+func (x placeholderExtension) Index() int { return 0 } -+func (x placeholderExtension) Syntax() protoreflect.Syntax { return 0 } -+func (x placeholderExtension) Name() protoreflect.Name { return x.name.Name() } -+func (x placeholderExtension) FullName() protoreflect.FullName { return x.name } -+func (x placeholderExtension) IsPlaceholder() bool { return true } -+func (x placeholderExtension) Options() protoreflect.ProtoMessage { return descopts.Field } -+func (x placeholderExtension) Number() protoreflect.FieldNumber { return x.number } -+func (x placeholderExtension) Cardinality() protoreflect.Cardinality { return 0 } -+func (x placeholderExtension) Kind() protoreflect.Kind { return 0 } -+func (x placeholderExtension) HasJSONName() bool { return false } -+func (x placeholderExtension) JSONName() string { return "[" + string(x.name) + "]" } -+func (x placeholderExtension) TextName() string { return "[" + string(x.name) + "]" } -+func (x placeholderExtension) HasPresence() bool { return false } -+func (x placeholderExtension) HasOptionalKeyword() bool { return false } -+func (x placeholderExtension) IsExtension() bool { return true } -+func (x placeholderExtension) IsWeak() bool { return false } -+func (x placeholderExtension) IsPacked() bool { return false } -+func (x placeholderExtension) IsList() bool { return false } -+func (x placeholderExtension) IsMap() bool { return false } -+func (x placeholderExtension) MapKey() protoreflect.FieldDescriptor { return nil } -+func (x placeholderExtension) MapValue() protoreflect.FieldDescriptor { return nil } -+func (x placeholderExtension) HasDefault() bool { return false } -+func (x placeholderExtension) Default() protoreflect.Value { return protoreflect.Value{} } -+func (x placeholderExtension) DefaultEnumValue() protoreflect.EnumValueDescriptor { return nil } -+func (x placeholderExtension) ContainingOneof() protoreflect.OneofDescriptor { return nil } -+func (x placeholderExtension) ContainingMessage() protoreflect.MessageDescriptor { return nil } -+func (x placeholderExtension) Enum() protoreflect.EnumDescriptor { return nil } -+func (x placeholderExtension) Message() protoreflect.MessageDescriptor { return nil } -+func (x placeholderExtension) ProtoType(protoreflect.FieldDescriptor) { return } -+func (x placeholderExtension) ProtoInternal(pragma.DoNotImplement) { return } -diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go -index 029feee..61c483f 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go -@@ -16,14 +16,12 @@ import ( - "google.golang.org/protobuf/internal/filedesc" - "google.golang.org/protobuf/internal/strs" - "google.golang.org/protobuf/reflect/protoreflect" -- pref "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/runtime/protoiface" -- piface "google.golang.org/protobuf/runtime/protoiface" - ) - - // legacyWrapMessage wraps v as a protoreflect.Message, - // where v must be a *struct kind and not implement the v2 API already. --func legacyWrapMessage(v reflect.Value) pref.Message { -+func legacyWrapMessage(v reflect.Value) protoreflect.Message { - t := v.Type() - if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { - return aberrantMessage{v: v} -@@ -35,7 +33,7 @@ func legacyWrapMessage(v reflect.Value) pref.Message { - // legacyLoadMessageType dynamically loads a protoreflect.Type for t, - // where t must be not implement the v2 API already. - // The provided name is used if it cannot be determined from the message. --func legacyLoadMessageType(t reflect.Type, name pref.FullName) protoreflect.MessageType { -+func legacyLoadMessageType(t reflect.Type, name protoreflect.FullName) protoreflect.MessageType { - if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { - return aberrantMessageType{t} - } -@@ -47,7 +45,7 @@ var legacyMessageTypeCache sync.Map // map[reflect.Type]*MessageInfo - // legacyLoadMessageInfo dynamically loads a *MessageInfo for t, - // where t must be a *struct kind and not implement the v2 API already. - // The provided name is used if it cannot be determined from the message. --func legacyLoadMessageInfo(t reflect.Type, name pref.FullName) *MessageInfo { -+func legacyLoadMessageInfo(t reflect.Type, name protoreflect.FullName) *MessageInfo { - // Fast-path: check if a MessageInfo is cached for this concrete type. - if mt, ok := legacyMessageTypeCache.Load(t); ok { - return mt.(*MessageInfo) -@@ -68,7 +66,7 @@ func legacyLoadMessageInfo(t reflect.Type, name pref.FullName) *MessageInfo { - // supports deterministic serialization or not, but this - // preserves the v1 implementation's behavior of always - // calling Marshal methods when present. -- mi.methods.Flags |= piface.SupportMarshalDeterministic -+ mi.methods.Flags |= protoiface.SupportMarshalDeterministic - } - if _, hasUnmarshal = v.(legacyUnmarshaler); hasUnmarshal { - mi.methods.Unmarshal = legacyUnmarshal -@@ -89,18 +87,18 @@ var legacyMessageDescCache sync.Map // map[reflect.Type]protoreflect.MessageDesc - // which should be a *struct kind and must not implement the v2 API already. - // - // This is exported for testing purposes. --func LegacyLoadMessageDesc(t reflect.Type) pref.MessageDescriptor { -+func LegacyLoadMessageDesc(t reflect.Type) protoreflect.MessageDescriptor { - return legacyLoadMessageDesc(t, "") - } --func legacyLoadMessageDesc(t reflect.Type, name pref.FullName) pref.MessageDescriptor { -+func legacyLoadMessageDesc(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor { - // Fast-path: check if a MessageDescriptor is cached for this concrete type. - if mi, ok := legacyMessageDescCache.Load(t); ok { -- return mi.(pref.MessageDescriptor) -+ return mi.(protoreflect.MessageDescriptor) - } - - // Slow-path: initialize MessageDescriptor from the raw descriptor. - mv := reflect.Zero(t).Interface() -- if _, ok := mv.(pref.ProtoMessage); ok { -+ if _, ok := mv.(protoreflect.ProtoMessage); ok { - panic(fmt.Sprintf("%v already implements proto.Message", t)) - } - mdV1, ok := mv.(messageV1) -@@ -164,7 +162,7 @@ var ( - // - // This is a best-effort derivation of the message descriptor using the protobuf - // tags on the struct fields. --func aberrantLoadMessageDesc(t reflect.Type, name pref.FullName) pref.MessageDescriptor { -+func aberrantLoadMessageDesc(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor { - aberrantMessageDescLock.Lock() - defer aberrantMessageDescLock.Unlock() - if aberrantMessageDescCache == nil { -@@ -172,7 +170,7 @@ func aberrantLoadMessageDesc(t reflect.Type, name pref.FullName) pref.MessageDes - } - return aberrantLoadMessageDescReentrant(t, name) - } --func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.MessageDescriptor { -+func aberrantLoadMessageDescReentrant(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor { - // Fast-path: check if an MessageDescriptor is cached for this concrete type. - if md, ok := aberrantMessageDescCache[t]; ok { - return md -@@ -225,9 +223,9 @@ func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.M - vs := fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0] - for i := 0; i < vs.Len(); i++ { - v := vs.Index(i) -- md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, [2]pref.FieldNumber{ -- pref.FieldNumber(v.FieldByName("Start").Int()), -- pref.FieldNumber(v.FieldByName("End").Int() + 1), -+ md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, [2]protoreflect.FieldNumber{ -+ protoreflect.FieldNumber(v.FieldByName("Start").Int()), -+ protoreflect.FieldNumber(v.FieldByName("End").Int() + 1), - }) - md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, nil) - } -@@ -245,7 +243,7 @@ func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.M - n := len(md.L2.Oneofs.List) - md.L2.Oneofs.List = append(md.L2.Oneofs.List, filedesc.Oneof{}) - od := &md.L2.Oneofs.List[n] -- od.L0.FullName = md.FullName().Append(pref.Name(tag)) -+ od.L0.FullName = md.FullName().Append(protoreflect.Name(tag)) - od.L0.ParentFile = md.L0.ParentFile - od.L0.Parent = md - od.L0.Index = n -@@ -267,14 +265,14 @@ func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.M - return md - } - --func aberrantDeriveMessageName(t reflect.Type, name pref.FullName) pref.FullName { -+func aberrantDeriveMessageName(t reflect.Type, name protoreflect.FullName) protoreflect.FullName { - if name.IsValid() { - return name - } - func() { - defer func() { recover() }() // swallow possible nil panics - if m, ok := reflect.Zero(t).Interface().(interface{ XXX_MessageName() string }); ok { -- name = pref.FullName(m.XXX_MessageName()) -+ name = protoreflect.FullName(m.XXX_MessageName()) - } - }() - if name.IsValid() { -@@ -305,7 +303,7 @@ func aberrantAppendField(md *filedesc.Message, goType reflect.Type, tag, tagKey, - fd.L0.Index = n - - if fd.L1.IsWeak || fd.L1.HasPacked { -- fd.L1.Options = func() pref.ProtoMessage { -+ fd.L1.Options = func() protoreflect.ProtoMessage { - opts := descopts.Field.ProtoReflect().New() - if fd.L1.IsWeak { - opts.Set(opts.Descriptor().Fields().ByName("weak"), protoreflect.ValueOfBool(true)) -@@ -318,17 +316,17 @@ func aberrantAppendField(md *filedesc.Message, goType reflect.Type, tag, tagKey, - } - - // Populate Enum and Message. -- if fd.Enum() == nil && fd.Kind() == pref.EnumKind { -+ if fd.Enum() == nil && fd.Kind() == protoreflect.EnumKind { - switch v := reflect.Zero(t).Interface().(type) { -- case pref.Enum: -+ case protoreflect.Enum: - fd.L1.Enum = v.Descriptor() - default: - fd.L1.Enum = LegacyLoadEnumDesc(t) - } - } -- if fd.Message() == nil && (fd.Kind() == pref.MessageKind || fd.Kind() == pref.GroupKind) { -+ if fd.Message() == nil && (fd.Kind() == protoreflect.MessageKind || fd.Kind() == protoreflect.GroupKind) { - switch v := reflect.Zero(t).Interface().(type) { -- case pref.ProtoMessage: -+ case protoreflect.ProtoMessage: - fd.L1.Message = v.ProtoReflect().Descriptor() - case messageV1: - fd.L1.Message = LegacyLoadMessageDesc(t) -@@ -337,13 +335,13 @@ func aberrantAppendField(md *filedesc.Message, goType reflect.Type, tag, tagKey, - n := len(md.L1.Messages.List) - md.L1.Messages.List = append(md.L1.Messages.List, filedesc.Message{L2: new(filedesc.MessageL2)}) - md2 := &md.L1.Messages.List[n] -- md2.L0.FullName = md.FullName().Append(pref.Name(strs.MapEntryName(string(fd.Name())))) -+ md2.L0.FullName = md.FullName().Append(protoreflect.Name(strs.MapEntryName(string(fd.Name())))) - md2.L0.ParentFile = md.L0.ParentFile - md2.L0.Parent = md - md2.L0.Index = n - - md2.L1.IsMapEntry = true -- md2.L2.Options = func() pref.ProtoMessage { -+ md2.L2.Options = func() protoreflect.ProtoMessage { - opts := descopts.Message.ProtoReflect().New() - opts.Set(opts.Descriptor().Fields().ByName("map_entry"), protoreflect.ValueOfBool(true)) - return opts.Interface() -@@ -364,8 +362,8 @@ type placeholderEnumValues struct { - protoreflect.EnumValueDescriptors - } - --func (placeholderEnumValues) ByNumber(n pref.EnumNumber) pref.EnumValueDescriptor { -- return filedesc.PlaceholderEnumValue(pref.FullName(fmt.Sprintf("UNKNOWN_%d", n))) -+func (placeholderEnumValues) ByNumber(n protoreflect.EnumNumber) protoreflect.EnumValueDescriptor { -+ return filedesc.PlaceholderEnumValue(protoreflect.FullName(fmt.Sprintf("UNKNOWN_%d", n))) - } - - // legacyMarshaler is the proto.Marshaler interface superseded by protoiface.Methoder. -@@ -383,7 +381,7 @@ type legacyMerger interface { - Merge(protoiface.MessageV1) - } - --var aberrantProtoMethods = &piface.Methods{ -+var aberrantProtoMethods = &protoiface.Methods{ - Marshal: legacyMarshal, - Unmarshal: legacyUnmarshal, - Merge: legacyMerge, -@@ -392,40 +390,40 @@ var aberrantProtoMethods = &piface.Methods{ - // supports deterministic serialization or not, but this - // preserves the v1 implementation's behavior of always - // calling Marshal methods when present. -- Flags: piface.SupportMarshalDeterministic, -+ Flags: protoiface.SupportMarshalDeterministic, - } - --func legacyMarshal(in piface.MarshalInput) (piface.MarshalOutput, error) { -+func legacyMarshal(in protoiface.MarshalInput) (protoiface.MarshalOutput, error) { - v := in.Message.(unwrapper).protoUnwrap() - marshaler, ok := v.(legacyMarshaler) - if !ok { -- return piface.MarshalOutput{}, errors.New("%T does not implement Marshal", v) -+ return protoiface.MarshalOutput{}, errors.New("%T does not implement Marshal", v) - } - out, err := marshaler.Marshal() - if in.Buf != nil { - out = append(in.Buf, out...) - } -- return piface.MarshalOutput{ -+ return protoiface.MarshalOutput{ - Buf: out, - }, err - } - --func legacyUnmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutput, error) { -+func legacyUnmarshal(in protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { - v := in.Message.(unwrapper).protoUnwrap() - unmarshaler, ok := v.(legacyUnmarshaler) - if !ok { -- return piface.UnmarshalOutput{}, errors.New("%T does not implement Unmarshal", v) -+ return protoiface.UnmarshalOutput{}, errors.New("%T does not implement Unmarshal", v) - } -- return piface.UnmarshalOutput{}, unmarshaler.Unmarshal(in.Buf) -+ return protoiface.UnmarshalOutput{}, unmarshaler.Unmarshal(in.Buf) - } - --func legacyMerge(in piface.MergeInput) piface.MergeOutput { -+func legacyMerge(in protoiface.MergeInput) protoiface.MergeOutput { - // Check whether this supports the legacy merger. - dstv := in.Destination.(unwrapper).protoUnwrap() - merger, ok := dstv.(legacyMerger) - if ok { - merger.Merge(Export{}.ProtoMessageV1Of(in.Source)) -- return piface.MergeOutput{Flags: piface.MergeComplete} -+ return protoiface.MergeOutput{Flags: protoiface.MergeComplete} - } - - // If legacy merger is unavailable, implement merge in terms of -@@ -433,29 +431,29 @@ func legacyMerge(in piface.MergeInput) piface.MergeOutput { - srcv := in.Source.(unwrapper).protoUnwrap() - marshaler, ok := srcv.(legacyMarshaler) - if !ok { -- return piface.MergeOutput{} -+ return protoiface.MergeOutput{} - } - dstv = in.Destination.(unwrapper).protoUnwrap() - unmarshaler, ok := dstv.(legacyUnmarshaler) - if !ok { -- return piface.MergeOutput{} -+ return protoiface.MergeOutput{} - } - if !in.Source.IsValid() { - // Legacy Marshal methods may not function on nil messages. - // Check for a typed nil source only after we confirm that - // legacy Marshal/Unmarshal methods are present, for - // consistency. -- return piface.MergeOutput{Flags: piface.MergeComplete} -+ return protoiface.MergeOutput{Flags: protoiface.MergeComplete} - } - b, err := marshaler.Marshal() - if err != nil { -- return piface.MergeOutput{} -+ return protoiface.MergeOutput{} - } - err = unmarshaler.Unmarshal(b) - if err != nil { -- return piface.MergeOutput{} -+ return protoiface.MergeOutput{} - } -- return piface.MergeOutput{Flags: piface.MergeComplete} -+ return protoiface.MergeOutput{Flags: protoiface.MergeComplete} - } - - // aberrantMessageType implements MessageType for all types other than pointer-to-struct. -@@ -463,19 +461,19 @@ type aberrantMessageType struct { - t reflect.Type - } - --func (mt aberrantMessageType) New() pref.Message { -+func (mt aberrantMessageType) New() protoreflect.Message { - if mt.t.Kind() == reflect.Ptr { - return aberrantMessage{reflect.New(mt.t.Elem())} - } - return aberrantMessage{reflect.Zero(mt.t)} - } --func (mt aberrantMessageType) Zero() pref.Message { -+func (mt aberrantMessageType) Zero() protoreflect.Message { - return aberrantMessage{reflect.Zero(mt.t)} - } - func (mt aberrantMessageType) GoType() reflect.Type { - return mt.t - } --func (mt aberrantMessageType) Descriptor() pref.MessageDescriptor { -+func (mt aberrantMessageType) Descriptor() protoreflect.MessageDescriptor { - return LegacyLoadMessageDesc(mt.t) - } - -@@ -499,56 +497,56 @@ func (m aberrantMessage) Reset() { - } - } - --func (m aberrantMessage) ProtoReflect() pref.Message { -+func (m aberrantMessage) ProtoReflect() protoreflect.Message { - return m - } - --func (m aberrantMessage) Descriptor() pref.MessageDescriptor { -+func (m aberrantMessage) Descriptor() protoreflect.MessageDescriptor { - return LegacyLoadMessageDesc(m.v.Type()) - } --func (m aberrantMessage) Type() pref.MessageType { -+func (m aberrantMessage) Type() protoreflect.MessageType { - return aberrantMessageType{m.v.Type()} - } --func (m aberrantMessage) New() pref.Message { -+func (m aberrantMessage) New() protoreflect.Message { - if m.v.Type().Kind() == reflect.Ptr { - return aberrantMessage{reflect.New(m.v.Type().Elem())} - } - return aberrantMessage{reflect.Zero(m.v.Type())} - } --func (m aberrantMessage) Interface() pref.ProtoMessage { -+func (m aberrantMessage) Interface() protoreflect.ProtoMessage { - return m - } --func (m aberrantMessage) Range(f func(pref.FieldDescriptor, pref.Value) bool) { -+func (m aberrantMessage) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { - return - } --func (m aberrantMessage) Has(pref.FieldDescriptor) bool { -+func (m aberrantMessage) Has(protoreflect.FieldDescriptor) bool { - return false - } --func (m aberrantMessage) Clear(pref.FieldDescriptor) { -+func (m aberrantMessage) Clear(protoreflect.FieldDescriptor) { - panic("invalid Message.Clear on " + string(m.Descriptor().FullName())) - } --func (m aberrantMessage) Get(fd pref.FieldDescriptor) pref.Value { -+func (m aberrantMessage) Get(fd protoreflect.FieldDescriptor) protoreflect.Value { - if fd.Default().IsValid() { - return fd.Default() - } - panic("invalid Message.Get on " + string(m.Descriptor().FullName())) - } --func (m aberrantMessage) Set(pref.FieldDescriptor, pref.Value) { -+func (m aberrantMessage) Set(protoreflect.FieldDescriptor, protoreflect.Value) { - panic("invalid Message.Set on " + string(m.Descriptor().FullName())) - } --func (m aberrantMessage) Mutable(pref.FieldDescriptor) pref.Value { -+func (m aberrantMessage) Mutable(protoreflect.FieldDescriptor) protoreflect.Value { - panic("invalid Message.Mutable on " + string(m.Descriptor().FullName())) - } --func (m aberrantMessage) NewField(pref.FieldDescriptor) pref.Value { -+func (m aberrantMessage) NewField(protoreflect.FieldDescriptor) protoreflect.Value { - panic("invalid Message.NewField on " + string(m.Descriptor().FullName())) - } --func (m aberrantMessage) WhichOneof(pref.OneofDescriptor) pref.FieldDescriptor { -+func (m aberrantMessage) WhichOneof(protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { - panic("invalid Message.WhichOneof descriptor on " + string(m.Descriptor().FullName())) - } --func (m aberrantMessage) GetUnknown() pref.RawFields { -+func (m aberrantMessage) GetUnknown() protoreflect.RawFields { - return nil - } --func (m aberrantMessage) SetUnknown(pref.RawFields) { -+func (m aberrantMessage) SetUnknown(protoreflect.RawFields) { - // SetUnknown discards its input on messages which don't support unknown field storage. - } - func (m aberrantMessage) IsValid() bool { -@@ -557,7 +555,7 @@ func (m aberrantMessage) IsValid() bool { - } - return false - } --func (m aberrantMessage) ProtoMethods() *piface.Methods { -+func (m aberrantMessage) ProtoMethods() *protoiface.Methods { - return aberrantProtoMethods - } - func (m aberrantMessage) protoUnwrap() interface{} { -diff --git a/vendor/google.golang.org/protobuf/internal/impl/merge.go b/vendor/google.golang.org/protobuf/internal/impl/merge.go -index c65bbc0..7e65f64 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/merge.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/merge.go -@@ -9,8 +9,8 @@ import ( - "reflect" - - "google.golang.org/protobuf/proto" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- piface "google.golang.org/protobuf/runtime/protoiface" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/runtime/protoiface" - ) - - type mergeOptions struct{} -@@ -20,17 +20,17 @@ func (o mergeOptions) Merge(dst, src proto.Message) { - } - - // merge is protoreflect.Methods.Merge. --func (mi *MessageInfo) merge(in piface.MergeInput) piface.MergeOutput { -+func (mi *MessageInfo) merge(in protoiface.MergeInput) protoiface.MergeOutput { - dp, ok := mi.getPointer(in.Destination) - if !ok { -- return piface.MergeOutput{} -+ return protoiface.MergeOutput{} - } - sp, ok := mi.getPointer(in.Source) - if !ok { -- return piface.MergeOutput{} -+ return protoiface.MergeOutput{} - } - mi.mergePointer(dp, sp, mergeOptions{}) -- return piface.MergeOutput{Flags: piface.MergeComplete} -+ return protoiface.MergeOutput{Flags: protoiface.MergeComplete} - } - - func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { -@@ -64,7 +64,7 @@ func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { - continue - } - dx := (*dext)[num] -- var dv pref.Value -+ var dv protoreflect.Value - if dx.Type() == sx.Type() { - dv = dx.Value() - } -@@ -85,15 +85,15 @@ func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { - } - } - --func mergeScalarValue(dst, src pref.Value, opts mergeOptions) pref.Value { -+func mergeScalarValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { - return src - } - --func mergeBytesValue(dst, src pref.Value, opts mergeOptions) pref.Value { -- return pref.ValueOfBytes(append(emptyBuf[:], src.Bytes()...)) -+func mergeBytesValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { -+ return protoreflect.ValueOfBytes(append(emptyBuf[:], src.Bytes()...)) - } - --func mergeListValue(dst, src pref.Value, opts mergeOptions) pref.Value { -+func mergeListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { - dstl := dst.List() - srcl := src.List() - for i, llen := 0, srcl.Len(); i < llen; i++ { -@@ -102,29 +102,29 @@ func mergeListValue(dst, src pref.Value, opts mergeOptions) pref.Value { - return dst - } - --func mergeBytesListValue(dst, src pref.Value, opts mergeOptions) pref.Value { -+func mergeBytesListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { - dstl := dst.List() - srcl := src.List() - for i, llen := 0, srcl.Len(); i < llen; i++ { - sb := srcl.Get(i).Bytes() - db := append(emptyBuf[:], sb...) -- dstl.Append(pref.ValueOfBytes(db)) -+ dstl.Append(protoreflect.ValueOfBytes(db)) - } - return dst - } - --func mergeMessageListValue(dst, src pref.Value, opts mergeOptions) pref.Value { -+func mergeMessageListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { - dstl := dst.List() - srcl := src.List() - for i, llen := 0, srcl.Len(); i < llen; i++ { - sm := srcl.Get(i).Message() - dm := proto.Clone(sm.Interface()).ProtoReflect() -- dstl.Append(pref.ValueOfMessage(dm)) -+ dstl.Append(protoreflect.ValueOfMessage(dm)) - } - return dst - } - --func mergeMessageValue(dst, src pref.Value, opts mergeOptions) pref.Value { -+func mergeMessageValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { - opts.Merge(dst.Message().Interface(), src.Message().Interface()) - return dst - } -diff --git a/vendor/google.golang.org/protobuf/internal/impl/message.go b/vendor/google.golang.org/protobuf/internal/impl/message.go -index a104e28..4f5fb67 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/message.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/message.go -@@ -14,8 +14,7 @@ import ( - - "google.golang.org/protobuf/internal/genid" - "google.golang.org/protobuf/reflect/protoreflect" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- preg "google.golang.org/protobuf/reflect/protoregistry" -+ "google.golang.org/protobuf/reflect/protoregistry" - ) - - // MessageInfo provides protobuf related functionality for a given Go type -@@ -29,7 +28,7 @@ type MessageInfo struct { - GoReflectType reflect.Type // pointer to struct - - // Desc is the underlying message descriptor type and must be populated. -- Desc pref.MessageDescriptor -+ Desc protoreflect.MessageDescriptor - - // Exporter must be provided in a purego environment in order to provide - // access to unexported fields. -@@ -54,7 +53,7 @@ type exporter func(v interface{}, i int) interface{} - // is generated by our implementation of protoc-gen-go (for v2 and on). - // If it is unable to obtain a MessageInfo, it returns nil. - func getMessageInfo(mt reflect.Type) *MessageInfo { -- m, ok := reflect.Zero(mt).Interface().(pref.ProtoMessage) -+ m, ok := reflect.Zero(mt).Interface().(protoreflect.ProtoMessage) - if !ok { - return nil - } -@@ -97,7 +96,7 @@ func (mi *MessageInfo) initOnce() { - // getPointer returns the pointer for a message, which should be of - // the type of the MessageInfo. If the message is of a different type, - // it returns ok==false. --func (mi *MessageInfo) getPointer(m pref.Message) (p pointer, ok bool) { -+func (mi *MessageInfo) getPointer(m protoreflect.Message) (p pointer, ok bool) { - switch m := m.(type) { - case *messageState: - return m.pointer(), m.messageInfo() == mi -@@ -134,10 +133,10 @@ type structInfo struct { - extensionOffset offset - extensionType reflect.Type - -- fieldsByNumber map[pref.FieldNumber]reflect.StructField -- oneofsByName map[pref.Name]reflect.StructField -- oneofWrappersByType map[reflect.Type]pref.FieldNumber -- oneofWrappersByNumber map[pref.FieldNumber]reflect.Type -+ fieldsByNumber map[protoreflect.FieldNumber]reflect.StructField -+ oneofsByName map[protoreflect.Name]reflect.StructField -+ oneofWrappersByType map[reflect.Type]protoreflect.FieldNumber -+ oneofWrappersByNumber map[protoreflect.FieldNumber]reflect.Type - } - - func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo { -@@ -147,10 +146,10 @@ func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo { - unknownOffset: invalidOffset, - extensionOffset: invalidOffset, - -- fieldsByNumber: map[pref.FieldNumber]reflect.StructField{}, -- oneofsByName: map[pref.Name]reflect.StructField{}, -- oneofWrappersByType: map[reflect.Type]pref.FieldNumber{}, -- oneofWrappersByNumber: map[pref.FieldNumber]reflect.Type{}, -+ fieldsByNumber: map[protoreflect.FieldNumber]reflect.StructField{}, -+ oneofsByName: map[protoreflect.Name]reflect.StructField{}, -+ oneofWrappersByType: map[reflect.Type]protoreflect.FieldNumber{}, -+ oneofWrappersByNumber: map[protoreflect.FieldNumber]reflect.Type{}, - } - - fieldLoop: -@@ -180,12 +179,12 @@ fieldLoop: - for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") { - if len(s) > 0 && strings.Trim(s, "0123456789") == "" { - n, _ := strconv.ParseUint(s, 10, 64) -- si.fieldsByNumber[pref.FieldNumber(n)] = f -+ si.fieldsByNumber[protoreflect.FieldNumber(n)] = f - continue fieldLoop - } - } - if s := f.Tag.Get("protobuf_oneof"); len(s) > 0 { -- si.oneofsByName[pref.Name(s)] = f -+ si.oneofsByName[protoreflect.Name(s)] = f - continue fieldLoop - } - } -@@ -208,8 +207,8 @@ fieldLoop: - for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") { - if len(s) > 0 && strings.Trim(s, "0123456789") == "" { - n, _ := strconv.ParseUint(s, 10, 64) -- si.oneofWrappersByType[tf] = pref.FieldNumber(n) -- si.oneofWrappersByNumber[pref.FieldNumber(n)] = tf -+ si.oneofWrappersByType[tf] = protoreflect.FieldNumber(n) -+ si.oneofWrappersByNumber[protoreflect.FieldNumber(n)] = tf - break - } - } -@@ -219,7 +218,11 @@ fieldLoop: - } - - func (mi *MessageInfo) New() protoreflect.Message { -- return mi.MessageOf(reflect.New(mi.GoReflectType.Elem()).Interface()) -+ m := reflect.New(mi.GoReflectType.Elem()).Interface() -+ if r, ok := m.(protoreflect.ProtoMessage); ok { -+ return r.ProtoReflect() -+ } -+ return mi.MessageOf(m) - } - func (mi *MessageInfo) Zero() protoreflect.Message { - return mi.MessageOf(reflect.Zero(mi.GoReflectType).Interface()) -@@ -237,7 +240,7 @@ func (mi *MessageInfo) Message(i int) protoreflect.MessageType { - fd := mi.Desc.Fields().Get(i) - switch { - case fd.IsWeak(): -- mt, _ := preg.GlobalTypes.FindMessageByName(fd.Message().FullName()) -+ mt, _ := protoregistry.GlobalTypes.FindMessageByName(fd.Message().FullName()) - return mt - case fd.IsMap(): - return mapEntryType{fd.Message(), mi.fieldTypes[fd.Number()]} -diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go -index 9488b72..d9ea010 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go -@@ -10,17 +10,17 @@ import ( - - "google.golang.org/protobuf/internal/detrand" - "google.golang.org/protobuf/internal/pragma" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - type reflectMessageInfo struct { -- fields map[pref.FieldNumber]*fieldInfo -- oneofs map[pref.Name]*oneofInfo -+ fields map[protoreflect.FieldNumber]*fieldInfo -+ oneofs map[protoreflect.Name]*oneofInfo - - // fieldTypes contains the zero value of an enum or message field. - // For lists, it contains the element type. - // For maps, it contains the entry value type. -- fieldTypes map[pref.FieldNumber]interface{} -+ fieldTypes map[protoreflect.FieldNumber]interface{} - - // denseFields is a subset of fields where: - // 0 < fieldDesc.Number() < len(denseFields) -@@ -30,8 +30,8 @@ type reflectMessageInfo struct { - // rangeInfos is a list of all fields (not belonging to a oneof) and oneofs. - rangeInfos []interface{} // either *fieldInfo or *oneofInfo - -- getUnknown func(pointer) pref.RawFields -- setUnknown func(pointer, pref.RawFields) -+ getUnknown func(pointer) protoreflect.RawFields -+ setUnknown func(pointer, protoreflect.RawFields) - extensionMap func(pointer) *extensionMap - - nilMessage atomicNilMessage -@@ -52,7 +52,7 @@ func (mi *MessageInfo) makeReflectFuncs(t reflect.Type, si structInfo) { - // This code assumes that the struct is well-formed and panics if there are - // any discrepancies. - func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) { -- mi.fields = map[pref.FieldNumber]*fieldInfo{} -+ mi.fields = map[protoreflect.FieldNumber]*fieldInfo{} - md := mi.Desc - fds := md.Fields() - for i := 0; i < fds.Len(); i++ { -@@ -82,7 +82,7 @@ func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) { - mi.fields[fd.Number()] = &fi - } - -- mi.oneofs = map[pref.Name]*oneofInfo{} -+ mi.oneofs = map[protoreflect.Name]*oneofInfo{} - for i := 0; i < md.Oneofs().Len(); i++ { - od := md.Oneofs().Get(i) - mi.oneofs[od.Name()] = makeOneofInfo(od, si, mi.Exporter) -@@ -117,13 +117,13 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { - switch { - case si.unknownOffset.IsValid() && si.unknownType == unknownFieldsAType: - // Handle as []byte. -- mi.getUnknown = func(p pointer) pref.RawFields { -+ mi.getUnknown = func(p pointer) protoreflect.RawFields { - if p.IsNil() { - return nil - } - return *p.Apply(mi.unknownOffset).Bytes() - } -- mi.setUnknown = func(p pointer, b pref.RawFields) { -+ mi.setUnknown = func(p pointer, b protoreflect.RawFields) { - if p.IsNil() { - panic("invalid SetUnknown on nil Message") - } -@@ -131,7 +131,7 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { - } - case si.unknownOffset.IsValid() && si.unknownType == unknownFieldsBType: - // Handle as *[]byte. -- mi.getUnknown = func(p pointer) pref.RawFields { -+ mi.getUnknown = func(p pointer) protoreflect.RawFields { - if p.IsNil() { - return nil - } -@@ -141,7 +141,7 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { - } - return **bp - } -- mi.setUnknown = func(p pointer, b pref.RawFields) { -+ mi.setUnknown = func(p pointer, b protoreflect.RawFields) { - if p.IsNil() { - panic("invalid SetUnknown on nil Message") - } -@@ -152,10 +152,10 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { - **bp = b - } - default: -- mi.getUnknown = func(pointer) pref.RawFields { -+ mi.getUnknown = func(pointer) protoreflect.RawFields { - return nil - } -- mi.setUnknown = func(p pointer, _ pref.RawFields) { -+ mi.setUnknown = func(p pointer, _ protoreflect.RawFields) { - if p.IsNil() { - panic("invalid SetUnknown on nil Message") - } -@@ -224,7 +224,7 @@ func (mi *MessageInfo) makeFieldTypes(si structInfo) { - } - if ft != nil { - if mi.fieldTypes == nil { -- mi.fieldTypes = make(map[pref.FieldNumber]interface{}) -+ mi.fieldTypes = make(map[protoreflect.FieldNumber]interface{}) - } - mi.fieldTypes[fd.Number()] = reflect.Zero(ft).Interface() - } -@@ -233,7 +233,7 @@ func (mi *MessageInfo) makeFieldTypes(si structInfo) { - - type extensionMap map[int32]ExtensionField - --func (m *extensionMap) Range(f func(pref.FieldDescriptor, pref.Value) bool) { -+func (m *extensionMap) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { - if m != nil { - for _, x := range *m { - xd := x.Type().TypeDescriptor() -@@ -247,7 +247,7 @@ func (m *extensionMap) Range(f func(pref.FieldDescriptor, pref.Value) bool) { - } - } - } --func (m *extensionMap) Has(xt pref.ExtensionType) (ok bool) { -+func (m *extensionMap) Has(xt protoreflect.ExtensionType) (ok bool) { - if m == nil { - return false - } -@@ -266,10 +266,10 @@ func (m *extensionMap) Has(xt pref.ExtensionType) (ok bool) { - } - return true - } --func (m *extensionMap) Clear(xt pref.ExtensionType) { -+func (m *extensionMap) Clear(xt protoreflect.ExtensionType) { - delete(*m, int32(xt.TypeDescriptor().Number())) - } --func (m *extensionMap) Get(xt pref.ExtensionType) pref.Value { -+func (m *extensionMap) Get(xt protoreflect.ExtensionType) protoreflect.Value { - xd := xt.TypeDescriptor() - if m != nil { - if x, ok := (*m)[int32(xd.Number())]; ok { -@@ -278,7 +278,7 @@ func (m *extensionMap) Get(xt pref.ExtensionType) pref.Value { - } - return xt.Zero() - } --func (m *extensionMap) Set(xt pref.ExtensionType, v pref.Value) { -+func (m *extensionMap) Set(xt protoreflect.ExtensionType, v protoreflect.Value) { - xd := xt.TypeDescriptor() - isValid := true - switch { -@@ -302,9 +302,9 @@ func (m *extensionMap) Set(xt pref.ExtensionType, v pref.Value) { - x.Set(xt, v) - (*m)[int32(xd.Number())] = x - } --func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value { -+func (m *extensionMap) Mutable(xt protoreflect.ExtensionType) protoreflect.Value { - xd := xt.TypeDescriptor() -- if xd.Kind() != pref.MessageKind && xd.Kind() != pref.GroupKind && !xd.IsList() && !xd.IsMap() { -+ if xd.Kind() != protoreflect.MessageKind && xd.Kind() != protoreflect.GroupKind && !xd.IsList() && !xd.IsMap() { - panic("invalid Mutable on field with non-composite type") - } - if x, ok := (*m)[int32(xd.Number())]; ok { -@@ -320,7 +320,6 @@ func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value { - // in an allocation-free way without needing to have a shadow Go type generated - // for every message type. This technique only works using unsafe. - // --// - // Example generated code: - // - // type M struct { -@@ -351,12 +350,11 @@ func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value { - // It has access to the message info as its first field, and a pointer to the - // MessageState is identical to a pointer to the concrete message value. - // --// - // Requirements: --// • The type M must implement protoreflect.ProtoMessage. --// • The address of m must not be nil. --// • The address of m and the address of m.state must be equal, --// even though they are different Go types. -+// - The type M must implement protoreflect.ProtoMessage. -+// - The address of m must not be nil. -+// - The address of m and the address of m.state must be equal, -+// even though they are different Go types. - type MessageState struct { - pragma.NoUnkeyedLiterals - pragma.DoNotCompare -@@ -368,8 +366,8 @@ type MessageState struct { - type messageState MessageState - - var ( -- _ pref.Message = (*messageState)(nil) -- _ unwrapper = (*messageState)(nil) -+ _ protoreflect.Message = (*messageState)(nil) -+ _ unwrapper = (*messageState)(nil) - ) - - // messageDataType is a tuple of a pointer to the message data and -@@ -387,16 +385,16 @@ type ( - ) - - var ( -- _ pref.Message = (*messageReflectWrapper)(nil) -- _ unwrapper = (*messageReflectWrapper)(nil) -- _ pref.ProtoMessage = (*messageIfaceWrapper)(nil) -- _ unwrapper = (*messageIfaceWrapper)(nil) -+ _ protoreflect.Message = (*messageReflectWrapper)(nil) -+ _ unwrapper = (*messageReflectWrapper)(nil) -+ _ protoreflect.ProtoMessage = (*messageIfaceWrapper)(nil) -+ _ unwrapper = (*messageIfaceWrapper)(nil) - ) - - // MessageOf returns a reflective view over a message. The input must be a - // pointer to a named Go struct. If the provided type has a ProtoReflect method, - // it must be implemented by calling this method. --func (mi *MessageInfo) MessageOf(m interface{}) pref.Message { -+func (mi *MessageInfo) MessageOf(m interface{}) protoreflect.Message { - if reflect.TypeOf(m) != mi.GoReflectType { - panic(fmt.Sprintf("type mismatch: got %T, want %v", m, mi.GoReflectType)) - } -@@ -421,7 +419,7 @@ func (m *messageIfaceWrapper) Reset() { - rv.Elem().Set(reflect.Zero(rv.Type().Elem())) - } - } --func (m *messageIfaceWrapper) ProtoReflect() pref.Message { -+func (m *messageIfaceWrapper) ProtoReflect() protoreflect.Message { - return (*messageReflectWrapper)(m) - } - func (m *messageIfaceWrapper) protoUnwrap() interface{} { -@@ -430,7 +428,7 @@ func (m *messageIfaceWrapper) protoUnwrap() interface{} { - - // checkField verifies that the provided field descriptor is valid. - // Exactly one of the returned values is populated. --func (mi *MessageInfo) checkField(fd pref.FieldDescriptor) (*fieldInfo, pref.ExtensionType) { -+func (mi *MessageInfo) checkField(fd protoreflect.FieldDescriptor) (*fieldInfo, protoreflect.ExtensionType) { - var fi *fieldInfo - if n := fd.Number(); 0 < n && int(n) < len(mi.denseFields) { - fi = mi.denseFields[n] -@@ -455,7 +453,7 @@ func (mi *MessageInfo) checkField(fd pref.FieldDescriptor) (*fieldInfo, pref.Ext - if !mi.Desc.ExtensionRanges().Has(fd.Number()) { - panic(fmt.Sprintf("extension %v extends %v outside the extension range", fd.FullName(), mi.Desc.FullName())) - } -- xtd, ok := fd.(pref.ExtensionTypeDescriptor) -+ xtd, ok := fd.(protoreflect.ExtensionTypeDescriptor) - if !ok { - panic(fmt.Sprintf("extension %v does not implement protoreflect.ExtensionTypeDescriptor", fd.FullName())) - } -diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go -index 343cf87..5e736c6 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go -@@ -11,24 +11,24 @@ import ( - "sync" - - "google.golang.org/protobuf/internal/flags" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- preg "google.golang.org/protobuf/reflect/protoregistry" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoregistry" - ) - - type fieldInfo struct { -- fieldDesc pref.FieldDescriptor -+ fieldDesc protoreflect.FieldDescriptor - - // These fields are used for protobuf reflection support. - has func(pointer) bool - clear func(pointer) -- get func(pointer) pref.Value -- set func(pointer, pref.Value) -- mutable func(pointer) pref.Value -- newMessage func() pref.Message -- newField func() pref.Value -+ get func(pointer) protoreflect.Value -+ set func(pointer, protoreflect.Value) -+ mutable func(pointer) protoreflect.Value -+ newMessage func() protoreflect.Message -+ newField func() protoreflect.Value - } - --func fieldInfoForMissing(fd pref.FieldDescriptor) fieldInfo { -+func fieldInfoForMissing(fd protoreflect.FieldDescriptor) fieldInfo { - // This never occurs for generated message types. - // It implies that a hand-crafted type has missing Go fields - // for specific protobuf message fields. -@@ -40,19 +40,19 @@ func fieldInfoForMissing(fd pref.FieldDescriptor) fieldInfo { - clear: func(p pointer) { - panic("missing Go struct field for " + string(fd.FullName())) - }, -- get: func(p pointer) pref.Value { -+ get: func(p pointer) protoreflect.Value { - return fd.Default() - }, -- set: func(p pointer, v pref.Value) { -+ set: func(p pointer, v protoreflect.Value) { - panic("missing Go struct field for " + string(fd.FullName())) - }, -- mutable: func(p pointer) pref.Value { -+ mutable: func(p pointer) protoreflect.Value { - panic("missing Go struct field for " + string(fd.FullName())) - }, -- newMessage: func() pref.Message { -+ newMessage: func() protoreflect.Message { - panic("missing Go struct field for " + string(fd.FullName())) - }, -- newField: func() pref.Value { -+ newField: func() protoreflect.Value { - if v := fd.Default(); v.IsValid() { - return v - } -@@ -61,7 +61,7 @@ func fieldInfoForMissing(fd pref.FieldDescriptor) fieldInfo { - } - } - --func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x exporter, ot reflect.Type) fieldInfo { -+func fieldInfoForOneof(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter, ot reflect.Type) fieldInfo { - ft := fs.Type - if ft.Kind() != reflect.Interface { - panic(fmt.Sprintf("field %v has invalid type: got %v, want interface kind", fd.FullName(), ft)) -@@ -102,7 +102,7 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export - } - rv.Set(reflect.Zero(rv.Type())) - }, -- get: func(p pointer) pref.Value { -+ get: func(p pointer) protoreflect.Value { - if p.IsNil() { - return conv.Zero() - } -@@ -113,7 +113,7 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export - rv = rv.Elem().Elem().Field(0) - return conv.PBValueOf(rv) - }, -- set: func(p pointer, v pref.Value) { -+ set: func(p pointer, v protoreflect.Value) { - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() { - rv.Set(reflect.New(ot)) -@@ -121,7 +121,7 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export - rv = rv.Elem().Elem().Field(0) - rv.Set(conv.GoValueOf(v)) - }, -- mutable: func(p pointer) pref.Value { -+ mutable: func(p pointer) protoreflect.Value { - if !isMessage { - panic(fmt.Sprintf("field %v with invalid Mutable call on field with non-composite type", fd.FullName())) - } -@@ -131,20 +131,20 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export - } - rv = rv.Elem().Elem().Field(0) - if rv.Kind() == reflect.Ptr && rv.IsNil() { -- rv.Set(conv.GoValueOf(pref.ValueOfMessage(conv.New().Message()))) -+ rv.Set(conv.GoValueOf(protoreflect.ValueOfMessage(conv.New().Message()))) - } - return conv.PBValueOf(rv) - }, -- newMessage: func() pref.Message { -+ newMessage: func() protoreflect.Message { - return conv.New().Message() - }, -- newField: func() pref.Value { -+ newField: func() protoreflect.Value { - return conv.New() - }, - } - } - --func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { -+func fieldInfoForMap(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { - ft := fs.Type - if ft.Kind() != reflect.Map { - panic(fmt.Sprintf("field %v has invalid type: got %v, want map kind", fd.FullName(), ft)) -@@ -166,7 +166,7 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - rv.Set(reflect.Zero(rv.Type())) - }, -- get: func(p pointer) pref.Value { -+ get: func(p pointer) protoreflect.Value { - if p.IsNil() { - return conv.Zero() - } -@@ -176,7 +176,7 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter - } - return conv.PBValueOf(rv) - }, -- set: func(p pointer, v pref.Value) { -+ set: func(p pointer, v protoreflect.Value) { - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - pv := conv.GoValueOf(v) - if pv.IsNil() { -@@ -184,20 +184,20 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter - } - rv.Set(pv) - }, -- mutable: func(p pointer) pref.Value { -+ mutable: func(p pointer) protoreflect.Value { - v := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - if v.IsNil() { - v.Set(reflect.MakeMap(fs.Type)) - } - return conv.PBValueOf(v) - }, -- newField: func() pref.Value { -+ newField: func() protoreflect.Value { - return conv.New() - }, - } - } - --func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { -+func fieldInfoForList(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { - ft := fs.Type - if ft.Kind() != reflect.Slice { - panic(fmt.Sprintf("field %v has invalid type: got %v, want slice kind", fd.FullName(), ft)) -@@ -219,7 +219,7 @@ func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporte - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - rv.Set(reflect.Zero(rv.Type())) - }, -- get: func(p pointer) pref.Value { -+ get: func(p pointer) protoreflect.Value { - if p.IsNil() { - return conv.Zero() - } -@@ -229,7 +229,7 @@ func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporte - } - return conv.PBValueOf(rv) - }, -- set: func(p pointer, v pref.Value) { -+ set: func(p pointer, v protoreflect.Value) { - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - pv := conv.GoValueOf(v) - if pv.IsNil() { -@@ -237,11 +237,11 @@ func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporte - } - rv.Set(pv.Elem()) - }, -- mutable: func(p pointer) pref.Value { -+ mutable: func(p pointer) protoreflect.Value { - v := p.Apply(fieldOffset).AsValueOf(fs.Type) - return conv.PBValueOf(v) - }, -- newField: func() pref.Value { -+ newField: func() protoreflect.Value { - return conv.New() - }, - } -@@ -252,7 +252,7 @@ var ( - emptyBytes = reflect.ValueOf([]byte{}) - ) - --func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { -+func fieldInfoForScalar(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { - ft := fs.Type - nullable := fd.HasPresence() - isBytes := ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 -@@ -300,7 +300,7 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - rv.Set(reflect.Zero(rv.Type())) - }, -- get: func(p pointer) pref.Value { -+ get: func(p pointer) protoreflect.Value { - if p.IsNil() { - return conv.Zero() - } -@@ -315,7 +315,7 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor - } - return conv.PBValueOf(rv) - }, -- set: func(p pointer, v pref.Value) { -+ set: func(p pointer, v protoreflect.Value) { - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - if nullable && rv.Kind() == reflect.Ptr { - if rv.IsNil() { -@@ -332,23 +332,23 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor - } - } - }, -- newField: func() pref.Value { -+ newField: func() protoreflect.Value { - return conv.New() - }, - } - } - --func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldInfo { -+func fieldInfoForWeakMessage(fd protoreflect.FieldDescriptor, weakOffset offset) fieldInfo { - if !flags.ProtoLegacy { - panic("no support for proto1 weak fields") - } - - var once sync.Once -- var messageType pref.MessageType -+ var messageType protoreflect.MessageType - lazyInit := func() { - once.Do(func() { - messageName := fd.Message().FullName() -- messageType, _ = preg.GlobalTypes.FindMessageByName(messageName) -+ messageType, _ = protoregistry.GlobalTypes.FindMessageByName(messageName) - if messageType == nil { - panic(fmt.Sprintf("weak message %v for field %v is not linked in", messageName, fd.FullName())) - } -@@ -368,18 +368,18 @@ func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldIn - clear: func(p pointer) { - p.Apply(weakOffset).WeakFields().clear(num) - }, -- get: func(p pointer) pref.Value { -+ get: func(p pointer) protoreflect.Value { - lazyInit() - if p.IsNil() { -- return pref.ValueOfMessage(messageType.Zero()) -+ return protoreflect.ValueOfMessage(messageType.Zero()) - } - m, ok := p.Apply(weakOffset).WeakFields().get(num) - if !ok { -- return pref.ValueOfMessage(messageType.Zero()) -+ return protoreflect.ValueOfMessage(messageType.Zero()) - } -- return pref.ValueOfMessage(m.ProtoReflect()) -+ return protoreflect.ValueOfMessage(m.ProtoReflect()) - }, -- set: func(p pointer, v pref.Value) { -+ set: func(p pointer, v protoreflect.Value) { - lazyInit() - m := v.Message() - if m.Descriptor() != messageType.Descriptor() { -@@ -390,7 +390,7 @@ func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldIn - } - p.Apply(weakOffset).WeakFields().set(num, m.Interface()) - }, -- mutable: func(p pointer) pref.Value { -+ mutable: func(p pointer) protoreflect.Value { - lazyInit() - fs := p.Apply(weakOffset).WeakFields() - m, ok := fs.get(num) -@@ -398,20 +398,20 @@ func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldIn - m = messageType.New().Interface() - fs.set(num, m) - } -- return pref.ValueOfMessage(m.ProtoReflect()) -+ return protoreflect.ValueOfMessage(m.ProtoReflect()) - }, -- newMessage: func() pref.Message { -+ newMessage: func() protoreflect.Message { - lazyInit() - return messageType.New() - }, -- newField: func() pref.Value { -+ newField: func() protoreflect.Value { - lazyInit() -- return pref.ValueOfMessage(messageType.New()) -+ return protoreflect.ValueOfMessage(messageType.New()) - }, - } - } - --func fieldInfoForMessage(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { -+func fieldInfoForMessage(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { - ft := fs.Type - conv := NewConverter(ft, fd) - -@@ -433,47 +433,47 @@ func fieldInfoForMessage(fd pref.FieldDescriptor, fs reflect.StructField, x expo - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - rv.Set(reflect.Zero(rv.Type())) - }, -- get: func(p pointer) pref.Value { -+ get: func(p pointer) protoreflect.Value { - if p.IsNil() { - return conv.Zero() - } - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - return conv.PBValueOf(rv) - }, -- set: func(p pointer, v pref.Value) { -+ set: func(p pointer, v protoreflect.Value) { - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - rv.Set(conv.GoValueOf(v)) - if fs.Type.Kind() == reflect.Ptr && rv.IsNil() { - panic(fmt.Sprintf("field %v has invalid nil pointer", fd.FullName())) - } - }, -- mutable: func(p pointer) pref.Value { -+ mutable: func(p pointer) protoreflect.Value { - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - if fs.Type.Kind() == reflect.Ptr && rv.IsNil() { - rv.Set(conv.GoValueOf(conv.New())) - } - return conv.PBValueOf(rv) - }, -- newMessage: func() pref.Message { -+ newMessage: func() protoreflect.Message { - return conv.New().Message() - }, -- newField: func() pref.Value { -+ newField: func() protoreflect.Value { - return conv.New() - }, - } - } - - type oneofInfo struct { -- oneofDesc pref.OneofDescriptor -- which func(pointer) pref.FieldNumber -+ oneofDesc protoreflect.OneofDescriptor -+ which func(pointer) protoreflect.FieldNumber - } - --func makeOneofInfo(od pref.OneofDescriptor, si structInfo, x exporter) *oneofInfo { -+func makeOneofInfo(od protoreflect.OneofDescriptor, si structInfo, x exporter) *oneofInfo { - oi := &oneofInfo{oneofDesc: od} - if od.IsSynthetic() { - fs := si.fieldsByNumber[od.Fields().Get(0).Number()] - fieldOffset := offsetOf(fs, x) -- oi.which = func(p pointer) pref.FieldNumber { -+ oi.which = func(p pointer) protoreflect.FieldNumber { - if p.IsNil() { - return 0 - } -@@ -486,7 +486,7 @@ func makeOneofInfo(od pref.OneofDescriptor, si structInfo, x exporter) *oneofInf - } else { - fs := si.oneofsByName[od.Name()] - fieldOffset := offsetOf(fs, x) -- oi.which = func(p pointer) pref.FieldNumber { -+ oi.which = func(p pointer) protoreflect.FieldNumber { - if p.IsNil() { - return 0 - } -diff --git a/vendor/google.golang.org/protobuf/internal/impl/validate.go b/vendor/google.golang.org/protobuf/internal/impl/validate.go -index 08cfb60..a24e6bb 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/validate.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/validate.go -@@ -16,9 +16,9 @@ import ( - "google.golang.org/protobuf/internal/flags" - "google.golang.org/protobuf/internal/genid" - "google.golang.org/protobuf/internal/strs" -- pref "google.golang.org/protobuf/reflect/protoreflect" -- preg "google.golang.org/protobuf/reflect/protoregistry" -- piface "google.golang.org/protobuf/runtime/protoiface" -+ "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoregistry" -+ "google.golang.org/protobuf/runtime/protoiface" - ) - - // ValidationStatus is the result of validating the wire-format encoding of a message. -@@ -56,20 +56,20 @@ func (v ValidationStatus) String() string { - // of the message type. - // - // This function is exposed for testing. --func Validate(mt pref.MessageType, in piface.UnmarshalInput) (out piface.UnmarshalOutput, _ ValidationStatus) { -+func Validate(mt protoreflect.MessageType, in protoiface.UnmarshalInput) (out protoiface.UnmarshalOutput, _ ValidationStatus) { - mi, ok := mt.(*MessageInfo) - if !ok { - return out, ValidationUnknown - } - if in.Resolver == nil { -- in.Resolver = preg.GlobalTypes -+ in.Resolver = protoregistry.GlobalTypes - } - o, st := mi.validate(in.Buf, 0, unmarshalOptions{ - flags: in.Flags, - resolver: in.Resolver, - }) - if o.initialized { -- out.Flags |= piface.UnmarshalInitialized -+ out.Flags |= protoiface.UnmarshalInitialized - } - return out, st - } -@@ -106,22 +106,22 @@ const ( - validationTypeMessageSetItem - ) - --func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd pref.FieldDescriptor, ft reflect.Type) validationInfo { -+func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd protoreflect.FieldDescriptor, ft reflect.Type) validationInfo { - var vi validationInfo - switch { - case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic(): - switch fd.Kind() { -- case pref.MessageKind: -+ case protoreflect.MessageKind: - vi.typ = validationTypeMessage - if ot, ok := si.oneofWrappersByNumber[fd.Number()]; ok { - vi.mi = getMessageInfo(ot.Field(0).Type) - } -- case pref.GroupKind: -+ case protoreflect.GroupKind: - vi.typ = validationTypeGroup - if ot, ok := si.oneofWrappersByNumber[fd.Number()]; ok { - vi.mi = getMessageInfo(ot.Field(0).Type) - } -- case pref.StringKind: -+ case protoreflect.StringKind: - if strs.EnforceUTF8(fd) { - vi.typ = validationTypeUTF8String - } -@@ -129,7 +129,7 @@ func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd pref.FieldDescrip - default: - vi = newValidationInfo(fd, ft) - } -- if fd.Cardinality() == pref.Required { -+ if fd.Cardinality() == protoreflect.Required { - // Avoid overflow. The required field check is done with a 64-bit mask, with - // any message containing more than 64 required fields always reported as - // potentially uninitialized, so it is not important to get a precise count -@@ -142,22 +142,22 @@ func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd pref.FieldDescrip - return vi - } - --func newValidationInfo(fd pref.FieldDescriptor, ft reflect.Type) validationInfo { -+func newValidationInfo(fd protoreflect.FieldDescriptor, ft reflect.Type) validationInfo { - var vi validationInfo - switch { - case fd.IsList(): - switch fd.Kind() { -- case pref.MessageKind: -+ case protoreflect.MessageKind: - vi.typ = validationTypeMessage - if ft.Kind() == reflect.Slice { - vi.mi = getMessageInfo(ft.Elem()) - } -- case pref.GroupKind: -+ case protoreflect.GroupKind: - vi.typ = validationTypeGroup - if ft.Kind() == reflect.Slice { - vi.mi = getMessageInfo(ft.Elem()) - } -- case pref.StringKind: -+ case protoreflect.StringKind: - vi.typ = validationTypeBytes - if strs.EnforceUTF8(fd) { - vi.typ = validationTypeUTF8String -@@ -175,33 +175,33 @@ func newValidationInfo(fd pref.FieldDescriptor, ft reflect.Type) validationInfo - case fd.IsMap(): - vi.typ = validationTypeMap - switch fd.MapKey().Kind() { -- case pref.StringKind: -+ case protoreflect.StringKind: - if strs.EnforceUTF8(fd) { - vi.keyType = validationTypeUTF8String - } - } - switch fd.MapValue().Kind() { -- case pref.MessageKind: -+ case protoreflect.MessageKind: - vi.valType = validationTypeMessage - if ft.Kind() == reflect.Map { - vi.mi = getMessageInfo(ft.Elem()) - } -- case pref.StringKind: -+ case protoreflect.StringKind: - if strs.EnforceUTF8(fd) { - vi.valType = validationTypeUTF8String - } - } - default: - switch fd.Kind() { -- case pref.MessageKind: -+ case protoreflect.MessageKind: - vi.typ = validationTypeMessage - if !fd.IsWeak() { - vi.mi = getMessageInfo(ft) - } -- case pref.GroupKind: -+ case protoreflect.GroupKind: - vi.typ = validationTypeGroup - vi.mi = getMessageInfo(ft) -- case pref.StringKind: -+ case protoreflect.StringKind: - vi.typ = validationTypeBytes - if strs.EnforceUTF8(fd) { - vi.typ = validationTypeUTF8String -@@ -314,11 +314,11 @@ State: - break - } - messageName := fd.Message().FullName() -- messageType, err := preg.GlobalTypes.FindMessageByName(messageName) -+ messageType, err := protoregistry.GlobalTypes.FindMessageByName(messageName) - switch err { - case nil: - vi.mi, _ = messageType.(*MessageInfo) -- case preg.NotFound: -+ case protoregistry.NotFound: - vi.typ = validationTypeBytes - default: - return out, ValidationUnknown -@@ -335,7 +335,7 @@ State: - // unmarshaling to begin failing. Supporting this requires some way to - // determine if the resolver is frozen. - xt, err := opts.resolver.FindExtensionByNumber(st.mi.Desc.FullName(), num) -- if err != nil && err != preg.NotFound { -+ if err != nil && err != protoregistry.NotFound { - return out, ValidationUnknown - } - if err == nil { -@@ -513,7 +513,7 @@ State: - } - xt, err := opts.resolver.FindExtensionByNumber(st.mi.Desc.FullName(), typeid) - switch { -- case err == preg.NotFound: -+ case err == protoregistry.NotFound: - b = b[n:] - case err != nil: - return out, ValidationUnknown -diff --git a/vendor/google.golang.org/protobuf/internal/impl/weak.go b/vendor/google.golang.org/protobuf/internal/impl/weak.go -index 009cbef..eb79a7b 100644 ---- a/vendor/google.golang.org/protobuf/internal/impl/weak.go -+++ b/vendor/google.golang.org/protobuf/internal/impl/weak.go -@@ -7,7 +7,7 @@ package impl - import ( - "fmt" - -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - ) - -@@ -17,32 +17,32 @@ import ( - // defined directly on it. - type weakFields WeakFields - --func (w weakFields) get(num pref.FieldNumber) (pref.ProtoMessage, bool) { -+func (w weakFields) get(num protoreflect.FieldNumber) (protoreflect.ProtoMessage, bool) { - m, ok := w[int32(num)] - return m, ok - } - --func (w *weakFields) set(num pref.FieldNumber, m pref.ProtoMessage) { -+func (w *weakFields) set(num protoreflect.FieldNumber, m protoreflect.ProtoMessage) { - if *w == nil { - *w = make(weakFields) - } - (*w)[int32(num)] = m - } - --func (w *weakFields) clear(num pref.FieldNumber) { -+func (w *weakFields) clear(num protoreflect.FieldNumber) { - delete(*w, int32(num)) - } - --func (Export) HasWeak(w WeakFields, num pref.FieldNumber) bool { -+func (Export) HasWeak(w WeakFields, num protoreflect.FieldNumber) bool { - _, ok := w[int32(num)] - return ok - } - --func (Export) ClearWeak(w *WeakFields, num pref.FieldNumber) { -+func (Export) ClearWeak(w *WeakFields, num protoreflect.FieldNumber) { - delete(*w, int32(num)) - } - --func (Export) GetWeak(w WeakFields, num pref.FieldNumber, name pref.FullName) pref.ProtoMessage { -+func (Export) GetWeak(w WeakFields, num protoreflect.FieldNumber, name protoreflect.FullName) protoreflect.ProtoMessage { - if m, ok := w[int32(num)]; ok { - return m - } -@@ -53,7 +53,7 @@ func (Export) GetWeak(w WeakFields, num pref.FieldNumber, name pref.FullName) pr - return mt.Zero().Interface() - } - --func (Export) SetWeak(w *WeakFields, num pref.FieldNumber, name pref.FullName, m pref.ProtoMessage) { -+func (Export) SetWeak(w *WeakFields, num protoreflect.FieldNumber, name protoreflect.FullName, m protoreflect.ProtoMessage) { - if m != nil { - mt, _ := protoregistry.GlobalTypes.FindMessageByName(name) - if mt == nil { -diff --git a/vendor/google.golang.org/protobuf/internal/order/order.go b/vendor/google.golang.org/protobuf/internal/order/order.go -index 2a24953..33745ed 100644 ---- a/vendor/google.golang.org/protobuf/internal/order/order.go -+++ b/vendor/google.golang.org/protobuf/internal/order/order.go -@@ -5,12 +5,12 @@ - package order - - import ( -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - // FieldOrder specifies the ordering to visit message fields. - // It is a function that reports whether x is ordered before y. --type FieldOrder func(x, y pref.FieldDescriptor) bool -+type FieldOrder func(x, y protoreflect.FieldDescriptor) bool - - var ( - // AnyFieldOrder specifies no specific field ordering. -@@ -18,9 +18,9 @@ var ( - - // LegacyFieldOrder sorts fields in the same ordering as emitted by - // wire serialization in the github.com/golang/protobuf implementation. -- LegacyFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { -+ LegacyFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool { - ox, oy := x.ContainingOneof(), y.ContainingOneof() -- inOneof := func(od pref.OneofDescriptor) bool { -+ inOneof := func(od protoreflect.OneofDescriptor) bool { - return od != nil && !od.IsSynthetic() - } - -@@ -41,14 +41,14 @@ var ( - } - - // NumberFieldOrder sorts fields by their field number. -- NumberFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { -+ NumberFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool { - return x.Number() < y.Number() - } - - // IndexNameFieldOrder sorts non-extension fields before extension fields. - // Non-extensions are sorted according to their declaration index. - // Extensions are sorted according to their full name. -- IndexNameFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { -+ IndexNameFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool { - // Non-extension fields sort before extension fields. - if x.IsExtension() != y.IsExtension() { - return !x.IsExtension() && y.IsExtension() -@@ -64,7 +64,7 @@ var ( - - // KeyOrder specifies the ordering to visit map entries. - // It is a function that reports whether x is ordered before y. --type KeyOrder func(x, y pref.MapKey) bool -+type KeyOrder func(x, y protoreflect.MapKey) bool - - var ( - // AnyKeyOrder specifies no specific key ordering. -@@ -72,7 +72,7 @@ var ( - - // GenericKeyOrder sorts false before true, numeric keys in ascending order, - // and strings in lexicographical ordering according to UTF-8 codepoints. -- GenericKeyOrder KeyOrder = func(x, y pref.MapKey) bool { -+ GenericKeyOrder KeyOrder = func(x, y protoreflect.MapKey) bool { - switch x.Interface().(type) { - case bool: - return !x.Bool() && y.Bool() -diff --git a/vendor/google.golang.org/protobuf/internal/order/range.go b/vendor/google.golang.org/protobuf/internal/order/range.go -index c8090e0..1665a68 100644 ---- a/vendor/google.golang.org/protobuf/internal/order/range.go -+++ b/vendor/google.golang.org/protobuf/internal/order/range.go -@@ -9,12 +9,12 @@ import ( - "sort" - "sync" - -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - type messageField struct { -- fd pref.FieldDescriptor -- v pref.Value -+ fd protoreflect.FieldDescriptor -+ v protoreflect.Value - } - - var messageFieldPool = sync.Pool{ -@@ -25,8 +25,8 @@ type ( - // FieldRnger is an interface for visiting all fields in a message. - // The protoreflect.Message type implements this interface. - FieldRanger interface{ Range(VisitField) } -- // VisitField is called everytime a message field is visited. -- VisitField = func(pref.FieldDescriptor, pref.Value) bool -+ // VisitField is called every time a message field is visited. -+ VisitField = func(protoreflect.FieldDescriptor, protoreflect.Value) bool - ) - - // RangeFields iterates over the fields of fs according to the specified order. -@@ -47,7 +47,7 @@ func RangeFields(fs FieldRanger, less FieldOrder, fn VisitField) { - }() - - // Collect all fields in the message and sort them. -- fs.Range(func(fd pref.FieldDescriptor, v pref.Value) bool { -+ fs.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - fields = append(fields, messageField{fd, v}) - return true - }) -@@ -64,8 +64,8 @@ func RangeFields(fs FieldRanger, less FieldOrder, fn VisitField) { - } - - type mapEntry struct { -- k pref.MapKey -- v pref.Value -+ k protoreflect.MapKey -+ v protoreflect.Value - } - - var mapEntryPool = sync.Pool{ -@@ -76,8 +76,8 @@ type ( - // EntryRanger is an interface for visiting all fields in a message. - // The protoreflect.Map type implements this interface. - EntryRanger interface{ Range(VisitEntry) } -- // VisitEntry is called everytime a map entry is visited. -- VisitEntry = func(pref.MapKey, pref.Value) bool -+ // VisitEntry is called every time a map entry is visited. -+ VisitEntry = func(protoreflect.MapKey, protoreflect.Value) bool - ) - - // RangeEntries iterates over the entries of es according to the specified order. -@@ -98,7 +98,7 @@ func RangeEntries(es EntryRanger, less KeyOrder, fn VisitEntry) { - }() - - // Collect all entries in the map and sort them. -- es.Range(func(k pref.MapKey, v pref.Value) bool { -+ es.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool { - entries = append(entries, mapEntry{k, v}) - return true - }) -diff --git a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go -index 56a8a4e..61a84d3 100644 ---- a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go -+++ b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go -@@ -10,7 +10,7 @@ package strs - import ( - "unsafe" - -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - - type ( -@@ -59,7 +59,7 @@ type Builder struct { - - // AppendFullName is equivalent to protoreflect.FullName.Append, - // but optimized for large batches where each name has a shared lifetime. --func (sb *Builder) AppendFullName(prefix pref.FullName, name pref.Name) pref.FullName { -+func (sb *Builder) AppendFullName(prefix protoreflect.FullName, name protoreflect.Name) protoreflect.FullName { - n := len(prefix) + len(".") + len(name) - if len(prefix) == 0 { - n -= len(".") -@@ -68,7 +68,7 @@ func (sb *Builder) AppendFullName(prefix pref.FullName, name pref.Name) pref.Ful - sb.buf = append(sb.buf, prefix...) - sb.buf = append(sb.buf, '.') - sb.buf = append(sb.buf, name...) -- return pref.FullName(sb.last(n)) -+ return protoreflect.FullName(sb.last(n)) - } - - // MakeString is equivalent to string(b), but optimized for large batches -@@ -87,7 +87,7 @@ func (sb *Builder) grow(n int) { - // Unlike strings.Builder, we do not need to copy over the contents - // of the old buffer since our builder provides no API for - // retrieving previously created strings. -- sb.buf = make([]byte, 2*(cap(sb.buf)+n)) -+ sb.buf = make([]byte, 0, 2*(cap(sb.buf)+n)) - } - - func (sb *Builder) last(n int) string { -diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go -index 3d40d52..f7014cd 100644 ---- a/vendor/google.golang.org/protobuf/internal/version/version.go -+++ b/vendor/google.golang.org/protobuf/internal/version/version.go -@@ -12,47 +12,46 @@ import ( - - // These constants determine the current version of this module. - // --// - // For our release process, we enforce the following rules: --// * Tagged releases use a tag that is identical to String. --// * Tagged releases never reference a commit where the String --// contains "devel". --// * The set of all commits in this repository where String --// does not contain "devel" must have a unique String. --// -+// - Tagged releases use a tag that is identical to String. -+// - Tagged releases never reference a commit where the String -+// contains "devel". -+// - The set of all commits in this repository where String -+// does not contain "devel" must have a unique String. - // - // Steps for tagging a new release: --// 1. Create a new CL. - // --// 2. Update Minor, Patch, and/or PreRelease as necessary. --// PreRelease must not contain the string "devel". -+// 1. Create a new CL. - // --// 3. Since the last released minor version, have there been any changes to --// generator that relies on new functionality in the runtime? --// If yes, then increment RequiredGenerated. -+// 2. Update Minor, Patch, and/or PreRelease as necessary. -+// PreRelease must not contain the string "devel". - // --// 4. Since the last released minor version, have there been any changes to --// the runtime that removes support for old .pb.go source code? --// If yes, then increment SupportMinimum. -+// 3. Since the last released minor version, have there been any changes to -+// generator that relies on new functionality in the runtime? -+// If yes, then increment RequiredGenerated. - // --// 5. Send out the CL for review and submit it. --// Note that the next CL in step 8 must be submitted after this CL --// without any other CLs in-between. -+// 4. Since the last released minor version, have there been any changes to -+// the runtime that removes support for old .pb.go source code? -+// If yes, then increment SupportMinimum. - // --// 6. Tag a new version, where the tag is is the current String. -+// 5. Send out the CL for review and submit it. -+// Note that the next CL in step 8 must be submitted after this CL -+// without any other CLs in-between. - // --// 7. Write release notes for all notable changes --// between this release and the last release. -+// 6. Tag a new version, where the tag is is the current String. - // --// 8. Create a new CL. -+// 7. Write release notes for all notable changes -+// between this release and the last release. - // --// 9. Update PreRelease to include the string "devel". --// For example: "" -> "devel" or "rc.1" -> "rc.1.devel" -+// 8. Create a new CL. - // --// 10. Send out the CL for review and submit it. -+// 9. Update PreRelease to include the string "devel". -+// For example: "" -> "devel" or "rc.1" -> "rc.1.devel" -+// -+// 10. Send out the CL for review and submit it. - const ( - Major = 1 -- Minor = 28 -+ Minor = 30 - Patch = 0 - PreRelease = "" - ) -@@ -60,6 +59,7 @@ const ( - // String formats the version string for this module in semver format. - // - // Examples: -+// - // v1.20.1 - // v1.21.0-rc.1 - func String() string { -diff --git a/vendor/google.golang.org/protobuf/proto/decode.go b/vendor/google.golang.org/protobuf/proto/decode.go -index 11bf717..48d4794 100644 ---- a/vendor/google.golang.org/protobuf/proto/decode.go -+++ b/vendor/google.golang.org/protobuf/proto/decode.go -@@ -19,7 +19,8 @@ import ( - // UnmarshalOptions configures the unmarshaler. - // - // Example usage: --// err := UnmarshalOptions{DiscardUnknown: true}.Unmarshal(b, m) -+// -+// err := UnmarshalOptions{DiscardUnknown: true}.Unmarshal(b, m) - type UnmarshalOptions struct { - pragma.NoUnkeyedLiterals - -diff --git a/vendor/google.golang.org/protobuf/proto/doc.go b/vendor/google.golang.org/protobuf/proto/doc.go -index c52d8c4..ec71e71 100644 ---- a/vendor/google.golang.org/protobuf/proto/doc.go -+++ b/vendor/google.golang.org/protobuf/proto/doc.go -@@ -5,19 +5,15 @@ - // Package proto provides functions operating on protocol buffer messages. - // - // For documentation on protocol buffers in general, see: --// --// https://developers.google.com/protocol-buffers -+// https://protobuf.dev. - // - // For a tutorial on using protocol buffers with Go, see: --// --// https://developers.google.com/protocol-buffers/docs/gotutorial -+// https://protobuf.dev/getting-started/gotutorial. - // - // For a guide to generated Go protocol buffer code, see: -+// https://protobuf.dev/reference/go/go-generated. - // --// https://developers.google.com/protocol-buffers/docs/reference/go-generated --// --// --// Binary serialization -+// # Binary serialization - // - // This package contains functions to convert to and from the wire format, - // an efficient binary serialization of protocol buffers. -@@ -30,8 +26,7 @@ - // • Unmarshal converts a message from the wire format. - // The UnmarshalOptions type provides more control over wire unmarshaling. - // --// --// Basic message operations -+// # Basic message operations - // - // • Clone makes a deep copy of a message. - // -@@ -45,8 +40,7 @@ - // - // • CheckInitialized reports whether all required fields in a message are set. - // --// --// Optional scalar constructors -+// # Optional scalar constructors - // - // The API for some generated messages represents optional scalar fields - // as pointers to a value. For example, an optional string field has the -@@ -61,16 +55,14 @@ - // - // Optional scalar fields are only supported in proto2. - // --// --// Extension accessors -+// # Extension accessors - // - // • HasExtension, GetExtension, SetExtension, and ClearExtension - // access extension field values in a protocol buffer message. - // - // Extension fields are only supported in proto2. - // --// --// Related packages -+// # Related packages - // - // • Package "google.golang.org/protobuf/encoding/protojson" converts messages to - // and from JSON. -diff --git a/vendor/google.golang.org/protobuf/proto/encode.go b/vendor/google.golang.org/protobuf/proto/encode.go -index d18239c..bf7f816 100644 ---- a/vendor/google.golang.org/protobuf/proto/encode.go -+++ b/vendor/google.golang.org/protobuf/proto/encode.go -@@ -16,7 +16,8 @@ import ( - // MarshalOptions configures the marshaler. - // - // Example usage: --// b, err := MarshalOptions{Deterministic: true}.Marshal(m) -+// -+// b, err := MarshalOptions{Deterministic: true}.Marshal(m) - type MarshalOptions struct { - pragma.NoUnkeyedLiterals - -@@ -101,7 +102,9 @@ func (o MarshalOptions) Marshal(m Message) ([]byte, error) { - // otherwise it returns a non-nil empty buffer. - // - // This is to assist the edge-case where user-code does the following: -+// - // m1.OptionalBytes, _ = proto.Marshal(m2) -+// - // where they expect the proto2 "optional_bytes" field to be populated - // if any only if m2 is a valid message. - func emptyBytesForMessage(m Message) []byte { -diff --git a/vendor/google.golang.org/protobuf/proto/equal.go b/vendor/google.golang.org/protobuf/proto/equal.go -index 4dba2b9..1a0be1b 100644 ---- a/vendor/google.golang.org/protobuf/proto/equal.go -+++ b/vendor/google.golang.org/protobuf/proto/equal.go -@@ -5,163 +5,53 @@ - package proto - - import ( -- "bytes" -- "math" - "reflect" - -- "google.golang.org/protobuf/encoding/protowire" -- pref "google.golang.org/protobuf/reflect/protoreflect" -+ "google.golang.org/protobuf/reflect/protoreflect" - ) - --// Equal reports whether two messages are equal. --// If two messages marshal to the same bytes under deterministic serialization, --// then Equal is guaranteed to report true. -+// Equal reports whether two messages are equal, -+// by recursively comparing the fields of the message. - // --// Two messages are equal if they belong to the same message descriptor, --// have the same set of populated known and extension field values, --// and the same set of unknown fields values. If either of the top-level --// messages are invalid, then Equal reports true only if both are invalid. -+// - Bytes fields are equal if they contain identical bytes. -+// Empty bytes (regardless of nil-ness) are considered equal. - // --// Scalar values are compared with the equivalent of the == operator in Go, --// except bytes values which are compared using bytes.Equal and --// floating point values which specially treat NaNs as equal. --// Message values are compared by recursively calling Equal. --// Lists are equal if each element value is also equal. --// Maps are equal if they have the same set of keys, where the pair of values --// for each key is also equal. -+// - Floating-point fields are equal if they contain the same value. -+// Unlike the == operator, a NaN is equal to another NaN. -+// -+// - Other scalar fields are equal if they contain the same value. -+// -+// - Message fields are equal if they have -+// the same set of populated known and extension field values, and -+// the same set of unknown fields values. -+// -+// - Lists are equal if they are the same length and -+// each corresponding element is equal. -+// -+// - Maps are equal if they have the same set of keys and -+// the corresponding value for each key is equal. -+// -+// An invalid message is not equal to a valid message. -+// An invalid message is only equal to another invalid message of the -+// same type. An invalid message often corresponds to a nil pointer -+// of the concrete message type. For example, (*pb.M)(nil) is not equal -+// to &pb.M{}. -+// If two valid messages marshal to the same bytes under deterministic -+// serialization, then Equal is guaranteed to report true. - func Equal(x, y Message) bool { - if x == nil || y == nil { - return x == nil && y == nil - } -+ if reflect.TypeOf(x).Kind() == reflect.Ptr && x == y { -+ // Avoid an expensive comparison if both inputs are identical pointers. -+ return true -+ } - mx := x.ProtoReflect() - my := y.ProtoReflect() - if mx.IsValid() != my.IsValid() { - return false - } -- return equalMessage(mx, my) --} -- --// equalMessage compares two messages. --func equalMessage(mx, my pref.Message) bool { -- if mx.Descriptor() != my.Descriptor() { -- return false -- } -- -- nx := 0 -- equal := true -- mx.Range(func(fd pref.FieldDescriptor, vx pref.Value) bool { -- nx++ -- vy := my.Get(fd) -- equal = my.Has(fd) && equalField(fd, vx, vy) -- return equal -- }) -- if !equal { -- return false -- } -- ny := 0 -- my.Range(func(fd pref.FieldDescriptor, vx pref.Value) bool { -- ny++ -- return true -- }) -- if nx != ny { -- return false -- } -- -- return equalUnknown(mx.GetUnknown(), my.GetUnknown()) --} -- --// equalField compares two fields. --func equalField(fd pref.FieldDescriptor, x, y pref.Value) bool { -- switch { -- case fd.IsList(): -- return equalList(fd, x.List(), y.List()) -- case fd.IsMap(): -- return equalMap(fd, x.Map(), y.Map()) -- default: -- return equalValue(fd, x, y) -- } --} -- --// equalMap compares two maps. --func equalMap(fd pref.FieldDescriptor, x, y pref.Map) bool { -- if x.Len() != y.Len() { -- return false -- } -- equal := true -- x.Range(func(k pref.MapKey, vx pref.Value) bool { -- vy := y.Get(k) -- equal = y.Has(k) && equalValue(fd.MapValue(), vx, vy) -- return equal -- }) -- return equal --} -- --// equalList compares two lists. --func equalList(fd pref.FieldDescriptor, x, y pref.List) bool { -- if x.Len() != y.Len() { -- return false -- } -- for i := x.Len() - 1; i >= 0; i-- { -- if !equalValue(fd, x.Get(i), y.Get(i)) { -- return false -- } -- } -- return true --} -- --// equalValue compares two singular values. --func equalValue(fd pref.FieldDescriptor, x, y pref.Value) bool { -- switch fd.Kind() { -- case pref.BoolKind: -- return x.Bool() == y.Bool() -- case pref.EnumKind: -- return x.Enum() == y.Enum() -- case pref.Int32Kind, pref.Sint32Kind, -- pref.Int64Kind, pref.Sint64Kind, -- pref.Sfixed32Kind, pref.Sfixed64Kind: -- return x.Int() == y.Int() -- case pref.Uint32Kind, pref.Uint64Kind, -- pref.Fixed32Kind, pref.Fixed64Kind: -- return x.Uint() == y.Uint() -- case pref.FloatKind, pref.DoubleKind: -- fx := x.Float() -- fy := y.Float() -- if math.IsNaN(fx) || math.IsNaN(fy) { -- return math.IsNaN(fx) && math.IsNaN(fy) -- } -- return fx == fy -- case pref.StringKind: -- return x.String() == y.String() -- case pref.BytesKind: -- return bytes.Equal(x.Bytes(), y.Bytes()) -- case pref.MessageKind, pref.GroupKind: -- return equalMessage(x.Message(), y.Message()) -- default: -- return x.Interface() == y.Interface() -- } --} -- --// equalUnknown compares unknown fields by direct comparison on the raw bytes --// of each individual field number. --func equalUnknown(x, y pref.RawFields) bool { -- if len(x) != len(y) { -- return false -- } -- if bytes.Equal([]byte(x), []byte(y)) { -- return true -- } -- -- mx := make(map[pref.FieldNumber]pref.RawFields) -- my := make(map[pref.FieldNumber]pref.RawFields) -- for len(x) > 0 { -- fnum, _, n := protowire.ConsumeField(x) -- mx[fnum] = append(mx[fnum], x[:n]...) -- x = x[n:] -- } -- for len(y) > 0 { -- fnum, _, n := protowire.ConsumeField(y) -- my[fnum] = append(my[fnum], y[:n]...) -- y = y[n:] -- } -- return reflect.DeepEqual(mx, my) -+ vx := protoreflect.ValueOfMessage(mx) -+ vy := protoreflect.ValueOfMessage(my) -+ return vx.Equal(vy) - } -diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go -index cebb36c..27d7e35 100644 ---- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go -+++ b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go -@@ -155,9 +155,9 @@ func (r *resolver) findTarget(k protoreflect.Kind, scope protoreflect.FullName, - // - // Suppose the scope was "fizz.buzz" and the reference was "Foo.Bar", - // then the following full names are searched: --// * fizz.buzz.Foo.Bar --// * fizz.Foo.Bar --// * Foo.Bar -+// - fizz.buzz.Foo.Bar -+// - fizz.Foo.Bar -+// - Foo.Bar - func (r *resolver) findDescriptor(scope protoreflect.FullName, ref partialName) (protoreflect.Descriptor, error) { - if !ref.IsValid() { - return nil, errors.New("invalid name reference: %q", ref) -diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go -index dd85915..55aa149 100644 ---- a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go -+++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go -@@ -8,8 +8,7 @@ - // defined in proto source files and value interfaces which provide the - // ability to examine and manipulate the contents of messages. - // --// --// Protocol Buffer Descriptors -+// # Protocol Buffer Descriptors - // - // Protobuf descriptors (e.g., EnumDescriptor or MessageDescriptor) - // are immutable objects that represent protobuf type information. -@@ -26,8 +25,7 @@ - // The "google.golang.org/protobuf/reflect/protodesc" package converts between - // google.protobuf.DescriptorProto messages and protobuf descriptors. - // --// --// Go Type Descriptors -+// # Go Type Descriptors - // - // A type descriptor (e.g., EnumType or MessageType) is a constructor for - // a concrete Go type that represents the associated protobuf descriptor. -@@ -41,8 +39,7 @@ - // The "google.golang.org/protobuf/types/dynamicpb" package can be used to - // create Go type descriptors from protobuf descriptors. - // --// --// Value Interfaces -+// # Value Interfaces - // - // The Enum and Message interfaces provide a reflective view over an - // enum or message instance. For enums, it provides the ability to retrieve -@@ -55,13 +52,11 @@ - // The "github.com/golang/protobuf/proto".MessageReflect function can be used - // to obtain a reflective view on older messages. - // --// --// Relationships -+// # Relationships - // - // The following diagrams demonstrate the relationships between - // various types declared in this package. - // --// - // ┌───────────────────────────────────┐ - // V │ - // ┌────────────── New(n) ─────────────┐ │ -@@ -83,7 +78,6 @@ - // - // • An Enum is a concrete enum instance. Generated enums implement Enum. - // --// - // ┌──────────────── New() ─────────────────┐ - // │ │ - // │ ┌─── Descriptor() ─────┐ │ ┌── Interface() ───┐ -@@ -98,12 +92,22 @@ - // - // • A MessageType describes a concrete Go message type. - // It has a MessageDescriptor and can construct a Message instance. -+// Just as how Go's reflect.Type is a reflective description of a Go type, -+// a MessageType is a reflective description of a Go type for a protobuf message. - // - // • A MessageDescriptor describes an abstract protobuf message type. --// --// • A Message is a concrete message instance. Generated messages implement --// ProtoMessage, which can convert to/from a Message. --// -+// It has no understanding of Go types. In order to construct a MessageType -+// from just a MessageDescriptor, you can consider looking up the message type -+// in the global registry using protoregistry.GlobalTypes.FindMessageByName -+// or constructing a dynamic MessageType using dynamicpb.NewMessageType. -+// -+// • A Message is a reflective view over a concrete message instance. -+// Generated messages implement ProtoMessage, which can convert to a Message. -+// Just as how Go's reflect.Value is a reflective view over a Go value, -+// a Message is a reflective view over a concrete protobuf message instance. -+// Using Go reflection as an analogy, the ProtoReflect method is similar to -+// calling reflect.ValueOf, and the Message.Interface method is similar to -+// calling reflect.Value.Interface. - // - // ┌── TypeDescriptor() ──┐ ┌───── Descriptor() ─────┐ - // │ V │ V -diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go -index 121ba3a..0b99428 100644 ---- a/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go -+++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go -@@ -87,6 +87,7 @@ func (p1 SourcePath) Equal(p2 SourcePath) bool { - // in a future version of this module. - // - // Example output: -+// - // .message_type[6].nested_type[15].field[3] - func (p SourcePath) String() string { - b := p.appendFileDescriptorProto(nil) -diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go -index b03c122..54ce326 100644 ---- a/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go -+++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go -@@ -35,6 +35,8 @@ func (p *SourcePath) appendFileDescriptorProto(b []byte) []byte { - b = p.appendSingularField(b, "source_code_info", (*SourcePath).appendSourceCodeInfo) - case 12: - b = p.appendSingularField(b, "syntax", nil) -+ case 13: -+ b = p.appendSingularField(b, "edition", nil) - } - return b - } -@@ -236,6 +238,8 @@ func (p *SourcePath) appendMessageOptions(b []byte) []byte { - b = p.appendSingularField(b, "deprecated", nil) - case 7: - b = p.appendSingularField(b, "map_entry", nil) -+ case 11: -+ b = p.appendSingularField(b, "deprecated_legacy_json_field_conflicts", nil) - case 999: - b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) - } -@@ -279,6 +283,8 @@ func (p *SourcePath) appendEnumOptions(b []byte) []byte { - b = p.appendSingularField(b, "allow_alias", nil) - case 3: - b = p.appendSingularField(b, "deprecated", nil) -+ case 6: -+ b = p.appendSingularField(b, "deprecated_legacy_json_field_conflicts", nil) - case 999: - b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) - } -@@ -345,10 +351,18 @@ func (p *SourcePath) appendFieldOptions(b []byte) []byte { - b = p.appendSingularField(b, "jstype", nil) - case 5: - b = p.appendSingularField(b, "lazy", nil) -+ case 15: -+ b = p.appendSingularField(b, "unverified_lazy", nil) - case 3: - b = p.appendSingularField(b, "deprecated", nil) - case 10: - b = p.appendSingularField(b, "weak", nil) -+ case 16: -+ b = p.appendSingularField(b, "debug_redact", nil) -+ case 17: -+ b = p.appendSingularField(b, "retention", nil) -+ case 18: -+ b = p.appendSingularField(b, "target", nil) - case 999: - b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) - } -diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go -index 8e53c44..3867470 100644 ---- a/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go -+++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go -@@ -480,6 +480,7 @@ type ExtensionDescriptors interface { - // relative to the parent that it is declared within. - // - // For example: -+// - // syntax = "proto2"; - // package example; - // message FooMessage { -diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go -index f319810..37601b7 100644 ---- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go -+++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go -@@ -148,7 +148,7 @@ type Message interface { - // be preserved in marshaling or other operations. - IsValid() bool - -- // ProtoMethods returns optional fast-path implementions of various operations. -+ // ProtoMethods returns optional fast-path implementations of various operations. - // This method may return nil. - // - // The returned methods type is identical to -diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go -new file mode 100644 -index 0000000..5916525 ---- /dev/null -+++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go -@@ -0,0 +1,168 @@ -+// Copyright 2022 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+ -+package protoreflect -+ -+import ( -+ "bytes" -+ "fmt" -+ "math" -+ "reflect" -+ -+ "google.golang.org/protobuf/encoding/protowire" -+) -+ -+// Equal reports whether v1 and v2 are recursively equal. -+// -+// - Values of different types are always unequal. -+// -+// - Bytes values are equal if they contain identical bytes. -+// Empty bytes (regardless of nil-ness) are considered equal. -+// -+// - Floating point values are equal if they contain the same value. -+// Unlike the == operator, a NaN is equal to another NaN. -+// -+// - Enums are equal if they contain the same number. -+// Since Value does not contain an enum descriptor, -+// enum values do not consider the type of the enum. -+// -+// - Other scalar values are equal if they contain the same value. -+// -+// - Message values are equal if they belong to the same message descriptor, -+// have the same set of populated known and extension field values, -+// and the same set of unknown fields values. -+// -+// - Lists are equal if they are the same length and -+// each corresponding element is equal. -+// -+// - Maps are equal if they have the same set of keys and -+// the corresponding value for each key is equal. -+func (v1 Value) Equal(v2 Value) bool { -+ return equalValue(v1, v2) -+} -+ -+func equalValue(x, y Value) bool { -+ eqType := x.typ == y.typ -+ switch x.typ { -+ case nilType: -+ return eqType -+ case boolType: -+ return eqType && x.Bool() == y.Bool() -+ case int32Type, int64Type: -+ return eqType && x.Int() == y.Int() -+ case uint32Type, uint64Type: -+ return eqType && x.Uint() == y.Uint() -+ case float32Type, float64Type: -+ return eqType && equalFloat(x.Float(), y.Float()) -+ case stringType: -+ return eqType && x.String() == y.String() -+ case bytesType: -+ return eqType && bytes.Equal(x.Bytes(), y.Bytes()) -+ case enumType: -+ return eqType && x.Enum() == y.Enum() -+ default: -+ switch x := x.Interface().(type) { -+ case Message: -+ y, ok := y.Interface().(Message) -+ return ok && equalMessage(x, y) -+ case List: -+ y, ok := y.Interface().(List) -+ return ok && equalList(x, y) -+ case Map: -+ y, ok := y.Interface().(Map) -+ return ok && equalMap(x, y) -+ default: -+ panic(fmt.Sprintf("unknown type: %T", x)) -+ } -+ } -+} -+ -+// equalFloat compares two floats, where NaNs are treated as equal. -+func equalFloat(x, y float64) bool { -+ if math.IsNaN(x) || math.IsNaN(y) { -+ return math.IsNaN(x) && math.IsNaN(y) -+ } -+ return x == y -+} -+ -+// equalMessage compares two messages. -+func equalMessage(mx, my Message) bool { -+ if mx.Descriptor() != my.Descriptor() { -+ return false -+ } -+ -+ nx := 0 -+ equal := true -+ mx.Range(func(fd FieldDescriptor, vx Value) bool { -+ nx++ -+ vy := my.Get(fd) -+ equal = my.Has(fd) && equalValue(vx, vy) -+ return equal -+ }) -+ if !equal { -+ return false -+ } -+ ny := 0 -+ my.Range(func(fd FieldDescriptor, vx Value) bool { -+ ny++ -+ return true -+ }) -+ if nx != ny { -+ return false -+ } -+ -+ return equalUnknown(mx.GetUnknown(), my.GetUnknown()) -+} -+ -+// equalList compares two lists. -+func equalList(x, y List) bool { -+ if x.Len() != y.Len() { -+ return false -+ } -+ for i := x.Len() - 1; i >= 0; i-- { -+ if !equalValue(x.Get(i), y.Get(i)) { -+ return false -+ } -+ } -+ return true -+} -+ -+// equalMap compares two maps. -+func equalMap(x, y Map) bool { -+ if x.Len() != y.Len() { -+ return false -+ } -+ equal := true -+ x.Range(func(k MapKey, vx Value) bool { -+ vy := y.Get(k) -+ equal = y.Has(k) && equalValue(vx, vy) -+ return equal -+ }) -+ return equal -+} -+ -+// equalUnknown compares unknown fields by direct comparison on the raw bytes -+// of each individual field number. -+func equalUnknown(x, y RawFields) bool { -+ if len(x) != len(y) { -+ return false -+ } -+ if bytes.Equal([]byte(x), []byte(y)) { -+ return true -+ } -+ -+ mx := make(map[FieldNumber]RawFields) -+ my := make(map[FieldNumber]RawFields) -+ for len(x) > 0 { -+ fnum, _, n := protowire.ConsumeField(x) -+ mx[fnum] = append(mx[fnum], x[:n]...) -+ x = x[n:] -+ } -+ for len(y) > 0 { -+ fnum, _, n := protowire.ConsumeField(y) -+ my[fnum] = append(my[fnum], y[:n]...) -+ y = y[n:] -+ } -+ return reflect.DeepEqual(mx, my) -+} -diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go -index eb7764c..08e5ef7 100644 ---- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go -+++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go -@@ -50,14 +50,15 @@ import ( - // always references the source object. - // - // For example: -+// - // // Append a 0 to a "repeated int32" field. - // // Since the Value returned by Mutable is guaranteed to alias - // // the source message, modifying the Value modifies the message. --// message.Mutable(fieldDesc).(List).Append(protoreflect.ValueOfInt32(0)) -+// message.Mutable(fieldDesc).List().Append(protoreflect.ValueOfInt32(0)) - // - // // Assign [0] to a "repeated int32" field by creating a new Value, - // // modifying it, and assigning it. --// list := message.NewField(fieldDesc).(List) -+// list := message.NewField(fieldDesc).List() - // list.Append(protoreflect.ValueOfInt32(0)) - // message.Set(fieldDesc, list) - // // ERROR: Since it is not defined whether Set aliases the source, -@@ -392,6 +393,7 @@ func (v Value) MapKey() MapKey { - // ╚═════════╧═════════════════════════════════════╝ - // - // A MapKey is constructed and accessed through a Value: -+// - // k := ValueOf("hash").MapKey() // convert string to MapKey - // s := k.String() // convert MapKey to string - // -diff --git a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go -index 59f024c..aeb5597 100644 ---- a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go -+++ b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go -@@ -30,9 +30,11 @@ import ( - // conflictPolicy configures the policy for handling registration conflicts. - // - // It can be over-written at compile time with a linker-initialized variable: -+// - // go build -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn" - // - // It can be over-written at program execution with an environment variable: -+// - // GOLANG_PROTOBUF_REGISTRATION_CONFLICT=warn ./main - // - // Neither of the above are covered by the compatibility promise and -@@ -44,7 +46,7 @@ var conflictPolicy = "panic" // "panic" | "warn" | "ignore" - // It is a variable so that the behavior is easily overridden in another file. - var ignoreConflict = func(d protoreflect.Descriptor, err error) bool { - const env = "GOLANG_PROTOBUF_REGISTRATION_CONFLICT" -- const faq = "https://developers.google.com/protocol-buffers/docs/reference/go/faq#namespace-conflict" -+ const faq = "https://protobuf.dev/reference/go/faq#namespace-conflict" - policy := conflictPolicy - if v := os.Getenv(env); v != "" { - policy = v -diff --git a/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go b/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go -index ff094e1..a105cb2 100644 ---- a/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go -+++ b/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go -@@ -26,16 +26,19 @@ const ( - // EnforceVersion is used by code generated by protoc-gen-go - // to statically enforce minimum and maximum versions of this package. - // A compilation failure implies either that: --// * the runtime package is too old and needs to be updated OR --// * the generated code is too old and needs to be regenerated. -+// - the runtime package is too old and needs to be updated OR -+// - the generated code is too old and needs to be regenerated. - // - // The runtime package can be upgraded by running: -+// - // go get google.golang.org/protobuf - // - // The generated code can be regenerated by running: -+// - // protoc --go_out=${PROTOC_GEN_GO_ARGS} ${PROTO_FILES} - // - // Example usage by generated code: -+// - // const ( - // // Verify that this generated code is sufficiently up-to-date. - // _ = protoimpl.EnforceVersion(genVersion - protoimpl.MinVersion) -@@ -49,6 +52,7 @@ const ( - type EnforceVersion uint - - // This enforces the following invariant: -+// - // MinVersion ≤ GenVersion ≤ MaxVersion - const ( - _ = EnforceVersion(GenVersion - MinVersion) -diff --git a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go -index abe4ab5..dac5671 100644 ---- a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go -+++ b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go -@@ -406,6 +406,152 @@ func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 1} - } - -+// If set to RETENTION_SOURCE, the option will be omitted from the binary. -+// Note: as of January 2023, support for this is in progress and does not yet -+// have an effect (b/264593489). -+type FieldOptions_OptionRetention int32 -+ -+const ( -+ FieldOptions_RETENTION_UNKNOWN FieldOptions_OptionRetention = 0 -+ FieldOptions_RETENTION_RUNTIME FieldOptions_OptionRetention = 1 -+ FieldOptions_RETENTION_SOURCE FieldOptions_OptionRetention = 2 -+) -+ -+// Enum value maps for FieldOptions_OptionRetention. -+var ( -+ FieldOptions_OptionRetention_name = map[int32]string{ -+ 0: "RETENTION_UNKNOWN", -+ 1: "RETENTION_RUNTIME", -+ 2: "RETENTION_SOURCE", -+ } -+ FieldOptions_OptionRetention_value = map[string]int32{ -+ "RETENTION_UNKNOWN": 0, -+ "RETENTION_RUNTIME": 1, -+ "RETENTION_SOURCE": 2, -+ } -+) -+ -+func (x FieldOptions_OptionRetention) Enum() *FieldOptions_OptionRetention { -+ p := new(FieldOptions_OptionRetention) -+ *p = x -+ return p -+} -+ -+func (x FieldOptions_OptionRetention) String() string { -+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -+} -+ -+func (FieldOptions_OptionRetention) Descriptor() protoreflect.EnumDescriptor { -+ return file_google_protobuf_descriptor_proto_enumTypes[5].Descriptor() -+} -+ -+func (FieldOptions_OptionRetention) Type() protoreflect.EnumType { -+ return &file_google_protobuf_descriptor_proto_enumTypes[5] -+} -+ -+func (x FieldOptions_OptionRetention) Number() protoreflect.EnumNumber { -+ return protoreflect.EnumNumber(x) -+} -+ -+// Deprecated: Do not use. -+func (x *FieldOptions_OptionRetention) UnmarshalJSON(b []byte) error { -+ num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) -+ if err != nil { -+ return err -+ } -+ *x = FieldOptions_OptionRetention(num) -+ return nil -+} -+ -+// Deprecated: Use FieldOptions_OptionRetention.Descriptor instead. -+func (FieldOptions_OptionRetention) EnumDescriptor() ([]byte, []int) { -+ return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 2} -+} -+ -+// This indicates the types of entities that the field may apply to when used -+// as an option. If it is unset, then the field may be freely used as an -+// option on any kind of entity. Note: as of January 2023, support for this is -+// in progress and does not yet have an effect (b/264593489). -+type FieldOptions_OptionTargetType int32 -+ -+const ( -+ FieldOptions_TARGET_TYPE_UNKNOWN FieldOptions_OptionTargetType = 0 -+ FieldOptions_TARGET_TYPE_FILE FieldOptions_OptionTargetType = 1 -+ FieldOptions_TARGET_TYPE_EXTENSION_RANGE FieldOptions_OptionTargetType = 2 -+ FieldOptions_TARGET_TYPE_MESSAGE FieldOptions_OptionTargetType = 3 -+ FieldOptions_TARGET_TYPE_FIELD FieldOptions_OptionTargetType = 4 -+ FieldOptions_TARGET_TYPE_ONEOF FieldOptions_OptionTargetType = 5 -+ FieldOptions_TARGET_TYPE_ENUM FieldOptions_OptionTargetType = 6 -+ FieldOptions_TARGET_TYPE_ENUM_ENTRY FieldOptions_OptionTargetType = 7 -+ FieldOptions_TARGET_TYPE_SERVICE FieldOptions_OptionTargetType = 8 -+ FieldOptions_TARGET_TYPE_METHOD FieldOptions_OptionTargetType = 9 -+) -+ -+// Enum value maps for FieldOptions_OptionTargetType. -+var ( -+ FieldOptions_OptionTargetType_name = map[int32]string{ -+ 0: "TARGET_TYPE_UNKNOWN", -+ 1: "TARGET_TYPE_FILE", -+ 2: "TARGET_TYPE_EXTENSION_RANGE", -+ 3: "TARGET_TYPE_MESSAGE", -+ 4: "TARGET_TYPE_FIELD", -+ 5: "TARGET_TYPE_ONEOF", -+ 6: "TARGET_TYPE_ENUM", -+ 7: "TARGET_TYPE_ENUM_ENTRY", -+ 8: "TARGET_TYPE_SERVICE", -+ 9: "TARGET_TYPE_METHOD", -+ } -+ FieldOptions_OptionTargetType_value = map[string]int32{ -+ "TARGET_TYPE_UNKNOWN": 0, -+ "TARGET_TYPE_FILE": 1, -+ "TARGET_TYPE_EXTENSION_RANGE": 2, -+ "TARGET_TYPE_MESSAGE": 3, -+ "TARGET_TYPE_FIELD": 4, -+ "TARGET_TYPE_ONEOF": 5, -+ "TARGET_TYPE_ENUM": 6, -+ "TARGET_TYPE_ENUM_ENTRY": 7, -+ "TARGET_TYPE_SERVICE": 8, -+ "TARGET_TYPE_METHOD": 9, -+ } -+) -+ -+func (x FieldOptions_OptionTargetType) Enum() *FieldOptions_OptionTargetType { -+ p := new(FieldOptions_OptionTargetType) -+ *p = x -+ return p -+} -+ -+func (x FieldOptions_OptionTargetType) String() string { -+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -+} -+ -+func (FieldOptions_OptionTargetType) Descriptor() protoreflect.EnumDescriptor { -+ return file_google_protobuf_descriptor_proto_enumTypes[6].Descriptor() -+} -+ -+func (FieldOptions_OptionTargetType) Type() protoreflect.EnumType { -+ return &file_google_protobuf_descriptor_proto_enumTypes[6] -+} -+ -+func (x FieldOptions_OptionTargetType) Number() protoreflect.EnumNumber { -+ return protoreflect.EnumNumber(x) -+} -+ -+// Deprecated: Do not use. -+func (x *FieldOptions_OptionTargetType) UnmarshalJSON(b []byte) error { -+ num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) -+ if err != nil { -+ return err -+ } -+ *x = FieldOptions_OptionTargetType(num) -+ return nil -+} -+ -+// Deprecated: Use FieldOptions_OptionTargetType.Descriptor instead. -+func (FieldOptions_OptionTargetType) EnumDescriptor() ([]byte, []int) { -+ return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 3} -+} -+ - // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, - // or neither? HTTP based RPC implementation may choose GET verb for safe - // methods, and PUT verb for idempotent methods instead of the default POST. -@@ -442,11 +588,11 @@ func (x MethodOptions_IdempotencyLevel) String() string { - } - - func (MethodOptions_IdempotencyLevel) Descriptor() protoreflect.EnumDescriptor { -- return file_google_protobuf_descriptor_proto_enumTypes[5].Descriptor() -+ return file_google_protobuf_descriptor_proto_enumTypes[7].Descriptor() - } - - func (MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType { -- return &file_google_protobuf_descriptor_proto_enumTypes[5] -+ return &file_google_protobuf_descriptor_proto_enumTypes[7] - } - - func (x MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber { -@@ -468,6 +614,70 @@ func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{17, 0} - } - -+// Represents the identified object's effect on the element in the original -+// .proto file. -+type GeneratedCodeInfo_Annotation_Semantic int32 -+ -+const ( -+ // There is no effect or the effect is indescribable. -+ GeneratedCodeInfo_Annotation_NONE GeneratedCodeInfo_Annotation_Semantic = 0 -+ // The element is set or otherwise mutated. -+ GeneratedCodeInfo_Annotation_SET GeneratedCodeInfo_Annotation_Semantic = 1 -+ // An alias to the element is returned. -+ GeneratedCodeInfo_Annotation_ALIAS GeneratedCodeInfo_Annotation_Semantic = 2 -+) -+ -+// Enum value maps for GeneratedCodeInfo_Annotation_Semantic. -+var ( -+ GeneratedCodeInfo_Annotation_Semantic_name = map[int32]string{ -+ 0: "NONE", -+ 1: "SET", -+ 2: "ALIAS", -+ } -+ GeneratedCodeInfo_Annotation_Semantic_value = map[string]int32{ -+ "NONE": 0, -+ "SET": 1, -+ "ALIAS": 2, -+ } -+) -+ -+func (x GeneratedCodeInfo_Annotation_Semantic) Enum() *GeneratedCodeInfo_Annotation_Semantic { -+ p := new(GeneratedCodeInfo_Annotation_Semantic) -+ *p = x -+ return p -+} -+ -+func (x GeneratedCodeInfo_Annotation_Semantic) String() string { -+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -+} -+ -+func (GeneratedCodeInfo_Annotation_Semantic) Descriptor() protoreflect.EnumDescriptor { -+ return file_google_protobuf_descriptor_proto_enumTypes[8].Descriptor() -+} -+ -+func (GeneratedCodeInfo_Annotation_Semantic) Type() protoreflect.EnumType { -+ return &file_google_protobuf_descriptor_proto_enumTypes[8] -+} -+ -+func (x GeneratedCodeInfo_Annotation_Semantic) Number() protoreflect.EnumNumber { -+ return protoreflect.EnumNumber(x) -+} -+ -+// Deprecated: Do not use. -+func (x *GeneratedCodeInfo_Annotation_Semantic) UnmarshalJSON(b []byte) error { -+ num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) -+ if err != nil { -+ return err -+ } -+ *x = GeneratedCodeInfo_Annotation_Semantic(num) -+ return nil -+} -+ -+// Deprecated: Use GeneratedCodeInfo_Annotation_Semantic.Descriptor instead. -+func (GeneratedCodeInfo_Annotation_Semantic) EnumDescriptor() ([]byte, []int) { -+ return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{20, 0, 0} -+} -+ - // The protocol compiler can output a FileDescriptorSet containing the .proto - // files it parses. - type FileDescriptorSet struct { -@@ -544,8 +754,12 @@ type FileDescriptorProto struct { - // development tools. - SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` - // The syntax of the proto file. -- // The supported values are "proto2" and "proto3". -+ // The supported values are "proto2", "proto3", and "editions". -+ // -+ // If `edition` is present, this value must be "editions". - Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` -+ // The edition of the proto file, which is an opaque string. -+ Edition *string `protobuf:"bytes,13,opt,name=edition" json:"edition,omitempty"` - } - - func (x *FileDescriptorProto) Reset() { -@@ -664,6 +878,13 @@ func (x *FileDescriptorProto) GetSyntax() string { - return "" - } - -+func (x *FileDescriptorProto) GetEdition() string { -+ if x != nil && x.Edition != nil { -+ return *x.Edition -+ } -+ return "" -+} -+ - // Describes a message type. - type DescriptorProto struct { - state protoimpl.MessageState -@@ -860,7 +1081,6 @@ type FieldDescriptorProto struct { - // For booleans, "true" or "false". - // For strings, contains the default text contents (not escaped in any way). - // For bytes, contains the C escaped value. All bytes >= 128 are escaped. -- // TODO(kenton): Base-64 encode? - DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"` - // If set, gives the index of a oneof in the containing type's oneof_decl - // list. This field is a member of that oneof. -@@ -1382,22 +1602,22 @@ type FileOptions struct { - // inappropriate because proto packages do not normally start with backwards - // domain names. - JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"` -- // If set, all the classes from the .proto file are wrapped in a single -- // outer class with the given name. This applies to both Proto1 -- // (equivalent to the old "--one_java_file" option) and Proto2 (where -- // a .proto always translates to a single class, but you may want to -- // explicitly choose the class name). -+ // Controls the name of the wrapper Java class generated for the .proto file. -+ // That class will always contain the .proto file's getDescriptor() method as -+ // well as any top-level extensions defined in the .proto file. -+ // If java_multiple_files is disabled, then all the other classes from the -+ // .proto file will be nested inside the single wrapper outer class. - JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` -- // If set true, then the Java code generator will generate a separate .java -+ // If enabled, then the Java code generator will generate a separate .java - // file for each top-level message, enum, and service defined in the .proto -- // file. Thus, these types will *not* be nested inside the outer class -- // named by java_outer_classname. However, the outer class will still be -+ // file. Thus, these types will *not* be nested inside the wrapper class -+ // named by java_outer_classname. However, the wrapper class will still be - // generated to contain the file's getDescriptor() method as well as any - // top-level extensions defined in the file. - JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` - // This option does nothing. - // -- // Deprecated: Do not use. -+ // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. - JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` - // If set true, then the Java2 code generator will generate code that - // throws an exception whenever an attempt is made to assign a non-UTF-8 -@@ -1531,7 +1751,7 @@ func (x *FileOptions) GetJavaMultipleFiles() bool { - return Default_FileOptions_JavaMultipleFiles - } - --// Deprecated: Do not use. -+// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. - func (x *FileOptions) GetJavaGenerateEqualsAndHash() bool { - if x != nil && x.JavaGenerateEqualsAndHash != nil { - return *x.JavaGenerateEqualsAndHash -@@ -1670,10 +1890,12 @@ type MessageOptions struct { - // efficient, has fewer features, and is more complicated. - // - // The message must be defined exactly as follows: -- // message Foo { -- // option message_set_wire_format = true; -- // extensions 4 to max; -- // } -+ // -+ // message Foo { -+ // option message_set_wire_format = true; -+ // extensions 4 to max; -+ // } -+ // - // Note that the message cannot have any defined fields; MessageSets only - // have extensions. - // -@@ -1692,28 +1914,44 @@ type MessageOptions struct { - // for the message, or it will be completely ignored; in the very least, - // this is a formalization for deprecating messages. - Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` -+ // NOTE: Do not set the option in .proto files. Always use the maps syntax -+ // instead. The option should only be implicitly set by the proto compiler -+ // parser. -+ // - // Whether the message is an automatically generated map entry type for the - // maps field. - // - // For maps fields: -- // map map_field = 1; -+ // -+ // map map_field = 1; -+ // - // The parsed descriptor looks like: -- // message MapFieldEntry { -- // option map_entry = true; -- // optional KeyType key = 1; -- // optional ValueType value = 2; -- // } -- // repeated MapFieldEntry map_field = 1; -+ // -+ // message MapFieldEntry { -+ // option map_entry = true; -+ // optional KeyType key = 1; -+ // optional ValueType value = 2; -+ // } -+ // repeated MapFieldEntry map_field = 1; - // - // Implementations may choose not to generate the map_entry=true message, but - // use a native map in the target language to hold the keys and values. - // The reflection APIs in such implementations still need to work as - // if the field is a repeated message field. -- // -- // NOTE: Do not set the option in .proto files. Always use the maps syntax -- // instead. The option should only be implicitly set by the proto compiler -- // parser. - MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` -+ // Enable the legacy handling of JSON field name conflicts. This lowercases -+ // and strips underscored from the fields before comparison in proto3 only. -+ // The new behavior takes `json_name` into account and applies to proto2 as -+ // well. -+ // -+ // This should only be used as a temporary measure against broken builds due -+ // to the change in behavior for JSON field name conflicts. -+ // -+ // TODO(b/261750190) This is legacy behavior we plan to remove once downstream -+ // teams have had time to migrate. -+ // -+ // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. -+ DeprecatedLegacyJsonFieldConflicts *bool `protobuf:"varint,11,opt,name=deprecated_legacy_json_field_conflicts,json=deprecatedLegacyJsonFieldConflicts" json:"deprecated_legacy_json_field_conflicts,omitempty"` - // The parser stores options it doesn't recognize here. See above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - } -@@ -1785,6 +2023,14 @@ func (x *MessageOptions) GetMapEntry() bool { - return false - } - -+// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. -+func (x *MessageOptions) GetDeprecatedLegacyJsonFieldConflicts() bool { -+ if x != nil && x.DeprecatedLegacyJsonFieldConflicts != nil { -+ return *x.DeprecatedLegacyJsonFieldConflicts -+ } -+ return false -+} -+ - func (x *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.UninterpretedOption -@@ -1838,7 +2084,6 @@ type FieldOptions struct { - // call from multiple threads concurrently, while non-const methods continue - // to require exclusive access. - // -- // - // Note that implementations may choose not to check required fields within - // a lazy sub-message. That is, calling IsInitialized() on the outer message - // may return true even if the inner message has missing required fields. -@@ -1849,7 +2094,14 @@ type FieldOptions struct { - // implementation must either *always* check its required fields, or *never* - // check its required fields, regardless of whether or not the message has - // been parsed. -+ // -+ // As of May 2022, lazy verifies the contents of the byte stream during -+ // parsing. An invalid byte stream will cause the overall parsing to fail. - Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` -+ // unverified_lazy does no correctness checks on the byte stream. This should -+ // only be used where lazy with verification is prohibitive for performance -+ // reasons. -+ UnverifiedLazy *bool `protobuf:"varint,15,opt,name=unverified_lazy,json=unverifiedLazy,def=0" json:"unverified_lazy,omitempty"` - // Is this field deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for accessors, or it will be completely ignored; in the very least, this -@@ -1857,17 +2109,24 @@ type FieldOptions struct { - Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` - // For Google-internal migration only. Do not use. - Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` -+ // Indicate that the field value should not be printed out when using debug -+ // formats, e.g. when the field contains sensitive credentials. -+ DebugRedact *bool `protobuf:"varint,16,opt,name=debug_redact,json=debugRedact,def=0" json:"debug_redact,omitempty"` -+ Retention *FieldOptions_OptionRetention `protobuf:"varint,17,opt,name=retention,enum=google.protobuf.FieldOptions_OptionRetention" json:"retention,omitempty"` -+ Target *FieldOptions_OptionTargetType `protobuf:"varint,18,opt,name=target,enum=google.protobuf.FieldOptions_OptionTargetType" json:"target,omitempty"` - // The parser stores options it doesn't recognize here. See above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - } - - // Default values for FieldOptions fields. - const ( -- Default_FieldOptions_Ctype = FieldOptions_STRING -- Default_FieldOptions_Jstype = FieldOptions_JS_NORMAL -- Default_FieldOptions_Lazy = bool(false) -- Default_FieldOptions_Deprecated = bool(false) -- Default_FieldOptions_Weak = bool(false) -+ Default_FieldOptions_Ctype = FieldOptions_STRING -+ Default_FieldOptions_Jstype = FieldOptions_JS_NORMAL -+ Default_FieldOptions_Lazy = bool(false) -+ Default_FieldOptions_UnverifiedLazy = bool(false) -+ Default_FieldOptions_Deprecated = bool(false) -+ Default_FieldOptions_Weak = bool(false) -+ Default_FieldOptions_DebugRedact = bool(false) - ) - - func (x *FieldOptions) Reset() { -@@ -1930,6 +2189,13 @@ func (x *FieldOptions) GetLazy() bool { - return Default_FieldOptions_Lazy - } - -+func (x *FieldOptions) GetUnverifiedLazy() bool { -+ if x != nil && x.UnverifiedLazy != nil { -+ return *x.UnverifiedLazy -+ } -+ return Default_FieldOptions_UnverifiedLazy -+} -+ - func (x *FieldOptions) GetDeprecated() bool { - if x != nil && x.Deprecated != nil { - return *x.Deprecated -@@ -1944,6 +2210,27 @@ func (x *FieldOptions) GetWeak() bool { - return Default_FieldOptions_Weak - } - -+func (x *FieldOptions) GetDebugRedact() bool { -+ if x != nil && x.DebugRedact != nil { -+ return *x.DebugRedact -+ } -+ return Default_FieldOptions_DebugRedact -+} -+ -+func (x *FieldOptions) GetRetention() FieldOptions_OptionRetention { -+ if x != nil && x.Retention != nil { -+ return *x.Retention -+ } -+ return FieldOptions_RETENTION_UNKNOWN -+} -+ -+func (x *FieldOptions) GetTarget() FieldOptions_OptionTargetType { -+ if x != nil && x.Target != nil { -+ return *x.Target -+ } -+ return FieldOptions_TARGET_TYPE_UNKNOWN -+} -+ - func (x *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.UninterpretedOption -@@ -2014,6 +2301,15 @@ type EnumOptions struct { - // for the enum, or it will be completely ignored; in the very least, this - // is a formalization for deprecating enums. - Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` -+ // Enable the legacy handling of JSON field name conflicts. This lowercases -+ // and strips underscored from the fields before comparison in proto3 only. -+ // The new behavior takes `json_name` into account and applies to proto2 as -+ // well. -+ // TODO(b/261750190) Remove this legacy behavior once downstream teams have -+ // had time to migrate. -+ // -+ // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. -+ DeprecatedLegacyJsonFieldConflicts *bool `protobuf:"varint,6,opt,name=deprecated_legacy_json_field_conflicts,json=deprecatedLegacyJsonFieldConflicts" json:"deprecated_legacy_json_field_conflicts,omitempty"` - // The parser stores options it doesn't recognize here. See above. - UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - } -@@ -2069,6 +2365,14 @@ func (x *EnumOptions) GetDeprecated() bool { - return Default_EnumOptions_Deprecated - } - -+// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. -+func (x *EnumOptions) GetDeprecatedLegacyJsonFieldConflicts() bool { -+ if x != nil && x.DeprecatedLegacyJsonFieldConflicts != nil { -+ return *x.DeprecatedLegacyJsonFieldConflicts -+ } -+ return false -+} -+ - func (x *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.UninterpretedOption -@@ -2399,43 +2703,48 @@ type SourceCodeInfo struct { - // tools. - // - // For example, say we have a file like: -- // message Foo { -- // optional string foo = 1; -- // } -+ // -+ // message Foo { -+ // optional string foo = 1; -+ // } -+ // - // Let's look at just the field definition: -- // optional string foo = 1; -- // ^ ^^ ^^ ^ ^^^ -- // a bc de f ghi -+ // -+ // optional string foo = 1; -+ // ^ ^^ ^^ ^ ^^^ -+ // a bc de f ghi -+ // - // We have the following locations: -- // span path represents -- // [a,i) [ 4, 0, 2, 0 ] The whole field definition. -- // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). -- // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). -- // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). -- // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). -+ // -+ // span path represents -+ // [a,i) [ 4, 0, 2, 0 ] The whole field definition. -+ // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). -+ // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). -+ // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). -+ // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). - // - // Notes: -- // - A location may refer to a repeated field itself (i.e. not to any -- // particular index within it). This is used whenever a set of elements are -- // logically enclosed in a single code segment. For example, an entire -- // extend block (possibly containing multiple extension definitions) will -- // have an outer location whose path refers to the "extensions" repeated -- // field without an index. -- // - Multiple locations may have the same path. This happens when a single -- // logical declaration is spread out across multiple places. The most -- // obvious example is the "extend" block again -- there may be multiple -- // extend blocks in the same scope, each of which will have the same path. -- // - A location's span is not always a subset of its parent's span. For -- // example, the "extendee" of an extension declaration appears at the -- // beginning of the "extend" block and is shared by all extensions within -- // the block. -- // - Just because a location's span is a subset of some other location's span -- // does not mean that it is a descendant. For example, a "group" defines -- // both a type and a field in a single declaration. Thus, the locations -- // corresponding to the type and field and their components will overlap. -- // - Code which tries to interpret locations should probably be designed to -- // ignore those that it doesn't understand, as more types of locations could -- // be recorded in the future. -+ // - A location may refer to a repeated field itself (i.e. not to any -+ // particular index within it). This is used whenever a set of elements are -+ // logically enclosed in a single code segment. For example, an entire -+ // extend block (possibly containing multiple extension definitions) will -+ // have an outer location whose path refers to the "extensions" repeated -+ // field without an index. -+ // - Multiple locations may have the same path. This happens when a single -+ // logical declaration is spread out across multiple places. The most -+ // obvious example is the "extend" block again -- there may be multiple -+ // extend blocks in the same scope, each of which will have the same path. -+ // - A location's span is not always a subset of its parent's span. For -+ // example, the "extendee" of an extension declaration appears at the -+ // beginning of the "extend" block and is shared by all extensions within -+ // the block. -+ // - Just because a location's span is a subset of some other location's span -+ // does not mean that it is a descendant. For example, a "group" defines -+ // both a type and a field in a single declaration. Thus, the locations -+ // corresponding to the type and field and their components will overlap. -+ // - Code which tries to interpret locations should probably be designed to -+ // ignore those that it doesn't understand, as more types of locations could -+ // be recorded in the future. - Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` - } - -@@ -2715,8 +3024,8 @@ func (x *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { - // The name of the uninterpreted option. Each string represents a segment in - // a dot-separated name. is_extension is true iff a segment represents an - // extension (denoted with parentheses in options specs in .proto files). --// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents --// "foo.(bar.baz).qux". -+// E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents -+// "foo.(bar.baz).moo". - type UninterpretedOption_NamePart struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache -@@ -2781,23 +3090,34 @@ type SourceCodeInfo_Location struct { - // location. - // - // Each element is a field number or an index. They form a path from -- // the root FileDescriptorProto to the place where the definition. For -- // example, this path: -- // [ 4, 3, 2, 7, 1 ] -+ // the root FileDescriptorProto to the place where the definition occurs. -+ // For example, this path: -+ // -+ // [ 4, 3, 2, 7, 1 ] -+ // - // refers to: -- // file.message_type(3) // 4, 3 -- // .field(7) // 2, 7 -- // .name() // 1 -+ // -+ // file.message_type(3) // 4, 3 -+ // .field(7) // 2, 7 -+ // .name() // 1 -+ // - // This is because FileDescriptorProto.message_type has field number 4: -- // repeated DescriptorProto message_type = 4; -+ // -+ // repeated DescriptorProto message_type = 4; -+ // - // and DescriptorProto.field has field number 2: -- // repeated FieldDescriptorProto field = 2; -+ // -+ // repeated FieldDescriptorProto field = 2; -+ // - // and FieldDescriptorProto.name has field number 1: -- // optional string name = 1; -+ // -+ // optional string name = 1; - // - // Thus, the above path gives the location of a field name. If we removed - // the last element: -- // [ 4, 3, 2, 7 ] -+ // -+ // [ 4, 3, 2, 7 ] -+ // - // this path refers to the whole field declaration (from the beginning - // of the label to the terminating semicolon). - Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` -@@ -2826,34 +3146,34 @@ type SourceCodeInfo_Location struct { - // - // Examples: - // -- // optional int32 foo = 1; // Comment attached to foo. -- // // Comment attached to bar. -- // optional int32 bar = 2; -+ // optional int32 foo = 1; // Comment attached to foo. -+ // // Comment attached to bar. -+ // optional int32 bar = 2; - // -- // optional string baz = 3; -- // // Comment attached to baz. -- // // Another line attached to baz. -+ // optional string baz = 3; -+ // // Comment attached to baz. -+ // // Another line attached to baz. - // -- // // Comment attached to qux. -- // // -- // // Another line attached to qux. -- // optional double qux = 4; -+ // // Comment attached to moo. -+ // // -+ // // Another line attached to moo. -+ // optional double moo = 4; - // -- // // Detached comment for corge. This is not leading or trailing comments -- // // to qux or corge because there are blank lines separating it from -- // // both. -+ // // Detached comment for corge. This is not leading or trailing comments -+ // // to moo or corge because there are blank lines separating it from -+ // // both. - // -- // // Detached comment for corge paragraph 2. -+ // // Detached comment for corge paragraph 2. - // -- // optional string corge = 5; -- // /* Block comment attached -- // * to corge. Leading asterisks -- // * will be removed. */ -- // /* Block comment attached to -- // * grault. */ -- // optional int32 grault = 6; -+ // optional string corge = 5; -+ // /* Block comment attached -+ // * to corge. Leading asterisks -+ // * will be removed. */ -+ // /* Block comment attached to -+ // * grault. */ -+ // optional int32 grault = 6; - // -- // // ignored detached comments. -+ // // ignored detached comments. - LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` - TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` - LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` -@@ -2940,9 +3260,10 @@ type GeneratedCodeInfo_Annotation struct { - // that relates to the identified object. - Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"` - // Identifies the ending offset in bytes in the generated code that -- // relates to the identified offset. The end offset should be one past -+ // relates to the identified object. The end offset should be one past - // the last relevant byte (so the length of the text = end - begin). -- End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` -+ End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` -+ Semantic *GeneratedCodeInfo_Annotation_Semantic `protobuf:"varint,5,opt,name=semantic,enum=google.protobuf.GeneratedCodeInfo_Annotation_Semantic" json:"semantic,omitempty"` - } - - func (x *GeneratedCodeInfo_Annotation) Reset() { -@@ -3005,6 +3326,13 @@ func (x *GeneratedCodeInfo_Annotation) GetEnd() int32 { - return 0 - } - -+func (x *GeneratedCodeInfo_Annotation) GetSemantic() GeneratedCodeInfo_Annotation_Semantic { -+ if x != nil && x.Semantic != nil { -+ return *x.Semantic -+ } -+ return GeneratedCodeInfo_Annotation_NONE -+} -+ - var File_google_protobuf_descriptor_proto protoreflect.FileDescriptor - - var file_google_protobuf_descriptor_proto_rawDesc = []byte{ -@@ -3016,7 +3344,7 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x04, 0x66, 0x69, -- 0x6c, 0x65, 0x22, 0xe4, 0x04, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, -+ 0x6c, 0x65, 0x22, 0xfe, 0x04, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, -@@ -3054,330 +3382,391 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ - 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, -- 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x22, 0xb9, 0x06, 0x0a, 0x0f, 0x44, 0x65, -- 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, -- 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, -- 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, -- 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, -- 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, -- 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x43, -- 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, -- 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, -- 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, -- 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, -- 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, -- 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, -- 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, -- 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, -- 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, -- 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, -- 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, -- 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, -- 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x65, 0x78, 0x74, -- 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x03, -- 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, -+ 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x64, 0x69, -+ 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x64, 0x69, 0x74, -+ 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x06, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, -+ 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, -+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x66, -+ 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, -+ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, -+ 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, -+ 0x6f, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, -+ 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, -+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, -+ 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, -+ 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, -+ 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, -+ 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, -- 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, -- 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, -- 0x6e, 0x67, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x63, -- 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, -- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, -- 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, -- 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x63, 0x6c, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, -- 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, -- 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, -- 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, -- 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, -- 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, -+ 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, -+ 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, -+ 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, -+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, -+ 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, -+ 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, -+ 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, -- 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, -- 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, -- 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, -- 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x03, -- 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, -- 0x1a, 0x7a, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, -- 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, -- 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, -- 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x6f, 0x70, -- 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, -- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, -- 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, -- 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x0d, -- 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, -- 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, -- 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, -- 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x7c, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, -- 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, -- 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, -- 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, -- 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, -- 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, -- 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, -- 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, -- 0x80, 0x80, 0x02, 0x22, 0xc1, 0x06, 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, -- 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, -- 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, -- 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, -- 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, -- 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, -- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, -- 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, -- 0x61, 0x62, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x3e, 0x0a, 0x04, 0x74, -- 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, -- 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, -- 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, -- 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, -- 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, -- 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, -- 0x6e, 0x64, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, -- 0x6e, 0x64, 0x65, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, -- 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, -- 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6e, 0x65, -- 0x6f, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, -- 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x73, -- 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, -- 0x73, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, -- 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, -- 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, -- 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, -- 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, -- 0x6e, 0x61, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, -- 0x33, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0xb6, 0x02, 0x0a, 0x04, 0x54, 0x79, -- 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, -- 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, -- 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, -- 0x34, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, -- 0x36, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, -- 0x33, 0x32, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, -- 0x45, 0x44, 0x36, 0x34, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, -- 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, -- 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, -- 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, -- 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, -- 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, -- 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, -- 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x54, -- 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, -- 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x11, 0x0a, -- 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, -- 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, -- 0x11, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, -- 0x10, 0x12, 0x22, 0x43, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x0e, 0x4c, -- 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, -- 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, -- 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, -- 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x22, 0x63, 0x0a, 0x14, 0x4f, 0x6e, 0x65, 0x6f, 0x66, -- 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, -- 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, -- 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, -- 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, -- 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, -- 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe3, 0x02, 0x0a, -- 0x13, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, -- 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, -- 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, -- 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, -- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, -- 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, -- 0x74, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, -- 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, -- 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, -- 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, -- 0x73, 0x12, 0x5d, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, -- 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, -- 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, -- 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, -- 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, -- 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, -- 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, -- 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, -- 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3b, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, -- 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, -- 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, -- 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, -- 0x6e, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, -- 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, -- 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, -- 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, -- 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6f, -- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, -- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, -- 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, -- 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, -- 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, -- 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, -- 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, -- 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, -- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, -- 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, -- 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, -- 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, -- 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, -- 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, -- 0x6e, 0x73, 0x22, 0x89, 0x02, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, -- 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, -- 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, -- 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, -- 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, -- 0x1f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, -- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, -- 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, -- 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, -- 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, -- 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x10, 0x63, 0x6c, -- 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x05, -- 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x63, 0x6c, 0x69, -- 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x10, -- 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, -- 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x73, -- 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x22, 0x91, -- 0x09, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, -- 0x0a, 0x0c, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, -- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, -- 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, -- 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, -- 0x12, 0x6a, 0x61, 0x76, 0x61, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x6e, -- 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, 0x75, 0x6c, 0x74, -- 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, -- 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x6a, 0x61, 0x76, 0x61, 0x4d, 0x75, 0x6c, -- 0x74, 0x69, 0x70, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1d, 0x6a, 0x61, -- 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x71, 0x75, 0x61, -- 0x6c, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x14, 0x20, 0x01, 0x28, -- 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x19, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, -- 0x61, 0x74, 0x65, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x48, 0x61, 0x73, 0x68, -- 0x12, 0x3a, 0x0a, 0x16, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, -- 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x75, 0x74, 0x66, 0x38, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, -- 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x53, 0x74, 0x72, -- 0x69, 0x6e, 0x67, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x74, 0x66, 0x38, 0x12, 0x53, 0x0a, 0x0c, -- 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, -- 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, -- 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, -- 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x05, 0x53, -- 0x50, 0x45, 0x45, 0x44, 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x46, 0x6f, -- 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, -- 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, -- 0x12, 0x35, 0x0a, 0x13, 0x63, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, -- 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, -- 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x63, 0x63, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, -- 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x15, 0x6a, 0x61, 0x76, 0x61, 0x5f, -- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, -- 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, -- 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, -- 0x65, 0x73, 0x12, 0x35, 0x0a, 0x13, 0x70, 0x79, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, -- 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x3a, -- 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x70, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, -- 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x14, 0x70, 0x68, 0x70, -+ 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, -+ 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x65, -+ 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x44, 0x0a, -+ 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, -+ 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, -+ 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, -+ 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x44, -+ 0x65, 0x63, 0x6c, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, -+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, -+ 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, -+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, -+ 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, -+ 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, -+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, -+ 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, -+ 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, -+ 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, -+ 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, -+ 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x7a, 0x0a, 0x0e, 0x45, 0x78, -+ 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, -+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, -+ 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, -+ 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, -+ 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, -+ 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, -+ 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, -+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, -+ 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, -+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, -+ 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, -+ 0x7c, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, -+ 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, -+ 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, -+ 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, -+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, -+ 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, -+ 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, -+ 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0xc1, 0x06, -+ 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, -+ 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, -+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, -+ 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, -+ 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, -+ 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, -+ 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, -+ 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x05, -+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, -+ 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, -+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, -+ 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, -+ 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, -+ 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, -+ 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x18, 0x02, -+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x12, 0x23, -+ 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, -+ 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, -+ 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x69, 0x6e, 0x64, -+ 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x49, -+ 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, -+ 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, -+ 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, -+ 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, -+ 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, -+ 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, -+ 0x6f, 0x74, 0x6f, 0x33, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x11, 0x20, -+ 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x4f, 0x70, 0x74, 0x69, 0x6f, -+ 0x6e, 0x61, 0x6c, 0x22, 0xb6, 0x02, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, -+ 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, -+ 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, -+ 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0f, 0x0a, -+ 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0e, -+ 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x05, 0x12, 0x10, -+ 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x06, -+ 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, -+ 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x10, -+ 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, -+ 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, -+ 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, -+ 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, -+ 0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, -+ 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, -+ 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, -+ 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, -+ 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, -+ 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x11, 0x12, 0x0f, 0x0a, 0x0b, 0x54, -+ 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x12, 0x22, 0x43, 0x0a, 0x05, -+ 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x4f, -+ 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, -+ 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, -+ 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, -+ 0x03, 0x22, 0x63, 0x0a, 0x14, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, -+ 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, -+ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, -+ 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, -+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, -+ 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, -+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe3, 0x02, 0x0a, 0x13, 0x45, 0x6e, 0x75, 0x6d, 0x44, -+ 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, -+ 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, -+ 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, -+ 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, -+ 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, -+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x76, 0x61, -+ 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, -+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, -+ 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, -+ 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5d, 0x0a, 0x0e, 0x72, -+ 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, -+ 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, -+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, -+ 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, -+ 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, -+ 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, -+ 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, -+ 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, -+ 0x3b, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, -+ 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, -+ 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, -+ 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x83, 0x01, 0x0a, -+ 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, -+ 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, -+ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, -+ 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, -+ 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, -+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, -+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, -+ 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, -+ 0x6e, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, -+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, -+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, -+ 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, -+ 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, -+ 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, -+ 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, -+ 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, -+ 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, -+ 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, -+ 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x89, 0x02, 0x0a, -+ 0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, -+ 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, -+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, -+ 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, -+ 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, -+ 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, -+ 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70, -+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, -+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, -+ 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, -+ 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x10, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, -+ 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, -+ 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, -+ 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, -+ 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, -+ 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, -+ 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x22, 0x91, 0x09, 0x0a, 0x0b, 0x46, 0x69, 0x6c, -+ 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x61, 0x76, 0x61, -+ 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, -+ 0x6a, 0x61, 0x76, 0x61, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6a, -+ 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6e, -+ 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6a, 0x61, 0x76, 0x61, 0x4f, -+ 0x75, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, -+ 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, -+ 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, -+ 0x65, 0x52, 0x11, 0x6a, 0x61, 0x76, 0x61, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x46, -+ 0x69, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1d, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, -+ 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x5f, 0x61, 0x6e, 0x64, -+ 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, -+ 0x19, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x71, 0x75, -+ 0x61, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x16, 0x6a, 0x61, -+ 0x76, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, -+ 0x75, 0x74, 0x66, 0x38, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, -+ 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x65, -+ 0x63, 0x6b, 0x55, 0x74, 0x66, 0x38, 0x12, 0x53, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, -+ 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, -+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, -+ 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, -+ 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x52, 0x0b, -+ 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x67, -+ 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, -+ 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x13, 0x63, 0x63, - 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, -- 0x73, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x12, -- 0x70, 0x68, 0x70, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, -- 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, -- 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, -- 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x63, 0x5f, -- 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x18, 0x1f, 0x20, -- 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x63, 0x45, 0x6e, 0x61, -- 0x62, 0x6c, 0x65, 0x41, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x6a, -- 0x63, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x24, -- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x63, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, -- 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, -- 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, -- 0x0f, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, -- 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, -- 0x18, 0x27, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x77, 0x69, 0x66, 0x74, 0x50, 0x72, 0x65, -- 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x68, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, -- 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, -- 0x68, 0x70, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, -- 0x0d, 0x70, 0x68, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x29, -- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x68, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, -- 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x68, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, -- 0x74, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x2c, 0x20, 0x01, -- 0x28, 0x09, 0x52, 0x14, 0x70, 0x68, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, -- 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x62, 0x79, -- 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, -- 0x72, 0x75, 0x62, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x58, 0x0a, 0x14, 0x75, -- 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, -- 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, -- 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, -- 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, -- 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, -- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, -- 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x10, 0x01, -- 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x02, 0x12, -- 0x10, 0x0a, 0x0c, 0x4c, 0x49, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, -- 0x03, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x26, -- 0x10, 0x27, 0x22, 0xd1, 0x02, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, -- 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, -- 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, -- 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x14, 0x6d, -- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x57, 0x69, 0x72, 0x65, 0x46, 0x6f, 0x72, -- 0x6d, 0x61, 0x74, 0x12, 0x4c, 0x0a, 0x1f, 0x6e, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, -- 0x72, 0x64, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, -- 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, -- 0x6c, 0x73, 0x65, 0x52, 0x1c, 0x6e, 0x6f, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x44, -- 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, -- 0x72, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, -- 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, -- 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, -- 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, 0x70, -- 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, -+ 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, -+ 0x63, 0x63, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, -+ 0x73, 0x12, 0x39, 0x0a, 0x15, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, -+ 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, -+ 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, -+ 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x13, -+ 0x70, 0x79, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, -+ 0x63, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, -+ 0x52, 0x11, 0x70, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, -+ 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x14, 0x70, 0x68, 0x70, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, -+ 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x2a, 0x20, 0x01, 0x28, -+ 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x12, 0x70, 0x68, 0x70, 0x47, 0x65, 0x6e, -+ 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0a, -+ 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, -+ 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, -+ 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x63, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, -+ 0x5f, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, -+ 0x72, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x63, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x72, 0x65, -+ 0x6e, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x6a, 0x63, 0x5f, 0x63, 0x6c, 0x61, 0x73, -+ 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, -+ 0x6f, 0x62, 0x6a, 0x63, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, -+ 0x29, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, -+ 0x61, 0x63, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x73, 0x68, 0x61, 0x72, -+ 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x77, -+ 0x69, 0x66, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x27, 0x20, 0x01, 0x28, 0x09, -+ 0x52, 0x0b, 0x73, 0x77, 0x69, 0x66, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, -+ 0x10, 0x70, 0x68, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, -+ 0x78, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x68, 0x70, 0x43, 0x6c, 0x61, 0x73, -+ 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x68, 0x70, 0x5f, 0x6e, -+ 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, -+ 0x70, 0x68, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, -+ 0x70, 0x68, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x61, 0x6d, -+ 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x68, -+ 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, -+ 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x62, 0x79, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, -+ 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x62, 0x79, 0x50, 0x61, -+ 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, -- 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, -- 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, -- 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0xe2, 0x03, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, -- 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, -- 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, -+ 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, -+ 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, -+ 0x09, 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, -+ 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x49, 0x54, -+ 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x03, 0x2a, 0x09, 0x08, 0xe8, 0x07, -+ 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x26, 0x10, 0x27, 0x22, 0xbb, 0x03, 0x0a, -+ 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, -+ 0x3c, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x77, -+ 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, -+ 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x14, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, -+ 0x53, 0x65, 0x74, 0x57, 0x69, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x4c, 0x0a, -+ 0x1f, 0x6e, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x73, -+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, -+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x1c, 0x6e, -+ 0x6f, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, -+ 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0a, 0x64, -+ 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, -+ 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, -+ 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, -+ 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, -+ 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x65, -+ 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, -+ 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x42, -+ 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4c, -+ 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, -+ 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, -+ 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, -+ 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, -+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, -+ 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, -+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, -+ 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x04, -+ 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, -+ 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0xb7, 0x08, 0x0a, 0x0c, 0x46, -+ 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x05, 0x63, -+ 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, -+ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, -+ 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x3a, -+ 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x52, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, -+ 0x0a, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, -+ 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, -+ 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, -- 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x06, 0x53, 0x54, 0x52, -- 0x49, 0x4e, 0x47, 0x52, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, -- 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, -- 0x65, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, -- 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, -- 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, -- 0x73, 0x2e, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, -- 0x4d, 0x41, 0x4c, 0x52, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x04, 0x6c, -- 0x61, 0x7a, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, -- 0x52, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, -- 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, -- 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, -- 0x04, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, -- 0x73, 0x65, 0x52, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, -- 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, -- 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, -- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, -- 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, -- 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, -- 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, -- 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x52, 0x44, 0x10, -- 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x49, 0x45, 0x43, -- 0x45, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x06, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, -- 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, -- 0x4a, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4a, -- 0x53, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, -- 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x73, 0x0a, 0x0c, 0x4f, -- 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, -+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x09, 0x4a, 0x53, -+ 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x52, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x12, -+ 0x19, 0x0a, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, -+ 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x12, 0x2e, 0x0a, 0x0f, 0x75, 0x6e, -+ 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x0f, 0x20, -+ 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0e, 0x75, 0x6e, 0x76, 0x65, -+ 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4c, 0x61, 0x7a, 0x79, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, -+ 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, -+ 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, -+ 0x64, 0x12, 0x19, 0x0a, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, -+ 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x12, 0x28, 0x0a, 0x0c, -+ 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x72, 0x65, 0x64, 0x61, 0x63, 0x74, 0x18, 0x10, 0x20, 0x01, -+ 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, -+ 0x52, 0x65, 0x64, 0x61, 0x63, 0x74, 0x12, 0x4b, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, -+ 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, -+ 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, -+ 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, -+ 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, -+ 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x12, 0x20, -+ 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, -+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, -+ 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, -+ 0x79, 0x70, 0x65, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x14, 0x75, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, -- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, -- 0x22, 0xc0, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, -- 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, -- 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x69, 0x61, -- 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, -- 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, -- 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, -- 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, -- 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, -- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, -- 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, -- 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, -- 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, -- 0x05, 0x10, 0x06, 0x22, 0x9e, 0x01, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, -+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, -+ 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, -+ 0x52, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, -+ 0x49, 0x45, 0x43, 0x45, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x06, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, -+ 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, -+ 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0d, -+ 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x22, 0x55, 0x0a, -+ 0x0f, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, -+ 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, -+ 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, -+ 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, -+ 0x0a, 0x10, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, -+ 0x43, 0x45, 0x10, 0x02, 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, -+ 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, -+ 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, -+ 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, -+ 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, -+ 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, -+ 0x4e, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, -+ 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, -+ 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, -+ 0x45, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, -+ 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x45, 0x4f, 0x46, 0x10, 0x05, -+ 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, -+ 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x06, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, -+ 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, -+ 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, -+ 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x54, -+ 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, -+ 0x44, 0x10, 0x09, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, -+ 0x08, 0x04, 0x10, 0x05, 0x22, 0x73, 0x0a, 0x0c, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, -+ 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, -+ 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, -+ 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, -+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, -+ 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, -+ 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, -+ 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x98, 0x02, 0x0a, 0x0b, 0x45, 0x6e, -+ 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, -+ 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, -+ 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, -+ 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, -+ 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, -+ 0x64, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, -+ 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, -+ 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, -+ 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, -+ 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, -+ 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, -+ 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, -+ 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, -+ 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, -+ 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, -+ 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, -+ 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, -+ 0x08, 0x05, 0x10, 0x06, 0x22, 0x9e, 0x01, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, -+ 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, -+ 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, -+ 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, -+ 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, -+ 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, -+ 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, -+ 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, -+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, -+ 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, -+ 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, -- 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, -+ 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, -@@ -3385,97 +3774,95 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ - 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, - 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, -- 0x80, 0x80, 0x80, 0x02, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, -- 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, -- 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, -- 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x58, -- 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, -- 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, -+ 0x80, 0x80, 0x80, 0x02, 0x22, 0xe0, 0x02, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, -+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, -+ 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, -+ 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x71, 0x0a, -+ 0x11, 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, -+ 0x65, 0x6c, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, -+ 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, -+ 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, -+ 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, -+ 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x10, -+ 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, -+ 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, -+ 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, -+ 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, -+ 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, -+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, -+ 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x64, -+ 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, -+ 0x0a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, -+ 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x4f, 0x5f, 0x53, 0x49, -+ 0x44, 0x45, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x53, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, -+ 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, -+ 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9a, 0x03, 0x0a, 0x13, 0x55, 0x6e, 0x69, 0x6e, -+ 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, -+ 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, -- 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, -- 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, -- 0x80, 0x80, 0x02, 0x22, 0xe0, 0x02, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, -- 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, -- 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, -- 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x71, 0x0a, 0x11, -- 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, -- 0x6c, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, -- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, -- 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, -- 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, -- 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x10, 0x69, -- 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, -- 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, -- 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, -- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, -- 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, -- 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, -- 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x64, 0x65, -- 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, 0x0a, -- 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, -- 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x4f, 0x5f, 0x53, 0x49, 0x44, -- 0x45, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x53, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x49, -- 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, 0x07, -- 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9a, 0x03, 0x0a, 0x13, 0x55, 0x6e, 0x69, 0x6e, 0x74, -- 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, -- 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, -- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, -- 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, -- 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, -- 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, -- 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, 0x65, -- 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, -- 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, -- 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, -- 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x65, -- 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, -- 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, -- 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, -- 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, -- 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, -- 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, -- 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27, -- 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, -- 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, -- 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x4a, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x50, -- 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, -- 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, -- 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, -- 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, -- 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x02, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, -- 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, -- 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, -- 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, -- 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, -- 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xce, 0x01, 0x0a, -- 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, -- 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, -- 0x68, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x42, -- 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x65, 0x61, -- 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, -- 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, -- 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, -- 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, -- 0x10, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, -- 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, -- 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, -- 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, -- 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd1, 0x01, -- 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, -- 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, -- 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, -- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, -- 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, -- 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, -- 0x6f, 0x6e, 0x1a, 0x6d, 0x0a, 0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, -- 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, -- 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, -- 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, -- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x65, 0x67, -- 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x12, -- 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, -- 0x64, 0x42, 0x7e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, -+ 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x52, 0x04, 0x6e, 0x61, -+ 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, -+ 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, -+ 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, -+ 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, -+ 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, -+ 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6e, -+ 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, -+ 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, -+ 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, -+ 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, -+ 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, -+ 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, -+ 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, -+ 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, -+ 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, -+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x4a, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, -+ 0x50, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x72, -+ 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, -+ 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, -+ 0x6e, 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, -+ 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x02, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, -+ 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, -+ 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, -+ 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, -+ 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, -+ 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xce, 0x01, -+ 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, -+ 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, -+ 0x74, 0x68, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, -+ 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x65, -+ 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, -+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, -+ 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, -+ 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, -+ 0x52, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, -+ 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, -+ 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, -+ 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, -+ 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd0, -+ 0x02, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, -+ 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, -+ 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, -+ 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, -+ 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, -+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, -+ 0x69, 0x6f, 0x6e, 0x1a, 0xeb, 0x01, 0x0a, 0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, -+ 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, -+ 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, -+ 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, -+ 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, -+ 0x65, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, -+ 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, -+ 0x65, 0x6e, 0x64, 0x12, 0x52, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, -+ 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, -+ 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, -+ 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, -+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x52, 0x08, 0x73, -+ 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x22, 0x28, 0x0a, 0x08, 0x53, 0x65, 0x6d, 0x61, 0x6e, -+ 0x74, 0x69, 0x63, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, -+ 0x03, 0x53, 0x45, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x49, 0x41, 0x53, 0x10, -+ 0x02, 0x42, 0x7e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42, 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x48, 0x01, 0x5a, 0x2d, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, -@@ -3498,7 +3885,7 @@ func file_google_protobuf_descriptor_proto_rawDescGZIP() []byte { - return file_google_protobuf_descriptor_proto_rawDescData - } - --var file_google_protobuf_descriptor_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -+var file_google_protobuf_descriptor_proto_enumTypes = make([]protoimpl.EnumInfo, 9) - var file_google_protobuf_descriptor_proto_msgTypes = make([]protoimpl.MessageInfo, 27) - var file_google_protobuf_descriptor_proto_goTypes = []interface{}{ - (FieldDescriptorProto_Type)(0), // 0: google.protobuf.FieldDescriptorProto.Type -@@ -3506,84 +3893,90 @@ var file_google_protobuf_descriptor_proto_goTypes = []interface{}{ - (FileOptions_OptimizeMode)(0), // 2: google.protobuf.FileOptions.OptimizeMode - (FieldOptions_CType)(0), // 3: google.protobuf.FieldOptions.CType - (FieldOptions_JSType)(0), // 4: google.protobuf.FieldOptions.JSType -- (MethodOptions_IdempotencyLevel)(0), // 5: google.protobuf.MethodOptions.IdempotencyLevel -- (*FileDescriptorSet)(nil), // 6: google.protobuf.FileDescriptorSet -- (*FileDescriptorProto)(nil), // 7: google.protobuf.FileDescriptorProto -- (*DescriptorProto)(nil), // 8: google.protobuf.DescriptorProto -- (*ExtensionRangeOptions)(nil), // 9: google.protobuf.ExtensionRangeOptions -- (*FieldDescriptorProto)(nil), // 10: google.protobuf.FieldDescriptorProto -- (*OneofDescriptorProto)(nil), // 11: google.protobuf.OneofDescriptorProto -- (*EnumDescriptorProto)(nil), // 12: google.protobuf.EnumDescriptorProto -- (*EnumValueDescriptorProto)(nil), // 13: google.protobuf.EnumValueDescriptorProto -- (*ServiceDescriptorProto)(nil), // 14: google.protobuf.ServiceDescriptorProto -- (*MethodDescriptorProto)(nil), // 15: google.protobuf.MethodDescriptorProto -- (*FileOptions)(nil), // 16: google.protobuf.FileOptions -- (*MessageOptions)(nil), // 17: google.protobuf.MessageOptions -- (*FieldOptions)(nil), // 18: google.protobuf.FieldOptions -- (*OneofOptions)(nil), // 19: google.protobuf.OneofOptions -- (*EnumOptions)(nil), // 20: google.protobuf.EnumOptions -- (*EnumValueOptions)(nil), // 21: google.protobuf.EnumValueOptions -- (*ServiceOptions)(nil), // 22: google.protobuf.ServiceOptions -- (*MethodOptions)(nil), // 23: google.protobuf.MethodOptions -- (*UninterpretedOption)(nil), // 24: google.protobuf.UninterpretedOption -- (*SourceCodeInfo)(nil), // 25: google.protobuf.SourceCodeInfo -- (*GeneratedCodeInfo)(nil), // 26: google.protobuf.GeneratedCodeInfo -- (*DescriptorProto_ExtensionRange)(nil), // 27: google.protobuf.DescriptorProto.ExtensionRange -- (*DescriptorProto_ReservedRange)(nil), // 28: google.protobuf.DescriptorProto.ReservedRange -- (*EnumDescriptorProto_EnumReservedRange)(nil), // 29: google.protobuf.EnumDescriptorProto.EnumReservedRange -- (*UninterpretedOption_NamePart)(nil), // 30: google.protobuf.UninterpretedOption.NamePart -- (*SourceCodeInfo_Location)(nil), // 31: google.protobuf.SourceCodeInfo.Location -- (*GeneratedCodeInfo_Annotation)(nil), // 32: google.protobuf.GeneratedCodeInfo.Annotation -+ (FieldOptions_OptionRetention)(0), // 5: google.protobuf.FieldOptions.OptionRetention -+ (FieldOptions_OptionTargetType)(0), // 6: google.protobuf.FieldOptions.OptionTargetType -+ (MethodOptions_IdempotencyLevel)(0), // 7: google.protobuf.MethodOptions.IdempotencyLevel -+ (GeneratedCodeInfo_Annotation_Semantic)(0), // 8: google.protobuf.GeneratedCodeInfo.Annotation.Semantic -+ (*FileDescriptorSet)(nil), // 9: google.protobuf.FileDescriptorSet -+ (*FileDescriptorProto)(nil), // 10: google.protobuf.FileDescriptorProto -+ (*DescriptorProto)(nil), // 11: google.protobuf.DescriptorProto -+ (*ExtensionRangeOptions)(nil), // 12: google.protobuf.ExtensionRangeOptions -+ (*FieldDescriptorProto)(nil), // 13: google.protobuf.FieldDescriptorProto -+ (*OneofDescriptorProto)(nil), // 14: google.protobuf.OneofDescriptorProto -+ (*EnumDescriptorProto)(nil), // 15: google.protobuf.EnumDescriptorProto -+ (*EnumValueDescriptorProto)(nil), // 16: google.protobuf.EnumValueDescriptorProto -+ (*ServiceDescriptorProto)(nil), // 17: google.protobuf.ServiceDescriptorProto -+ (*MethodDescriptorProto)(nil), // 18: google.protobuf.MethodDescriptorProto -+ (*FileOptions)(nil), // 19: google.protobuf.FileOptions -+ (*MessageOptions)(nil), // 20: google.protobuf.MessageOptions -+ (*FieldOptions)(nil), // 21: google.protobuf.FieldOptions -+ (*OneofOptions)(nil), // 22: google.protobuf.OneofOptions -+ (*EnumOptions)(nil), // 23: google.protobuf.EnumOptions -+ (*EnumValueOptions)(nil), // 24: google.protobuf.EnumValueOptions -+ (*ServiceOptions)(nil), // 25: google.protobuf.ServiceOptions -+ (*MethodOptions)(nil), // 26: google.protobuf.MethodOptions -+ (*UninterpretedOption)(nil), // 27: google.protobuf.UninterpretedOption -+ (*SourceCodeInfo)(nil), // 28: google.protobuf.SourceCodeInfo -+ (*GeneratedCodeInfo)(nil), // 29: google.protobuf.GeneratedCodeInfo -+ (*DescriptorProto_ExtensionRange)(nil), // 30: google.protobuf.DescriptorProto.ExtensionRange -+ (*DescriptorProto_ReservedRange)(nil), // 31: google.protobuf.DescriptorProto.ReservedRange -+ (*EnumDescriptorProto_EnumReservedRange)(nil), // 32: google.protobuf.EnumDescriptorProto.EnumReservedRange -+ (*UninterpretedOption_NamePart)(nil), // 33: google.protobuf.UninterpretedOption.NamePart -+ (*SourceCodeInfo_Location)(nil), // 34: google.protobuf.SourceCodeInfo.Location -+ (*GeneratedCodeInfo_Annotation)(nil), // 35: google.protobuf.GeneratedCodeInfo.Annotation - } - var file_google_protobuf_descriptor_proto_depIdxs = []int32{ -- 7, // 0: google.protobuf.FileDescriptorSet.file:type_name -> google.protobuf.FileDescriptorProto -- 8, // 1: google.protobuf.FileDescriptorProto.message_type:type_name -> google.protobuf.DescriptorProto -- 12, // 2: google.protobuf.FileDescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto -- 14, // 3: google.protobuf.FileDescriptorProto.service:type_name -> google.protobuf.ServiceDescriptorProto -- 10, // 4: google.protobuf.FileDescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto -- 16, // 5: google.protobuf.FileDescriptorProto.options:type_name -> google.protobuf.FileOptions -- 25, // 6: google.protobuf.FileDescriptorProto.source_code_info:type_name -> google.protobuf.SourceCodeInfo -- 10, // 7: google.protobuf.DescriptorProto.field:type_name -> google.protobuf.FieldDescriptorProto -- 10, // 8: google.protobuf.DescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto -- 8, // 9: google.protobuf.DescriptorProto.nested_type:type_name -> google.protobuf.DescriptorProto -- 12, // 10: google.protobuf.DescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto -- 27, // 11: google.protobuf.DescriptorProto.extension_range:type_name -> google.protobuf.DescriptorProto.ExtensionRange -- 11, // 12: google.protobuf.DescriptorProto.oneof_decl:type_name -> google.protobuf.OneofDescriptorProto -- 17, // 13: google.protobuf.DescriptorProto.options:type_name -> google.protobuf.MessageOptions -- 28, // 14: google.protobuf.DescriptorProto.reserved_range:type_name -> google.protobuf.DescriptorProto.ReservedRange -- 24, // 15: google.protobuf.ExtensionRangeOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -+ 10, // 0: google.protobuf.FileDescriptorSet.file:type_name -> google.protobuf.FileDescriptorProto -+ 11, // 1: google.protobuf.FileDescriptorProto.message_type:type_name -> google.protobuf.DescriptorProto -+ 15, // 2: google.protobuf.FileDescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto -+ 17, // 3: google.protobuf.FileDescriptorProto.service:type_name -> google.protobuf.ServiceDescriptorProto -+ 13, // 4: google.protobuf.FileDescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto -+ 19, // 5: google.protobuf.FileDescriptorProto.options:type_name -> google.protobuf.FileOptions -+ 28, // 6: google.protobuf.FileDescriptorProto.source_code_info:type_name -> google.protobuf.SourceCodeInfo -+ 13, // 7: google.protobuf.DescriptorProto.field:type_name -> google.protobuf.FieldDescriptorProto -+ 13, // 8: google.protobuf.DescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto -+ 11, // 9: google.protobuf.DescriptorProto.nested_type:type_name -> google.protobuf.DescriptorProto -+ 15, // 10: google.protobuf.DescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto -+ 30, // 11: google.protobuf.DescriptorProto.extension_range:type_name -> google.protobuf.DescriptorProto.ExtensionRange -+ 14, // 12: google.protobuf.DescriptorProto.oneof_decl:type_name -> google.protobuf.OneofDescriptorProto -+ 20, // 13: google.protobuf.DescriptorProto.options:type_name -> google.protobuf.MessageOptions -+ 31, // 14: google.protobuf.DescriptorProto.reserved_range:type_name -> google.protobuf.DescriptorProto.ReservedRange -+ 27, // 15: google.protobuf.ExtensionRangeOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 1, // 16: google.protobuf.FieldDescriptorProto.label:type_name -> google.protobuf.FieldDescriptorProto.Label - 0, // 17: google.protobuf.FieldDescriptorProto.type:type_name -> google.protobuf.FieldDescriptorProto.Type -- 18, // 18: google.protobuf.FieldDescriptorProto.options:type_name -> google.protobuf.FieldOptions -- 19, // 19: google.protobuf.OneofDescriptorProto.options:type_name -> google.protobuf.OneofOptions -- 13, // 20: google.protobuf.EnumDescriptorProto.value:type_name -> google.protobuf.EnumValueDescriptorProto -- 20, // 21: google.protobuf.EnumDescriptorProto.options:type_name -> google.protobuf.EnumOptions -- 29, // 22: google.protobuf.EnumDescriptorProto.reserved_range:type_name -> google.protobuf.EnumDescriptorProto.EnumReservedRange -- 21, // 23: google.protobuf.EnumValueDescriptorProto.options:type_name -> google.protobuf.EnumValueOptions -- 15, // 24: google.protobuf.ServiceDescriptorProto.method:type_name -> google.protobuf.MethodDescriptorProto -- 22, // 25: google.protobuf.ServiceDescriptorProto.options:type_name -> google.protobuf.ServiceOptions -- 23, // 26: google.protobuf.MethodDescriptorProto.options:type_name -> google.protobuf.MethodOptions -+ 21, // 18: google.protobuf.FieldDescriptorProto.options:type_name -> google.protobuf.FieldOptions -+ 22, // 19: google.protobuf.OneofDescriptorProto.options:type_name -> google.protobuf.OneofOptions -+ 16, // 20: google.protobuf.EnumDescriptorProto.value:type_name -> google.protobuf.EnumValueDescriptorProto -+ 23, // 21: google.protobuf.EnumDescriptorProto.options:type_name -> google.protobuf.EnumOptions -+ 32, // 22: google.protobuf.EnumDescriptorProto.reserved_range:type_name -> google.protobuf.EnumDescriptorProto.EnumReservedRange -+ 24, // 23: google.protobuf.EnumValueDescriptorProto.options:type_name -> google.protobuf.EnumValueOptions -+ 18, // 24: google.protobuf.ServiceDescriptorProto.method:type_name -> google.protobuf.MethodDescriptorProto -+ 25, // 25: google.protobuf.ServiceDescriptorProto.options:type_name -> google.protobuf.ServiceOptions -+ 26, // 26: google.protobuf.MethodDescriptorProto.options:type_name -> google.protobuf.MethodOptions - 2, // 27: google.protobuf.FileOptions.optimize_for:type_name -> google.protobuf.FileOptions.OptimizeMode -- 24, // 28: google.protobuf.FileOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -- 24, // 29: google.protobuf.MessageOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -+ 27, // 28: google.protobuf.FileOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -+ 27, // 29: google.protobuf.MessageOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 3, // 30: google.protobuf.FieldOptions.ctype:type_name -> google.protobuf.FieldOptions.CType - 4, // 31: google.protobuf.FieldOptions.jstype:type_name -> google.protobuf.FieldOptions.JSType -- 24, // 32: google.protobuf.FieldOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -- 24, // 33: google.protobuf.OneofOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -- 24, // 34: google.protobuf.EnumOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -- 24, // 35: google.protobuf.EnumValueOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -- 24, // 36: google.protobuf.ServiceOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -- 5, // 37: google.protobuf.MethodOptions.idempotency_level:type_name -> google.protobuf.MethodOptions.IdempotencyLevel -- 24, // 38: google.protobuf.MethodOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -- 30, // 39: google.protobuf.UninterpretedOption.name:type_name -> google.protobuf.UninterpretedOption.NamePart -- 31, // 40: google.protobuf.SourceCodeInfo.location:type_name -> google.protobuf.SourceCodeInfo.Location -- 32, // 41: google.protobuf.GeneratedCodeInfo.annotation:type_name -> google.protobuf.GeneratedCodeInfo.Annotation -- 9, // 42: google.protobuf.DescriptorProto.ExtensionRange.options:type_name -> google.protobuf.ExtensionRangeOptions -- 43, // [43:43] is the sub-list for method output_type -- 43, // [43:43] is the sub-list for method input_type -- 43, // [43:43] is the sub-list for extension type_name -- 43, // [43:43] is the sub-list for extension extendee -- 0, // [0:43] is the sub-list for field type_name -+ 5, // 32: google.protobuf.FieldOptions.retention:type_name -> google.protobuf.FieldOptions.OptionRetention -+ 6, // 33: google.protobuf.FieldOptions.target:type_name -> google.protobuf.FieldOptions.OptionTargetType -+ 27, // 34: google.protobuf.FieldOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -+ 27, // 35: google.protobuf.OneofOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -+ 27, // 36: google.protobuf.EnumOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -+ 27, // 37: google.protobuf.EnumValueOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -+ 27, // 38: google.protobuf.ServiceOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -+ 7, // 39: google.protobuf.MethodOptions.idempotency_level:type_name -> google.protobuf.MethodOptions.IdempotencyLevel -+ 27, // 40: google.protobuf.MethodOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption -+ 33, // 41: google.protobuf.UninterpretedOption.name:type_name -> google.protobuf.UninterpretedOption.NamePart -+ 34, // 42: google.protobuf.SourceCodeInfo.location:type_name -> google.protobuf.SourceCodeInfo.Location -+ 35, // 43: google.protobuf.GeneratedCodeInfo.annotation:type_name -> google.protobuf.GeneratedCodeInfo.Annotation -+ 12, // 44: google.protobuf.DescriptorProto.ExtensionRange.options:type_name -> google.protobuf.ExtensionRangeOptions -+ 8, // 45: google.protobuf.GeneratedCodeInfo.Annotation.semantic:type_name -> google.protobuf.GeneratedCodeInfo.Annotation.Semantic -+ 46, // [46:46] is the sub-list for method output_type -+ 46, // [46:46] is the sub-list for method input_type -+ 46, // [46:46] is the sub-list for extension type_name -+ 46, // [46:46] is the sub-list for extension extendee -+ 0, // [0:46] is the sub-list for field type_name - } - - func init() { file_google_protobuf_descriptor_proto_init() } -@@ -3940,7 +4333,7 @@ func file_google_protobuf_descriptor_proto_init() { - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_protobuf_descriptor_proto_rawDesc, -- NumEnums: 6, -+ NumEnums: 9, - NumMessages: 27, - NumExtensions: 0, - NumServices: 0, -diff --git a/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go b/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go -index 8c10797..a6c7a33 100644 ---- a/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go -+++ b/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go -@@ -37,8 +37,7 @@ - // It is functionally a tuple of the full name of the remote message type and - // the serialized bytes of the remote message value. - // --// --// Constructing an Any -+// # Constructing an Any - // - // An Any message containing another message value is constructed using New: - // -@@ -48,8 +47,7 @@ - // } - // ... // make use of any - // --// --// Unmarshaling an Any -+// # Unmarshaling an Any - // - // With a populated Any message, the underlying message can be serialized into - // a remote concrete message value in a few ways. -@@ -95,8 +93,7 @@ - // listed in the case clauses are linked into the Go binary and therefore also - // registered in the global registry. - // --// --// Type checking an Any -+// # Type checking an Any - // - // In order to type check whether an Any message represents some other message, - // then use the MessageIs method: -@@ -115,7 +112,6 @@ - // } - // ... // make use of m - // } --// - package anypb - - import ( -@@ -136,45 +132,49 @@ import ( - // - // Example 1: Pack and unpack a message in C++. - // --// Foo foo = ...; --// Any any; --// any.PackFrom(foo); --// ... --// if (any.UnpackTo(&foo)) { --// ... --// } -+// Foo foo = ...; -+// Any any; -+// any.PackFrom(foo); -+// ... -+// if (any.UnpackTo(&foo)) { -+// ... -+// } - // - // Example 2: Pack and unpack a message in Java. - // --// Foo foo = ...; --// Any any = Any.pack(foo); --// ... --// if (any.is(Foo.class)) { --// foo = any.unpack(Foo.class); --// } --// --// Example 3: Pack and unpack a message in Python. --// --// foo = Foo(...) --// any = Any() --// any.Pack(foo) --// ... --// if any.Is(Foo.DESCRIPTOR): --// any.Unpack(foo) --// ... --// --// Example 4: Pack and unpack a message in Go --// --// foo := &pb.Foo{...} --// any, err := anypb.New(foo) --// if err != nil { --// ... --// } --// ... --// foo := &pb.Foo{} --// if err := any.UnmarshalTo(foo); err != nil { --// ... --// } -+// Foo foo = ...; -+// Any any = Any.pack(foo); -+// ... -+// if (any.is(Foo.class)) { -+// foo = any.unpack(Foo.class); -+// } -+// // or ... -+// if (any.isSameTypeAs(Foo.getDefaultInstance())) { -+// foo = any.unpack(Foo.getDefaultInstance()); -+// } -+// -+// Example 3: Pack and unpack a message in Python. -+// -+// foo = Foo(...) -+// any = Any() -+// any.Pack(foo) -+// ... -+// if any.Is(Foo.DESCRIPTOR): -+// any.Unpack(foo) -+// ... -+// -+// Example 4: Pack and unpack a message in Go -+// -+// foo := &pb.Foo{...} -+// any, err := anypb.New(foo) -+// if err != nil { -+// ... -+// } -+// ... -+// foo := &pb.Foo{} -+// if err := any.UnmarshalTo(foo); err != nil { -+// ... -+// } - // - // The pack methods provided by protobuf library will by default use - // 'type.googleapis.com/full.type.name' as the type URL and the unpack -@@ -182,35 +182,33 @@ import ( - // in the type URL, for example "foo.bar.com/x/y.z" will yield type - // name "y.z". - // -+// # JSON - // --// JSON --// ==== - // The JSON representation of an `Any` value uses the regular - // representation of the deserialized, embedded message, with an - // additional field `@type` which contains the type URL. Example: - // --// package google.profile; --// message Person { --// string first_name = 1; --// string last_name = 2; --// } -+// package google.profile; -+// message Person { -+// string first_name = 1; -+// string last_name = 2; -+// } - // --// { --// "@type": "type.googleapis.com/google.profile.Person", --// "firstName": , --// "lastName": --// } -+// { -+// "@type": "type.googleapis.com/google.profile.Person", -+// "firstName": , -+// "lastName": -+// } - // - // If the embedded message type is well-known and has a custom JSON - // representation, that representation will be embedded adding a field - // `value` which holds the custom JSON in addition to the `@type` - // field. Example (for message [google.protobuf.Duration][]): - // --// { --// "@type": "type.googleapis.com/google.protobuf.Duration", --// "value": "1.212s" --// } --// -+// { -+// "@type": "type.googleapis.com/google.protobuf.Duration", -+// "value": "1.212s" -+// } - type Any struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache -@@ -228,14 +226,14 @@ type Any struct { - // scheme `http`, `https`, or no scheme, one can optionally set up a type - // server that maps type URLs to message definitions as follows: - // -- // * If no scheme is provided, `https` is assumed. -- // * An HTTP GET on the URL must yield a [google.protobuf.Type][] -- // value in binary format, or produce an error. -- // * Applications are allowed to cache lookup results based on the -- // URL, or have them precompiled into a binary to avoid any -- // lookup. Therefore, binary compatibility needs to be preserved -- // on changes to types. (Use versioned type names to manage -- // breaking changes.) -+ // - If no scheme is provided, `https` is assumed. -+ // - An HTTP GET on the URL must yield a [google.protobuf.Type][] -+ // value in binary format, or produce an error. -+ // - Applications are allowed to cache lookup results based on the -+ // URL, or have them precompiled into a binary to avoid any -+ // lookup. Therefore, binary compatibility needs to be preserved -+ // on changes to types. (Use versioned type names to manage -+ // breaking changes.) - // - // Note: this functionality is not currently available in the official - // protobuf release, and it is not used for type URLs beginning with -@@ -243,7 +241,6 @@ type Any struct { - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. -- // - TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` - // Must be a valid serialized protocol buffer of the above specified type. - Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` -diff --git a/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go b/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go -index a583ca2..df709a8 100644 ---- a/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go -+++ b/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go -@@ -35,8 +35,7 @@ - // - // The Duration message represents a signed span of time. - // --// --// Conversion to a Go Duration -+// # Conversion to a Go Duration - // - // The AsDuration method can be used to convert a Duration message to a - // standard Go time.Duration value: -@@ -65,15 +64,13 @@ - // the resulting value to the closest representable value (e.g., math.MaxInt64 - // for positive overflow and math.MinInt64 for negative overflow). - // --// --// Conversion from a Go Duration -+// # Conversion from a Go Duration - // - // The durationpb.New function can be used to construct a Duration message - // from a standard Go time.Duration value: - // - // dur := durationpb.New(d) - // ... // make use of d as a *durationpb.Duration --// - package durationpb - - import ( -@@ -96,43 +93,43 @@ import ( - // - // Example 1: Compute Duration from two Timestamps in pseudo code. - // --// Timestamp start = ...; --// Timestamp end = ...; --// Duration duration = ...; -+// Timestamp start = ...; -+// Timestamp end = ...; -+// Duration duration = ...; - // --// duration.seconds = end.seconds - start.seconds; --// duration.nanos = end.nanos - start.nanos; -+// duration.seconds = end.seconds - start.seconds; -+// duration.nanos = end.nanos - start.nanos; - // --// if (duration.seconds < 0 && duration.nanos > 0) { --// duration.seconds += 1; --// duration.nanos -= 1000000000; --// } else if (duration.seconds > 0 && duration.nanos < 0) { --// duration.seconds -= 1; --// duration.nanos += 1000000000; --// } -+// if (duration.seconds < 0 && duration.nanos > 0) { -+// duration.seconds += 1; -+// duration.nanos -= 1000000000; -+// } else if (duration.seconds > 0 && duration.nanos < 0) { -+// duration.seconds -= 1; -+// duration.nanos += 1000000000; -+// } - // - // Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. - // --// Timestamp start = ...; --// Duration duration = ...; --// Timestamp end = ...; -+// Timestamp start = ...; -+// Duration duration = ...; -+// Timestamp end = ...; - // --// end.seconds = start.seconds + duration.seconds; --// end.nanos = start.nanos + duration.nanos; -+// end.seconds = start.seconds + duration.seconds; -+// end.nanos = start.nanos + duration.nanos; - // --// if (end.nanos < 0) { --// end.seconds -= 1; --// end.nanos += 1000000000; --// } else if (end.nanos >= 1000000000) { --// end.seconds += 1; --// end.nanos -= 1000000000; --// } -+// if (end.nanos < 0) { -+// end.seconds -= 1; -+// end.nanos += 1000000000; -+// } else if (end.nanos >= 1000000000) { -+// end.seconds += 1; -+// end.nanos -= 1000000000; -+// } - // - // Example 3: Compute Duration from datetime.timedelta in Python. - // --// td = datetime.timedelta(days=3, minutes=10) --// duration = Duration() --// duration.FromTimedelta(td) -+// td = datetime.timedelta(days=3, minutes=10) -+// duration = Duration() -+// duration.FromTimedelta(td) - // - // # JSON Mapping - // -@@ -143,8 +140,6 @@ import ( - // encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should - // be expressed in JSON format as "3.000000001s", and 3 seconds and 1 - // microsecond should be expressed in JSON format as "3.000001s". --// --// - type Duration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache -diff --git a/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go b/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go -index c9ae921..61f69fc 100644 ---- a/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go -+++ b/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go -@@ -36,8 +36,7 @@ - // The Timestamp message represents a timestamp, - // an instant in time since the Unix epoch (January 1st, 1970). - // --// --// Conversion to a Go Time -+// # Conversion to a Go Time - // - // The AsTime method can be used to convert a Timestamp message to a - // standard Go time.Time value in UTC: -@@ -59,8 +58,7 @@ - // ... // handle error - // } - // --// --// Conversion from a Go Time -+// # Conversion from a Go Time - // - // The timestamppb.New function can be used to construct a Timestamp message - // from a standard Go time.Time value: -@@ -72,7 +70,6 @@ - // - // ts := timestamppb.Now() - // ... // make use of ts as a *timestamppb.Timestamp --// - package timestamppb - - import ( -@@ -101,52 +98,50 @@ import ( - // - // Example 1: Compute Timestamp from POSIX `time()`. - // --// Timestamp timestamp; --// timestamp.set_seconds(time(NULL)); --// timestamp.set_nanos(0); -+// Timestamp timestamp; -+// timestamp.set_seconds(time(NULL)); -+// timestamp.set_nanos(0); - // - // Example 2: Compute Timestamp from POSIX `gettimeofday()`. - // --// struct timeval tv; --// gettimeofday(&tv, NULL); -+// struct timeval tv; -+// gettimeofday(&tv, NULL); - // --// Timestamp timestamp; --// timestamp.set_seconds(tv.tv_sec); --// timestamp.set_nanos(tv.tv_usec * 1000); -+// Timestamp timestamp; -+// timestamp.set_seconds(tv.tv_sec); -+// timestamp.set_nanos(tv.tv_usec * 1000); - // - // Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. - // --// FILETIME ft; --// GetSystemTimeAsFileTime(&ft); --// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; -+// FILETIME ft; -+// GetSystemTimeAsFileTime(&ft); -+// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; - // --// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z --// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. --// Timestamp timestamp; --// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); --// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); -+// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z -+// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. -+// Timestamp timestamp; -+// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); -+// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); - // - // Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. - // --// long millis = System.currentTimeMillis(); --// --// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) --// .setNanos((int) ((millis % 1000) * 1000000)).build(); -+// long millis = System.currentTimeMillis(); - // -+// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) -+// .setNanos((int) ((millis % 1000) * 1000000)).build(); - // - // Example 5: Compute Timestamp from Java `Instant.now()`. - // --// Instant now = Instant.now(); --// --// Timestamp timestamp = --// Timestamp.newBuilder().setSeconds(now.getEpochSecond()) --// .setNanos(now.getNano()).build(); -+// Instant now = Instant.now(); - // -+// Timestamp timestamp = -+// Timestamp.newBuilder().setSeconds(now.getEpochSecond()) -+// .setNanos(now.getNano()).build(); - // - // Example 6: Compute Timestamp from current time in Python. - // --// timestamp = Timestamp() --// timestamp.GetCurrentTime() -+// timestamp = Timestamp() -+// timestamp.GetCurrentTime() - // - // # JSON Mapping - // -@@ -174,8 +169,6 @@ import ( - // the Joda Time's [`ISODateTimeFormat.dateTime()`]( - // http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D - // ) to obtain a formatter capable of generating timestamps in this format. --// --// - type Timestamp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache -diff --git a/vendor/k8s.io/client-go/pkg/version/base.go b/vendor/k8s.io/client-go/pkg/version/base.go -index 83ec8a9..51e34dd 100644 ---- a/vendor/k8s.io/client-go/pkg/version/base.go -+++ b/vendor/k8s.io/client-go/pkg/version/base.go -@@ -55,8 +55,8 @@ var ( - // NOTE: The $Format strings are replaced during 'git archive' thanks to the - // companion .gitattributes file containing 'export-subst' in this same - // directory. See also https://git-scm.com/docs/gitattributes -- gitVersion string = "v0.0.0-master+f03765681fe81ee1e0633ee1734bf48ab3bccf2b" -- gitCommit string = "f03765681fe81ee1e0633ee1734bf48ab3bccf2b" // sha1 from git, output of $(git rev-parse HEAD) -+ gitVersion string = "v0.0.0-master+$Format:%H$" -+ gitCommit string = "$Format:%H$" // sha1 from git, output of $(git rev-parse HEAD) - gitTreeState string = "" // state of git tree, either "clean" or "dirty" - - buildDate string = "1970-01-01T00:00:00Z" // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ') -diff --git a/vendor/modules.txt b/vendor/modules.txt -index 9f9fcc2..7ef0ab8 100644 ---- a/vendor/modules.txt -+++ b/vendor/modules.txt -@@ -4,7 +4,7 @@ github.com/beorn7/perks/quantile - # github.com/blang/semver v3.5.1+incompatible - ## explicit - github.com/blang/semver --# github.com/cespare/xxhash/v2 v2.1.2 -+# github.com/cespare/xxhash/v2 v2.2.0 - ## explicit; go 1.11 - github.com/cespare/xxhash/v2 - # github.com/containernetworking/cni v1.1.2 -@@ -46,8 +46,9 @@ github.com/gogo/protobuf/sortkeys - # github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da - ## explicit - github.com/golang/groupcache/lru --# github.com/golang/protobuf v1.5.2 -+# github.com/golang/protobuf v1.5.3 - ## explicit; go 1.9 -+github.com/golang/protobuf/jsonpb - github.com/golang/protobuf/proto - github.com/golang/protobuf/ptypes - github.com/golang/protobuf/ptypes/any -@@ -149,10 +150,9 @@ github.com/vishvananda/netlink/nl - # github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f - ## explicit; go 1.12 - github.com/vishvananda/netns --# golang.org/x/net v0.7.0 -+# golang.org/x/net v0.17.0 - ## explicit; go 1.17 - golang.org/x/net/context --golang.org/x/net/context/ctxhttp - golang.org/x/net/html - golang.org/x/net/html/atom - golang.org/x/net/html/charset -@@ -162,20 +162,19 @@ golang.org/x/net/http2/hpack - golang.org/x/net/idna - golang.org/x/net/internal/timeseries - golang.org/x/net/trace --# golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f --## explicit; go 1.11 -+# golang.org/x/oauth2 v0.7.0 -+## explicit; go 1.17 - golang.org/x/oauth2 - golang.org/x/oauth2/internal --# golang.org/x/sys v0.5.0 -+# golang.org/x/sys v0.13.0 - ## explicit; go 1.17 --golang.org/x/sys/internal/unsafeheader - golang.org/x/sys/plan9 - golang.org/x/sys/unix - golang.org/x/sys/windows --# golang.org/x/term v0.5.0 -+# golang.org/x/term v0.13.0 - ## explicit; go 1.17 - golang.org/x/term --# golang.org/x/text v0.7.0 -+# golang.org/x/text v0.13.0 - ## explicit; go 1.17 - golang.org/x/text/encoding - golang.org/x/text/encoding/charmap -@@ -209,11 +208,11 @@ google.golang.org/appengine/internal/log - google.golang.org/appengine/internal/remote_api - google.golang.org/appengine/internal/urlfetch - google.golang.org/appengine/urlfetch --# google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 --## explicit; go 1.11 -+# google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 -+## explicit; go 1.19 - google.golang.org/genproto/googleapis/rpc/status --# google.golang.org/grpc v1.40.0 --## explicit; go 1.11 -+# google.golang.org/grpc v1.56.3 -+## explicit; go 1.17 - google.golang.org/grpc - google.golang.org/grpc/attributes - google.golang.org/grpc/backoff -@@ -222,6 +221,7 @@ google.golang.org/grpc/balancer/base - google.golang.org/grpc/balancer/grpclb/state - google.golang.org/grpc/balancer/roundrobin - google.golang.org/grpc/binarylog/grpc_binarylog_v1 -+google.golang.org/grpc/channelz - google.golang.org/grpc/codes - google.golang.org/grpc/connectivity - google.golang.org/grpc/credentials -@@ -231,6 +231,7 @@ google.golang.org/grpc/encoding/proto - google.golang.org/grpc/grpclog - google.golang.org/grpc/internal - google.golang.org/grpc/internal/backoff -+google.golang.org/grpc/internal/balancer/gracefulswitch - google.golang.org/grpc/internal/balancerload - google.golang.org/grpc/internal/binarylog - google.golang.org/grpc/internal/buffer -@@ -242,6 +243,7 @@ google.golang.org/grpc/internal/grpcrand - google.golang.org/grpc/internal/grpcsync - google.golang.org/grpc/internal/grpcutil - google.golang.org/grpc/internal/metadata -+google.golang.org/grpc/internal/pretty - google.golang.org/grpc/internal/resolver - google.golang.org/grpc/internal/resolver/dns - google.golang.org/grpc/internal/resolver/passthrough -@@ -259,14 +261,16 @@ google.golang.org/grpc/serviceconfig - google.golang.org/grpc/stats - google.golang.org/grpc/status - google.golang.org/grpc/tap --# google.golang.org/protobuf v1.28.0 -+# google.golang.org/protobuf v1.30.0 - ## explicit; go 1.11 -+google.golang.org/protobuf/encoding/protojson - google.golang.org/protobuf/encoding/prototext - google.golang.org/protobuf/encoding/protowire - google.golang.org/protobuf/internal/descfmt - google.golang.org/protobuf/internal/descopts - google.golang.org/protobuf/internal/detrand - google.golang.org/protobuf/internal/encoding/defval -+google.golang.org/protobuf/internal/encoding/json - google.golang.org/protobuf/internal/encoding/messageset - google.golang.org/protobuf/internal/encoding/tag - google.golang.org/protobuf/internal/encoding/text --- -2.34.1 - diff --git a/SPECS/multus/CVE-2023-45288.patch b/SPECS/multus/CVE-2023-45288.patch deleted file mode 100644 index 09942176fe..0000000000 --- a/SPECS/multus/CVE-2023-45288.patch +++ /dev/null @@ -1,8790 +0,0 @@ -From 319e6f6e683cc82da402207a4d616505dd133b8c Mon Sep 17 00:00:00 2001 -From: xiaohongdeng <“worldsky86rough@gmail.com”> -Date: Tue, 26 Nov 2024 23:52:44 +0000 -Subject: [PATCH] upgrade golang.org/x/net to 0.23.0 - ---- - go.mod | 8 +- - go.sum | 16 +- - vendor/golang.org/x/net/context/go17.go | 1 - - vendor/golang.org/x/net/context/go19.go | 1 - - vendor/golang.org/x/net/context/pre_go17.go | 1 - - vendor/golang.org/x/net/context/pre_go19.go | 1 - - vendor/golang.org/x/net/html/token.go | 12 +- - vendor/golang.org/x/net/http2/databuffer.go | 59 +-- - vendor/golang.org/x/net/http2/frame.go | 42 ++- - vendor/golang.org/x/net/http2/go111.go | 30 -- - vendor/golang.org/x/net/http2/go115.go | 27 -- - vendor/golang.org/x/net/http2/go118.go | 17 - - vendor/golang.org/x/net/http2/not_go111.go | 21 -- - vendor/golang.org/x/net/http2/not_go115.go | 31 -- - vendor/golang.org/x/net/http2/not_go118.go | 17 - - vendor/golang.org/x/net/http2/pipe.go | 11 +- - vendor/golang.org/x/net/http2/server.go | 37 +- - vendor/golang.org/x/net/http2/testsync.go | 331 +++++++++++++++++ - vendor/golang.org/x/net/http2/transport.go | 340 ++++++++++++++---- - vendor/golang.org/x/net/idna/go118.go | 1 - - vendor/golang.org/x/net/idna/idna10.0.0.go | 1 - - vendor/golang.org/x/net/idna/idna9.0.0.go | 1 - - vendor/golang.org/x/net/idna/pre_go118.go | 1 - - vendor/golang.org/x/net/idna/tables10.0.0.go | 1 - - vendor/golang.org/x/net/idna/tables11.0.0.go | 1 - - vendor/golang.org/x/net/idna/tables12.0.0.go | 1 - - vendor/golang.org/x/net/idna/tables13.0.0.go | 1 - - vendor/golang.org/x/net/idna/tables15.0.0.go | 1 - - vendor/golang.org/x/net/idna/tables9.0.0.go | 1 - - vendor/golang.org/x/net/idna/trie12.0.0.go | 1 - - vendor/golang.org/x/net/idna/trie13.0.0.go | 1 - - .../golang.org/x/sys/plan9/pwd_go15_plan9.go | 1 - - vendor/golang.org/x/sys/plan9/pwd_plan9.go | 1 - - vendor/golang.org/x/sys/plan9/race.go | 1 - - vendor/golang.org/x/sys/plan9/race0.go | 1 - - vendor/golang.org/x/sys/plan9/str.go | 1 - - vendor/golang.org/x/sys/plan9/syscall.go | 1 - - .../x/sys/plan9/zsyscall_plan9_386.go | 1 - - .../x/sys/plan9/zsyscall_plan9_amd64.go | 1 - - .../x/sys/plan9/zsyscall_plan9_arm.go | 1 - - vendor/golang.org/x/sys/unix/aliases.go | 4 +- - vendor/golang.org/x/sys/unix/asm_aix_ppc64.s | 1 - - vendor/golang.org/x/sys/unix/asm_bsd_386.s | 2 - - vendor/golang.org/x/sys/unix/asm_bsd_amd64.s | 2 - - vendor/golang.org/x/sys/unix/asm_bsd_arm.s | 2 - - vendor/golang.org/x/sys/unix/asm_bsd_arm64.s | 2 - - vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s | 2 - - .../golang.org/x/sys/unix/asm_bsd_riscv64.s | 2 - - vendor/golang.org/x/sys/unix/asm_linux_386.s | 1 - - .../golang.org/x/sys/unix/asm_linux_amd64.s | 1 - - vendor/golang.org/x/sys/unix/asm_linux_arm.s | 1 - - .../golang.org/x/sys/unix/asm_linux_arm64.s | 3 - - .../golang.org/x/sys/unix/asm_linux_loong64.s | 3 - - .../golang.org/x/sys/unix/asm_linux_mips64x.s | 3 - - .../golang.org/x/sys/unix/asm_linux_mipsx.s | 3 - - .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 3 - - .../golang.org/x/sys/unix/asm_linux_riscv64.s | 2 - - .../golang.org/x/sys/unix/asm_linux_s390x.s | 3 - - .../x/sys/unix/asm_openbsd_mips64.s | 1 - - .../golang.org/x/sys/unix/asm_solaris_amd64.s | 1 - - vendor/golang.org/x/sys/unix/asm_zos_s390x.s | 3 - - vendor/golang.org/x/sys/unix/cap_freebsd.go | 1 - - vendor/golang.org/x/sys/unix/constants.go | 1 - - vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 1 - - vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 1 - - vendor/golang.org/x/sys/unix/dev_zos.go | 1 - - vendor/golang.org/x/sys/unix/dirent.go | 1 - - vendor/golang.org/x/sys/unix/endian_big.go | 1 - - vendor/golang.org/x/sys/unix/endian_little.go | 1 - - vendor/golang.org/x/sys/unix/env_unix.go | 1 - - vendor/golang.org/x/sys/unix/epoll_zos.go | 1 - - vendor/golang.org/x/sys/unix/fcntl.go | 3 +- - .../x/sys/unix/fcntl_linux_32bit.go | 1 - - vendor/golang.org/x/sys/unix/fdset.go | 1 - - vendor/golang.org/x/sys/unix/fstatfs_zos.go | 1 - - vendor/golang.org/x/sys/unix/gccgo.go | 1 - - vendor/golang.org/x/sys/unix/gccgo_c.c | 1 - - .../x/sys/unix/gccgo_linux_amd64.go | 1 - - vendor/golang.org/x/sys/unix/ifreq_linux.go | 1 - - vendor/golang.org/x/sys/unix/ioctl_linux.go | 5 + - vendor/golang.org/x/sys/unix/ioctl_signed.go | 1 - - .../golang.org/x/sys/unix/ioctl_unsigned.go | 1 - - vendor/golang.org/x/sys/unix/ioctl_zos.go | 1 - - vendor/golang.org/x/sys/unix/mkerrors.sh | 43 ++- - vendor/golang.org/x/sys/unix/mmap_nomremap.go | 1 - - vendor/golang.org/x/sys/unix/mremap.go | 1 - - vendor/golang.org/x/sys/unix/pagesize_unix.go | 1 - - .../golang.org/x/sys/unix/pledge_openbsd.go | 92 ++--- - vendor/golang.org/x/sys/unix/ptrace_darwin.go | 1 - - vendor/golang.org/x/sys/unix/ptrace_ios.go | 1 - - vendor/golang.org/x/sys/unix/race.go | 1 - - vendor/golang.org/x/sys/unix/race0.go | 1 - - .../x/sys/unix/readdirent_getdents.go | 1 - - .../x/sys/unix/readdirent_getdirentries.go | 1 - - vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 1 - - .../x/sys/unix/sockcmsg_unix_other.go | 1 - - vendor/golang.org/x/sys/unix/syscall.go | 1 - - vendor/golang.org/x/sys/unix/syscall_aix.go | 4 +- - .../golang.org/x/sys/unix/syscall_aix_ppc.go | 1 - - .../x/sys/unix/syscall_aix_ppc64.go | 1 - - vendor/golang.org/x/sys/unix/syscall_bsd.go | 3 +- - .../x/sys/unix/syscall_darwin_amd64.go | 1 - - .../x/sys/unix/syscall_darwin_arm64.go | 1 - - .../x/sys/unix/syscall_darwin_libSystem.go | 3 +- - .../x/sys/unix/syscall_dragonfly_amd64.go | 1 - - .../golang.org/x/sys/unix/syscall_freebsd.go | 12 +- - .../x/sys/unix/syscall_freebsd_386.go | 1 - - .../x/sys/unix/syscall_freebsd_amd64.go | 1 - - .../x/sys/unix/syscall_freebsd_arm.go | 1 - - .../x/sys/unix/syscall_freebsd_arm64.go | 1 - - .../x/sys/unix/syscall_freebsd_riscv64.go | 1 - - vendor/golang.org/x/sys/unix/syscall_hurd.go | 1 - - .../golang.org/x/sys/unix/syscall_hurd_386.go | 1 - - .../golang.org/x/sys/unix/syscall_illumos.go | 1 - - vendor/golang.org/x/sys/unix/syscall_linux.go | 132 ++++++- - .../x/sys/unix/syscall_linux_386.go | 1 - - .../x/sys/unix/syscall_linux_alarm.go | 2 - - .../x/sys/unix/syscall_linux_amd64.go | 1 - - .../x/sys/unix/syscall_linux_amd64_gc.go | 1 - - .../x/sys/unix/syscall_linux_arm.go | 1 - - .../x/sys/unix/syscall_linux_arm64.go | 1 - - .../golang.org/x/sys/unix/syscall_linux_gc.go | 1 - - .../x/sys/unix/syscall_linux_gc_386.go | 1 - - .../x/sys/unix/syscall_linux_gc_arm.go | 1 - - .../x/sys/unix/syscall_linux_gccgo_386.go | 1 - - .../x/sys/unix/syscall_linux_gccgo_arm.go | 1 - - .../x/sys/unix/syscall_linux_loong64.go | 1 - - .../x/sys/unix/syscall_linux_mips64x.go | 2 - - .../x/sys/unix/syscall_linux_mipsx.go | 2 - - .../x/sys/unix/syscall_linux_ppc.go | 1 - - .../x/sys/unix/syscall_linux_ppc64x.go | 2 - - .../x/sys/unix/syscall_linux_riscv64.go | 1 - - .../x/sys/unix/syscall_linux_s390x.go | 1 - - .../x/sys/unix/syscall_linux_sparc64.go | 1 - - .../x/sys/unix/syscall_netbsd_386.go | 1 - - .../x/sys/unix/syscall_netbsd_amd64.go | 1 - - .../x/sys/unix/syscall_netbsd_arm.go | 1 - - .../x/sys/unix/syscall_netbsd_arm64.go | 1 - - .../golang.org/x/sys/unix/syscall_openbsd.go | 28 +- - .../x/sys/unix/syscall_openbsd_386.go | 1 - - .../x/sys/unix/syscall_openbsd_amd64.go | 1 - - .../x/sys/unix/syscall_openbsd_arm.go | 1 - - .../x/sys/unix/syscall_openbsd_arm64.go | 1 - - .../x/sys/unix/syscall_openbsd_libc.go | 1 - - .../x/sys/unix/syscall_openbsd_ppc64.go | 1 - - .../x/sys/unix/syscall_openbsd_riscv64.go | 1 - - .../golang.org/x/sys/unix/syscall_solaris.go | 5 +- - .../x/sys/unix/syscall_solaris_amd64.go | 1 - - vendor/golang.org/x/sys/unix/syscall_unix.go | 1 - - .../golang.org/x/sys/unix/syscall_unix_gc.go | 2 - - .../x/sys/unix/syscall_unix_gc_ppc64x.go | 3 - - .../x/sys/unix/syscall_zos_s390x.go | 3 +- - vendor/golang.org/x/sys/unix/sysvshm_linux.go | 1 - - vendor/golang.org/x/sys/unix/sysvshm_unix.go | 1 - - .../x/sys/unix/sysvshm_unix_other.go | 1 - - vendor/golang.org/x/sys/unix/timestruct.go | 1 - - .../golang.org/x/sys/unix/unveil_openbsd.go | 41 ++- - vendor/golang.org/x/sys/unix/xattr_bsd.go | 1 - - .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1 - - .../x/sys/unix/zerrors_aix_ppc64.go | 1 - - .../x/sys/unix/zerrors_darwin_amd64.go | 1 - - .../x/sys/unix/zerrors_darwin_arm64.go | 1 - - .../x/sys/unix/zerrors_dragonfly_amd64.go | 1 - - .../x/sys/unix/zerrors_freebsd_386.go | 1 - - .../x/sys/unix/zerrors_freebsd_amd64.go | 1 - - .../x/sys/unix/zerrors_freebsd_arm.go | 1 - - .../x/sys/unix/zerrors_freebsd_arm64.go | 1 - - .../x/sys/unix/zerrors_freebsd_riscv64.go | 1 - - vendor/golang.org/x/sys/unix/zerrors_linux.go | 104 +++++- - .../x/sys/unix/zerrors_linux_386.go | 4 +- - .../x/sys/unix/zerrors_linux_amd64.go | 4 +- - .../x/sys/unix/zerrors_linux_arm.go | 4 +- - .../x/sys/unix/zerrors_linux_arm64.go | 4 +- - .../x/sys/unix/zerrors_linux_loong64.go | 5 +- - .../x/sys/unix/zerrors_linux_mips.go | 4 +- - .../x/sys/unix/zerrors_linux_mips64.go | 4 +- - .../x/sys/unix/zerrors_linux_mips64le.go | 4 +- - .../x/sys/unix/zerrors_linux_mipsle.go | 4 +- - .../x/sys/unix/zerrors_linux_ppc.go | 4 +- - .../x/sys/unix/zerrors_linux_ppc64.go | 4 +- - .../x/sys/unix/zerrors_linux_ppc64le.go | 4 +- - .../x/sys/unix/zerrors_linux_riscv64.go | 7 +- - .../x/sys/unix/zerrors_linux_s390x.go | 4 +- - .../x/sys/unix/zerrors_linux_sparc64.go | 4 +- - .../x/sys/unix/zerrors_netbsd_386.go | 1 - - .../x/sys/unix/zerrors_netbsd_amd64.go | 1 - - .../x/sys/unix/zerrors_netbsd_arm.go | 1 - - .../x/sys/unix/zerrors_netbsd_arm64.go | 1 - - .../x/sys/unix/zerrors_openbsd_386.go | 1 - - .../x/sys/unix/zerrors_openbsd_amd64.go | 1 - - .../x/sys/unix/zerrors_openbsd_arm.go | 1 - - .../x/sys/unix/zerrors_openbsd_arm64.go | 1 - - .../x/sys/unix/zerrors_openbsd_mips64.go | 1 - - .../x/sys/unix/zerrors_openbsd_ppc64.go | 1 - - .../x/sys/unix/zerrors_openbsd_riscv64.go | 1 - - .../x/sys/unix/zerrors_solaris_amd64.go | 1 - - .../x/sys/unix/zerrors_zos_s390x.go | 1 - - .../x/sys/unix/zptrace_armnn_linux.go | 2 - - .../x/sys/unix/zptrace_mipsnn_linux.go | 2 - - .../x/sys/unix/zptrace_mipsnnle_linux.go | 2 - - .../x/sys/unix/zptrace_x86_linux.go | 2 - - .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1 - - .../x/sys/unix/zsyscall_aix_ppc64.go | 1 - - .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 1 - - .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 1 - - .../x/sys/unix/zsyscall_darwin_amd64.go | 1 - - .../x/sys/unix/zsyscall_darwin_arm64.go | 1 - - .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1 - - .../x/sys/unix/zsyscall_freebsd_386.go | 1 - - .../x/sys/unix/zsyscall_freebsd_amd64.go | 1 - - .../x/sys/unix/zsyscall_freebsd_arm.go | 1 - - .../x/sys/unix/zsyscall_freebsd_arm64.go | 1 - - .../x/sys/unix/zsyscall_freebsd_riscv64.go | 1 - - .../x/sys/unix/zsyscall_illumos_amd64.go | 1 - - .../golang.org/x/sys/unix/zsyscall_linux.go | 36 +- - .../x/sys/unix/zsyscall_linux_386.go | 1 - - .../x/sys/unix/zsyscall_linux_amd64.go | 1 - - .../x/sys/unix/zsyscall_linux_arm.go | 1 - - .../x/sys/unix/zsyscall_linux_arm64.go | 1 - - .../x/sys/unix/zsyscall_linux_loong64.go | 1 - - .../x/sys/unix/zsyscall_linux_mips.go | 1 - - .../x/sys/unix/zsyscall_linux_mips64.go | 1 - - .../x/sys/unix/zsyscall_linux_mips64le.go | 1 - - .../x/sys/unix/zsyscall_linux_mipsle.go | 1 - - .../x/sys/unix/zsyscall_linux_ppc.go | 1 - - .../x/sys/unix/zsyscall_linux_ppc64.go | 1 - - .../x/sys/unix/zsyscall_linux_ppc64le.go | 1 - - .../x/sys/unix/zsyscall_linux_riscv64.go | 1 - - .../x/sys/unix/zsyscall_linux_s390x.go | 1 - - .../x/sys/unix/zsyscall_linux_sparc64.go | 1 - - .../x/sys/unix/zsyscall_netbsd_386.go | 1 - - .../x/sys/unix/zsyscall_netbsd_amd64.go | 1 - - .../x/sys/unix/zsyscall_netbsd_arm.go | 1 - - .../x/sys/unix/zsyscall_netbsd_arm64.go | 1 - - .../x/sys/unix/zsyscall_openbsd_386.go | 70 +++- - .../x/sys/unix/zsyscall_openbsd_386.s | 20 ++ - .../x/sys/unix/zsyscall_openbsd_amd64.go | 70 +++- - .../x/sys/unix/zsyscall_openbsd_amd64.s | 20 ++ - .../x/sys/unix/zsyscall_openbsd_arm.go | 70 +++- - .../x/sys/unix/zsyscall_openbsd_arm.s | 20 ++ - .../x/sys/unix/zsyscall_openbsd_arm64.go | 70 +++- - .../x/sys/unix/zsyscall_openbsd_arm64.s | 20 ++ - .../x/sys/unix/zsyscall_openbsd_mips64.go | 70 +++- - .../x/sys/unix/zsyscall_openbsd_mips64.s | 20 ++ - .../x/sys/unix/zsyscall_openbsd_ppc64.go | 70 +++- - .../x/sys/unix/zsyscall_openbsd_ppc64.s | 24 ++ - .../x/sys/unix/zsyscall_openbsd_riscv64.go | 70 +++- - .../x/sys/unix/zsyscall_openbsd_riscv64.s | 20 ++ - .../x/sys/unix/zsyscall_solaris_amd64.go | 1 - - .../x/sys/unix/zsyscall_zos_s390x.go | 1 - - .../x/sys/unix/zsysctl_openbsd_386.go | 1 - - .../x/sys/unix/zsysctl_openbsd_amd64.go | 1 - - .../x/sys/unix/zsysctl_openbsd_arm.go | 1 - - .../x/sys/unix/zsysctl_openbsd_arm64.go | 1 - - .../x/sys/unix/zsysctl_openbsd_mips64.go | 1 - - .../x/sys/unix/zsysctl_openbsd_ppc64.go | 1 - - .../x/sys/unix/zsysctl_openbsd_riscv64.go | 1 - - .../x/sys/unix/zsysnum_darwin_amd64.go | 1 - - .../x/sys/unix/zsysnum_darwin_arm64.go | 1 - - .../x/sys/unix/zsysnum_dragonfly_amd64.go | 1 - - .../x/sys/unix/zsysnum_freebsd_386.go | 1 - - .../x/sys/unix/zsysnum_freebsd_amd64.go | 1 - - .../x/sys/unix/zsysnum_freebsd_arm.go | 1 - - .../x/sys/unix/zsysnum_freebsd_arm64.go | 1 - - .../x/sys/unix/zsysnum_freebsd_riscv64.go | 1 - - .../x/sys/unix/zsysnum_linux_386.go | 6 +- - .../x/sys/unix/zsysnum_linux_amd64.go | 6 +- - .../x/sys/unix/zsysnum_linux_arm.go | 6 +- - .../x/sys/unix/zsysnum_linux_arm64.go | 6 +- - .../x/sys/unix/zsysnum_linux_loong64.go | 6 +- - .../x/sys/unix/zsysnum_linux_mips.go | 6 +- - .../x/sys/unix/zsysnum_linux_mips64.go | 6 +- - .../x/sys/unix/zsysnum_linux_mips64le.go | 6 +- - .../x/sys/unix/zsysnum_linux_mipsle.go | 6 +- - .../x/sys/unix/zsysnum_linux_ppc.go | 6 +- - .../x/sys/unix/zsysnum_linux_ppc64.go | 6 +- - .../x/sys/unix/zsysnum_linux_ppc64le.go | 6 +- - .../x/sys/unix/zsysnum_linux_riscv64.go | 6 +- - .../x/sys/unix/zsysnum_linux_s390x.go | 6 +- - .../x/sys/unix/zsysnum_linux_sparc64.go | 6 +- - .../x/sys/unix/zsysnum_netbsd_386.go | 1 - - .../x/sys/unix/zsysnum_netbsd_amd64.go | 1 - - .../x/sys/unix/zsysnum_netbsd_arm.go | 1 - - .../x/sys/unix/zsysnum_netbsd_arm64.go | 1 - - .../x/sys/unix/zsysnum_openbsd_386.go | 1 - - .../x/sys/unix/zsysnum_openbsd_amd64.go | 1 - - .../x/sys/unix/zsysnum_openbsd_arm.go | 1 - - .../x/sys/unix/zsysnum_openbsd_arm64.go | 1 - - .../x/sys/unix/zsysnum_openbsd_mips64.go | 1 - - .../x/sys/unix/zsysnum_openbsd_ppc64.go | 1 - - .../x/sys/unix/zsysnum_openbsd_riscv64.go | 1 - - .../x/sys/unix/zsysnum_zos_s390x.go | 1 - - .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 1 - - .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 1 - - .../x/sys/unix/ztypes_darwin_amd64.go | 1 - - .../x/sys/unix/ztypes_darwin_arm64.go | 1 - - .../x/sys/unix/ztypes_dragonfly_amd64.go | 1 - - .../x/sys/unix/ztypes_freebsd_386.go | 1 - - .../x/sys/unix/ztypes_freebsd_amd64.go | 1 - - .../x/sys/unix/ztypes_freebsd_arm.go | 1 - - .../x/sys/unix/ztypes_freebsd_arm64.go | 1 - - .../x/sys/unix/ztypes_freebsd_riscv64.go | 1 - - vendor/golang.org/x/sys/unix/ztypes_linux.go | 230 ++++++++---- - .../golang.org/x/sys/unix/ztypes_linux_386.go | 1 - - .../x/sys/unix/ztypes_linux_amd64.go | 1 - - .../golang.org/x/sys/unix/ztypes_linux_arm.go | 1 - - .../x/sys/unix/ztypes_linux_arm64.go | 1 - - .../x/sys/unix/ztypes_linux_loong64.go | 1 - - .../x/sys/unix/ztypes_linux_mips.go | 1 - - .../x/sys/unix/ztypes_linux_mips64.go | 1 - - .../x/sys/unix/ztypes_linux_mips64le.go | 1 - - .../x/sys/unix/ztypes_linux_mipsle.go | 1 - - .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 1 - - .../x/sys/unix/ztypes_linux_ppc64.go | 1 - - .../x/sys/unix/ztypes_linux_ppc64le.go | 1 - - .../x/sys/unix/ztypes_linux_riscv64.go | 1 - - .../x/sys/unix/ztypes_linux_s390x.go | 1 - - .../x/sys/unix/ztypes_linux_sparc64.go | 1 - - .../x/sys/unix/ztypes_netbsd_386.go | 1 - - .../x/sys/unix/ztypes_netbsd_amd64.go | 1 - - .../x/sys/unix/ztypes_netbsd_arm.go | 1 - - .../x/sys/unix/ztypes_netbsd_arm64.go | 1 - - .../x/sys/unix/ztypes_openbsd_386.go | 1 - - .../x/sys/unix/ztypes_openbsd_amd64.go | 1 - - .../x/sys/unix/ztypes_openbsd_arm.go | 1 - - .../x/sys/unix/ztypes_openbsd_arm64.go | 1 - - .../x/sys/unix/ztypes_openbsd_mips64.go | 1 - - .../x/sys/unix/ztypes_openbsd_ppc64.go | 1 - - .../x/sys/unix/ztypes_openbsd_riscv64.go | 1 - - .../x/sys/unix/ztypes_solaris_amd64.go | 1 - - .../golang.org/x/sys/unix/ztypes_zos_s390x.go | 1 - - vendor/golang.org/x/sys/windows/aliases.go | 1 - - vendor/golang.org/x/sys/windows/empty.s | 1 - - .../golang.org/x/sys/windows/env_windows.go | 17 +- - vendor/golang.org/x/sys/windows/eventlog.go | 1 - - vendor/golang.org/x/sys/windows/mksyscall.go | 1 - - vendor/golang.org/x/sys/windows/race.go | 1 - - vendor/golang.org/x/sys/windows/race0.go | 1 - - vendor/golang.org/x/sys/windows/service.go | 1 - - vendor/golang.org/x/sys/windows/str.go | 1 - - vendor/golang.org/x/sys/windows/syscall.go | 1 - - .../x/sys/windows/syscall_windows.go | 10 +- - .../golang.org/x/sys/windows/types_windows.go | 28 +- - .../x/sys/windows/zsyscall_windows.go | 37 ++ - vendor/golang.org/x/term/term_unix.go | 1 - - vendor/golang.org/x/term/term_unix_bsd.go | 1 - - vendor/golang.org/x/term/term_unix_other.go | 1 - - vendor/golang.org/x/term/term_unsupported.go | 1 - - .../x/text/secure/bidirule/bidirule10.0.0.go | 1 - - .../x/text/secure/bidirule/bidirule9.0.0.go | 1 - - .../x/text/unicode/bidi/tables10.0.0.go | 1 - - .../x/text/unicode/bidi/tables11.0.0.go | 1 - - .../x/text/unicode/bidi/tables12.0.0.go | 1 - - .../x/text/unicode/bidi/tables13.0.0.go | 1 - - .../x/text/unicode/bidi/tables15.0.0.go | 1 - - .../x/text/unicode/bidi/tables9.0.0.go | 1 - - .../x/text/unicode/norm/tables10.0.0.go | 1 - - .../x/text/unicode/norm/tables11.0.0.go | 1 - - .../x/text/unicode/norm/tables12.0.0.go | 1 - - .../x/text/unicode/norm/tables13.0.0.go | 1 - - .../x/text/unicode/norm/tables15.0.0.go | 1 - - .../x/text/unicode/norm/tables9.0.0.go | 1 - - vendor/modules.txt | 16 +- - 363 files changed, 2094 insertions(+), 863 deletions(-) - delete mode 100644 vendor/golang.org/x/net/http2/go111.go - delete mode 100644 vendor/golang.org/x/net/http2/go115.go - delete mode 100644 vendor/golang.org/x/net/http2/go118.go - delete mode 100644 vendor/golang.org/x/net/http2/not_go111.go - delete mode 100644 vendor/golang.org/x/net/http2/not_go115.go - delete mode 100644 vendor/golang.org/x/net/http2/not_go118.go - create mode 100644 vendor/golang.org/x/net/http2/testsync.go - -diff --git a/go.mod b/go.mod -index 192b65c..f35bcd8 100644 ---- a/go.mod -+++ b/go.mod -@@ -13,8 +13,8 @@ require ( - github.com/onsi/gomega v1.24.0 - github.com/pkg/errors v0.9.1 // indirect - github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 -- golang.org/x/net v0.17.0 -- golang.org/x/sys v0.13.0 -+ golang.org/x/net v0.23.0 -+ golang.org/x/sys v0.18.0 - google.golang.org/grpc v1.56.3 - gopkg.in/natefinch/lumberjack.v2 v2.0.0 - k8s.io/api v0.22.8 -@@ -53,8 +53,8 @@ require ( - github.com/prometheus/procfs v0.7.3 // indirect - github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f // indirect - golang.org/x/oauth2 v0.7.0 // indirect -- golang.org/x/term v0.13.0 // indirect -- golang.org/x/text v0.13.0 // indirect -+ golang.org/x/term v0.18.0 // indirect -+ golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect -diff --git a/go.sum b/go.sum -index 0dabda6..844eeb8 100644 ---- a/go.sum -+++ b/go.sum -@@ -501,8 +501,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b - golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= - golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= - golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= --golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= --golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= - golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= - golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= - golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -@@ -576,13 +576,13 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc - golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= - golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= - golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= --golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= --golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= - golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= - golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= - golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= --golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= --golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -+golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -+golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= - golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= - golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= - golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -@@ -590,8 +590,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= - golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= - golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= - golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= --golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= --golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= - golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= - golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= - golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -diff --git a/vendor/golang.org/x/net/context/go17.go b/vendor/golang.org/x/net/context/go17.go -index 2cb9c40..0c1b867 100644 ---- a/vendor/golang.org/x/net/context/go17.go -+++ b/vendor/golang.org/x/net/context/go17.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build go1.7 --// +build go1.7 - - package context - -diff --git a/vendor/golang.org/x/net/context/go19.go b/vendor/golang.org/x/net/context/go19.go -index 64d31ec..e31e35a 100644 ---- a/vendor/golang.org/x/net/context/go19.go -+++ b/vendor/golang.org/x/net/context/go19.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build go1.9 --// +build go1.9 - - package context - -diff --git a/vendor/golang.org/x/net/context/pre_go17.go b/vendor/golang.org/x/net/context/pre_go17.go -index 7b6b685..065ff3d 100644 ---- a/vendor/golang.org/x/net/context/pre_go17.go -+++ b/vendor/golang.org/x/net/context/pre_go17.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build !go1.7 --// +build !go1.7 - - package context - -diff --git a/vendor/golang.org/x/net/context/pre_go19.go b/vendor/golang.org/x/net/context/pre_go19.go -index 1f97153..ec5a638 100644 ---- a/vendor/golang.org/x/net/context/pre_go19.go -+++ b/vendor/golang.org/x/net/context/pre_go19.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build !go1.9 --// +build !go1.9 - - package context - -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index de67f93..3c57880 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -910,9 +910,6 @@ func (z *Tokenizer) readTagAttrKey() { - return - } - switch c { -- case ' ', '\n', '\r', '\t', '\f', '/': -- z.pendingAttr[0].end = z.raw.end - 1 -- return - case '=': - if z.pendingAttr[0].start+1 == z.raw.end { - // WHATWG 13.2.5.32, if we see an equals sign before the attribute name -@@ -920,7 +917,9 @@ func (z *Tokenizer) readTagAttrKey() { - continue - } - fallthrough -- case '>': -+ case ' ', '\n', '\r', '\t', '\f', '/', '>': -+ // WHATWG 13.2.5.33 Attribute name state -+ // We need to reconsume the char in the after attribute name state to support the / character - z.raw.end-- - z.pendingAttr[0].end = z.raw.end - return -@@ -939,6 +938,11 @@ func (z *Tokenizer) readTagAttrVal() { - if z.err != nil { - return - } -+ if c == '/' { -+ // WHATWG 13.2.5.34 After attribute name state -+ // U+002F SOLIDUS (/) - Switch to the self-closing start tag state. -+ return -+ } - if c != '=' { - z.raw.end-- - return -diff --git a/vendor/golang.org/x/net/http2/databuffer.go b/vendor/golang.org/x/net/http2/databuffer.go -index a3067f8..e6f55cb 100644 ---- a/vendor/golang.org/x/net/http2/databuffer.go -+++ b/vendor/golang.org/x/net/http2/databuffer.go -@@ -20,41 +20,44 @@ import ( - // TODO: Benchmark to determine if the pools are necessary. The GC may have - // improved enough that we can instead allocate chunks like this: - // make([]byte, max(16<<10, expectedBytesRemaining)) --var ( -- dataChunkSizeClasses = []int{ -- 1 << 10, -- 2 << 10, -- 4 << 10, -- 8 << 10, -- 16 << 10, -- } -- dataChunkPools = [...]sync.Pool{ -- {New: func() interface{} { return make([]byte, 1<<10) }}, -- {New: func() interface{} { return make([]byte, 2<<10) }}, -- {New: func() interface{} { return make([]byte, 4<<10) }}, -- {New: func() interface{} { return make([]byte, 8<<10) }}, -- {New: func() interface{} { return make([]byte, 16<<10) }}, -- } --) -+var dataChunkPools = [...]sync.Pool{ -+ {New: func() interface{} { return new([1 << 10]byte) }}, -+ {New: func() interface{} { return new([2 << 10]byte) }}, -+ {New: func() interface{} { return new([4 << 10]byte) }}, -+ {New: func() interface{} { return new([8 << 10]byte) }}, -+ {New: func() interface{} { return new([16 << 10]byte) }}, -+} - - func getDataBufferChunk(size int64) []byte { -- i := 0 -- for ; i < len(dataChunkSizeClasses)-1; i++ { -- if size <= int64(dataChunkSizeClasses[i]) { -- break -- } -+ switch { -+ case size <= 1<<10: -+ return dataChunkPools[0].Get().(*[1 << 10]byte)[:] -+ case size <= 2<<10: -+ return dataChunkPools[1].Get().(*[2 << 10]byte)[:] -+ case size <= 4<<10: -+ return dataChunkPools[2].Get().(*[4 << 10]byte)[:] -+ case size <= 8<<10: -+ return dataChunkPools[3].Get().(*[8 << 10]byte)[:] -+ default: -+ return dataChunkPools[4].Get().(*[16 << 10]byte)[:] - } -- return dataChunkPools[i].Get().([]byte) - } - - func putDataBufferChunk(p []byte) { -- for i, n := range dataChunkSizeClasses { -- if len(p) == n { -- dataChunkPools[i].Put(p) -- return -- } -+ switch len(p) { -+ case 1 << 10: -+ dataChunkPools[0].Put((*[1 << 10]byte)(p)) -+ case 2 << 10: -+ dataChunkPools[1].Put((*[2 << 10]byte)(p)) -+ case 4 << 10: -+ dataChunkPools[2].Put((*[4 << 10]byte)(p)) -+ case 8 << 10: -+ dataChunkPools[3].Put((*[8 << 10]byte)(p)) -+ case 16 << 10: -+ dataChunkPools[4].Put((*[16 << 10]byte)(p)) -+ default: -+ panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) - } -- panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) - } - - // dataBuffer is an io.ReadWriter backed by a list of data chunks. -diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go -index c1f6b90..43557ab 100644 ---- a/vendor/golang.org/x/net/http2/frame.go -+++ b/vendor/golang.org/x/net/http2/frame.go -@@ -1510,13 +1510,12 @@ func (mh *MetaHeadersFrame) checkPseudos() error { - } - - func (fr *Framer) maxHeaderStringLen() int { -- v := fr.maxHeaderListSize() -- if uint32(int(v)) == v { -- return int(v) -+ v := int(fr.maxHeaderListSize()) -+ if v < 0 { -+ // If maxHeaderListSize overflows an int, use no limit (0). -+ return 0 - } -- // They had a crazy big number for MaxHeaderBytes anyway, -- // so give them unlimited header lengths: -- return 0 -+ return v - } - - // readMetaFrame returns 0 or more CONTINUATION frames from fr and -@@ -1565,6 +1564,7 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { - if size > remainSize { - hdec.SetEmitEnabled(false) - mh.Truncated = true -+ remainSize = 0 - return - } - remainSize -= size -@@ -1577,6 +1577,36 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { - var hc headersOrContinuation = hf - for { - frag := hc.HeaderBlockFragment() -+ -+ // Avoid parsing large amounts of headers that we will then discard. -+ // If the sender exceeds the max header list size by too much, -+ // skip parsing the fragment and close the connection. -+ // -+ // "Too much" is either any CONTINUATION frame after we've already -+ // exceeded the max header list size (in which case remainSize is 0), -+ // or a frame whose encoded size is more than twice the remaining -+ // header list bytes we're willing to accept. -+ if int64(len(frag)) > int64(2*remainSize) { -+ if VerboseLogs { -+ log.Printf("http2: header list too large") -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the structure of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ -+ // Also close the connection after any CONTINUATION frame following an -+ // invalid header, since we stop tracking the size of the headers after -+ // an invalid one. -+ if invalid != nil { -+ if VerboseLogs { -+ log.Printf("http2: invalid header: %v", invalid) -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the structure of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ - if _, err := hdec.Write(frag); err != nil { - return nil, ConnectionError(ErrCodeCompression) - } -diff --git a/vendor/golang.org/x/net/http2/go111.go b/vendor/golang.org/x/net/http2/go111.go -deleted file mode 100644 -index 5bf62b0..0000000 ---- a/vendor/golang.org/x/net/http2/go111.go -+++ /dev/null -@@ -1,30 +0,0 @@ --// Copyright 2018 The Go Authors. All rights reserved. --// Use of this source code is governed by a BSD-style --// license that can be found in the LICENSE file. -- --//go:build go1.11 --// +build go1.11 -- --package http2 -- --import ( -- "net/http/httptrace" -- "net/textproto" --) -- --func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { -- return trace != nil && trace.WroteHeaderField != nil --} -- --func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) { -- if trace != nil && trace.WroteHeaderField != nil { -- trace.WroteHeaderField(k, []string{v}) -- } --} -- --func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { -- if trace != nil { -- return trace.Got1xxResponse -- } -- return nil --} -diff --git a/vendor/golang.org/x/net/http2/go115.go b/vendor/golang.org/x/net/http2/go115.go -deleted file mode 100644 -index 908af1a..0000000 ---- a/vendor/golang.org/x/net/http2/go115.go -+++ /dev/null -@@ -1,27 +0,0 @@ --// Copyright 2021 The Go Authors. All rights reserved. --// Use of this source code is governed by a BSD-style --// license that can be found in the LICENSE file. -- --//go:build go1.15 --// +build go1.15 -- --package http2 -- --import ( -- "context" -- "crypto/tls" --) -- --// dialTLSWithContext uses tls.Dialer, added in Go 1.15, to open a TLS --// connection. --func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { -- dialer := &tls.Dialer{ -- Config: cfg, -- } -- cn, err := dialer.DialContext(ctx, network, addr) -- if err != nil { -- return nil, err -- } -- tlsCn := cn.(*tls.Conn) // DialContext comment promises this will always succeed -- return tlsCn, nil --} -diff --git a/vendor/golang.org/x/net/http2/go118.go b/vendor/golang.org/x/net/http2/go118.go -deleted file mode 100644 -index aca4b2b..0000000 ---- a/vendor/golang.org/x/net/http2/go118.go -+++ /dev/null -@@ -1,17 +0,0 @@ --// Copyright 2021 The Go Authors. All rights reserved. --// Use of this source code is governed by a BSD-style --// license that can be found in the LICENSE file. -- --//go:build go1.18 --// +build go1.18 -- --package http2 -- --import ( -- "crypto/tls" -- "net" --) -- --func tlsUnderlyingConn(tc *tls.Conn) net.Conn { -- return tc.NetConn() --} -diff --git a/vendor/golang.org/x/net/http2/not_go111.go b/vendor/golang.org/x/net/http2/not_go111.go -deleted file mode 100644 -index cc0baa8..0000000 ---- a/vendor/golang.org/x/net/http2/not_go111.go -+++ /dev/null -@@ -1,21 +0,0 @@ --// Copyright 2018 The Go Authors. All rights reserved. --// Use of this source code is governed by a BSD-style --// license that can be found in the LICENSE file. -- --//go:build !go1.11 --// +build !go1.11 -- --package http2 -- --import ( -- "net/http/httptrace" -- "net/textproto" --) -- --func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { return false } -- --func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) {} -- --func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { -- return nil --} -diff --git a/vendor/golang.org/x/net/http2/not_go115.go b/vendor/golang.org/x/net/http2/not_go115.go -deleted file mode 100644 -index e6c04cf..0000000 ---- a/vendor/golang.org/x/net/http2/not_go115.go -+++ /dev/null -@@ -1,31 +0,0 @@ --// Copyright 2021 The Go Authors. All rights reserved. --// Use of this source code is governed by a BSD-style --// license that can be found in the LICENSE file. -- --//go:build !go1.15 --// +build !go1.15 -- --package http2 -- --import ( -- "context" -- "crypto/tls" --) -- --// dialTLSWithContext opens a TLS connection. --func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { -- cn, err := tls.Dial(network, addr, cfg) -- if err != nil { -- return nil, err -- } -- if err := cn.Handshake(); err != nil { -- return nil, err -- } -- if cfg.InsecureSkipVerify { -- return cn, nil -- } -- if err := cn.VerifyHostname(cfg.ServerName); err != nil { -- return nil, err -- } -- return cn, nil --} -diff --git a/vendor/golang.org/x/net/http2/not_go118.go b/vendor/golang.org/x/net/http2/not_go118.go -deleted file mode 100644 -index eab532c..0000000 ---- a/vendor/golang.org/x/net/http2/not_go118.go -+++ /dev/null -@@ -1,17 +0,0 @@ --// Copyright 2021 The Go Authors. All rights reserved. --// Use of this source code is governed by a BSD-style --// license that can be found in the LICENSE file. -- --//go:build !go1.18 --// +build !go1.18 -- --package http2 -- --import ( -- "crypto/tls" -- "net" --) -- --func tlsUnderlyingConn(tc *tls.Conn) net.Conn { -- return nil --} -diff --git a/vendor/golang.org/x/net/http2/pipe.go b/vendor/golang.org/x/net/http2/pipe.go -index 684d984..3b9f06b 100644 ---- a/vendor/golang.org/x/net/http2/pipe.go -+++ b/vendor/golang.org/x/net/http2/pipe.go -@@ -77,7 +77,10 @@ func (p *pipe) Read(d []byte) (n int, err error) { - } - } - --var errClosedPipeWrite = errors.New("write on closed buffer") -+var ( -+ errClosedPipeWrite = errors.New("write on closed buffer") -+ errUninitializedPipeWrite = errors.New("write on uninitialized buffer") -+) - - // Write copies bytes from p into the buffer and wakes a reader. - // It is an error to write more data than the buffer can hold. -@@ -91,6 +94,12 @@ func (p *pipe) Write(d []byte) (n int, err error) { - if p.err != nil || p.breakErr != nil { - return 0, errClosedPipeWrite - } -+ // pipe.setBuffer is never invoked, leaving the buffer uninitialized. -+ // We shouldn't try to write to an uninitialized pipe, -+ // but returning an error is better than panicking. -+ if p.b == nil { -+ return 0, errUninitializedPipeWrite -+ } - return p.b.Write(d) - } - -diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go -index 02c88b6..ce2e8b4 100644 ---- a/vendor/golang.org/x/net/http2/server.go -+++ b/vendor/golang.org/x/net/http2/server.go -@@ -124,6 +124,7 @@ type Server struct { - // IdleTimeout specifies how long until idle clients should be - // closed with a GOAWAY frame. PING frames are not considered - // activity for the purposes of IdleTimeout. -+ // If zero or negative, there is no timeout. - IdleTimeout time.Duration - - // MaxUploadBufferPerConnection is the size of the initial flow -@@ -434,7 +435,7 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { - // passes the connection off to us with the deadline already set. - // Write deadlines are set per stream in serverConn.newStream. - // Disarm the net.Conn write deadline here. -- if sc.hs.WriteTimeout != 0 { -+ if sc.hs.WriteTimeout > 0 { - sc.conn.SetWriteDeadline(time.Time{}) - } - -@@ -924,7 +925,7 @@ func (sc *serverConn) serve() { - sc.setConnState(http.StateActive) - sc.setConnState(http.StateIdle) - -- if sc.srv.IdleTimeout != 0 { -+ if sc.srv.IdleTimeout > 0 { - sc.idleTimer = time.AfterFunc(sc.srv.IdleTimeout, sc.onIdleTimer) - defer sc.idleTimer.Stop() - } -@@ -1637,7 +1638,7 @@ func (sc *serverConn) closeStream(st *stream, err error) { - delete(sc.streams, st.id) - if len(sc.streams) == 0 { - sc.setConnState(http.StateIdle) -- if sc.srv.IdleTimeout != 0 { -+ if sc.srv.IdleTimeout > 0 { - sc.idleTimer.Reset(sc.srv.IdleTimeout) - } - if h1ServerKeepAlivesDisabled(sc.hs) { -@@ -2017,7 +2018,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { - // similar to how the http1 server works. Here it's - // technically more like the http1 Server's ReadHeaderTimeout - // (in Go 1.8), though. That's a more sane option anyway. -- if sc.hs.ReadTimeout != 0 { -+ if sc.hs.ReadTimeout > 0 { - sc.conn.SetReadDeadline(time.Time{}) - st.readDeadline = time.AfterFunc(sc.hs.ReadTimeout, st.onReadTimeout) - } -@@ -2038,7 +2039,7 @@ func (sc *serverConn) upgradeRequest(req *http.Request) { - - // Disable any read deadline set by the net/http package - // prior to the upgrade. -- if sc.hs.ReadTimeout != 0 { -+ if sc.hs.ReadTimeout > 0 { - sc.conn.SetReadDeadline(time.Time{}) - } - -@@ -2116,7 +2117,7 @@ func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream - st.flow.conn = &sc.flow // link to conn-level counter - st.flow.add(sc.initialStreamSendWindowSize) - st.inflow.init(sc.srv.initialStreamRecvWindowSize()) -- if sc.hs.WriteTimeout != 0 { -+ if sc.hs.WriteTimeout > 0 { - st.writeDeadline = time.AfterFunc(sc.hs.WriteTimeout, st.onWriteTimeout) - } - -@@ -2549,7 +2550,6 @@ type responseWriterState struct { - wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. - sentHeader bool // have we sent the header frame? - handlerDone bool // handler has finished -- dirty bool // a Write failed; don't reuse this responseWriterState - - sentContentLen int64 // non-zero if handler set a Content-Length header - wroteBytes int64 -@@ -2669,7 +2669,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { - date: date, - }) - if err != nil { -- rws.dirty = true - return 0, err - } - if endStream { -@@ -2690,7 +2689,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { - if len(p) > 0 || endStream { - // only send a 0 byte DATA frame if we're ending the stream. - if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil { -- rws.dirty = true - return 0, err - } - } -@@ -2702,9 +2700,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { - trailers: rws.trailers, - endStream: true, - }) -- if err != nil { -- rws.dirty = true -- } - return len(p), err - } - return len(p), nil -@@ -2920,14 +2915,12 @@ func (rws *responseWriterState) writeHeader(code int) { - h.Del("Transfer-Encoding") - } - -- if rws.conn.writeHeaders(rws.stream, &writeResHeaders{ -+ rws.conn.writeHeaders(rws.stream, &writeResHeaders{ - streamID: rws.stream.id, - httpResCode: code, - h: h, - endStream: rws.handlerDone && !rws.hasTrailers(), -- }) != nil { -- rws.dirty = true -- } -+ }) - - return - } -@@ -2992,19 +2985,10 @@ func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, - - func (w *responseWriter) handlerDone() { - rws := w.rws -- dirty := rws.dirty - rws.handlerDone = true - w.Flush() - w.rws = nil -- if !dirty { -- // Only recycle the pool if all prior Write calls to -- // the serverConn goroutine completed successfully. If -- // they returned earlier due to resets from the peer -- // there might still be write goroutines outstanding -- // from the serverConn referencing the rws memory. See -- // issue 20704. -- responseWriterStatePool.Put(rws) -- } -+ responseWriterStatePool.Put(rws) - } - - // Push errors. -@@ -3187,6 +3171,7 @@ func (sc *serverConn) startPush(msg *startPushRequest) { - panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err)) - } - -+ sc.curHandlers++ - go sc.runHandler(rw, req, sc.handler.ServeHTTP) - return promisedID, nil - } -diff --git a/vendor/golang.org/x/net/http2/testsync.go b/vendor/golang.org/x/net/http2/testsync.go -new file mode 100644 -index 0000000..61075bd ---- /dev/null -+++ b/vendor/golang.org/x/net/http2/testsync.go -@@ -0,0 +1,331 @@ -+// Copyright 2024 The Go Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style -+// license that can be found in the LICENSE file. -+package http2 -+ -+import ( -+ "context" -+ "sync" -+ "time" -+) -+ -+// testSyncHooks coordinates goroutines in tests. -+// -+// For example, a call to ClientConn.RoundTrip involves several goroutines, including: -+// - the goroutine running RoundTrip; -+// - the clientStream.doRequest goroutine, which writes the request; and -+// - the clientStream.readLoop goroutine, which reads the response. -+// -+// Using testSyncHooks, a test can start a RoundTrip and identify when all these goroutines -+// are blocked waiting for some condition such as reading the Request.Body or waiting for -+// flow control to become available. -+// -+// The testSyncHooks also manage timers and synthetic time in tests. -+// This permits us to, for example, start a request and cause it to time out waiting for -+// response headers without resorting to time.Sleep calls. -+type testSyncHooks struct { -+ // active/inactive act as a mutex and condition variable. -+ // -+ // - neither chan contains a value: testSyncHooks is locked. -+ // - active contains a value: unlocked, and at least one goroutine is not blocked -+ // - inactive contains a value: unlocked, and all goroutines are blocked -+ active chan struct{} -+ inactive chan struct{} -+ -+ // goroutine counts -+ total int // total goroutines -+ condwait map[*sync.Cond]int // blocked in sync.Cond.Wait -+ blocked []*testBlockedGoroutine // otherwise blocked -+ -+ // fake time -+ now time.Time -+ timers []*fakeTimer -+ -+ // Transport testing: Report various events. -+ newclientconn func(*ClientConn) -+ newstream func(*clientStream) -+} -+ -+// testBlockedGoroutine is a blocked goroutine. -+type testBlockedGoroutine struct { -+ f func() bool // blocked until f returns true -+ ch chan struct{} // closed when unblocked -+} -+ -+func newTestSyncHooks() *testSyncHooks { -+ h := &testSyncHooks{ -+ active: make(chan struct{}, 1), -+ inactive: make(chan struct{}, 1), -+ condwait: map[*sync.Cond]int{}, -+ } -+ h.inactive <- struct{}{} -+ h.now = time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC) -+ return h -+} -+ -+// lock acquires the testSyncHooks mutex. -+func (h *testSyncHooks) lock() { -+ select { -+ case <-h.active: -+ case <-h.inactive: -+ } -+} -+ -+// waitInactive waits for all goroutines to become inactive. -+func (h *testSyncHooks) waitInactive() { -+ for { -+ <-h.inactive -+ if !h.unlock() { -+ break -+ } -+ } -+} -+ -+// unlock releases the testSyncHooks mutex. -+// It reports whether any goroutines are active. -+func (h *testSyncHooks) unlock() (active bool) { -+ // Look for a blocked goroutine which can be unblocked. -+ blocked := h.blocked[:0] -+ unblocked := false -+ for _, b := range h.blocked { -+ if !unblocked && b.f() { -+ unblocked = true -+ close(b.ch) -+ } else { -+ blocked = append(blocked, b) -+ } -+ } -+ h.blocked = blocked -+ -+ // Count goroutines blocked on condition variables. -+ condwait := 0 -+ for _, count := range h.condwait { -+ condwait += count -+ } -+ -+ if h.total > condwait+len(blocked) { -+ h.active <- struct{}{} -+ return true -+ } else { -+ h.inactive <- struct{}{} -+ return false -+ } -+} -+ -+// goRun starts a new goroutine. -+func (h *testSyncHooks) goRun(f func()) { -+ h.lock() -+ h.total++ -+ h.unlock() -+ go func() { -+ defer func() { -+ h.lock() -+ h.total-- -+ h.unlock() -+ }() -+ f() -+ }() -+} -+ -+// blockUntil indicates that a goroutine is blocked waiting for some condition to become true. -+// It waits until f returns true before proceeding. -+// -+// Example usage: -+// -+// h.blockUntil(func() bool { -+// // Is the context done yet? -+// select { -+// case <-ctx.Done(): -+// default: -+// return false -+// } -+// return true -+// }) -+// // Wait for the context to become done. -+// <-ctx.Done() -+// -+// The function f passed to blockUntil must be non-blocking and idempotent. -+func (h *testSyncHooks) blockUntil(f func() bool) { -+ if f() { -+ return -+ } -+ ch := make(chan struct{}) -+ h.lock() -+ h.blocked = append(h.blocked, &testBlockedGoroutine{ -+ f: f, -+ ch: ch, -+ }) -+ h.unlock() -+ <-ch -+} -+ -+// broadcast is sync.Cond.Broadcast. -+func (h *testSyncHooks) condBroadcast(cond *sync.Cond) { -+ h.lock() -+ delete(h.condwait, cond) -+ h.unlock() -+ cond.Broadcast() -+} -+ -+// broadcast is sync.Cond.Wait. -+func (h *testSyncHooks) condWait(cond *sync.Cond) { -+ h.lock() -+ h.condwait[cond]++ -+ h.unlock() -+} -+ -+// newTimer creates a new fake timer. -+func (h *testSyncHooks) newTimer(d time.Duration) timer { -+ h.lock() -+ defer h.unlock() -+ t := &fakeTimer{ -+ hooks: h, -+ when: h.now.Add(d), -+ c: make(chan time.Time), -+ } -+ h.timers = append(h.timers, t) -+ return t -+} -+ -+// afterFunc creates a new fake AfterFunc timer. -+func (h *testSyncHooks) afterFunc(d time.Duration, f func()) timer { -+ h.lock() -+ defer h.unlock() -+ t := &fakeTimer{ -+ hooks: h, -+ when: h.now.Add(d), -+ f: f, -+ } -+ h.timers = append(h.timers, t) -+ return t -+} -+ -+func (h *testSyncHooks) contextWithTimeout(ctx context.Context, d time.Duration) (context.Context, context.CancelFunc) { -+ ctx, cancel := context.WithCancel(ctx) -+ t := h.afterFunc(d, cancel) -+ return ctx, func() { -+ t.Stop() -+ cancel() -+ } -+} -+ -+func (h *testSyncHooks) timeUntilEvent() time.Duration { -+ h.lock() -+ defer h.unlock() -+ var next time.Time -+ for _, t := range h.timers { -+ if next.IsZero() || t.when.Before(next) { -+ next = t.when -+ } -+ } -+ if d := next.Sub(h.now); d > 0 { -+ return d -+ } -+ return 0 -+} -+ -+// advance advances time and causes synthetic timers to fire. -+func (h *testSyncHooks) advance(d time.Duration) { -+ h.lock() -+ defer h.unlock() -+ h.now = h.now.Add(d) -+ timers := h.timers[:0] -+ for _, t := range h.timers { -+ t := t // remove after go.mod depends on go1.22 -+ t.mu.Lock() -+ switch { -+ case t.when.After(h.now): -+ timers = append(timers, t) -+ case t.when.IsZero(): -+ // stopped timer -+ default: -+ t.when = time.Time{} -+ if t.c != nil { -+ close(t.c) -+ } -+ if t.f != nil { -+ h.total++ -+ go func() { -+ defer func() { -+ h.lock() -+ h.total-- -+ h.unlock() -+ }() -+ t.f() -+ }() -+ } -+ } -+ t.mu.Unlock() -+ } -+ h.timers = timers -+} -+ -+// A timer wraps a time.Timer, or a synthetic equivalent in tests. -+// Unlike time.Timer, timer is single-use: The timer channel is closed when the timer expires. -+type timer interface { -+ C() <-chan time.Time -+ Stop() bool -+ Reset(d time.Duration) bool -+} -+ -+// timeTimer implements timer using real time. -+type timeTimer struct { -+ t *time.Timer -+ c chan time.Time -+} -+ -+// newTimeTimer creates a new timer using real time. -+func newTimeTimer(d time.Duration) timer { -+ ch := make(chan time.Time) -+ t := time.AfterFunc(d, func() { -+ close(ch) -+ }) -+ return &timeTimer{t, ch} -+} -+ -+// newTimeAfterFunc creates an AfterFunc timer using real time. -+func newTimeAfterFunc(d time.Duration, f func()) timer { -+ return &timeTimer{ -+ t: time.AfterFunc(d, f), -+ } -+} -+ -+func (t timeTimer) C() <-chan time.Time { return t.c } -+func (t timeTimer) Stop() bool { return t.t.Stop() } -+func (t timeTimer) Reset(d time.Duration) bool { return t.t.Reset(d) } -+ -+// fakeTimer implements timer using fake time. -+type fakeTimer struct { -+ hooks *testSyncHooks -+ -+ mu sync.Mutex -+ when time.Time // when the timer will fire -+ c chan time.Time // closed when the timer fires; mutually exclusive with f -+ f func() // called when the timer fires; mutually exclusive with c -+} -+ -+func (t *fakeTimer) C() <-chan time.Time { return t.c } -+ -+func (t *fakeTimer) Stop() bool { -+ t.mu.Lock() -+ defer t.mu.Unlock() -+ stopped := t.when.IsZero() -+ t.when = time.Time{} -+ return stopped -+} -+ -+func (t *fakeTimer) Reset(d time.Duration) bool { -+ if t.c != nil || t.f == nil { -+ panic("fakeTimer only supports Reset on AfterFunc timers") -+ } -+ t.mu.Lock() -+ defer t.mu.Unlock() -+ t.hooks.lock() -+ defer t.hooks.unlock() -+ active := !t.when.IsZero() -+ t.when = t.hooks.now.Add(d) -+ if !active { -+ t.hooks.timers = append(t.hooks.timers, t) -+ } -+ return active -+} -diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go -index 4515b22..ce375c8 100644 ---- a/vendor/golang.org/x/net/http2/transport.go -+++ b/vendor/golang.org/x/net/http2/transport.go -@@ -147,6 +147,12 @@ type Transport struct { - // waiting for their turn. - StrictMaxConcurrentStreams bool - -+ // IdleConnTimeout is the maximum amount of time an idle -+ // (keep-alive) connection will remain idle before closing -+ // itself. -+ // Zero means no limit. -+ IdleConnTimeout time.Duration -+ - // ReadIdleTimeout is the timeout after which a health check using ping - // frame will be carried out if no frame is received on the connection. - // Note that a ping response will is considered a received frame, so if -@@ -178,6 +184,8 @@ type Transport struct { - - connPoolOnce sync.Once - connPoolOrDef ClientConnPool // non-nil version of ConnPool -+ -+ syncHooks *testSyncHooks - } - - func (t *Transport) maxHeaderListSize() uint32 { -@@ -302,7 +310,7 @@ type ClientConn struct { - readerErr error // set before readerDone is closed - - idleTimeout time.Duration // or 0 for never -- idleTimer *time.Timer -+ idleTimer timer - - mu sync.Mutex // guards following - cond *sync.Cond // hold mu; broadcast on flow/closed changes -@@ -344,6 +352,60 @@ type ClientConn struct { - werr error // first write error that has occurred - hbuf bytes.Buffer // HPACK encoder writes into this - henc *hpack.Encoder -+ -+ syncHooks *testSyncHooks // can be nil -+} -+ -+// Hook points used for testing. -+// Outside of tests, cc.syncHooks is nil and these all have minimal implementations. -+// Inside tests, see the testSyncHooks function docs. -+ -+// goRun starts a new goroutine. -+func (cc *ClientConn) goRun(f func()) { -+ if cc.syncHooks != nil { -+ cc.syncHooks.goRun(f) -+ return -+ } -+ go f() -+} -+ -+// condBroadcast is cc.cond.Broadcast. -+func (cc *ClientConn) condBroadcast() { -+ if cc.syncHooks != nil { -+ cc.syncHooks.condBroadcast(cc.cond) -+ } -+ cc.cond.Broadcast() -+} -+ -+// condWait is cc.cond.Wait. -+func (cc *ClientConn) condWait() { -+ if cc.syncHooks != nil { -+ cc.syncHooks.condWait(cc.cond) -+ } -+ cc.cond.Wait() -+} -+ -+// newTimer creates a new time.Timer, or a synthetic timer in tests. -+func (cc *ClientConn) newTimer(d time.Duration) timer { -+ if cc.syncHooks != nil { -+ return cc.syncHooks.newTimer(d) -+ } -+ return newTimeTimer(d) -+} -+ -+// afterFunc creates a new time.AfterFunc timer, or a synthetic timer in tests. -+func (cc *ClientConn) afterFunc(d time.Duration, f func()) timer { -+ if cc.syncHooks != nil { -+ return cc.syncHooks.afterFunc(d, f) -+ } -+ return newTimeAfterFunc(d, f) -+} -+ -+func (cc *ClientConn) contextWithTimeout(ctx context.Context, d time.Duration) (context.Context, context.CancelFunc) { -+ if cc.syncHooks != nil { -+ return cc.syncHooks.contextWithTimeout(ctx, d) -+ } -+ return context.WithTimeout(ctx, d) - } - - // clientStream is the state for a single HTTP/2 stream. One of these -@@ -425,7 +487,7 @@ func (cs *clientStream) abortStreamLocked(err error) { - // TODO(dneil): Clean up tests where cs.cc.cond is nil. - if cs.cc.cond != nil { - // Wake up writeRequestBody if it is waiting on flow control. -- cs.cc.cond.Broadcast() -+ cs.cc.condBroadcast() - } - } - -@@ -435,7 +497,7 @@ func (cs *clientStream) abortRequestBodyWrite() { - defer cc.mu.Unlock() - if cs.reqBody != nil && cs.reqBodyClosed == nil { - cs.closeReqBodyLocked() -- cc.cond.Broadcast() -+ cc.condBroadcast() - } - } - -@@ -445,10 +507,10 @@ func (cs *clientStream) closeReqBodyLocked() { - } - cs.reqBodyClosed = make(chan struct{}) - reqBodyClosed := cs.reqBodyClosed -- go func() { -+ cs.cc.goRun(func() { - cs.reqBody.Close() - close(reqBodyClosed) -- }() -+ }) - } - - type stickyErrWriter struct { -@@ -537,15 +599,6 @@ func authorityAddr(scheme string, authority string) (addr string) { - return net.JoinHostPort(host, port) - } - --var retryBackoffHook func(time.Duration) *time.Timer -- --func backoffNewTimer(d time.Duration) *time.Timer { -- if retryBackoffHook != nil { -- return retryBackoffHook(d) -- } -- return time.NewTimer(d) --} -- - // RoundTripOpt is like RoundTrip, but takes options. - func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) { - if !(req.URL.Scheme == "https" || (req.URL.Scheme == "http" && t.AllowHTTP)) { -@@ -573,13 +626,27 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res - backoff := float64(uint(1) << (uint(retry) - 1)) - backoff += backoff * (0.1 * mathrand.Float64()) - d := time.Second * time.Duration(backoff) -- timer := backoffNewTimer(d) -+ var tm timer -+ if t.syncHooks != nil { -+ tm = t.syncHooks.newTimer(d) -+ t.syncHooks.blockUntil(func() bool { -+ select { -+ case <-tm.C(): -+ case <-req.Context().Done(): -+ default: -+ return false -+ } -+ return true -+ }) -+ } else { -+ tm = newTimeTimer(d) -+ } - select { -- case <-timer.C: -+ case <-tm.C(): - t.vlogf("RoundTrip retrying after failure: %v", roundTripErr) - continue - case <-req.Context().Done(): -- timer.Stop() -+ tm.Stop() - err = req.Context().Err() - } - } -@@ -658,6 +725,9 @@ func canRetryError(err error) bool { - } - - func (t *Transport) dialClientConn(ctx context.Context, addr string, singleUse bool) (*ClientConn, error) { -+ if t.syncHooks != nil { -+ return t.newClientConn(nil, singleUse, t.syncHooks) -+ } - host, _, err := net.SplitHostPort(addr) - if err != nil { - return nil, err -@@ -666,7 +736,7 @@ func (t *Transport) dialClientConn(ctx context.Context, addr string, singleUse b - if err != nil { - return nil, err - } -- return t.newClientConn(tconn, singleUse) -+ return t.newClientConn(tconn, singleUse, nil) - } - - func (t *Transport) newTLSConfig(host string) *tls.Config { -@@ -732,10 +802,10 @@ func (t *Transport) maxEncoderHeaderTableSize() uint32 { - } - - func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) { -- return t.newClientConn(c, t.disableKeepAlives()) -+ return t.newClientConn(c, t.disableKeepAlives(), nil) - } - --func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, error) { -+func (t *Transport) newClientConn(c net.Conn, singleUse bool, hooks *testSyncHooks) (*ClientConn, error) { - cc := &ClientConn{ - t: t, - tconn: c, -@@ -750,10 +820,15 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro - wantSettingsAck: true, - pings: make(map[[8]byte]chan struct{}), - reqHeaderMu: make(chan struct{}, 1), -+ syncHooks: hooks, -+ } -+ if hooks != nil { -+ hooks.newclientconn(cc) -+ c = cc.tconn - } - if d := t.idleConnTimeout(); d != 0 { - cc.idleTimeout = d -- cc.idleTimer = time.AfterFunc(d, cc.onIdleTimeout) -+ cc.idleTimer = cc.afterFunc(d, cc.onIdleTimeout) - } - if VerboseLogs { - t.vlogf("http2: Transport creating client conn %p to %v", cc, c.RemoteAddr()) -@@ -818,7 +893,7 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro - return nil, cc.werr - } - -- go cc.readLoop() -+ cc.goRun(cc.readLoop) - return cc, nil - } - -@@ -826,7 +901,7 @@ func (cc *ClientConn) healthCheck() { - pingTimeout := cc.t.pingTimeout() - // We don't need to periodically ping in the health check, because the readLoop of ClientConn will - // trigger the healthCheck again if there is no frame received. -- ctx, cancel := context.WithTimeout(context.Background(), pingTimeout) -+ ctx, cancel := cc.contextWithTimeout(context.Background(), pingTimeout) - defer cancel() - cc.vlogf("http2: Transport sending health check") - err := cc.Ping(ctx) -@@ -1018,7 +1093,7 @@ func (cc *ClientConn) forceCloseConn() { - if !ok { - return - } -- if nc := tlsUnderlyingConn(tc); nc != nil { -+ if nc := tc.NetConn(); nc != nil { - nc.Close() - } - } -@@ -1056,7 +1131,7 @@ func (cc *ClientConn) Shutdown(ctx context.Context) error { - // Wait for all in-flight streams to complete or connection to close - done := make(chan struct{}) - cancelled := false // guarded by cc.mu -- go func() { -+ cc.goRun(func() { - cc.mu.Lock() - defer cc.mu.Unlock() - for { -@@ -1068,9 +1143,9 @@ func (cc *ClientConn) Shutdown(ctx context.Context) error { - if cancelled { - break - } -- cc.cond.Wait() -+ cc.condWait() - } -- }() -+ }) - shutdownEnterWaitStateHook() - select { - case <-done: -@@ -1080,7 +1155,7 @@ func (cc *ClientConn) Shutdown(ctx context.Context) error { - cc.mu.Lock() - // Free the goroutine above - cancelled = true -- cc.cond.Broadcast() -+ cc.condBroadcast() - cc.mu.Unlock() - return ctx.Err() - } -@@ -1118,7 +1193,7 @@ func (cc *ClientConn) closeForError(err error) { - for _, cs := range cc.streams { - cs.abortStreamLocked(err) - } -- cc.cond.Broadcast() -+ cc.condBroadcast() - cc.mu.Unlock() - cc.closeConn() - } -@@ -1215,6 +1290,10 @@ func (cc *ClientConn) decrStreamReservationsLocked() { - } - - func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { -+ return cc.roundTrip(req, nil) -+} -+ -+func (cc *ClientConn) roundTrip(req *http.Request, streamf func(*clientStream)) (*http.Response, error) { - ctx := req.Context() - cs := &clientStream{ - cc: cc, -@@ -1229,9 +1308,23 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { - respHeaderRecv: make(chan struct{}), - donec: make(chan struct{}), - } -- go cs.doRequest(req) -+ cc.goRun(func() { -+ cs.doRequest(req) -+ }) - - waitDone := func() error { -+ if cc.syncHooks != nil { -+ cc.syncHooks.blockUntil(func() bool { -+ select { -+ case <-cs.donec: -+ case <-ctx.Done(): -+ case <-cs.reqCancel: -+ default: -+ return false -+ } -+ return true -+ }) -+ } - select { - case <-cs.donec: - return nil -@@ -1292,7 +1385,24 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { - return err - } - -+ if streamf != nil { -+ streamf(cs) -+ } -+ - for { -+ if cc.syncHooks != nil { -+ cc.syncHooks.blockUntil(func() bool { -+ select { -+ case <-cs.respHeaderRecv: -+ case <-cs.abort: -+ case <-ctx.Done(): -+ case <-cs.reqCancel: -+ default: -+ return false -+ } -+ return true -+ }) -+ } - select { - case <-cs.respHeaderRecv: - return handleResponseHeaders() -@@ -1348,6 +1458,21 @@ func (cs *clientStream) writeRequest(req *http.Request) (err error) { - if cc.reqHeaderMu == nil { - panic("RoundTrip on uninitialized ClientConn") // for tests - } -+ var newStreamHook func(*clientStream) -+ if cc.syncHooks != nil { -+ newStreamHook = cc.syncHooks.newstream -+ cc.syncHooks.blockUntil(func() bool { -+ select { -+ case cc.reqHeaderMu <- struct{}{}: -+ <-cc.reqHeaderMu -+ case <-cs.reqCancel: -+ case <-ctx.Done(): -+ default: -+ return false -+ } -+ return true -+ }) -+ } - select { - case cc.reqHeaderMu <- struct{}{}: - case <-cs.reqCancel: -@@ -1372,6 +1497,10 @@ func (cs *clientStream) writeRequest(req *http.Request) (err error) { - } - cc.mu.Unlock() - -+ if newStreamHook != nil { -+ newStreamHook(cs) -+ } -+ - // TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere? - if !cc.t.disableCompression() && - req.Header.Get("Accept-Encoding") == "" && -@@ -1452,15 +1581,30 @@ func (cs *clientStream) writeRequest(req *http.Request) (err error) { - var respHeaderTimer <-chan time.Time - var respHeaderRecv chan struct{} - if d := cc.responseHeaderTimeout(); d != 0 { -- timer := time.NewTimer(d) -+ timer := cc.newTimer(d) - defer timer.Stop() -- respHeaderTimer = timer.C -+ respHeaderTimer = timer.C() - respHeaderRecv = cs.respHeaderRecv - } - // Wait until the peer half-closes its end of the stream, - // or until the request is aborted (via context, error, or otherwise), - // whichever comes first. - for { -+ if cc.syncHooks != nil { -+ cc.syncHooks.blockUntil(func() bool { -+ select { -+ case <-cs.peerClosed: -+ case <-respHeaderTimer: -+ case <-respHeaderRecv: -+ case <-cs.abort: -+ case <-ctx.Done(): -+ case <-cs.reqCancel: -+ default: -+ return false -+ } -+ return true -+ }) -+ } - select { - case <-cs.peerClosed: - return nil -@@ -1609,7 +1753,7 @@ func (cc *ClientConn) awaitOpenSlotForStreamLocked(cs *clientStream) error { - return nil - } - cc.pendingRequests++ -- cc.cond.Wait() -+ cc.condWait() - cc.pendingRequests-- - select { - case <-cs.abort: -@@ -1871,10 +2015,26 @@ func (cs *clientStream) awaitFlowControl(maxBytes int) (taken int32, err error) - cs.flow.take(take) - return take, nil - } -- cc.cond.Wait() -+ cc.condWait() - } - } - -+func validateHeaders(hdrs http.Header) string { -+ for k, vv := range hdrs { -+ if !httpguts.ValidHeaderFieldName(k) { -+ return fmt.Sprintf("name %q", k) -+ } -+ for _, v := range vv { -+ if !httpguts.ValidHeaderFieldValue(v) { -+ // Don't include the value in the error, -+ // because it may be sensitive. -+ return fmt.Sprintf("value for header %q", k) -+ } -+ } -+ } -+ return "" -+} -+ - var errNilRequestURL = errors.New("http2: Request.URI is nil") - - // requires cc.wmu be held. -@@ -1912,19 +2072,14 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail - } - } - -- // Check for any invalid headers and return an error before we -+ // Check for any invalid headers+trailers and return an error before we - // potentially pollute our hpack state. (We want to be able to - // continue to reuse the hpack encoder for future requests) -- for k, vv := range req.Header { -- if !httpguts.ValidHeaderFieldName(k) { -- return nil, fmt.Errorf("invalid HTTP header name %q", k) -- } -- for _, v := range vv { -- if !httpguts.ValidHeaderFieldValue(v) { -- // Don't include the value in the error, because it may be sensitive. -- return nil, fmt.Errorf("invalid HTTP header value for header %q", k) -- } -- } -+ if err := validateHeaders(req.Header); err != "" { -+ return nil, fmt.Errorf("invalid HTTP header %s", err) -+ } -+ if err := validateHeaders(req.Trailer); err != "" { -+ return nil, fmt.Errorf("invalid HTTP trailer %s", err) - } - - enumerateHeaders := func(f func(name, value string)) { -@@ -2143,7 +2298,7 @@ func (cc *ClientConn) forgetStreamID(id uint32) { - } - // Wake up writeRequestBody via clientStream.awaitFlowControl and - // wake up RoundTrip if there is a pending request. -- cc.cond.Broadcast() -+ cc.condBroadcast() - - closeOnIdle := cc.singleUse || cc.doNotReuse || cc.t.disableKeepAlives() || cc.goAway != nil - if closeOnIdle && cc.streamsReserved == 0 && len(cc.streams) == 0 { -@@ -2231,7 +2386,7 @@ func (rl *clientConnReadLoop) cleanup() { - cs.abortStreamLocked(err) - } - } -- cc.cond.Broadcast() -+ cc.condBroadcast() - cc.mu.Unlock() - } - -@@ -2266,10 +2421,9 @@ func (rl *clientConnReadLoop) run() error { - cc := rl.cc - gotSettings := false - readIdleTimeout := cc.t.ReadIdleTimeout -- var t *time.Timer -+ var t timer - if readIdleTimeout != 0 { -- t = time.AfterFunc(readIdleTimeout, cc.healthCheck) -- defer t.Stop() -+ t = cc.afterFunc(readIdleTimeout, cc.healthCheck) - } - for { - f, err := cc.fr.ReadFrame() -@@ -2684,7 +2838,7 @@ func (rl *clientConnReadLoop) processData(f *DataFrame) error { - }) - return nil - } -- if !cs.firstByte { -+ if !cs.pastHeaders { - cc.logf("protocol error: received DATA before a HEADERS frame") - rl.endStreamError(cs, StreamError{ - StreamID: f.StreamID, -@@ -2867,7 +3021,7 @@ func (rl *clientConnReadLoop) processSettingsNoWrite(f *SettingsFrame) error { - for _, cs := range cc.streams { - cs.flow.add(delta) - } -- cc.cond.Broadcast() -+ cc.condBroadcast() - - cc.initialWindowSize = s.Val - case SettingHeaderTableSize: -@@ -2911,9 +3065,18 @@ func (rl *clientConnReadLoop) processWindowUpdate(f *WindowUpdateFrame) error { - fl = &cs.flow - } - if !fl.add(int32(f.Increment)) { -+ // For stream, the sender sends RST_STREAM with an error code of FLOW_CONTROL_ERROR -+ if cs != nil { -+ rl.endStreamError(cs, StreamError{ -+ StreamID: f.StreamID, -+ Code: ErrCodeFlowControl, -+ }) -+ return nil -+ } -+ - return ConnectionError(ErrCodeFlowControl) - } -- cc.cond.Broadcast() -+ cc.condBroadcast() - return nil - } - -@@ -2955,24 +3118,38 @@ func (cc *ClientConn) Ping(ctx context.Context) error { - } - cc.mu.Unlock() - } -- errc := make(chan error, 1) -- go func() { -+ var pingError error -+ errc := make(chan struct{}) -+ cc.goRun(func() { - cc.wmu.Lock() - defer cc.wmu.Unlock() -- if err := cc.fr.WritePing(false, p); err != nil { -- errc <- err -+ if pingError = cc.fr.WritePing(false, p); pingError != nil { -+ close(errc) - return - } -- if err := cc.bw.Flush(); err != nil { -- errc <- err -+ if pingError = cc.bw.Flush(); pingError != nil { -+ close(errc) - return - } -- }() -+ }) -+ if cc.syncHooks != nil { -+ cc.syncHooks.blockUntil(func() bool { -+ select { -+ case <-c: -+ case <-errc: -+ case <-ctx.Done(): -+ case <-cc.readerDone: -+ default: -+ return false -+ } -+ return true -+ }) -+ } - select { - case <-c: - return nil -- case err := <-errc: -- return err -+ case <-errc: -+ return pingError - case <-ctx.Done(): - return ctx.Err() - case <-cc.readerDone: -@@ -3141,9 +3318,17 @@ func (rt noDialH2RoundTripper) RoundTrip(req *http.Request) (*http.Response, err - } - - func (t *Transport) idleConnTimeout() time.Duration { -+ // to keep things backwards compatible, we use non-zero values of -+ // IdleConnTimeout, followed by using the IdleConnTimeout on the underlying -+ // http1 transport, followed by 0 -+ if t.IdleConnTimeout != 0 { -+ return t.IdleConnTimeout -+ } -+ - if t.t1 != nil { - return t.t1.IdleConnTimeout - } -+ - return 0 - } - -@@ -3201,3 +3386,34 @@ func traceFirstResponseByte(trace *httptrace.ClientTrace) { - trace.GotFirstResponseByte() - } - } -+ -+func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { -+ return trace != nil && trace.WroteHeaderField != nil -+} -+ -+func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) { -+ if trace != nil && trace.WroteHeaderField != nil { -+ trace.WroteHeaderField(k, []string{v}) -+ } -+} -+ -+func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { -+ if trace != nil { -+ return trace.Got1xxResponse -+ } -+ return nil -+} -+ -+// dialTLSWithContext uses tls.Dialer, added in Go 1.15, to open a TLS -+// connection. -+func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { -+ dialer := &tls.Dialer{ -+ Config: cfg, -+ } -+ cn, err := dialer.DialContext(ctx, network, addr) -+ if err != nil { -+ return nil, err -+ } -+ tlsCn := cn.(*tls.Conn) // DialContext comment promises this will always succeed -+ return tlsCn, nil -+} -diff --git a/vendor/golang.org/x/net/idna/go118.go b/vendor/golang.org/x/net/idna/go118.go -index c5c4338..712f1ad 100644 ---- a/vendor/golang.org/x/net/idna/go118.go -+++ b/vendor/golang.org/x/net/idna/go118.go -@@ -5,7 +5,6 @@ - // license that can be found in the LICENSE file. - - //go:build go1.18 --// +build go1.18 - - package idna - -diff --git a/vendor/golang.org/x/net/idna/idna10.0.0.go b/vendor/golang.org/x/net/idna/idna10.0.0.go -index 64ccf85..7b37178 100644 ---- a/vendor/golang.org/x/net/idna/idna10.0.0.go -+++ b/vendor/golang.org/x/net/idna/idna10.0.0.go -@@ -5,7 +5,6 @@ - // license that can be found in the LICENSE file. - - //go:build go1.10 --// +build go1.10 - - // Package idna implements IDNA2008 using the compatibility processing - // defined by UTS (Unicode Technical Standard) #46, which defines a standard to -diff --git a/vendor/golang.org/x/net/idna/idna9.0.0.go b/vendor/golang.org/x/net/idna/idna9.0.0.go -index ee1698c..cc6a892 100644 ---- a/vendor/golang.org/x/net/idna/idna9.0.0.go -+++ b/vendor/golang.org/x/net/idna/idna9.0.0.go -@@ -5,7 +5,6 @@ - // license that can be found in the LICENSE file. - - //go:build !go1.10 --// +build !go1.10 - - // Package idna implements IDNA2008 using the compatibility processing - // defined by UTS (Unicode Technical Standard) #46, which defines a standard to -diff --git a/vendor/golang.org/x/net/idna/pre_go118.go b/vendor/golang.org/x/net/idna/pre_go118.go -index 3aaccab..40e74bb 100644 ---- a/vendor/golang.org/x/net/idna/pre_go118.go -+++ b/vendor/golang.org/x/net/idna/pre_go118.go -@@ -5,7 +5,6 @@ - // license that can be found in the LICENSE file. - - //go:build !go1.18 --// +build !go1.18 - - package idna - -diff --git a/vendor/golang.org/x/net/idna/tables10.0.0.go b/vendor/golang.org/x/net/idna/tables10.0.0.go -index d1d62ef..c6c2bf1 100644 ---- a/vendor/golang.org/x/net/idna/tables10.0.0.go -+++ b/vendor/golang.org/x/net/idna/tables10.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.10 && !go1.13 --// +build go1.10,!go1.13 - - package idna - -diff --git a/vendor/golang.org/x/net/idna/tables11.0.0.go b/vendor/golang.org/x/net/idna/tables11.0.0.go -index 167efba..7678939 100644 ---- a/vendor/golang.org/x/net/idna/tables11.0.0.go -+++ b/vendor/golang.org/x/net/idna/tables11.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.13 && !go1.14 --// +build go1.13,!go1.14 - - package idna - -diff --git a/vendor/golang.org/x/net/idna/tables12.0.0.go b/vendor/golang.org/x/net/idna/tables12.0.0.go -index ab40f7b..0600cd2 100644 ---- a/vendor/golang.org/x/net/idna/tables12.0.0.go -+++ b/vendor/golang.org/x/net/idna/tables12.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.14 && !go1.16 --// +build go1.14,!go1.16 - - package idna - -diff --git a/vendor/golang.org/x/net/idna/tables13.0.0.go b/vendor/golang.org/x/net/idna/tables13.0.0.go -index 66701ea..2fb768e 100644 ---- a/vendor/golang.org/x/net/idna/tables13.0.0.go -+++ b/vendor/golang.org/x/net/idna/tables13.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.16 && !go1.21 --// +build go1.16,!go1.21 - - package idna - -diff --git a/vendor/golang.org/x/net/idna/tables15.0.0.go b/vendor/golang.org/x/net/idna/tables15.0.0.go -index 4003377..5ff05fe 100644 ---- a/vendor/golang.org/x/net/idna/tables15.0.0.go -+++ b/vendor/golang.org/x/net/idna/tables15.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.21 --// +build go1.21 - - package idna - -diff --git a/vendor/golang.org/x/net/idna/tables9.0.0.go b/vendor/golang.org/x/net/idna/tables9.0.0.go -index 4074b53..0f25e84 100644 ---- a/vendor/golang.org/x/net/idna/tables9.0.0.go -+++ b/vendor/golang.org/x/net/idna/tables9.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build !go1.10 --// +build !go1.10 - - package idna - -diff --git a/vendor/golang.org/x/net/idna/trie12.0.0.go b/vendor/golang.org/x/net/idna/trie12.0.0.go -index bb63f90..8a75b96 100644 ---- a/vendor/golang.org/x/net/idna/trie12.0.0.go -+++ b/vendor/golang.org/x/net/idna/trie12.0.0.go -@@ -5,7 +5,6 @@ - // license that can be found in the LICENSE file. - - //go:build !go1.16 --// +build !go1.16 - - package idna - -diff --git a/vendor/golang.org/x/net/idna/trie13.0.0.go b/vendor/golang.org/x/net/idna/trie13.0.0.go -index 7d68a8d..fa45bb9 100644 ---- a/vendor/golang.org/x/net/idna/trie13.0.0.go -+++ b/vendor/golang.org/x/net/idna/trie13.0.0.go -@@ -5,7 +5,6 @@ - // license that can be found in the LICENSE file. - - //go:build go1.16 --// +build go1.16 - - package idna - -diff --git a/vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go b/vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go -index c9b6993..73687de 100644 ---- a/vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go -+++ b/vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build go1.5 --// +build go1.5 - - package plan9 - -diff --git a/vendor/golang.org/x/sys/plan9/pwd_plan9.go b/vendor/golang.org/x/sys/plan9/pwd_plan9.go -index 98bf56b..fb94582 100644 ---- a/vendor/golang.org/x/sys/plan9/pwd_plan9.go -+++ b/vendor/golang.org/x/sys/plan9/pwd_plan9.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build !go1.5 --// +build !go1.5 - - package plan9 - -diff --git a/vendor/golang.org/x/sys/plan9/race.go b/vendor/golang.org/x/sys/plan9/race.go -index 62377d2..c02d9ed 100644 ---- a/vendor/golang.org/x/sys/plan9/race.go -+++ b/vendor/golang.org/x/sys/plan9/race.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build plan9 && race --// +build plan9,race - - package plan9 - -diff --git a/vendor/golang.org/x/sys/plan9/race0.go b/vendor/golang.org/x/sys/plan9/race0.go -index f8da308..7b15e15 100644 ---- a/vendor/golang.org/x/sys/plan9/race0.go -+++ b/vendor/golang.org/x/sys/plan9/race0.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build plan9 && !race --// +build plan9,!race - - package plan9 - -diff --git a/vendor/golang.org/x/sys/plan9/str.go b/vendor/golang.org/x/sys/plan9/str.go -index 55fa8d0..ba3e8ff 100644 ---- a/vendor/golang.org/x/sys/plan9/str.go -+++ b/vendor/golang.org/x/sys/plan9/str.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build plan9 --// +build plan9 - - package plan9 - -diff --git a/vendor/golang.org/x/sys/plan9/syscall.go b/vendor/golang.org/x/sys/plan9/syscall.go -index 67e5b01..d631fd6 100644 ---- a/vendor/golang.org/x/sys/plan9/syscall.go -+++ b/vendor/golang.org/x/sys/plan9/syscall.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build plan9 --// +build plan9 - - // Package plan9 contains an interface to the low-level operating system - // primitives. OS details vary depending on the underlying system, and -diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go -index 3f40b9b..f780d5c 100644 ---- a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go -+++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build plan9 && 386 --// +build plan9,386 - - package plan9 - -diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go -index 0e6a96a..7de6106 100644 ---- a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go -+++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build plan9 && amd64 --// +build plan9,amd64 - - package plan9 - -diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go -index 244c501..ea85780 100644 ---- a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go -+++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build plan9 && arm --// +build plan9,arm - - package plan9 - -diff --git a/vendor/golang.org/x/sys/unix/aliases.go b/vendor/golang.org/x/sys/unix/aliases.go -index abc89c1..b0e4198 100644 ---- a/vendor/golang.org/x/sys/unix/aliases.go -+++ b/vendor/golang.org/x/sys/unix/aliases.go -@@ -2,9 +2,7 @@ - // Use of this source code is governed by a BSD-style - // license that can be found in the LICENSE file. - --//go:build (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos) && go1.9 --// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos --// +build go1.9 -+//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/asm_aix_ppc64.s b/vendor/golang.org/x/sys/unix/asm_aix_ppc64.s -index db9171c..269e173 100644 ---- a/vendor/golang.org/x/sys/unix/asm_aix_ppc64.s -+++ b/vendor/golang.org/x/sys/unix/asm_aix_ppc64.s -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build gc --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_386.s b/vendor/golang.org/x/sys/unix/asm_bsd_386.s -index e0fcd9b..a4fcef0 100644 ---- a/vendor/golang.org/x/sys/unix/asm_bsd_386.s -+++ b/vendor/golang.org/x/sys/unix/asm_bsd_386.s -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build (freebsd || netbsd || openbsd) && gc --// +build freebsd netbsd openbsd --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_amd64.s b/vendor/golang.org/x/sys/unix/asm_bsd_amd64.s -index 2b99c34..1e63615 100644 ---- a/vendor/golang.org/x/sys/unix/asm_bsd_amd64.s -+++ b/vendor/golang.org/x/sys/unix/asm_bsd_amd64.s -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build (darwin || dragonfly || freebsd || netbsd || openbsd) && gc --// +build darwin dragonfly freebsd netbsd openbsd --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_arm.s b/vendor/golang.org/x/sys/unix/asm_bsd_arm.s -index d702d4a..6496c31 100644 ---- a/vendor/golang.org/x/sys/unix/asm_bsd_arm.s -+++ b/vendor/golang.org/x/sys/unix/asm_bsd_arm.s -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build (freebsd || netbsd || openbsd) && gc --// +build freebsd netbsd openbsd --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_arm64.s b/vendor/golang.org/x/sys/unix/asm_bsd_arm64.s -index fe36a73..4fd1f54 100644 ---- a/vendor/golang.org/x/sys/unix/asm_bsd_arm64.s -+++ b/vendor/golang.org/x/sys/unix/asm_bsd_arm64.s -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build (darwin || freebsd || netbsd || openbsd) && gc --// +build darwin freebsd netbsd openbsd --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s b/vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s -index e5b9a84..42f7eb9 100644 ---- a/vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s -+++ b/vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build (darwin || freebsd || netbsd || openbsd) && gc --// +build darwin freebsd netbsd openbsd --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s b/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s -index d560019..f890266 100644 ---- a/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s -+++ b/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build (darwin || freebsd || netbsd || openbsd) && gc --// +build darwin freebsd netbsd openbsd --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_linux_386.s b/vendor/golang.org/x/sys/unix/asm_linux_386.s -index 8fd101d..3b47348 100644 ---- a/vendor/golang.org/x/sys/unix/asm_linux_386.s -+++ b/vendor/golang.org/x/sys/unix/asm_linux_386.s -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build gc --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_linux_amd64.s b/vendor/golang.org/x/sys/unix/asm_linux_amd64.s -index 7ed38e4..67e29f3 100644 ---- a/vendor/golang.org/x/sys/unix/asm_linux_amd64.s -+++ b/vendor/golang.org/x/sys/unix/asm_linux_amd64.s -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build gc --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_linux_arm.s b/vendor/golang.org/x/sys/unix/asm_linux_arm.s -index 8ef1d51..d6ae269 100644 ---- a/vendor/golang.org/x/sys/unix/asm_linux_arm.s -+++ b/vendor/golang.org/x/sys/unix/asm_linux_arm.s -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build gc --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_linux_arm64.s b/vendor/golang.org/x/sys/unix/asm_linux_arm64.s -index 98ae027..01e5e25 100644 ---- a/vendor/golang.org/x/sys/unix/asm_linux_arm64.s -+++ b/vendor/golang.org/x/sys/unix/asm_linux_arm64.s -@@ -3,9 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && arm64 && gc --// +build linux --// +build arm64 --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_linux_loong64.s b/vendor/golang.org/x/sys/unix/asm_linux_loong64.s -index 5653572..2abf12f 100644 ---- a/vendor/golang.org/x/sys/unix/asm_linux_loong64.s -+++ b/vendor/golang.org/x/sys/unix/asm_linux_loong64.s -@@ -3,9 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && loong64 && gc --// +build linux --// +build loong64 --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s b/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s -index 21231d2..f84bae7 100644 ---- a/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s -+++ b/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s -@@ -3,9 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && (mips64 || mips64le) && gc --// +build linux --// +build mips64 mips64le --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s b/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s -index 6783b26..f08f628 100644 ---- a/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s -+++ b/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s -@@ -3,9 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && (mips || mipsle) && gc --// +build linux --// +build mips mipsle --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s b/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s -index 19d4989..bdfc024 100644 ---- a/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s -+++ b/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s -@@ -3,9 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && (ppc64 || ppc64le) && gc --// +build linux --// +build ppc64 ppc64le --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s b/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s -index e42eb81..2e8c996 100644 ---- a/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s -+++ b/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build riscv64 && gc --// +build riscv64 --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_linux_s390x.s b/vendor/golang.org/x/sys/unix/asm_linux_s390x.s -index c46aab3..2c394b1 100644 ---- a/vendor/golang.org/x/sys/unix/asm_linux_s390x.s -+++ b/vendor/golang.org/x/sys/unix/asm_linux_s390x.s -@@ -3,9 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && s390x && gc --// +build linux --// +build s390x --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s b/vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s -index 5e7a116..fab586a 100644 ---- a/vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s -+++ b/vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build gc --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s b/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s -index f8c5394..f949ec5 100644 ---- a/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s -+++ b/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build gc --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/asm_zos_s390x.s b/vendor/golang.org/x/sys/unix/asm_zos_s390x.s -index 3b54e18..2f67ba8 100644 ---- a/vendor/golang.org/x/sys/unix/asm_zos_s390x.s -+++ b/vendor/golang.org/x/sys/unix/asm_zos_s390x.s -@@ -3,9 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build zos && s390x && gc --// +build zos --// +build s390x --// +build gc - - #include "textflag.h" - -diff --git a/vendor/golang.org/x/sys/unix/cap_freebsd.go b/vendor/golang.org/x/sys/unix/cap_freebsd.go -index 0b7c6ad..a086578 100644 ---- a/vendor/golang.org/x/sys/unix/cap_freebsd.go -+++ b/vendor/golang.org/x/sys/unix/cap_freebsd.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build freebsd --// +build freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/constants.go b/vendor/golang.org/x/sys/unix/constants.go -index 394a396..6fb7cb7 100644 ---- a/vendor/golang.org/x/sys/unix/constants.go -+++ b/vendor/golang.org/x/sys/unix/constants.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos --// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/dev_aix_ppc.go b/vendor/golang.org/x/sys/unix/dev_aix_ppc.go -index 65a9985..d785134 100644 ---- a/vendor/golang.org/x/sys/unix/dev_aix_ppc.go -+++ b/vendor/golang.org/x/sys/unix/dev_aix_ppc.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix && ppc --// +build aix,ppc - - // Functions to access/create device major and minor numbers matching the - // encoding used by AIX. -diff --git a/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go b/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go -index 8fc08ad..623a5e6 100644 ---- a/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix && ppc64 --// +build aix,ppc64 - - // Functions to access/create device major and minor numbers matching the - // encoding used AIX. -diff --git a/vendor/golang.org/x/sys/unix/dev_zos.go b/vendor/golang.org/x/sys/unix/dev_zos.go -index a388e59..bb6a64f 100644 ---- a/vendor/golang.org/x/sys/unix/dev_zos.go -+++ b/vendor/golang.org/x/sys/unix/dev_zos.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build zos && s390x --// +build zos,s390x - - // Functions to access/create device major and minor numbers matching the - // encoding used by z/OS. -diff --git a/vendor/golang.org/x/sys/unix/dirent.go b/vendor/golang.org/x/sys/unix/dirent.go -index 2499f97..1ebf117 100644 ---- a/vendor/golang.org/x/sys/unix/dirent.go -+++ b/vendor/golang.org/x/sys/unix/dirent.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos --// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/endian_big.go b/vendor/golang.org/x/sys/unix/endian_big.go -index a520265..1095fd3 100644 ---- a/vendor/golang.org/x/sys/unix/endian_big.go -+++ b/vendor/golang.org/x/sys/unix/endian_big.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - // - //go:build armbe || arm64be || m68k || mips || mips64 || mips64p32 || ppc || ppc64 || s390 || s390x || shbe || sparc || sparc64 --// +build armbe arm64be m68k mips mips64 mips64p32 ppc ppc64 s390 s390x shbe sparc sparc64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/endian_little.go b/vendor/golang.org/x/sys/unix/endian_little.go -index b0f2bc4..b9f0e27 100644 ---- a/vendor/golang.org/x/sys/unix/endian_little.go -+++ b/vendor/golang.org/x/sys/unix/endian_little.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - // - //go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh --// +build 386 amd64 amd64p32 alpha arm arm64 loong64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/env_unix.go b/vendor/golang.org/x/sys/unix/env_unix.go -index 29ccc4d..a96da71 100644 ---- a/vendor/golang.org/x/sys/unix/env_unix.go -+++ b/vendor/golang.org/x/sys/unix/env_unix.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos --// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos - - // Unix environment variables. - -diff --git a/vendor/golang.org/x/sys/unix/epoll_zos.go b/vendor/golang.org/x/sys/unix/epoll_zos.go -index cedaf7e..7753fdd 100644 ---- a/vendor/golang.org/x/sys/unix/epoll_zos.go -+++ b/vendor/golang.org/x/sys/unix/epoll_zos.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build zos && s390x --// +build zos,s390x - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/fcntl.go b/vendor/golang.org/x/sys/unix/fcntl.go -index e9b9912..6200876 100644 ---- a/vendor/golang.org/x/sys/unix/fcntl.go -+++ b/vendor/golang.org/x/sys/unix/fcntl.go -@@ -2,8 +2,7 @@ - // Use of this source code is governed by a BSD-style - // license that can be found in the LICENSE file. - --//go:build dragonfly || freebsd || linux || netbsd || openbsd --// +build dragonfly freebsd linux netbsd openbsd -+//go:build dragonfly || freebsd || linux || netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go b/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go -index 29d4480..13b4acd 100644 ---- a/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go -+++ b/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build (linux && 386) || (linux && arm) || (linux && mips) || (linux && mipsle) || (linux && ppc) --// +build linux,386 linux,arm linux,mips linux,mipsle linux,ppc - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/fdset.go b/vendor/golang.org/x/sys/unix/fdset.go -index a8068f9..9e83d18 100644 ---- a/vendor/golang.org/x/sys/unix/fdset.go -+++ b/vendor/golang.org/x/sys/unix/fdset.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos --// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/fstatfs_zos.go b/vendor/golang.org/x/sys/unix/fstatfs_zos.go -index e377cc9..c8bde60 100644 ---- a/vendor/golang.org/x/sys/unix/fstatfs_zos.go -+++ b/vendor/golang.org/x/sys/unix/fstatfs_zos.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build zos && s390x --// +build zos,s390x - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/gccgo.go b/vendor/golang.org/x/sys/unix/gccgo.go -index b06f52d..aca5721 100644 ---- a/vendor/golang.org/x/sys/unix/gccgo.go -+++ b/vendor/golang.org/x/sys/unix/gccgo.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build gccgo && !aix && !hurd --// +build gccgo,!aix,!hurd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/gccgo_c.c b/vendor/golang.org/x/sys/unix/gccgo_c.c -index f98a1c5..d468b7b 100644 ---- a/vendor/golang.org/x/sys/unix/gccgo_c.c -+++ b/vendor/golang.org/x/sys/unix/gccgo_c.c -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build gccgo && !aix && !hurd --// +build gccgo,!aix,!hurd - - #include - #include -diff --git a/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go b/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go -index e60e49a..972d61b 100644 ---- a/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go -+++ b/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build gccgo && linux && amd64 --// +build gccgo,linux,amd64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ifreq_linux.go b/vendor/golang.org/x/sys/unix/ifreq_linux.go -index 15721a5..848840a 100644 ---- a/vendor/golang.org/x/sys/unix/ifreq_linux.go -+++ b/vendor/golang.org/x/sys/unix/ifreq_linux.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux --// +build linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ioctl_linux.go b/vendor/golang.org/x/sys/unix/ioctl_linux.go -index 0d12c08..dbe680e 100644 ---- a/vendor/golang.org/x/sys/unix/ioctl_linux.go -+++ b/vendor/golang.org/x/sys/unix/ioctl_linux.go -@@ -231,3 +231,8 @@ func IoctlLoopGetStatus64(fd int) (*LoopInfo64, error) { - func IoctlLoopSetStatus64(fd int, value *LoopInfo64) error { - return ioctlPtr(fd, LOOP_SET_STATUS64, unsafe.Pointer(value)) - } -+ -+// IoctlLoopConfigure configures all loop device parameters in a single step -+func IoctlLoopConfigure(fd int, value *LoopConfig) error { -+ return ioctlPtr(fd, LOOP_CONFIGURE, unsafe.Pointer(value)) -+} -diff --git a/vendor/golang.org/x/sys/unix/ioctl_signed.go b/vendor/golang.org/x/sys/unix/ioctl_signed.go -index 7def958..5b0759b 100644 ---- a/vendor/golang.org/x/sys/unix/ioctl_signed.go -+++ b/vendor/golang.org/x/sys/unix/ioctl_signed.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || solaris --// +build aix solaris - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ioctl_unsigned.go b/vendor/golang.org/x/sys/unix/ioctl_unsigned.go -index 649913d..20f470b 100644 ---- a/vendor/golang.org/x/sys/unix/ioctl_unsigned.go -+++ b/vendor/golang.org/x/sys/unix/ioctl_unsigned.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build darwin || dragonfly || freebsd || hurd || linux || netbsd || openbsd --// +build darwin dragonfly freebsd hurd linux netbsd openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ioctl_zos.go b/vendor/golang.org/x/sys/unix/ioctl_zos.go -index cdc21bf..c8b2a75 100644 ---- a/vendor/golang.org/x/sys/unix/ioctl_zos.go -+++ b/vendor/golang.org/x/sys/unix/ioctl_zos.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build zos && s390x --// +build zos,s390x - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh -index 47fa6a7..fdcaa97 100644 ---- a/vendor/golang.org/x/sys/unix/mkerrors.sh -+++ b/vendor/golang.org/x/sys/unix/mkerrors.sh -@@ -248,6 +248,7 @@ struct ltchars { - #include - #include - #include -+#include - #include - #include - #include -@@ -283,10 +284,6 @@ struct ltchars { - #include - #endif - --#ifndef MSG_FASTOPEN --#define MSG_FASTOPEN 0x20000000 --#endif -- - #ifndef PTRACE_GETREGS - #define PTRACE_GETREGS 0xc - #endif -@@ -295,14 +292,6 @@ struct ltchars { - #define PTRACE_SETREGS 0xd - #endif - --#ifndef SOL_NETLINK --#define SOL_NETLINK 270 --#endif -- --#ifndef SOL_SMC --#define SOL_SMC 286 --#endif -- - #ifdef SOL_BLUETOOTH - // SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h - // but it is already in bluetooth_linux.go -@@ -319,10 +308,23 @@ struct ltchars { - #undef TIPC_WAIT_FOREVER - #define TIPC_WAIT_FOREVER 0xffffffff - --// Copied from linux/l2tp.h --// Including linux/l2tp.h here causes conflicts between linux/in.h --// and netinet/in.h included via net/route.h above. --#define IPPROTO_L2TP 115 -+// Copied from linux/netfilter/nf_nat.h -+// Including linux/netfilter/nf_nat.h here causes conflicts between linux/in.h -+// and netinet/in.h. -+#define NF_NAT_RANGE_MAP_IPS (1 << 0) -+#define NF_NAT_RANGE_PROTO_SPECIFIED (1 << 1) -+#define NF_NAT_RANGE_PROTO_RANDOM (1 << 2) -+#define NF_NAT_RANGE_PERSISTENT (1 << 3) -+#define NF_NAT_RANGE_PROTO_RANDOM_FULLY (1 << 4) -+#define NF_NAT_RANGE_PROTO_OFFSET (1 << 5) -+#define NF_NAT_RANGE_NETMAP (1 << 6) -+#define NF_NAT_RANGE_PROTO_RANDOM_ALL \ -+ (NF_NAT_RANGE_PROTO_RANDOM | NF_NAT_RANGE_PROTO_RANDOM_FULLY) -+#define NF_NAT_RANGE_MASK \ -+ (NF_NAT_RANGE_MAP_IPS | NF_NAT_RANGE_PROTO_SPECIFIED | \ -+ NF_NAT_RANGE_PROTO_RANDOM | NF_NAT_RANGE_PERSISTENT | \ -+ NF_NAT_RANGE_PROTO_RANDOM_FULLY | NF_NAT_RANGE_PROTO_OFFSET | \ -+ NF_NAT_RANGE_NETMAP) - - // Copied from linux/hid.h. - // Keep in sync with the size of the referenced fields. -@@ -519,6 +521,7 @@ ccflags="$@" - $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || - $2 ~ /^LO_(KEY|NAME)_SIZE$/ || - $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || -+ $2 == "LOOP_CONFIGURE" || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MREMAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || - $2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ || - $2 ~ /^NFC_.*_(MAX)?SIZE$/ || -@@ -560,7 +563,7 @@ ccflags="$@" - $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || - $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || - $2 ~ /^CLONE_[A-Z_]+/ || -- $2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ && -+ $2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+|BPF_F_LINK)$/ && - $2 ~ /^(BPF|DLT)_/ || - $2 ~ /^AUDIT_/ || - $2 ~ /^(CLOCK|TIMER)_/ || -@@ -581,7 +584,7 @@ ccflags="$@" - $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || - $2 ~ /^KEYCTL_/ || - $2 ~ /^PERF_/ || -- $2 ~ /^SECCOMP_MODE_/ || -+ $2 ~ /^SECCOMP_/ || - $2 ~ /^SEEK_/ || - $2 ~ /^SCHED_/ || - $2 ~ /^SPLICE_/ || -@@ -602,6 +605,9 @@ ccflags="$@" - $2 ~ /^FSOPT_/ || - $2 ~ /^WDIO[CFS]_/ || - $2 ~ /^NFN/ || -+ $2 !~ /^NFT_META_IIFTYPE/ && -+ $2 ~ /^NFT_/ || -+ $2 ~ /^NF_NAT_/ || - $2 ~ /^XDP_/ || - $2 ~ /^RWF_/ || - $2 ~ /^(HDIO|WIN|SMART)_/ || -@@ -663,7 +669,6 @@ echo '// mkerrors.sh' "$@" - echo '// Code generated by the command above; see README.md. DO NOT EDIT.' - echo - echo "//go:build ${GOARCH} && ${GOOS}" --echo "// +build ${GOARCH},${GOOS}" - echo - go tool cgo -godefs -- "$@" _const.go >_error.out - cat _error.out | grep -vf _error.grep | grep -vf _signal.grep -diff --git a/vendor/golang.org/x/sys/unix/mmap_nomremap.go b/vendor/golang.org/x/sys/unix/mmap_nomremap.go -index ca05136..4b68e59 100644 ---- a/vendor/golang.org/x/sys/unix/mmap_nomremap.go -+++ b/vendor/golang.org/x/sys/unix/mmap_nomremap.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || dragonfly || freebsd || openbsd || solaris --// +build aix darwin dragonfly freebsd openbsd solaris - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/mremap.go b/vendor/golang.org/x/sys/unix/mremap.go -index fa93d0a..fd45fe5 100644 ---- a/vendor/golang.org/x/sys/unix/mremap.go -+++ b/vendor/golang.org/x/sys/unix/mremap.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux || netbsd --// +build linux netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/pagesize_unix.go b/vendor/golang.org/x/sys/unix/pagesize_unix.go -index 53f1b4c..4d0a343 100644 ---- a/vendor/golang.org/x/sys/unix/pagesize_unix.go -+++ b/vendor/golang.org/x/sys/unix/pagesize_unix.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris --// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris - - // For Unix, get the pagesize from the runtime. - -diff --git a/vendor/golang.org/x/sys/unix/pledge_openbsd.go b/vendor/golang.org/x/sys/unix/pledge_openbsd.go -index eb48294..6a09af5 100644 ---- a/vendor/golang.org/x/sys/unix/pledge_openbsd.go -+++ b/vendor/golang.org/x/sys/unix/pledge_openbsd.go -@@ -8,54 +8,31 @@ import ( - "errors" - "fmt" - "strconv" -- "syscall" -- "unsafe" - ) - - // Pledge implements the pledge syscall. - // --// The pledge syscall does not accept execpromises on OpenBSD releases --// before 6.3. --// --// execpromises must be empty when Pledge is called on OpenBSD --// releases predating 6.3, otherwise an error will be returned. -+// This changes both the promises and execpromises; use PledgePromises or -+// PledgeExecpromises to only change the promises or execpromises -+// respectively. - // - // For more information see pledge(2). - func Pledge(promises, execpromises string) error { -- maj, min, err := majmin() -- if err != nil { -+ if err := pledgeAvailable(); err != nil { - return err - } - -- err = pledgeAvailable(maj, min, execpromises) -+ pptr, err := BytePtrFromString(promises) - if err != nil { - return err - } - -- pptr, err := syscall.BytePtrFromString(promises) -+ exptr, err := BytePtrFromString(execpromises) - if err != nil { - return err - } - -- // This variable will hold either a nil unsafe.Pointer or -- // an unsafe.Pointer to a string (execpromises). -- var expr unsafe.Pointer -- -- // If we're running on OpenBSD > 6.2, pass execpromises to the syscall. -- if maj > 6 || (maj == 6 && min > 2) { -- exptr, err := syscall.BytePtrFromString(execpromises) -- if err != nil { -- return err -- } -- expr = unsafe.Pointer(exptr) -- } -- -- _, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0) -- if e != 0 { -- return e -- } -- -- return nil -+ return pledge(pptr, exptr) - } - - // PledgePromises implements the pledge syscall. -@@ -64,30 +41,16 @@ func Pledge(promises, execpromises string) error { - // - // For more information see pledge(2). - func PledgePromises(promises string) error { -- maj, min, err := majmin() -- if err != nil { -- return err -- } -- -- err = pledgeAvailable(maj, min, "") -- if err != nil { -+ if err := pledgeAvailable(); err != nil { - return err - } - -- // This variable holds the execpromises and is always nil. -- var expr unsafe.Pointer -- -- pptr, err := syscall.BytePtrFromString(promises) -+ pptr, err := BytePtrFromString(promises) - if err != nil { - return err - } - -- _, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0) -- if e != 0 { -- return e -- } -- -- return nil -+ return pledge(pptr, nil) - } - - // PledgeExecpromises implements the pledge syscall. -@@ -96,30 +59,16 @@ func PledgePromises(promises string) error { - // - // For more information see pledge(2). - func PledgeExecpromises(execpromises string) error { -- maj, min, err := majmin() -- if err != nil { -+ if err := pledgeAvailable(); err != nil { - return err - } - -- err = pledgeAvailable(maj, min, execpromises) -+ exptr, err := BytePtrFromString(execpromises) - if err != nil { - return err - } - -- // This variable holds the promises and is always nil. -- var pptr unsafe.Pointer -- -- exptr, err := syscall.BytePtrFromString(execpromises) -- if err != nil { -- return err -- } -- -- _, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(pptr), uintptr(unsafe.Pointer(exptr)), 0) -- if e != 0 { -- return e -- } -- -- return nil -+ return pledge(nil, exptr) - } - - // majmin returns major and minor version number for an OpenBSD system. -@@ -147,16 +96,15 @@ func majmin() (major int, minor int, err error) { - - // pledgeAvailable checks for availability of the pledge(2) syscall - // based on the running OpenBSD version. --func pledgeAvailable(maj, min int, execpromises string) error { -- // If OpenBSD <= 5.9, pledge is not available. -- if (maj == 5 && min != 9) || maj < 5 { -- return fmt.Errorf("pledge syscall is not available on OpenBSD %d.%d", maj, min) -+func pledgeAvailable() error { -+ maj, min, err := majmin() -+ if err != nil { -+ return err - } - -- // If OpenBSD <= 6.2 and execpromises is not empty, -- // return an error - execpromises is not available before 6.3 -- if (maj < 6 || (maj == 6 && min <= 2)) && execpromises != "" { -- return fmt.Errorf("cannot use execpromises on OpenBSD %d.%d", maj, min) -+ // Require OpenBSD 6.4 as a minimum. -+ if maj < 6 || (maj == 6 && min <= 3) { -+ return fmt.Errorf("cannot call Pledge on OpenBSD %d.%d", maj, min) - } - - return nil -diff --git a/vendor/golang.org/x/sys/unix/ptrace_darwin.go b/vendor/golang.org/x/sys/unix/ptrace_darwin.go -index 463c3ef..3f0975f 100644 ---- a/vendor/golang.org/x/sys/unix/ptrace_darwin.go -+++ b/vendor/golang.org/x/sys/unix/ptrace_darwin.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build darwin && !ios --// +build darwin,!ios - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ptrace_ios.go b/vendor/golang.org/x/sys/unix/ptrace_ios.go -index ed0509a..a4d35db 100644 ---- a/vendor/golang.org/x/sys/unix/ptrace_ios.go -+++ b/vendor/golang.org/x/sys/unix/ptrace_ios.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build ios --// +build ios - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/race.go b/vendor/golang.org/x/sys/unix/race.go -index 6f6c5fe..714d2aa 100644 ---- a/vendor/golang.org/x/sys/unix/race.go -+++ b/vendor/golang.org/x/sys/unix/race.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build (darwin && race) || (linux && race) || (freebsd && race) --// +build darwin,race linux,race freebsd,race - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/race0.go b/vendor/golang.org/x/sys/unix/race0.go -index 706e132..4a9f663 100644 ---- a/vendor/golang.org/x/sys/unix/race0.go -+++ b/vendor/golang.org/x/sys/unix/race0.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || (darwin && !race) || (linux && !race) || (freebsd && !race) || netbsd || openbsd || solaris || dragonfly || zos --// +build aix darwin,!race linux,!race freebsd,!race netbsd openbsd solaris dragonfly zos - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/readdirent_getdents.go b/vendor/golang.org/x/sys/unix/readdirent_getdents.go -index 4d62575..dbd2b6c 100644 ---- a/vendor/golang.org/x/sys/unix/readdirent_getdents.go -+++ b/vendor/golang.org/x/sys/unix/readdirent_getdents.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || dragonfly || freebsd || linux || netbsd || openbsd --// +build aix dragonfly freebsd linux netbsd openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go b/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go -index 2a4ba47..130398b 100644 ---- a/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go -+++ b/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build darwin --// +build darwin - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_unix.go b/vendor/golang.org/x/sys/unix/sockcmsg_unix.go -index 3865943..c3a62db 100644 ---- a/vendor/golang.org/x/sys/unix/sockcmsg_unix.go -+++ b/vendor/golang.org/x/sys/unix/sockcmsg_unix.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos --// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos - - // Socket control messages - -diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go b/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go -index 0840fe4..4a1eab3 100644 ---- a/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go -+++ b/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || freebsd || linux || netbsd || openbsd || solaris || zos --// +build aix darwin freebsd linux netbsd openbsd solaris zos - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall.go b/vendor/golang.org/x/sys/unix/syscall.go -index 63e8c83..5ea74da 100644 ---- a/vendor/golang.org/x/sys/unix/syscall.go -+++ b/vendor/golang.org/x/sys/unix/syscall.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos --// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos - - // Package unix contains an interface to the low-level operating system - // primitives. OS details vary depending on the underlying system, and -diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go -index e94e6cd..67ce6ce 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_aix.go -+++ b/vendor/golang.org/x/sys/unix/syscall_aix.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix --// +build aix - - // Aix system calls. - // This file is compiled as ordinary Go code, -@@ -107,7 +106,8 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { - if n > 0 { - sl += _Socklen(n) + 1 - } -- if sa.raw.Path[0] == '@' { -+ if sa.raw.Path[0] == '@' || (sa.raw.Path[0] == 0 && sl > 3) { -+ // Check sl > 3 so we don't change unnamed socket behavior. - sa.raw.Path[0] = 0 - // Don't count trailing NUL for abstract address. - sl-- -diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go -index f2871fa..1fdaa47 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go -+++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix && ppc --// +build aix,ppc - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go -index 75718ec..c87f9a9 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix && ppc64 --// +build aix,ppc64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go -index 4217de5..a00c3e5 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_bsd.go -+++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build darwin || dragonfly || freebsd || netbsd || openbsd --// +build darwin dragonfly freebsd netbsd openbsd - - // BSD system call wrappers shared by *BSD based systems - // including OS X (Darwin) and FreeBSD. Like the other -@@ -317,7 +316,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { - if err != nil { - return "", err - } -- return string(buf[:vallen-1]), nil -+ return ByteSliceToString(buf[:vallen]), nil - } - - //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) -diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go -index b37310c..0eaecf5 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build amd64 && darwin --// +build amd64,darwin - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go -index d51ec99..f36c670 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build arm64 && darwin --// +build arm64,darwin - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go b/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go -index 53c9664..2f0fa76 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go -+++ b/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go -@@ -2,8 +2,7 @@ - // Use of this source code is governed by a BSD-style - // license that can be found in the LICENSE file. - --//go:build darwin && go1.12 --// +build darwin,go1.12 -+//go:build darwin - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go -index 4e2d321..14bab6b 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build amd64 && dragonfly --// +build amd64,dragonfly - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go -index 64d1bb4..2b57e0f 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go -+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go -@@ -13,6 +13,7 @@ - package unix - - import ( -+ "errors" - "sync" - "unsafe" - ) -@@ -169,25 +170,26 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { - func Uname(uname *Utsname) error { - mib := []_C_int{CTL_KERN, KERN_OSTYPE} - n := unsafe.Sizeof(uname.Sysname) -- if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { -+ // Suppress ENOMEM errors to be compatible with the C library __xuname() implementation. -+ if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil && !errors.Is(err, ENOMEM) { - return err - } - - mib = []_C_int{CTL_KERN, KERN_HOSTNAME} - n = unsafe.Sizeof(uname.Nodename) -- if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { -+ if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil && !errors.Is(err, ENOMEM) { - return err - } - - mib = []_C_int{CTL_KERN, KERN_OSRELEASE} - n = unsafe.Sizeof(uname.Release) -- if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { -+ if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil && !errors.Is(err, ENOMEM) { - return err - } - - mib = []_C_int{CTL_KERN, KERN_VERSION} - n = unsafe.Sizeof(uname.Version) -- if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { -+ if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil && !errors.Is(err, ENOMEM) { - return err - } - -@@ -205,7 +207,7 @@ func Uname(uname *Utsname) error { - - mib = []_C_int{CTL_HW, HW_MACHINE} - n = unsafe.Sizeof(uname.Machine) -- if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { -+ if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil && !errors.Is(err, ENOMEM) { - return err - } - -diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go -index b8da510..3967bca 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go -+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build 386 && freebsd --// +build 386,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go -index 47155c4..eff19ad 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build amd64 && freebsd --// +build amd64,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go -index 0893209..4f24b51 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build arm && freebsd --// +build arm,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go -index d151a0d..ac30759 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build arm64 && freebsd --// +build arm64,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go -index d5cd64b..aab725c 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build riscv64 && freebsd --// +build riscv64,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_hurd.go b/vendor/golang.org/x/sys/unix/syscall_hurd.go -index 381fd46..ba46651 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_hurd.go -+++ b/vendor/golang.org/x/sys/unix/syscall_hurd.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build hurd --// +build hurd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_hurd_386.go b/vendor/golang.org/x/sys/unix/syscall_hurd_386.go -index 7cf54a3..df89f9e 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_hurd_386.go -+++ b/vendor/golang.org/x/sys/unix/syscall_hurd_386.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build 386 && hurd --// +build 386,hurd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_illumos.go b/vendor/golang.org/x/sys/unix/syscall_illumos.go -index 87db5a6..a863f70 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_illumos.go -+++ b/vendor/golang.org/x/sys/unix/syscall_illumos.go -@@ -5,7 +5,6 @@ - // illumos system calls not present on Solaris. - - //go:build amd64 && illumos --// +build amd64,illumos - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go -index fb4e502..5682e26 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux.go -@@ -61,15 +61,23 @@ func FanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname string) ( - } - - //sys fchmodat(dirfd int, path string, mode uint32) (err error) -- --func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { -- // Linux fchmodat doesn't support the flags parameter. Mimick glibc's behavior -- // and check the flags. Otherwise the mode would be applied to the symlink -- // destination which is not what the user expects. -- if flags&^AT_SYMLINK_NOFOLLOW != 0 { -- return EINVAL -- } else if flags&AT_SYMLINK_NOFOLLOW != 0 { -- return EOPNOTSUPP -+//sys fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) -+ -+func Fchmodat(dirfd int, path string, mode uint32, flags int) error { -+ // Linux fchmodat doesn't support the flags parameter, but fchmodat2 does. -+ // Try fchmodat2 if flags are specified. -+ if flags != 0 { -+ err := fchmodat2(dirfd, path, mode, flags) -+ if err == ENOSYS { -+ // fchmodat2 isn't available. If the flags are known to be valid, -+ // return EOPNOTSUPP to indicate that fchmodat doesn't support them. -+ if flags&^(AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) != 0 { -+ return EINVAL -+ } else if flags&(AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) != 0 { -+ return EOPNOTSUPP -+ } -+ } -+ return err - } - return fchmodat(dirfd, path, mode) - } -@@ -417,7 +425,8 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { - if n > 0 { - sl += _Socklen(n) + 1 - } -- if sa.raw.Path[0] == '@' { -+ if sa.raw.Path[0] == '@' || (sa.raw.Path[0] == 0 && sl > 3) { -+ // Check sl > 3 so we don't change unnamed socket behavior. - sa.raw.Path[0] = 0 - // Don't count trailing NUL for abstract address. - sl-- -@@ -1301,7 +1310,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { - return "", err - } - } -- return string(buf[:vallen-1]), nil -+ return ByteSliceToString(buf[:vallen]), nil - } - - func GetsockoptTpacketStats(fd, level, opt int) (*TpacketStats, error) { -@@ -1840,6 +1849,105 @@ func Dup2(oldfd, newfd int) error { - //sys Fsmount(fd int, flags int, mountAttrs int) (fsfd int, err error) - //sys Fsopen(fsName string, flags int) (fd int, err error) - //sys Fspick(dirfd int, pathName string, flags int) (fd int, err error) -+ -+//sys fsconfig(fd int, cmd uint, key *byte, value *byte, aux int) (err error) -+ -+func fsconfigCommon(fd int, cmd uint, key string, value *byte, aux int) (err error) { -+ var keyp *byte -+ if keyp, err = BytePtrFromString(key); err != nil { -+ return -+ } -+ return fsconfig(fd, cmd, keyp, value, aux) -+} -+ -+// FsconfigSetFlag is equivalent to fsconfig(2) called -+// with cmd == FSCONFIG_SET_FLAG. -+// -+// fd is the filesystem context to act upon. -+// key the parameter key to set. -+func FsconfigSetFlag(fd int, key string) (err error) { -+ return fsconfigCommon(fd, FSCONFIG_SET_FLAG, key, nil, 0) -+} -+ -+// FsconfigSetString is equivalent to fsconfig(2) called -+// with cmd == FSCONFIG_SET_STRING. -+// -+// fd is the filesystem context to act upon. -+// key the parameter key to set. -+// value is the parameter value to set. -+func FsconfigSetString(fd int, key string, value string) (err error) { -+ var valuep *byte -+ if valuep, err = BytePtrFromString(value); err != nil { -+ return -+ } -+ return fsconfigCommon(fd, FSCONFIG_SET_STRING, key, valuep, 0) -+} -+ -+// FsconfigSetBinary is equivalent to fsconfig(2) called -+// with cmd == FSCONFIG_SET_BINARY. -+// -+// fd is the filesystem context to act upon. -+// key the parameter key to set. -+// value is the parameter value to set. -+func FsconfigSetBinary(fd int, key string, value []byte) (err error) { -+ if len(value) == 0 { -+ return EINVAL -+ } -+ return fsconfigCommon(fd, FSCONFIG_SET_BINARY, key, &value[0], len(value)) -+} -+ -+// FsconfigSetPath is equivalent to fsconfig(2) called -+// with cmd == FSCONFIG_SET_PATH. -+// -+// fd is the filesystem context to act upon. -+// key the parameter key to set. -+// path is a non-empty path for specified key. -+// atfd is a file descriptor at which to start lookup from or AT_FDCWD. -+func FsconfigSetPath(fd int, key string, path string, atfd int) (err error) { -+ var valuep *byte -+ if valuep, err = BytePtrFromString(path); err != nil { -+ return -+ } -+ return fsconfigCommon(fd, FSCONFIG_SET_PATH, key, valuep, atfd) -+} -+ -+// FsconfigSetPathEmpty is equivalent to fsconfig(2) called -+// with cmd == FSCONFIG_SET_PATH_EMPTY. The same as -+// FconfigSetPath but with AT_PATH_EMPTY implied. -+func FsconfigSetPathEmpty(fd int, key string, path string, atfd int) (err error) { -+ var valuep *byte -+ if valuep, err = BytePtrFromString(path); err != nil { -+ return -+ } -+ return fsconfigCommon(fd, FSCONFIG_SET_PATH_EMPTY, key, valuep, atfd) -+} -+ -+// FsconfigSetFd is equivalent to fsconfig(2) called -+// with cmd == FSCONFIG_SET_FD. -+// -+// fd is the filesystem context to act upon. -+// key the parameter key to set. -+// value is a file descriptor to be assigned to specified key. -+func FsconfigSetFd(fd int, key string, value int) (err error) { -+ return fsconfigCommon(fd, FSCONFIG_SET_FD, key, nil, value) -+} -+ -+// FsconfigCreate is equivalent to fsconfig(2) called -+// with cmd == FSCONFIG_CMD_CREATE. -+// -+// fd is the filesystem context to act upon. -+func FsconfigCreate(fd int) (err error) { -+ return fsconfig(fd, FSCONFIG_CMD_CREATE, nil, nil, 0) -+} -+ -+// FsconfigReconfigure is equivalent to fsconfig(2) called -+// with cmd == FSCONFIG_CMD_RECONFIGURE. -+// -+// fd is the filesystem context to act upon. -+func FsconfigReconfigure(fd int) (err error) { -+ return fsconfig(fd, FSCONFIG_CMD_RECONFIGURE, nil, nil, 0) -+} -+ - //sys Getdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64 - //sysnb Getpgid(pid int) (pgid int, err error) - -@@ -2482,3 +2590,5 @@ func SchedGetAttr(pid int, flags uint) (*SchedAttr, error) { - } - return attr, nil - } -+ -+//sys Cachestat(fd uint, crange *CachestatRange, cstat *Cachestat_t, flags uint) (err error) -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go -index c7d9945..506dafa 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build 386 && linux --// +build 386,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_alarm.go b/vendor/golang.org/x/sys/unix/syscall_linux_alarm.go -index 08086ac..38d5564 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_alarm.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_alarm.go -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && (386 || amd64 || mips || mipsle || mips64 || mipsle || ppc64 || ppc64le || ppc || s390x || sparc64) --// +build linux --// +build 386 amd64 mips mipsle mips64 mipsle ppc64 ppc64le ppc s390x sparc64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go -index 70601ce..d557cf8 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build amd64 && linux --// +build amd64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go -index 8b0f0f3..facdb83 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build amd64 && linux && gc --// +build amd64,linux,gc - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go -index da29864..cd2dd79 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build arm && linux --// +build arm,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go -index f526668..cf2ee6c 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build arm64 && linux --// +build arm64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gc.go b/vendor/golang.org/x/sys/unix/syscall_linux_gc.go -index 2b1168d..ffc4c2b 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_gc.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_gc.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && gc --// +build linux,gc - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go -index 9843fb4..9ebfdcf 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && gc && 386 --// +build linux,gc,386 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go -index a6008fc..5f2b57c 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build arm && gc && linux --// +build arm,gc,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go -index 7740af2..d1a3ad8 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && gccgo && 386 --// +build linux,gccgo,386 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go -index e16a122..f2f6742 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && gccgo && arm --// +build linux,gccgo,arm - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go -index f6ab02e..3d0e984 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build loong64 && linux --// +build loong64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go -index 93fe59d..70963a9 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && (mips64 || mips64le) --// +build linux --// +build mips64 mips64le - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go -index aae7f0f..c218ebd 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && (mips || mipsle) --// +build linux --// +build mips mipsle - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go -index 66eff19..e6c4850 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && ppc --// +build linux,ppc - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go -index 806aa25..7286a9a 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && (ppc64 || ppc64le) --// +build linux --// +build ppc64 ppc64le - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go -index 5e6ceee..6f5a288 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build riscv64 && linux --// +build riscv64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go -index 2f89e8f..66f3121 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build s390x && linux --// +build s390x,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go -index 7ca064a..11d1f16 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build sparc64 && linux --// +build sparc64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go -index 5199d28..7a5eb57 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go -+++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build 386 && netbsd --// +build 386,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go -index 70a9c52..62d8957 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build amd64 && netbsd --// +build amd64,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go -index 3eb5942..ce6a068 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build arm && netbsd --// +build arm,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go -index fc6ccfd..d46d689 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build arm64 && netbsd --// +build arm64,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go -index 6f34479..b25343c 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go -+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go -@@ -137,18 +137,13 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e - } - - func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { -- var _p0 unsafe.Pointer -+ var bufptr *Statfs_t - var bufsize uintptr - if len(buf) > 0 { -- _p0 = unsafe.Pointer(&buf[0]) -+ bufptr = &buf[0] - bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) - } -- r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) -- n = int(r0) -- if e1 != 0 { -- err = e1 -- } -- return -+ return getfsstat(bufptr, bufsize, flags) - } - - //sysnb getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) -@@ -171,6 +166,20 @@ func Getresgid() (rgid, egid, sgid int) { - - //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL - -+//sys fcntl(fd int, cmd int, arg int) (n int, err error) -+//sys fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) = SYS_FCNTL -+ -+// FcntlInt performs a fcntl syscall on fd with the provided command and argument. -+func FcntlInt(fd uintptr, cmd, arg int) (int, error) { -+ return fcntl(int(fd), cmd, arg) -+} -+ -+// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. -+func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { -+ _, err := fcntlPtr(int(fd), cmd, unsafe.Pointer(lk)) -+ return err -+} -+ - //sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) - - func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { -@@ -326,4 +335,7 @@ func Uname(uname *Utsname) error { - //sys write(fd int, p []byte) (n int, err error) - //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) - //sys munmap(addr uintptr, length uintptr) (err error) -+//sys getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) - //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) -+//sys pledge(promises *byte, execpromises *byte) (err error) -+//sys unveil(path *byte, flags *byte) (err error) -diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go -index 6baabcd..9ddc89f 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go -+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build 386 && openbsd --// +build 386,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go -index bab2536..70a3c96 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build amd64 && openbsd --// +build amd64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go -index 8eed3c4..265caa8 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build arm && openbsd --// +build arm,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go -index 483dde9..ac4fda1 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build arm64 && openbsd --// +build arm64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go -index 04aa43f..0a451e6 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go -+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build openbsd --// +build openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go -index c279613..30a308c 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build ppc64 && openbsd --// +build ppc64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go -index 23199a7..ea95433 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build riscv64 && openbsd --// +build riscv64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go -index b99cfa1..21974af 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_solaris.go -+++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go -@@ -128,7 +128,8 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { - if n > 0 { - sl += _Socklen(n) + 1 - } -- if sa.raw.Path[0] == '@' { -+ if sa.raw.Path[0] == '@' || (sa.raw.Path[0] == 0 && sl > 3) { -+ // Check sl > 3 so we don't change unnamed socket behavior. - sa.raw.Path[0] = 0 - // Don't count trailing NUL for abstract address. - sl-- -@@ -157,7 +158,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { - if err != nil { - return "", err - } -- return string(buf[:vallen-1]), nil -+ return ByteSliceToString(buf[:vallen]), nil - } - - const ImplementsGetwd = true -diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go -index 0bd25ef..e02d8ce 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go -+++ b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build amd64 && solaris --// +build amd64,solaris - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go -index f6eda27..77081de 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_unix.go -+++ b/vendor/golang.org/x/sys/unix/syscall_unix.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris --// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_unix_gc.go b/vendor/golang.org/x/sys/unix/syscall_unix_gc.go -index b6919ca..05c95bc 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_unix_gc.go -+++ b/vendor/golang.org/x/sys/unix/syscall_unix_gc.go -@@ -3,8 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build (darwin || dragonfly || freebsd || (linux && !ppc64 && !ppc64le) || netbsd || openbsd || solaris) && gc --// +build darwin dragonfly freebsd linux,!ppc64,!ppc64le netbsd openbsd solaris --// +build gc - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go -index f6f707a..23f39b7 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go -+++ b/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go -@@ -3,9 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux && (ppc64le || ppc64) && gc --// +build linux --// +build ppc64le ppc64 --// +build gc - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go -index 4596d04..b473038 100644 ---- a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go -+++ b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build zos && s390x --// +build zos,s390x - - package unix - -@@ -1105,7 +1104,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { - return "", err - } - -- return string(buf[:vallen-1]), nil -+ return ByteSliceToString(buf[:vallen]), nil - } - - func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { -diff --git a/vendor/golang.org/x/sys/unix/sysvshm_linux.go b/vendor/golang.org/x/sys/unix/sysvshm_linux.go -index 2c3a443..4fcd38d 100644 ---- a/vendor/golang.org/x/sys/unix/sysvshm_linux.go -+++ b/vendor/golang.org/x/sys/unix/sysvshm_linux.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build linux --// +build linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/sysvshm_unix.go b/vendor/golang.org/x/sys/unix/sysvshm_unix.go -index 5bb41d1..79a84f1 100644 ---- a/vendor/golang.org/x/sys/unix/sysvshm_unix.go -+++ b/vendor/golang.org/x/sys/unix/sysvshm_unix.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build (darwin && !ios) || linux --// +build darwin,!ios linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/sysvshm_unix_other.go b/vendor/golang.org/x/sys/unix/sysvshm_unix_other.go -index 71bddef..9eb0db6 100644 ---- a/vendor/golang.org/x/sys/unix/sysvshm_unix_other.go -+++ b/vendor/golang.org/x/sys/unix/sysvshm_unix_other.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build darwin && !ios --// +build darwin,!ios - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/timestruct.go b/vendor/golang.org/x/sys/unix/timestruct.go -index 616b1b2..7997b19 100644 ---- a/vendor/golang.org/x/sys/unix/timestruct.go -+++ b/vendor/golang.org/x/sys/unix/timestruct.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos --// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/unveil_openbsd.go b/vendor/golang.org/x/sys/unix/unveil_openbsd.go -index 168d5ae..cb7e598 100644 ---- a/vendor/golang.org/x/sys/unix/unveil_openbsd.go -+++ b/vendor/golang.org/x/sys/unix/unveil_openbsd.go -@@ -4,39 +4,48 @@ - - package unix - --import ( -- "syscall" -- "unsafe" --) -+import "fmt" - - // Unveil implements the unveil syscall. - // For more information see unveil(2). - // Note that the special case of blocking further - // unveil calls is handled by UnveilBlock. - func Unveil(path string, flags string) error { -- pathPtr, err := syscall.BytePtrFromString(path) -- if err != nil { -+ if err := supportsUnveil(); err != nil { - return err - } -- flagsPtr, err := syscall.BytePtrFromString(flags) -+ pathPtr, err := BytePtrFromString(path) - if err != nil { - return err - } -- _, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(unsafe.Pointer(pathPtr)), uintptr(unsafe.Pointer(flagsPtr)), 0) -- if e != 0 { -- return e -+ flagsPtr, err := BytePtrFromString(flags) -+ if err != nil { -+ return err - } -- return nil -+ return unveil(pathPtr, flagsPtr) - } - - // UnveilBlock blocks future unveil calls. - // For more information see unveil(2). - func UnveilBlock() error { -- // Both pointers must be nil. -- var pathUnsafe, flagsUnsafe unsafe.Pointer -- _, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(pathUnsafe), uintptr(flagsUnsafe), 0) -- if e != 0 { -- return e -+ if err := supportsUnveil(); err != nil { -+ return err - } -+ return unveil(nil, nil) -+} -+ -+// supportsUnveil checks for availability of the unveil(2) system call based -+// on the running OpenBSD version. -+func supportsUnveil() error { -+ maj, min, err := majmin() -+ if err != nil { -+ return err -+ } -+ -+ // unveil is not available before 6.4 -+ if maj < 6 || (maj == 6 && min <= 3) { -+ return fmt.Errorf("cannot call Unveil on OpenBSD %d.%d", maj, min) -+ } -+ - return nil - } -diff --git a/vendor/golang.org/x/sys/unix/xattr_bsd.go b/vendor/golang.org/x/sys/unix/xattr_bsd.go -index f5f8e9f..e168793 100644 ---- a/vendor/golang.org/x/sys/unix/xattr_bsd.go -+++ b/vendor/golang.org/x/sys/unix/xattr_bsd.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build freebsd || netbsd --// +build freebsd netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go -index ca9799b..2fb219d 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc && aix --// +build ppc,aix - - // Created by cgo -godefs - DO NOT EDIT - // cgo -godefs -- -maix32 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go -index 200c8c2..b0e6f5c 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc64 && aix --// +build ppc64,aix - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -maix64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go -index 1430076..e40fa85 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && darwin --// +build amd64,darwin - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go -index ab044a7..bb02aa6 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && darwin --// +build arm64,darwin - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go -index 17bba0e..c0e0f86 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && dragonfly --// +build amd64,dragonfly - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go -index f8c2c51..6c69239 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && freebsd --// +build 386,freebsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m32 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go -index 96310c3..dd9163f 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && freebsd --// +build amd64,freebsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go -index 777b69d..493a2a7 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && freebsd --// +build arm,freebsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go -index c557ac2..8b437b3 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && freebsd --// +build arm64,freebsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go -index 341b4d9..67c02dd 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build riscv64 && freebsd --// +build riscv64,freebsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go -index f9c7f47..36bf839 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go -@@ -1,7 +1,6 @@ - // Code generated by mkmerge; DO NOT EDIT. - - //go:build linux --// +build linux - - package unix - -@@ -481,10 +480,13 @@ const ( - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 -+ BPF_F_AFTER = 0x10 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 -- BPF_F_KPROBE_MULTI_RETURN = 0x1 -+ BPF_F_BEFORE = 0x8 -+ BPF_F_ID = 0x20 -+ BPF_F_NETFILTER_IP_DEFRAG = 0x1 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_REPLACE = 0x4 - BPF_F_SLEEPABLE = 0x10 -@@ -521,6 +523,7 @@ const ( - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 -+ BPF_MEMSX = 0x80 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 -@@ -776,6 +779,8 @@ const ( - DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" - DEVLINK_GENL_NAME = "devlink" - DEVLINK_GENL_VERSION = 0x1 -+ DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO = 0x4 -+ DEVLINK_PORT_FN_CAP_IPSEC_PACKET = 0x8 - DEVLINK_PORT_FN_CAP_MIGRATABLE = 0x2 - DEVLINK_PORT_FN_CAP_ROCE = 0x1 - DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 -@@ -1698,6 +1703,7 @@ const ( - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 -+ KEXEC_UPDATE_ELFCOREHDR = 0x4 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 -@@ -1779,6 +1785,8 @@ const ( - LANDLOCK_ACCESS_FS_REMOVE_FILE = 0x20 - LANDLOCK_ACCESS_FS_TRUNCATE = 0x4000 - LANDLOCK_ACCESS_FS_WRITE_FILE = 0x2 -+ LANDLOCK_ACCESS_NET_BIND_TCP = 0x1 -+ LANDLOCK_ACCESS_NET_CONNECT_TCP = 0x2 - LANDLOCK_CREATE_RULESET_VERSION = 0x1 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef -@@ -1795,6 +1803,7 @@ const ( - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 -+ LOOP_CONFIGURE = 0x4c0a - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 -@@ -2120,6 +2129,60 @@ const ( - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 -+ NFT_CHAIN_FLAGS = 0x7 -+ NFT_CHAIN_MAXNAMELEN = 0x100 -+ NFT_CT_MAX = 0x17 -+ NFT_DATA_RESERVED_MASK = 0xffffff00 -+ NFT_DATA_VALUE_MAXLEN = 0x40 -+ NFT_EXTHDR_OP_MAX = 0x4 -+ NFT_FIB_RESULT_MAX = 0x3 -+ NFT_INNER_MASK = 0xf -+ NFT_LOGLEVEL_MAX = 0x8 -+ NFT_NAME_MAXLEN = 0x100 -+ NFT_NG_MAX = 0x1 -+ NFT_OBJECT_CONNLIMIT = 0x5 -+ NFT_OBJECT_COUNTER = 0x1 -+ NFT_OBJECT_CT_EXPECT = 0x9 -+ NFT_OBJECT_CT_HELPER = 0x3 -+ NFT_OBJECT_CT_TIMEOUT = 0x7 -+ NFT_OBJECT_LIMIT = 0x4 -+ NFT_OBJECT_MAX = 0xa -+ NFT_OBJECT_QUOTA = 0x2 -+ NFT_OBJECT_SECMARK = 0x8 -+ NFT_OBJECT_SYNPROXY = 0xa -+ NFT_OBJECT_TUNNEL = 0x6 -+ NFT_OBJECT_UNSPEC = 0x0 -+ NFT_OBJ_MAXNAMELEN = 0x100 -+ NFT_OSF_MAXGENRELEN = 0x10 -+ NFT_QUEUE_FLAG_BYPASS = 0x1 -+ NFT_QUEUE_FLAG_CPU_FANOUT = 0x2 -+ NFT_QUEUE_FLAG_MASK = 0x3 -+ NFT_REG32_COUNT = 0x10 -+ NFT_REG32_SIZE = 0x4 -+ NFT_REG_MAX = 0x4 -+ NFT_REG_SIZE = 0x10 -+ NFT_REJECT_ICMPX_MAX = 0x3 -+ NFT_RT_MAX = 0x4 -+ NFT_SECMARK_CTX_MAXLEN = 0x100 -+ NFT_SET_MAXNAMELEN = 0x100 -+ NFT_SOCKET_MAX = 0x3 -+ NFT_TABLE_F_MASK = 0x3 -+ NFT_TABLE_MAXNAMELEN = 0x100 -+ NFT_TRACETYPE_MAX = 0x3 -+ NFT_TUNNEL_F_MASK = 0x7 -+ NFT_TUNNEL_MAX = 0x1 -+ NFT_TUNNEL_MODE_MAX = 0x2 -+ NFT_USERDATA_MAXLEN = 0x100 -+ NFT_XFRM_KEY_MAX = 0x6 -+ NF_NAT_RANGE_MAP_IPS = 0x1 -+ NF_NAT_RANGE_MASK = 0x7f -+ NF_NAT_RANGE_NETMAP = 0x40 -+ NF_NAT_RANGE_PERSISTENT = 0x8 -+ NF_NAT_RANGE_PROTO_OFFSET = 0x20 -+ NF_NAT_RANGE_PROTO_RANDOM = 0x4 -+ NF_NAT_RANGE_PROTO_RANDOM_ALL = 0x14 -+ NF_NAT_RANGE_PROTO_RANDOM_FULLY = 0x10 -+ NF_NAT_RANGE_PROTO_SPECIFIED = 0x2 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 -@@ -2275,6 +2338,7 @@ const ( - PERF_MEM_LVLNUM_PMEM = 0xe - PERF_MEM_LVLNUM_RAM = 0xd - PERF_MEM_LVLNUM_SHIFT = 0x21 -+ PERF_MEM_LVLNUM_UNC = 0x8 - PERF_MEM_LVL_HIT = 0x2 - PERF_MEM_LVL_IO = 0x1000 - PERF_MEM_LVL_L1 = 0x8 -@@ -2403,6 +2467,7 @@ const ( - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 -+ PR_MDWE_NO_INHERIT = 0x2 - PR_MDWE_REFUSE_EXEC_GAIN = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b -@@ -2607,8 +2672,9 @@ const ( - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 -- RTAX_FEATURE_MASK = 0xf -+ RTAX_FEATURE_MASK = 0x1f - RTAX_FEATURE_SACK = 0x2 -+ RTAX_FEATURE_TCP_USEC_TS = 0x10 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb -@@ -2851,9 +2917,38 @@ const ( - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SC_LOG_FLUSH = 0x100000 -+ SECCOMP_ADDFD_FLAG_SEND = 0x2 -+ SECCOMP_ADDFD_FLAG_SETFD = 0x1 -+ SECCOMP_FILTER_FLAG_LOG = 0x2 -+ SECCOMP_FILTER_FLAG_NEW_LISTENER = 0x8 -+ SECCOMP_FILTER_FLAG_SPEC_ALLOW = 0x4 -+ SECCOMP_FILTER_FLAG_TSYNC = 0x1 -+ SECCOMP_FILTER_FLAG_TSYNC_ESRCH = 0x10 -+ SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV = 0x20 -+ SECCOMP_GET_ACTION_AVAIL = 0x2 -+ SECCOMP_GET_NOTIF_SIZES = 0x3 -+ SECCOMP_IOCTL_NOTIF_RECV = 0xc0502100 -+ SECCOMP_IOCTL_NOTIF_SEND = 0xc0182101 -+ SECCOMP_IOC_MAGIC = '!' - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 -+ SECCOMP_RET_ACTION = 0x7fff0000 -+ SECCOMP_RET_ACTION_FULL = 0xffff0000 -+ SECCOMP_RET_ALLOW = 0x7fff0000 -+ SECCOMP_RET_DATA = 0xffff -+ SECCOMP_RET_ERRNO = 0x50000 -+ SECCOMP_RET_KILL = 0x0 -+ SECCOMP_RET_KILL_PROCESS = 0x80000000 -+ SECCOMP_RET_KILL_THREAD = 0x0 -+ SECCOMP_RET_LOG = 0x7ffc0000 -+ SECCOMP_RET_TRACE = 0x7ff00000 -+ SECCOMP_RET_TRAP = 0x30000 -+ SECCOMP_RET_USER_NOTIF = 0x7fc00000 -+ SECCOMP_SET_MODE_FILTER = 0x1 -+ SECCOMP_SET_MODE_STRICT = 0x0 -+ SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP = 0x1 -+ SECCOMP_USER_NOTIF_FLAG_CONTINUE = 0x1 - SECRETMEM_MAGIC = 0x5345434d - SECURITYFS_MAGIC = 0x73636673 - SEEK_CUR = 0x1 -@@ -3013,6 +3108,7 @@ const ( - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_UDP = 0x11 -+ SOL_VSOCK = 0x11f - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x1000 -@@ -3461,6 +3557,7 @@ const ( - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 -+ XDP_PKT_CONTD = 0x1 - XDP_RING_NEED_WAKEUP = 0x1 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 -@@ -3473,6 +3570,7 @@ const ( - XDP_UMEM_REG = 0x4 - XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 - XDP_USE_NEED_WAKEUP = 0x8 -+ XDP_USE_SG = 0x10 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go -index 30aee00..42ff8c3 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && linux --// +build 386,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/386/include -m32 _const.go -@@ -282,6 +281,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SIOCATMARK = 0x8905 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go -index 8ebfa51..dca4360 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && linux --// +build amd64,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/amd64/include -m64 _const.go -@@ -283,6 +282,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SIOCATMARK = 0x8905 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go -index 271a21c..5cca668 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && linux --// +build arm,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/arm/include _const.go -@@ -289,6 +288,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SIOCATMARK = 0x8905 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go -index 910c330..d8cae6d 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && linux --// +build arm64,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/arm64/include -fsigned-char _const.go -@@ -279,6 +278,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SIOCATMARK = 0x8905 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go -index a640798..28e39af 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build loong64 && linux --// +build loong64,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/loong64/include _const.go -@@ -119,6 +118,7 @@ const ( - IXOFF = 0x1000 - IXON = 0x400 - LASX_CTX_MAGIC = 0x41535801 -+ LBT_CTX_MAGIC = 0x42540001 - LSX_CTX_MAGIC = 0x53580001 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 -@@ -275,6 +275,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SIOCATMARK = 0x8905 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go -index 0d5925d..cd66e92 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips && linux --// +build mips,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/mips/include _const.go -@@ -282,6 +281,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x80 - SIOCATMARK = 0x40047307 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go -index d72a00e..c1595eb 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips64 && linux --// +build mips64,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/mips64/include _const.go -@@ -282,6 +281,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x80 - SIOCATMARK = 0x40047307 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go -index 02ba129..ee9456b 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips64le && linux --// +build mips64le,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/mips64le/include _const.go -@@ -282,6 +281,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x80 - SIOCATMARK = 0x40047307 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go -index 8daa6dd..8cfca81 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mipsle && linux --// +build mipsle,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/mipsle/include _const.go -@@ -282,6 +281,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x80 - SIOCATMARK = 0x40047307 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go -index 63c8fa2..60b0deb 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc && linux --// +build ppc,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/ppc/include _const.go -@@ -337,6 +336,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SIOCATMARK = 0x8905 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go -index 930799e..f90aa72 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc64 && linux --// +build ppc64,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/ppc64/include _const.go -@@ -341,6 +340,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SIOCATMARK = 0x8905 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go -index 8605a7d..ba9e015 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc64le && linux --// +build ppc64le,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/ppc64le/include _const.go -@@ -341,6 +340,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SIOCATMARK = 0x8905 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go -index 95a016f..07cdfd6 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build riscv64 && linux --// +build riscv64,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/riscv64/include _const.go -@@ -228,6 +227,9 @@ const ( - PPPIOCUNBRIDGECHAN = 0x7434 - PPPIOCXFERUNIT = 0x744e - PR_SET_PTRACER_ANY = 0xffffffffffffffff -+ PTRACE_GETFDPIC = 0x21 -+ PTRACE_GETFDPIC_EXEC = 0x0 -+ PTRACE_GETFDPIC_INTERP = 0x1 - RLIMIT_AS = 0x9 - RLIMIT_MEMLOCK = 0x8 - RLIMIT_NOFILE = 0x7 -@@ -270,6 +272,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SIOCATMARK = 0x8905 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go -index 1ae0108..2f1dd21 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build s390x && linux --// +build s390x,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/s390x/include -fsigned-char _const.go -@@ -345,6 +344,9 @@ const ( - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SIOCATMARK = 0x8905 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go -index 1bb7c63..f40519d 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build sparc64 && linux --// +build sparc64,linux - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -Wall -Werror -static -I/tmp/sparc64/include _const.go -@@ -336,6 +335,9 @@ const ( - SCM_TIMESTAMPNS = 0x21 - SCM_TXTIME = 0x3f - SCM_WIFI_STATUS = 0x25 -+ SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 -+ SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 -+ SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 - SFD_CLOEXEC = 0x400000 - SFD_NONBLOCK = 0x4000 - SF_FP = 0x38 -diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go -index 72f7420..130085d 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && netbsd --// +build 386,netbsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m32 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go -index 8d4eb0c..84769a1 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && netbsd --// +build amd64,netbsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go -index 9eef974..602ded0 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && netbsd --// +build arm,netbsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -marm _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go -index 3b62ba1..efc0406 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && netbsd --// +build arm64,netbsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go -index af20e47..5a6500f 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && openbsd --// +build 386,openbsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m32 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go -index 6015fcb..a5aeeb9 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && openbsd --// +build amd64,openbsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go -index 8d44955..0e9748a 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && openbsd --// +build arm,openbsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go -index ae16fe7..4f4449a 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && openbsd --// +build arm64,openbsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go -index 03d90fe..76a363f 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips64 && openbsd --// +build mips64,openbsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go -index 8e2c51b..43ca0cd 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc64 && openbsd --// +build ppc64,openbsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go -index 13d4030..b1b8bb2 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build riscv64 && openbsd --// +build riscv64,openbsd - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go -index 1afee6a..d2ddd31 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && solaris --// +build amd64,solaris - - // Code generated by cmd/cgo -godefs; DO NOT EDIT. - // cgo -godefs -- -m64 _const.go -diff --git a/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go -index fc7d050..4dfd2e0 100644 ---- a/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go -+++ b/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build zos && s390x --// +build zos,s390x - - // Hand edited based on zerrors_linux_s390x.go - // TODO: auto-generate. -diff --git a/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go b/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go -index 97f20ca..586317c 100644 ---- a/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go -+++ b/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go -@@ -1,8 +1,6 @@ - // Code generated by linux/mkall.go generatePtracePair("arm", "arm64"). DO NOT EDIT. - - //go:build linux && (arm || arm64) --// +build linux --// +build arm arm64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go b/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go -index 0b5f794..d7c881b 100644 ---- a/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go -+++ b/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go -@@ -1,8 +1,6 @@ - // Code generated by linux/mkall.go generatePtracePair("mips", "mips64"). DO NOT EDIT. - - //go:build linux && (mips || mips64) --// +build linux --// +build mips mips64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go b/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go -index 2807f7e..2d2de5d 100644 ---- a/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go -+++ b/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go -@@ -1,8 +1,6 @@ - // Code generated by linux/mkall.go generatePtracePair("mipsle", "mips64le"). DO NOT EDIT. - - //go:build linux && (mipsle || mips64le) --// +build linux --// +build mipsle mips64le - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go b/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go -index 281ea64..5adc79f 100644 ---- a/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go -+++ b/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go -@@ -1,8 +1,6 @@ - // Code generated by linux/mkall.go generatePtracePair("386", "amd64"). DO NOT EDIT. - - //go:build linux && (386 || amd64) --// +build linux --// +build 386 amd64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go -index d1d1d23..6ea64a3 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build aix && ppc --// +build aix,ppc - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go -index f99a18a..99ee439 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build aix && ppc64 --// +build aix,ppc64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go -index c4d50ae..b68a783 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build aix && ppc64 && gc --// +build aix,ppc64,gc - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go -index 6903d3b..0a87450 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build aix && ppc64 && gccgo --// +build aix,ppc64,gccgo - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go -index 1cad561..ccb02f2 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build darwin && amd64 --// +build darwin,amd64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go -index b18edbd..1b40b99 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build darwin && arm64 --// +build darwin,arm64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go -index 0c67df6..aad65fc 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build dragonfly && amd64 --// +build dragonfly,amd64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go -index e6e05d1..c009639 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build freebsd && 386 --// +build freebsd,386 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go -index 7508acc..7664df7 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build freebsd && amd64 --// +build freebsd,amd64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go -index 7b56aea..ae09918 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build freebsd && arm --// +build freebsd,arm - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go -index cc623dc..11fd5d4 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build freebsd && arm64 --// +build freebsd,arm64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go -index 5818491..c3d2d65 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build freebsd && riscv64 --// +build freebsd,riscv64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go -index 6be25cd..c698cbc 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build illumos && amd64 --// +build illumos,amd64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go -index 1ff3aec..87d8612 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go -@@ -1,7 +1,6 @@ - // Code generated by mkmerge; DO NOT EDIT. - - //go:build linux --// +build linux - - package unix - -@@ -38,6 +37,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { -+ var _p0 *byte -+ _p0, err = BytePtrFromString(path) -+ if err != nil { -+ return -+ } -+ _, _, e1 := Syscall6(SYS_FCHMODAT2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func ioctl(fd int, req uint, arg uintptr) (err error) { - _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) - if e1 != 0 { -@@ -892,6 +906,16 @@ func Fspick(dirfd int, pathName string, flags int) (fd int, err error) { - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func fsconfig(fd int, cmd uint, key *byte, value *byte, aux int) (err error) { -+ _, _, e1 := Syscall6(SYS_FSCONFIG, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(value)), uintptr(aux), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func Getdents(fd int, buf []byte) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { -@@ -2195,3 +2219,13 @@ func schedGetattr(pid int, attr *SchedAttr, size uint, flags uint) (err error) { - } - return - } -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func Cachestat(fd uint, crange *CachestatRange, cstat *Cachestat_t, flags uint) (err error) { -+ _, _, e1 := Syscall6(SYS_CACHESTAT, uintptr(fd), uintptr(unsafe.Pointer(crange)), uintptr(unsafe.Pointer(cstat)), uintptr(flags), 0, 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go -index 07b549c..4def3e9 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && 386 --// +build linux,386 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go -index 5f481bf..fef2bc8 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && amd64 --// +build linux,amd64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go -index 824cd52..a9fd76a 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && arm --// +build linux,arm - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go -index e77aecf..4600650 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && arm64 --// +build linux,arm64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go -index 806ffd1..c8987d2 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && loong64 --// +build linux,loong64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go -index 961a3af..921f430 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && mips --// +build linux,mips - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go -index ed05005..44f0678 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && mips64 --// +build linux,mips64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go -index d365b71..e7fa0ab 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && mips64le --// +build linux,mips64le - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go -index c3f1b8b..8c51256 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && mipsle --// +build linux,mipsle - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go -index a6574cf..7392fd4 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && ppc --// +build linux,ppc - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go -index f409902..4118043 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && ppc64 --// +build linux,ppc64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go -index 9dfcc29..40c6ce7 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && ppc64le --// +build linux,ppc64le - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go -index 0ab4f2e..2cfe34a 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && riscv64 --// +build linux,riscv64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go -index 6cde322..61e6f07 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && s390x --// +build linux,s390x - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go -index 5253d65..834b842 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build linux && sparc64 --// +build linux,sparc64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go -index 2df3c5b..e91ebc1 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build netbsd && 386 --// +build netbsd,386 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go -index a60556b..be28bab 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build netbsd && amd64 --// +build netbsd,amd64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go -index 9f78891..fb587e8 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build netbsd && arm --// +build netbsd,arm - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go -index 82a4cb2..d576438 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build netbsd && arm64 --// +build netbsd,arm64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go -index 66b3b64..9dc4241 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build openbsd && 386 --// +build openbsd,386 - - package unix - -@@ -585,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func fcntl(fd int, cmd int, arg int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_fcntl_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) - n = int(r0) -@@ -2213,6 +2238,21 @@ var libc_munmap_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_getfsstat_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) -@@ -2229,3 +2269,31 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error - var libc_utimensat_trampoline_addr uintptr - - //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func pledge(promises *byte, execpromises *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_pledge_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_pledge pledge "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func unveil(path *byte, flags *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_unveil_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_unveil unveil "libc.so" -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s -index 3dcacd3..41b5617 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s -@@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $4 - DATA ·libc_sysctl_trampoline_addr(SB)/4, $libc_sysctl_trampoline<>(SB) - -+TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_fcntl(SB) -+GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $4 -+DATA ·libc_fcntl_trampoline_addr(SB)/4, $libc_fcntl_trampoline<>(SB) -+ - TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_ppoll(SB) - GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $4 -@@ -668,7 +673,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $4 - DATA ·libc_munmap_trampoline_addr(SB)/4, $libc_munmap_trampoline<>(SB) - -+TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_getfsstat(SB) -+GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $4 -+DATA ·libc_getfsstat_trampoline_addr(SB)/4, $libc_getfsstat_trampoline<>(SB) -+ - TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_utimensat(SB) - GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $4 - DATA ·libc_utimensat_trampoline_addr(SB)/4, $libc_utimensat_trampoline<>(SB) -+ -+TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_pledge(SB) -+GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $4 -+DATA ·libc_pledge_trampoline_addr(SB)/4, $libc_pledge_trampoline<>(SB) -+ -+TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_unveil(SB) -+GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $4 -+DATA ·libc_unveil_trampoline_addr(SB)/4, $libc_unveil_trampoline<>(SB) -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go -index c5c4cc1..0d3a075 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build openbsd && amd64 --// +build openbsd,amd64 - - package unix - -@@ -585,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func fcntl(fd int, cmd int, arg int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_fcntl_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) - n = int(r0) -@@ -2213,6 +2238,21 @@ var libc_munmap_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_getfsstat_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) -@@ -2229,3 +2269,31 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error - var libc_utimensat_trampoline_addr uintptr - - //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func pledge(promises *byte, execpromises *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_pledge_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_pledge pledge "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func unveil(path *byte, flags *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_unveil_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_unveil unveil "libc.so" -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s -index 2763620..4019a65 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s -@@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 - DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) - -+TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_fcntl(SB) -+GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) -+ - TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_ppoll(SB) - GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 -@@ -668,7 +673,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 - DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) - -+TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_getfsstat(SB) -+GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) -+ - TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_utimensat(SB) - GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 - DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) -+ -+TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_pledge(SB) -+GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB) -+ -+TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_unveil(SB) -+GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB) -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go -index 93bfbb3..c39f777 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build openbsd && arm --// +build openbsd,arm - - package unix - -@@ -585,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func fcntl(fd int, cmd int, arg int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_fcntl_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) - n = int(r0) -@@ -2213,6 +2238,21 @@ var libc_munmap_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_getfsstat_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) -@@ -2229,3 +2269,31 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error - var libc_utimensat_trampoline_addr uintptr - - //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func pledge(promises *byte, execpromises *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_pledge_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_pledge pledge "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func unveil(path *byte, flags *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_unveil_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_unveil unveil "libc.so" -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s -index c922314..ac4af24 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s -@@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $4 - DATA ·libc_sysctl_trampoline_addr(SB)/4, $libc_sysctl_trampoline<>(SB) - -+TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_fcntl(SB) -+GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $4 -+DATA ·libc_fcntl_trampoline_addr(SB)/4, $libc_fcntl_trampoline<>(SB) -+ - TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_ppoll(SB) - GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $4 -@@ -668,7 +673,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $4 - DATA ·libc_munmap_trampoline_addr(SB)/4, $libc_munmap_trampoline<>(SB) - -+TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_getfsstat(SB) -+GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $4 -+DATA ·libc_getfsstat_trampoline_addr(SB)/4, $libc_getfsstat_trampoline<>(SB) -+ - TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_utimensat(SB) - GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $4 - DATA ·libc_utimensat_trampoline_addr(SB)/4, $libc_utimensat_trampoline<>(SB) -+ -+TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_pledge(SB) -+GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $4 -+DATA ·libc_pledge_trampoline_addr(SB)/4, $libc_pledge_trampoline<>(SB) -+ -+TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_unveil(SB) -+GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $4 -+DATA ·libc_unveil_trampoline_addr(SB)/4, $libc_unveil_trampoline<>(SB) -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go -index a107b8f..57571d0 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build openbsd && arm64 --// +build openbsd,arm64 - - package unix - -@@ -585,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func fcntl(fd int, cmd int, arg int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_fcntl_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) - n = int(r0) -@@ -2213,6 +2238,21 @@ var libc_munmap_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_getfsstat_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) -@@ -2229,3 +2269,31 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error - var libc_utimensat_trampoline_addr uintptr - - //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func pledge(promises *byte, execpromises *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_pledge_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_pledge pledge "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func unveil(path *byte, flags *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_unveil_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_unveil unveil "libc.so" -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s -index a6bc32c..f77d532 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s -@@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 - DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) - -+TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_fcntl(SB) -+GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) -+ - TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_ppoll(SB) - GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 -@@ -668,7 +673,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 - DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) - -+TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_getfsstat(SB) -+GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) -+ - TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_utimensat(SB) - GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 - DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) -+ -+TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_pledge(SB) -+GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB) -+ -+TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_unveil(SB) -+GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB) -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go -index c427de5..e62963e 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build openbsd && mips64 --// +build openbsd,mips64 - - package unix - -@@ -585,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func fcntl(fd int, cmd int, arg int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_fcntl_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) - n = int(r0) -@@ -2213,6 +2238,21 @@ var libc_munmap_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_getfsstat_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) -@@ -2229,3 +2269,31 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error - var libc_utimensat_trampoline_addr uintptr - - //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func pledge(promises *byte, execpromises *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_pledge_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_pledge pledge "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func unveil(path *byte, flags *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_unveil_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_unveil unveil "libc.so" -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s -index b4e7bce..fae140b 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s -@@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 - DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) - -+TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_fcntl(SB) -+GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) -+ - TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_ppoll(SB) - GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 -@@ -668,7 +673,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 - DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) - -+TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_getfsstat(SB) -+GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) -+ - TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_utimensat(SB) - GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 - DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) -+ -+TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_pledge(SB) -+GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB) -+ -+TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_unveil(SB) -+GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB) -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go -index 60c1a99..0083135 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build openbsd && ppc64 --// +build openbsd,ppc64 - - package unix - -@@ -585,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func fcntl(fd int, cmd int, arg int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_fcntl_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) - n = int(r0) -@@ -2213,6 +2238,21 @@ var libc_munmap_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_getfsstat_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) -@@ -2229,3 +2269,31 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error - var libc_utimensat_trampoline_addr uintptr - - //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func pledge(promises *byte, execpromises *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_pledge_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_pledge pledge "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func unveil(path *byte, flags *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_unveil_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_unveil unveil "libc.so" -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s -index ca3f766..9d1e0ff 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s -@@ -213,6 +213,12 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 - DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) - -+TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 -+ CALL libc_fcntl(SB) -+ RET -+GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) -+ - TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 - CALL libc_ppoll(SB) - RET -@@ -801,8 +807,26 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 - DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) - -+TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 -+ CALL libc_getfsstat(SB) -+ RET -+GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) -+ - TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 - CALL libc_utimensat(SB) - RET - GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 - DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) -+ -+TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 -+ CALL libc_pledge(SB) -+ RET -+GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB) -+ -+TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 -+ CALL libc_unveil(SB) -+ RET -+GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB) -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go -index 52eba36..79029ed 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build openbsd && riscv64 --// +build openbsd,riscv64 - - package unix - -@@ -585,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func fcntl(fd int, cmd int, arg int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_fcntl_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) - n = int(r0) -@@ -2213,6 +2238,21 @@ var libc_munmap_trampoline_addr uintptr - - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -+func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { -+ r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) -+ n = int(r0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_getfsstat_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) -@@ -2229,3 +2269,31 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error - var libc_utimensat_trampoline_addr uintptr - - //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func pledge(promises *byte, execpromises *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_pledge_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_pledge pledge "libc.so" -+ -+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -+ -+func unveil(path *byte, flags *byte) (err error) { -+ _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) -+ if e1 != 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ -+var libc_unveil_trampoline_addr uintptr -+ -+//go:cgo_import_dynamic libc_unveil unveil "libc.so" -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s -index 477a7d5..da115f9 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s -+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s -@@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 - DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) - -+TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_fcntl(SB) -+GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) -+ - TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_ppoll(SB) - GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 -@@ -668,7 +673,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 - GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 - DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) - -+TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_getfsstat(SB) -+GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) -+ - TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_utimensat(SB) - GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 - DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) -+ -+TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_pledge(SB) -+GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB) -+ -+TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 -+ JMP libc_unveil(SB) -+GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8 -+DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB) -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go -index b401894..829b87f 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build solaris && amd64 --// +build solaris,amd64 - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go -index 1d8fe1d..94f0112 100644 ---- a/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go -+++ b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build zos && s390x --// +build zos,s390x - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go -index 55e0484..3a58ae8 100644 ---- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go -+++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; DO NOT EDIT. - - //go:build 386 && openbsd --// +build 386,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go -index d2243cf..dcb7a0e 100644 ---- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; DO NOT EDIT. - - //go:build amd64 && openbsd --// +build amd64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go -index 82dc51b..db5a7bf 100644 ---- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; DO NOT EDIT. - - //go:build arm && openbsd --// +build arm,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go -index cbdda1a..7be575a 100644 ---- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; DO NOT EDIT. - - //go:build arm64 && openbsd --// +build arm64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go -index f55eae1..d6e3174 100644 ---- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go -+++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; DO NOT EDIT. - - //go:build mips64 && openbsd --// +build mips64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go -index e440544..ee97157 100644 ---- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; DO NOT EDIT. - - //go:build ppc64 && openbsd --// +build ppc64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go -index a0db82f..35c3b91 100644 ---- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; DO NOT EDIT. - - //go:build riscv64 && openbsd --// +build riscv64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go -index f8298ff..5edda76 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && darwin --// +build amd64,darwin - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go -index 5eb433b..0dc9e8b 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && darwin --// +build arm64,darwin - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go -index 703675c..308ddf3 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && dragonfly --// +build amd64,dragonfly - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go -index 4e0d961..418664e 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && freebsd --// +build 386,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go -index 01636b8..34d0b86 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && freebsd --// +build amd64,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go -index ad99bc1..b71cf45 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && freebsd --// +build arm,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go -index 89dcc42..e32df1c 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && freebsd --// +build arm64,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go -index ee37aaa..15ad611 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build riscv64 && freebsd --// +build riscv64,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go -index 9862853..0cc3ce4 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && linux --// +build 386,linux - - package unix - -@@ -448,4 +447,9 @@ const ( - SYS_FUTEX_WAITV = 449 - SYS_SET_MEMPOLICY_HOME_NODE = 450 - SYS_CACHESTAT = 451 -+ SYS_FCHMODAT2 = 452 -+ SYS_MAP_SHADOW_STACK = 453 -+ SYS_FUTEX_WAKE = 454 -+ SYS_FUTEX_WAIT = 455 -+ SYS_FUTEX_REQUEUE = 456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go -index 8901f0f..856d92d 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && linux --// +build amd64,linux - - package unix - -@@ -370,4 +369,9 @@ const ( - SYS_FUTEX_WAITV = 449 - SYS_SET_MEMPOLICY_HOME_NODE = 450 - SYS_CACHESTAT = 451 -+ SYS_FCHMODAT2 = 452 -+ SYS_MAP_SHADOW_STACK = 453 -+ SYS_FUTEX_WAKE = 454 -+ SYS_FUTEX_WAIT = 455 -+ SYS_FUTEX_REQUEUE = 456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go -index 6902c37..8d46709 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && linux --// +build arm,linux - - package unix - -@@ -412,4 +411,9 @@ const ( - SYS_FUTEX_WAITV = 449 - SYS_SET_MEMPOLICY_HOME_NODE = 450 - SYS_CACHESTAT = 451 -+ SYS_FCHMODAT2 = 452 -+ SYS_MAP_SHADOW_STACK = 453 -+ SYS_FUTEX_WAKE = 454 -+ SYS_FUTEX_WAIT = 455 -+ SYS_FUTEX_REQUEUE = 456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go -index a6d3dff..edc1732 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && linux --// +build arm64,linux - - package unix - -@@ -315,4 +314,9 @@ const ( - SYS_FUTEX_WAITV = 449 - SYS_SET_MEMPOLICY_HOME_NODE = 450 - SYS_CACHESTAT = 451 -+ SYS_FCHMODAT2 = 452 -+ SYS_MAP_SHADOW_STACK = 453 -+ SYS_FUTEX_WAKE = 454 -+ SYS_FUTEX_WAIT = 455 -+ SYS_FUTEX_REQUEUE = 456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go -index b18f3f7..445eba2 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build loong64 && linux --// +build loong64,linux - - package unix - -@@ -309,4 +308,9 @@ const ( - SYS_FUTEX_WAITV = 449 - SYS_SET_MEMPOLICY_HOME_NODE = 450 - SYS_CACHESTAT = 451 -+ SYS_FCHMODAT2 = 452 -+ SYS_MAP_SHADOW_STACK = 453 -+ SYS_FUTEX_WAKE = 454 -+ SYS_FUTEX_WAIT = 455 -+ SYS_FUTEX_REQUEUE = 456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go -index 0302e5e..adba01b 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips && linux --// +build mips,linux - - package unix - -@@ -432,4 +431,9 @@ const ( - SYS_FUTEX_WAITV = 4449 - SYS_SET_MEMPOLICY_HOME_NODE = 4450 - SYS_CACHESTAT = 4451 -+ SYS_FCHMODAT2 = 4452 -+ SYS_MAP_SHADOW_STACK = 4453 -+ SYS_FUTEX_WAKE = 4454 -+ SYS_FUTEX_WAIT = 4455 -+ SYS_FUTEX_REQUEUE = 4456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go -index 6693ba4..014c4e9 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips64 && linux --// +build mips64,linux - - package unix - -@@ -362,4 +361,9 @@ const ( - SYS_FUTEX_WAITV = 5449 - SYS_SET_MEMPOLICY_HOME_NODE = 5450 - SYS_CACHESTAT = 5451 -+ SYS_FCHMODAT2 = 5452 -+ SYS_MAP_SHADOW_STACK = 5453 -+ SYS_FUTEX_WAKE = 5454 -+ SYS_FUTEX_WAIT = 5455 -+ SYS_FUTEX_REQUEUE = 5456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go -index fd93f49..ccc97d7 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips64le && linux --// +build mips64le,linux - - package unix - -@@ -362,4 +361,9 @@ const ( - SYS_FUTEX_WAITV = 5449 - SYS_SET_MEMPOLICY_HOME_NODE = 5450 - SYS_CACHESTAT = 5451 -+ SYS_FCHMODAT2 = 5452 -+ SYS_MAP_SHADOW_STACK = 5453 -+ SYS_FUTEX_WAKE = 5454 -+ SYS_FUTEX_WAIT = 5455 -+ SYS_FUTEX_REQUEUE = 5456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go -index 760ddca..ec2b64a 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mipsle && linux --// +build mipsle,linux - - package unix - -@@ -432,4 +431,9 @@ const ( - SYS_FUTEX_WAITV = 4449 - SYS_SET_MEMPOLICY_HOME_NODE = 4450 - SYS_CACHESTAT = 4451 -+ SYS_FCHMODAT2 = 4452 -+ SYS_MAP_SHADOW_STACK = 4453 -+ SYS_FUTEX_WAKE = 4454 -+ SYS_FUTEX_WAIT = 4455 -+ SYS_FUTEX_REQUEUE = 4456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go -index cff2b25..21a839e 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc && linux --// +build ppc,linux - - package unix - -@@ -439,4 +438,9 @@ const ( - SYS_FUTEX_WAITV = 449 - SYS_SET_MEMPOLICY_HOME_NODE = 450 - SYS_CACHESTAT = 451 -+ SYS_FCHMODAT2 = 452 -+ SYS_MAP_SHADOW_STACK = 453 -+ SYS_FUTEX_WAKE = 454 -+ SYS_FUTEX_WAIT = 455 -+ SYS_FUTEX_REQUEUE = 456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go -index a4b2405..c11121e 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc64 && linux --// +build ppc64,linux - - package unix - -@@ -411,4 +410,9 @@ const ( - SYS_FUTEX_WAITV = 449 - SYS_SET_MEMPOLICY_HOME_NODE = 450 - SYS_CACHESTAT = 451 -+ SYS_FCHMODAT2 = 452 -+ SYS_MAP_SHADOW_STACK = 453 -+ SYS_FUTEX_WAKE = 454 -+ SYS_FUTEX_WAIT = 455 -+ SYS_FUTEX_REQUEUE = 456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go -index aca54b4..909b631 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc64le && linux --// +build ppc64le,linux - - package unix - -@@ -411,4 +410,9 @@ const ( - SYS_FUTEX_WAITV = 449 - SYS_SET_MEMPOLICY_HOME_NODE = 450 - SYS_CACHESTAT = 451 -+ SYS_FCHMODAT2 = 452 -+ SYS_MAP_SHADOW_STACK = 453 -+ SYS_FUTEX_WAKE = 454 -+ SYS_FUTEX_WAIT = 455 -+ SYS_FUTEX_REQUEUE = 456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go -index 9d1738d..e49bed1 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build riscv64 && linux --// +build riscv64,linux - - package unix - -@@ -316,4 +315,9 @@ const ( - SYS_FUTEX_WAITV = 449 - SYS_SET_MEMPOLICY_HOME_NODE = 450 - SYS_CACHESTAT = 451 -+ SYS_FCHMODAT2 = 452 -+ SYS_MAP_SHADOW_STACK = 453 -+ SYS_FUTEX_WAKE = 454 -+ SYS_FUTEX_WAIT = 455 -+ SYS_FUTEX_REQUEUE = 456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go -index 022878d..66017d2 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build s390x && linux --// +build s390x,linux - - package unix - -@@ -377,4 +376,9 @@ const ( - SYS_FUTEX_WAITV = 449 - SYS_SET_MEMPOLICY_HOME_NODE = 450 - SYS_CACHESTAT = 451 -+ SYS_FCHMODAT2 = 452 -+ SYS_MAP_SHADOW_STACK = 453 -+ SYS_FUTEX_WAKE = 454 -+ SYS_FUTEX_WAIT = 455 -+ SYS_FUTEX_REQUEUE = 456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go -index 4100a76..47bab18 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build sparc64 && linux --// +build sparc64,linux - - package unix - -@@ -390,4 +389,9 @@ const ( - SYS_FUTEX_WAITV = 449 - SYS_SET_MEMPOLICY_HOME_NODE = 450 - SYS_CACHESTAT = 451 -+ SYS_FCHMODAT2 = 452 -+ SYS_MAP_SHADOW_STACK = 453 -+ SYS_FUTEX_WAKE = 454 -+ SYS_FUTEX_WAIT = 455 -+ SYS_FUTEX_REQUEUE = 456 - ) -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go -index 3a6699e..b2aa8cd 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && netbsd --// +build 386,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go -index 5677cd4..524a1b1 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && netbsd --// +build amd64,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go -index e784cb6..d59b943 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && netbsd --// +build arm,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go -index bd4952e..31e771d 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; DO NOT EDIT. - - //go:build arm64 && netbsd --// +build arm64,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go -index 5977338..9fd77c6 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && openbsd --// +build 386,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go -index 16af291..af10af2 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && openbsd --// +build amd64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go -index f59b18a..cc2028a 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && openbsd --// +build arm,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go -index 721ef59..c06dd44 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && openbsd --// +build arm64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go -index 01c43a0..9ddbf3e 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips64 && openbsd --// +build mips64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go -index f258cfa..19a6ee4 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc64 && openbsd --// +build ppc64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go -index 07919e0..05192a7 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build riscv64 && openbsd --// +build riscv64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go -index 073daad..b2e3085 100644 ---- a/vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go -+++ b/vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build zos && s390x --// +build zos,s390x - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go -index 7a8161c..3e6d57c 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc && aix --// +build ppc,aix - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go -index 07ed733..3a219bd 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc64 && aix --// +build ppc64,aix - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go -index 690cefc..091d107 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && darwin --// +build amd64,darwin - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go -index 5bffc10..28ff4ef 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && darwin --// +build arm64,darwin - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go -index d0ba8e9..30e405b 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && dragonfly --// +build amd64,dragonfly - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go -index 29dc483..6cbd094 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && freebsd --// +build 386,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go -index 0a89b28..7c03b6e 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && freebsd --// +build amd64,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go -index c8666bb..422107e 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && freebsd --// +build arm,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go -index 88fb48a..505a12a 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && freebsd --// +build arm64,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go -index 698dc97..cc986c7 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build riscv64 && freebsd --// +build riscv64,freebsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go -index 18aa70b..eff6bcd 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go -@@ -1,7 +1,6 @@ - // Code generated by mkmerge; DO NOT EDIT. - - //go:build linux --// +build linux - - package unix - -@@ -175,7 +174,8 @@ type FscryptPolicyV2 struct { - Contents_encryption_mode uint8 - Filenames_encryption_mode uint8 - Flags uint8 -- _ [4]uint8 -+ Log2_data_unit_size uint8 -+ _ [3]uint8 - Master_key_identifier [16]uint8 - } - -@@ -456,60 +456,63 @@ type Ucred struct { - } - - type TCPInfo struct { -- State uint8 -- Ca_state uint8 -- Retransmits uint8 -- Probes uint8 -- Backoff uint8 -- Options uint8 -- Rto uint32 -- Ato uint32 -- Snd_mss uint32 -- Rcv_mss uint32 -- Unacked uint32 -- Sacked uint32 -- Lost uint32 -- Retrans uint32 -- Fackets uint32 -- Last_data_sent uint32 -- Last_ack_sent uint32 -- Last_data_recv uint32 -- Last_ack_recv uint32 -- Pmtu uint32 -- Rcv_ssthresh uint32 -- Rtt uint32 -- Rttvar uint32 -- Snd_ssthresh uint32 -- Snd_cwnd uint32 -- Advmss uint32 -- Reordering uint32 -- Rcv_rtt uint32 -- Rcv_space uint32 -- Total_retrans uint32 -- Pacing_rate uint64 -- Max_pacing_rate uint64 -- Bytes_acked uint64 -- Bytes_received uint64 -- Segs_out uint32 -- Segs_in uint32 -- Notsent_bytes uint32 -- Min_rtt uint32 -- Data_segs_in uint32 -- Data_segs_out uint32 -- Delivery_rate uint64 -- Busy_time uint64 -- Rwnd_limited uint64 -- Sndbuf_limited uint64 -- Delivered uint32 -- Delivered_ce uint32 -- Bytes_sent uint64 -- Bytes_retrans uint64 -- Dsack_dups uint32 -- Reord_seen uint32 -- Rcv_ooopack uint32 -- Snd_wnd uint32 -- Rcv_wnd uint32 -- Rehash uint32 -+ State uint8 -+ Ca_state uint8 -+ Retransmits uint8 -+ Probes uint8 -+ Backoff uint8 -+ Options uint8 -+ Rto uint32 -+ Ato uint32 -+ Snd_mss uint32 -+ Rcv_mss uint32 -+ Unacked uint32 -+ Sacked uint32 -+ Lost uint32 -+ Retrans uint32 -+ Fackets uint32 -+ Last_data_sent uint32 -+ Last_ack_sent uint32 -+ Last_data_recv uint32 -+ Last_ack_recv uint32 -+ Pmtu uint32 -+ Rcv_ssthresh uint32 -+ Rtt uint32 -+ Rttvar uint32 -+ Snd_ssthresh uint32 -+ Snd_cwnd uint32 -+ Advmss uint32 -+ Reordering uint32 -+ Rcv_rtt uint32 -+ Rcv_space uint32 -+ Total_retrans uint32 -+ Pacing_rate uint64 -+ Max_pacing_rate uint64 -+ Bytes_acked uint64 -+ Bytes_received uint64 -+ Segs_out uint32 -+ Segs_in uint32 -+ Notsent_bytes uint32 -+ Min_rtt uint32 -+ Data_segs_in uint32 -+ Data_segs_out uint32 -+ Delivery_rate uint64 -+ Busy_time uint64 -+ Rwnd_limited uint64 -+ Sndbuf_limited uint64 -+ Delivered uint32 -+ Delivered_ce uint32 -+ Bytes_sent uint64 -+ Bytes_retrans uint64 -+ Dsack_dups uint32 -+ Reord_seen uint32 -+ Rcv_ooopack uint32 -+ Snd_wnd uint32 -+ Rcv_wnd uint32 -+ Rehash uint32 -+ Total_rto uint16 -+ Total_rto_recoveries uint16 -+ Total_rto_time uint32 - } - - type CanFilter struct { -@@ -552,7 +555,7 @@ const ( - SizeofIPv6MTUInfo = 0x20 - SizeofICMPv6Filter = 0x20 - SizeofUcred = 0xc -- SizeofTCPInfo = 0xf0 -+ SizeofTCPInfo = 0xf8 - SizeofCanFilter = 0x8 - SizeofTCPRepairOpt = 0x8 - ) -@@ -833,6 +836,15 @@ const ( - FSPICK_EMPTY_PATH = 0x8 - - FSMOUNT_CLOEXEC = 0x1 -+ -+ FSCONFIG_SET_FLAG = 0x0 -+ FSCONFIG_SET_STRING = 0x1 -+ FSCONFIG_SET_BINARY = 0x2 -+ FSCONFIG_SET_PATH = 0x3 -+ FSCONFIG_SET_PATH_EMPTY = 0x4 -+ FSCONFIG_SET_FD = 0x5 -+ FSCONFIG_CMD_CREATE = 0x6 -+ FSCONFIG_CMD_RECONFIGURE = 0x7 - ) - - type OpenHow struct { -@@ -1547,6 +1559,7 @@ const ( - IFLA_DEVLINK_PORT = 0x3e - IFLA_GSO_IPV4_MAX_SIZE = 0x3f - IFLA_GRO_IPV4_MAX_SIZE = 0x40 -+ IFLA_DPLL_PIN = 0x41 - IFLA_PROTO_DOWN_REASON_UNSPEC = 0x0 - IFLA_PROTO_DOWN_REASON_MASK = 0x1 - IFLA_PROTO_DOWN_REASON_VALUE = 0x2 -@@ -1562,6 +1575,7 @@ const ( - IFLA_INET6_ICMP6STATS = 0x6 - IFLA_INET6_TOKEN = 0x7 - IFLA_INET6_ADDR_GEN_MODE = 0x8 -+ IFLA_INET6_RA_MTU = 0x9 - IFLA_BR_UNSPEC = 0x0 - IFLA_BR_FORWARD_DELAY = 0x1 - IFLA_BR_HELLO_TIME = 0x2 -@@ -1609,6 +1623,9 @@ const ( - IFLA_BR_MCAST_MLD_VERSION = 0x2c - IFLA_BR_VLAN_STATS_PER_PORT = 0x2d - IFLA_BR_MULTI_BOOLOPT = 0x2e -+ IFLA_BR_MCAST_QUERIER_STATE = 0x2f -+ IFLA_BR_FDB_N_LEARNED = 0x30 -+ IFLA_BR_FDB_MAX_LEARNED = 0x31 - IFLA_BRPORT_UNSPEC = 0x0 - IFLA_BRPORT_STATE = 0x1 - IFLA_BRPORT_PRIORITY = 0x2 -@@ -1646,6 +1663,14 @@ const ( - IFLA_BRPORT_BACKUP_PORT = 0x22 - IFLA_BRPORT_MRP_RING_OPEN = 0x23 - IFLA_BRPORT_MRP_IN_OPEN = 0x24 -+ IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT = 0x25 -+ IFLA_BRPORT_MCAST_EHT_HOSTS_CNT = 0x26 -+ IFLA_BRPORT_LOCKED = 0x27 -+ IFLA_BRPORT_MAB = 0x28 -+ IFLA_BRPORT_MCAST_N_GROUPS = 0x29 -+ IFLA_BRPORT_MCAST_MAX_GROUPS = 0x2a -+ IFLA_BRPORT_NEIGH_VLAN_SUPPRESS = 0x2b -+ IFLA_BRPORT_BACKUP_NHID = 0x2c - IFLA_INFO_UNSPEC = 0x0 - IFLA_INFO_KIND = 0x1 - IFLA_INFO_DATA = 0x2 -@@ -1667,6 +1692,9 @@ const ( - IFLA_MACVLAN_MACADDR = 0x4 - IFLA_MACVLAN_MACADDR_DATA = 0x5 - IFLA_MACVLAN_MACADDR_COUNT = 0x6 -+ IFLA_MACVLAN_BC_QUEUE_LEN = 0x7 -+ IFLA_MACVLAN_BC_QUEUE_LEN_USED = 0x8 -+ IFLA_MACVLAN_BC_CUTOFF = 0x9 - IFLA_VRF_UNSPEC = 0x0 - IFLA_VRF_TABLE = 0x1 - IFLA_VRF_PORT_UNSPEC = 0x0 -@@ -1690,9 +1718,22 @@ const ( - IFLA_XFRM_UNSPEC = 0x0 - IFLA_XFRM_LINK = 0x1 - IFLA_XFRM_IF_ID = 0x2 -+ IFLA_XFRM_COLLECT_METADATA = 0x3 - IFLA_IPVLAN_UNSPEC = 0x0 - IFLA_IPVLAN_MODE = 0x1 - IFLA_IPVLAN_FLAGS = 0x2 -+ NETKIT_NEXT = -0x1 -+ NETKIT_PASS = 0x0 -+ NETKIT_DROP = 0x2 -+ NETKIT_REDIRECT = 0x7 -+ NETKIT_L2 = 0x0 -+ NETKIT_L3 = 0x1 -+ IFLA_NETKIT_UNSPEC = 0x0 -+ IFLA_NETKIT_PEER_INFO = 0x1 -+ IFLA_NETKIT_PRIMARY = 0x2 -+ IFLA_NETKIT_POLICY = 0x3 -+ IFLA_NETKIT_PEER_POLICY = 0x4 -+ IFLA_NETKIT_MODE = 0x5 - IFLA_VXLAN_UNSPEC = 0x0 - IFLA_VXLAN_ID = 0x1 - IFLA_VXLAN_GROUP = 0x2 -@@ -1723,6 +1764,8 @@ const ( - IFLA_VXLAN_GPE = 0x1b - IFLA_VXLAN_TTL_INHERIT = 0x1c - IFLA_VXLAN_DF = 0x1d -+ IFLA_VXLAN_VNIFILTER = 0x1e -+ IFLA_VXLAN_LOCALBYPASS = 0x1f - IFLA_GENEVE_UNSPEC = 0x0 - IFLA_GENEVE_ID = 0x1 - IFLA_GENEVE_REMOTE = 0x2 -@@ -1737,6 +1780,7 @@ const ( - IFLA_GENEVE_LABEL = 0xb - IFLA_GENEVE_TTL_INHERIT = 0xc - IFLA_GENEVE_DF = 0xd -+ IFLA_GENEVE_INNER_PROTO_INHERIT = 0xe - IFLA_BAREUDP_UNSPEC = 0x0 - IFLA_BAREUDP_PORT = 0x1 - IFLA_BAREUDP_ETHERTYPE = 0x2 -@@ -1749,6 +1793,8 @@ const ( - IFLA_GTP_FD1 = 0x2 - IFLA_GTP_PDP_HASHSIZE = 0x3 - IFLA_GTP_ROLE = 0x4 -+ IFLA_GTP_CREATE_SOCKETS = 0x5 -+ IFLA_GTP_RESTART_COUNT = 0x6 - IFLA_BOND_UNSPEC = 0x0 - IFLA_BOND_MODE = 0x1 - IFLA_BOND_ACTIVE_SLAVE = 0x2 -@@ -1778,6 +1824,9 @@ const ( - IFLA_BOND_AD_ACTOR_SYSTEM = 0x1a - IFLA_BOND_TLB_DYNAMIC_LB = 0x1b - IFLA_BOND_PEER_NOTIF_DELAY = 0x1c -+ IFLA_BOND_AD_LACP_ACTIVE = 0x1d -+ IFLA_BOND_MISSED_MAX = 0x1e -+ IFLA_BOND_NS_IP6_TARGET = 0x1f - IFLA_BOND_AD_INFO_UNSPEC = 0x0 - IFLA_BOND_AD_INFO_AGGREGATOR = 0x1 - IFLA_BOND_AD_INFO_NUM_PORTS = 0x2 -@@ -1793,6 +1842,7 @@ const ( - IFLA_BOND_SLAVE_AD_AGGREGATOR_ID = 0x6 - IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE = 0x7 - IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE = 0x8 -+ IFLA_BOND_SLAVE_PRIO = 0x9 - IFLA_VF_INFO_UNSPEC = 0x0 - IFLA_VF_INFO = 0x1 - IFLA_VF_UNSPEC = 0x0 -@@ -1851,8 +1901,16 @@ const ( - IFLA_STATS_LINK_XSTATS_SLAVE = 0x3 - IFLA_STATS_LINK_OFFLOAD_XSTATS = 0x4 - IFLA_STATS_AF_SPEC = 0x5 -+ IFLA_STATS_GETSET_UNSPEC = 0x0 -+ IFLA_STATS_GET_FILTERS = 0x1 -+ IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS = 0x2 - IFLA_OFFLOAD_XSTATS_UNSPEC = 0x0 - IFLA_OFFLOAD_XSTATS_CPU_HIT = 0x1 -+ IFLA_OFFLOAD_XSTATS_HW_S_INFO = 0x2 -+ IFLA_OFFLOAD_XSTATS_L3_STATS = 0x3 -+ IFLA_OFFLOAD_XSTATS_HW_S_INFO_UNSPEC = 0x0 -+ IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST = 0x1 -+ IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED = 0x2 - IFLA_XDP_UNSPEC = 0x0 - IFLA_XDP_FD = 0x1 - IFLA_XDP_ATTACHED = 0x2 -@@ -1882,6 +1940,11 @@ const ( - IFLA_RMNET_UNSPEC = 0x0 - IFLA_RMNET_MUX_ID = 0x1 - IFLA_RMNET_FLAGS = 0x2 -+ IFLA_MCTP_UNSPEC = 0x0 -+ IFLA_MCTP_NET = 0x1 -+ IFLA_DSA_UNSPEC = 0x0 -+ IFLA_DSA_CONDUIT = 0x1 -+ IFLA_DSA_MASTER = 0x1 - ) - - const ( -@@ -2672,6 +2735,7 @@ const ( - BPF_PROG_TYPE_LSM = 0x1d - BPF_PROG_TYPE_SK_LOOKUP = 0x1e - BPF_PROG_TYPE_SYSCALL = 0x1f -+ BPF_PROG_TYPE_NETFILTER = 0x20 - BPF_CGROUP_INET_INGRESS = 0x0 - BPF_CGROUP_INET_EGRESS = 0x1 - BPF_CGROUP_INET_SOCK_CREATE = 0x2 -@@ -2716,6 +2780,11 @@ const ( - BPF_PERF_EVENT = 0x29 - BPF_TRACE_KPROBE_MULTI = 0x2a - BPF_LSM_CGROUP = 0x2b -+ BPF_STRUCT_OPS = 0x2c -+ BPF_NETFILTER = 0x2d -+ BPF_TCX_INGRESS = 0x2e -+ BPF_TCX_EGRESS = 0x2f -+ BPF_TRACE_UPROBE_MULTI = 0x30 - BPF_LINK_TYPE_UNSPEC = 0x0 - BPF_LINK_TYPE_RAW_TRACEPOINT = 0x1 - BPF_LINK_TYPE_TRACING = 0x2 -@@ -2726,6 +2795,18 @@ const ( - BPF_LINK_TYPE_PERF_EVENT = 0x7 - BPF_LINK_TYPE_KPROBE_MULTI = 0x8 - BPF_LINK_TYPE_STRUCT_OPS = 0x9 -+ BPF_LINK_TYPE_NETFILTER = 0xa -+ BPF_LINK_TYPE_TCX = 0xb -+ BPF_LINK_TYPE_UPROBE_MULTI = 0xc -+ BPF_PERF_EVENT_UNSPEC = 0x0 -+ BPF_PERF_EVENT_UPROBE = 0x1 -+ BPF_PERF_EVENT_URETPROBE = 0x2 -+ BPF_PERF_EVENT_KPROBE = 0x3 -+ BPF_PERF_EVENT_KRETPROBE = 0x4 -+ BPF_PERF_EVENT_TRACEPOINT = 0x5 -+ BPF_PERF_EVENT_EVENT = 0x6 -+ BPF_F_KPROBE_MULTI_RETURN = 0x1 -+ BPF_F_UPROBE_MULTI_RETURN = 0x1 - BPF_ANY = 0x0 - BPF_NOEXIST = 0x1 - BPF_EXIST = 0x2 -@@ -2743,6 +2824,8 @@ const ( - BPF_F_MMAPABLE = 0x400 - BPF_F_PRESERVE_ELEMS = 0x800 - BPF_F_INNER_MAP = 0x1000 -+ BPF_F_LINK = 0x2000 -+ BPF_F_PATH_FD = 0x4000 - BPF_STATS_RUN_TIME = 0x0 - BPF_STACK_BUILD_ID_EMPTY = 0x0 - BPF_STACK_BUILD_ID_VALID = 0x1 -@@ -2763,6 +2846,7 @@ const ( - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_SEQ_NUMBER = 0x8 -+ BPF_F_NO_TUNNEL_KEY = 0x10 - BPF_F_TUNINFO_FLAGS = 0x10 - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_CURRENT_CPU = 0xffffffff -@@ -2779,6 +2863,8 @@ const ( - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_NO_CSUM_RESET = 0x20 - BPF_F_ADJ_ROOM_ENCAP_L2_ETH = 0x40 -+ BPF_F_ADJ_ROOM_DECAP_L3_IPV4 = 0x80 -+ BPF_F_ADJ_ROOM_DECAP_L3_IPV6 = 0x100 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_F_SYSCTL_BASE_NAME = 0x1 -@@ -2867,6 +2953,8 @@ const ( - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_FIB_LOOKUP_DIRECT = 0x1 - BPF_FIB_LOOKUP_OUTPUT = 0x2 -+ BPF_FIB_LOOKUP_SKIP_NEIGH = 0x4 -+ BPF_FIB_LOOKUP_TBID = 0x8 - BPF_FIB_LKUP_RET_SUCCESS = 0x0 - BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 - BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 -@@ -2902,6 +2990,7 @@ const ( - BPF_CORE_ENUMVAL_EXISTS = 0xa - BPF_CORE_ENUMVAL_VALUE = 0xb - BPF_CORE_TYPE_MATCHES = 0xc -+ BPF_F_TIMER_ABS = 0x1 - ) - - const ( -@@ -2980,6 +3069,12 @@ type LoopInfo64 struct { - Encrypt_key [32]uint8 - Init [2]uint64 - } -+type LoopConfig struct { -+ Fd uint32 -+ Size uint32 -+ Info LoopInfo64 -+ _ [8]uint64 -+} - - type TIPCSocketAddr struct { - Ref uint32 -@@ -3368,7 +3463,7 @@ const ( - DEVLINK_PORT_FN_ATTR_STATE = 0x2 - DEVLINK_PORT_FN_ATTR_OPSTATE = 0x3 - DEVLINK_PORT_FN_ATTR_CAPS = 0x4 -- DEVLINK_PORT_FUNCTION_ATTR_MAX = 0x4 -+ DEVLINK_PORT_FUNCTION_ATTR_MAX = 0x5 - ) - - type FsverityDigest struct { -@@ -4152,7 +4247,8 @@ const ( - ) - - type LandlockRulesetAttr struct { -- Access_fs uint64 -+ Access_fs uint64 -+ Access_net uint64 - } - - type LandlockPathBeneathAttr struct { -@@ -5103,7 +5199,7 @@ const ( - NL80211_FREQUENCY_ATTR_GO_CONCURRENT = 0xf - NL80211_FREQUENCY_ATTR_INDOOR_ONLY = 0xe - NL80211_FREQUENCY_ATTR_IR_CONCURRENT = 0xf -- NL80211_FREQUENCY_ATTR_MAX = 0x1b -+ NL80211_FREQUENCY_ATTR_MAX = 0x1c - NL80211_FREQUENCY_ATTR_MAX_TX_POWER = 0x6 - NL80211_FREQUENCY_ATTR_NO_10MHZ = 0x11 - NL80211_FREQUENCY_ATTR_NO_160MHZ = 0xc -@@ -5516,7 +5612,7 @@ const ( - NL80211_REGDOM_TYPE_CUSTOM_WORLD = 0x2 - NL80211_REGDOM_TYPE_INTERSECTION = 0x3 - NL80211_REGDOM_TYPE_WORLD = 0x1 -- NL80211_REG_RULE_ATTR_MAX = 0x7 -+ NL80211_REG_RULE_ATTR_MAX = 0x8 - NL80211_REKEY_DATA_AKM = 0x4 - NL80211_REKEY_DATA_KCK = 0x2 - NL80211_REKEY_DATA_KEK = 0x1 -@@ -5883,3 +5979,15 @@ type SchedAttr struct { - } - - const SizeofSchedAttr = 0x38 -+ -+type Cachestat_t struct { -+ Cache uint64 -+ Dirty uint64 -+ Writeback uint64 -+ Evicted uint64 -+ Recently_evicted uint64 -+} -+type CachestatRange struct { -+ Off uint64 -+ Len uint64 -+} -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go -index 6d8acbc..438a30a 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && linux --// +build 386,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go -index 59293c6..adceca3 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && linux --// +build amd64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go -index 40cfa38..eeaa00a 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && linux --// +build arm,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go -index 055bc42..6739aa9 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && linux --// +build arm64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go -index f28affb..9920ef6 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build loong64 && linux --// +build loong64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go -index 9d71e7c..2923b79 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips && linux --// +build mips,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go -index fd5ccd3..ce2750e 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips64 && linux --// +build mips64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go -index 7704de7..3038811 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips64le && linux --// +build mips64le,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go -index df00b87..efc6fed 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mipsle && linux --// +build mipsle,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go -index 0942840..9a654b7 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc && linux --// +build ppc,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go -index 0348743..40d358e 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc64 && linux --// +build ppc64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go -index bad0670..148c6ce 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc64le && linux --// +build ppc64le,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go -index 1b4c97c..72ba815 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build riscv64 && linux --// +build riscv64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go -index aa268d0..71e7655 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build s390x && linux --// +build s390x,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go -index 444045b..4abbdb9 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build sparc64 && linux --// +build sparc64,linux - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go -index 9bc4c8f..f22e794 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && netbsd --// +build 386,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go -index bb05f65..066a7d8 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && netbsd --// +build amd64,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go -index db40e3a..439548e 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && netbsd --// +build arm,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go -index 1112115..16085d3 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && netbsd --// +build arm64,netbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go -index 26eba23..afd13a3 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build 386 && openbsd --// +build 386,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go -index 5a54798..5d97f1f 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && openbsd --// +build amd64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go -index be58c4e..34871cd 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm && openbsd --// +build arm,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go -index 5233826..5911bce 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build arm64 && openbsd --// +build arm64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go -index 605cfdb..e4f24f3 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build mips64 && openbsd --// +build mips64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go -index d6724c0..ca50a79 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build ppc64 && openbsd --// +build ppc64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go -index ddfd27a..d7d7f79 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build riscv64 && openbsd --// +build riscv64,openbsd - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go -index 0400747..1416057 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go -@@ -2,7 +2,6 @@ - // Code generated by the command above; see README.md. DO NOT EDIT. - - //go:build amd64 && solaris --// +build amd64,solaris - - package unix - -diff --git a/vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go -index aec1efc..54f31be 100644 ---- a/vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go -+++ b/vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build zos && s390x --// +build zos,s390x - - // Hand edited based on ztypes_linux_s390x.go - // TODO: auto-generate. -diff --git a/vendor/golang.org/x/sys/windows/aliases.go b/vendor/golang.org/x/sys/windows/aliases.go -index a20ebea..ce2d713 100644 ---- a/vendor/golang.org/x/sys/windows/aliases.go -+++ b/vendor/golang.org/x/sys/windows/aliases.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build windows && go1.9 --// +build windows,go1.9 - - package windows - -diff --git a/vendor/golang.org/x/sys/windows/empty.s b/vendor/golang.org/x/sys/windows/empty.s -index fdbbbcd..ba64cac 100644 ---- a/vendor/golang.org/x/sys/windows/empty.s -+++ b/vendor/golang.org/x/sys/windows/empty.s -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build !go1.12 --// +build !go1.12 - - // This file is here to allow bodyless functions with go:linkname for Go 1.11 - // and earlier (see https://golang.org/issue/23311). -diff --git a/vendor/golang.org/x/sys/windows/env_windows.go b/vendor/golang.org/x/sys/windows/env_windows.go -index b8ad192..d4577a4 100644 ---- a/vendor/golang.org/x/sys/windows/env_windows.go -+++ b/vendor/golang.org/x/sys/windows/env_windows.go -@@ -37,14 +37,17 @@ func (token Token) Environ(inheritExisting bool) (env []string, err error) { - return nil, err - } - defer DestroyEnvironmentBlock(block) -- blockp := unsafe.Pointer(block) -- for { -- entry := UTF16PtrToString((*uint16)(blockp)) -- if len(entry) == 0 { -- break -+ size := unsafe.Sizeof(*block) -+ for *block != 0 { -+ // find NUL terminator -+ end := unsafe.Pointer(block) -+ for *(*uint16)(end) != 0 { -+ end = unsafe.Add(end, size) - } -- env = append(env, entry) -- blockp = unsafe.Add(blockp, 2*(len(entry)+1)) -+ -+ entry := unsafe.Slice(block, (uintptr(end)-uintptr(unsafe.Pointer(block)))/size) -+ env = append(env, UTF16ToString(entry)) -+ block = (*uint16)(unsafe.Add(end, size)) - } - return env, nil - } -diff --git a/vendor/golang.org/x/sys/windows/eventlog.go b/vendor/golang.org/x/sys/windows/eventlog.go -index 2cd6064..6c36695 100644 ---- a/vendor/golang.org/x/sys/windows/eventlog.go -+++ b/vendor/golang.org/x/sys/windows/eventlog.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build windows --// +build windows - - package windows - -diff --git a/vendor/golang.org/x/sys/windows/mksyscall.go b/vendor/golang.org/x/sys/windows/mksyscall.go -index 8563f79..dbcdb09 100644 ---- a/vendor/golang.org/x/sys/windows/mksyscall.go -+++ b/vendor/golang.org/x/sys/windows/mksyscall.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build generate --// +build generate - - package windows - -diff --git a/vendor/golang.org/x/sys/windows/race.go b/vendor/golang.org/x/sys/windows/race.go -index 9196b08..0f1bdc3 100644 ---- a/vendor/golang.org/x/sys/windows/race.go -+++ b/vendor/golang.org/x/sys/windows/race.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build windows && race --// +build windows,race - - package windows - -diff --git a/vendor/golang.org/x/sys/windows/race0.go b/vendor/golang.org/x/sys/windows/race0.go -index 7bae481..0c78da7 100644 ---- a/vendor/golang.org/x/sys/windows/race0.go -+++ b/vendor/golang.org/x/sys/windows/race0.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build windows && !race --// +build windows,!race - - package windows - -diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go -index c44a1b9..a9dc630 100644 ---- a/vendor/golang.org/x/sys/windows/service.go -+++ b/vendor/golang.org/x/sys/windows/service.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build windows --// +build windows - - package windows - -diff --git a/vendor/golang.org/x/sys/windows/str.go b/vendor/golang.org/x/sys/windows/str.go -index 4fc0143..6a4f9ce 100644 ---- a/vendor/golang.org/x/sys/windows/str.go -+++ b/vendor/golang.org/x/sys/windows/str.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build windows --// +build windows - - package windows - -diff --git a/vendor/golang.org/x/sys/windows/syscall.go b/vendor/golang.org/x/sys/windows/syscall.go -index 8732cdb..e85ed6b 100644 ---- a/vendor/golang.org/x/sys/windows/syscall.go -+++ b/vendor/golang.org/x/sys/windows/syscall.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build windows --// +build windows - - // Package windows contains an interface to the low-level operating system - // primitives. OS details vary depending on the underlying system, and -diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go -index 35cfc57..6395a03 100644 ---- a/vendor/golang.org/x/sys/windows/syscall_windows.go -+++ b/vendor/golang.org/x/sys/windows/syscall_windows.go -@@ -125,8 +125,7 @@ func UTF16PtrToString(p *uint16) string { - for ptr := unsafe.Pointer(p); *(*uint16)(ptr) != 0; n++ { - ptr = unsafe.Pointer(uintptr(ptr) + unsafe.Sizeof(*p)) - } -- -- return string(utf16.Decode(unsafe.Slice(p, n))) -+ return UTF16ToString(unsafe.Slice(p, n)) - } - - func Getpagesize() int { return 4096 } -@@ -155,6 +154,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { - //sys GetModuleFileName(module Handle, filename *uint16, size uint32) (n uint32, err error) = kernel32.GetModuleFileNameW - //sys GetModuleHandleEx(flags uint32, moduleName *uint16, module *Handle) (err error) = kernel32.GetModuleHandleExW - //sys SetDefaultDllDirectories(directoryFlags uint32) (err error) -+//sys AddDllDirectory(path *uint16) (cookie uintptr, err error) = kernel32.AddDllDirectory -+//sys RemoveDllDirectory(cookie uintptr) (err error) = kernel32.RemoveDllDirectory - //sys SetDllDirectory(path string) (err error) = kernel32.SetDllDirectoryW - //sys GetVersion() (ver uint32, err error) - //sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW -@@ -192,6 +193,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { - //sys GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW - //sys GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW - //sys SetEndOfFile(handle Handle) (err error) -+//sys SetFileValidData(handle Handle, validDataLength int64) (err error) - //sys GetSystemTimeAsFileTime(time *Filetime) - //sys GetSystemTimePreciseAsFileTime(time *Filetime) - //sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff] -@@ -233,6 +235,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { - //sys CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock - //sys DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock - //sys getTickCount64() (ms uint64) = kernel32.GetTickCount64 -+//sys GetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) - //sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) - //sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW - //sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW -@@ -969,7 +972,8 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { - if n > 0 { - sl += int32(n) + 1 - } -- if sa.raw.Path[0] == '@' { -+ if sa.raw.Path[0] == '@' || (sa.raw.Path[0] == 0 && sl > 3) { -+ // Check sl > 3 so we don't change unnamed socket behavior. - sa.raw.Path[0] = 0 - // Don't count trailing NUL for abstract address. - sl-- -diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go -index b88dc7c..359780f 100644 ---- a/vendor/golang.org/x/sys/windows/types_windows.go -+++ b/vendor/golang.org/x/sys/windows/types_windows.go -@@ -1094,7 +1094,33 @@ const ( - - SOMAXCONN = 0x7fffffff - -- TCP_NODELAY = 1 -+ TCP_NODELAY = 1 -+ TCP_EXPEDITED_1122 = 2 -+ TCP_KEEPALIVE = 3 -+ TCP_MAXSEG = 4 -+ TCP_MAXRT = 5 -+ TCP_STDURG = 6 -+ TCP_NOURG = 7 -+ TCP_ATMARK = 8 -+ TCP_NOSYNRETRIES = 9 -+ TCP_TIMESTAMPS = 10 -+ TCP_OFFLOAD_PREFERENCE = 11 -+ TCP_CONGESTION_ALGORITHM = 12 -+ TCP_DELAY_FIN_ACK = 13 -+ TCP_MAXRTMS = 14 -+ TCP_FASTOPEN = 15 -+ TCP_KEEPCNT = 16 -+ TCP_KEEPIDLE = TCP_KEEPALIVE -+ TCP_KEEPINTVL = 17 -+ TCP_FAIL_CONNECT_ON_ICMP_ERROR = 18 -+ TCP_ICMP_ERROR_INFO = 19 -+ -+ UDP_NOCHECKSUM = 1 -+ UDP_SEND_MSG_SIZE = 2 -+ UDP_RECV_MAX_COALESCED_SIZE = 3 -+ UDP_CHECKSUM_COVERAGE = 20 -+ -+ UDP_COALESCED_INFO = 3 - - SHUT_RD = 0 - SHUT_WR = 1 -diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go -index 8b1688d..e8791c8 100644 ---- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go -+++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go -@@ -184,6 +184,7 @@ var ( - procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") - procGetBestInterfaceEx = modiphlpapi.NewProc("GetBestInterfaceEx") - procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") -+ procAddDllDirectory = modkernel32.NewProc("AddDllDirectory") - procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject") - procCancelIo = modkernel32.NewProc("CancelIo") - procCancelIoEx = modkernel32.NewProc("CancelIoEx") -@@ -253,6 +254,7 @@ var ( - procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW") - procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle") - procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx") -+ procGetFileTime = modkernel32.NewProc("GetFileTime") - procGetFileType = modkernel32.NewProc("GetFileType") - procGetFinalPathNameByHandleW = modkernel32.NewProc("GetFinalPathNameByHandleW") - procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW") -@@ -329,6 +331,7 @@ var ( - procReadProcessMemory = modkernel32.NewProc("ReadProcessMemory") - procReleaseMutex = modkernel32.NewProc("ReleaseMutex") - procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") -+ procRemoveDllDirectory = modkernel32.NewProc("RemoveDllDirectory") - procResetEvent = modkernel32.NewProc("ResetEvent") - procResizePseudoConsole = modkernel32.NewProc("ResizePseudoConsole") - procResumeThread = modkernel32.NewProc("ResumeThread") -@@ -339,6 +342,7 @@ var ( - procSetDefaultDllDirectories = modkernel32.NewProc("SetDefaultDllDirectories") - procSetDllDirectoryW = modkernel32.NewProc("SetDllDirectoryW") - procSetEndOfFile = modkernel32.NewProc("SetEndOfFile") -+ procSetFileValidData = modkernel32.NewProc("SetFileValidData") - procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW") - procSetErrorMode = modkernel32.NewProc("SetErrorMode") - procSetEvent = modkernel32.NewProc("SetEvent") -@@ -1604,6 +1608,15 @@ func GetIfEntry(pIfRow *MibIfRow) (errcode error) { - return - } - -+func AddDllDirectory(path *uint16) (cookie uintptr, err error) { -+ r0, _, e1 := syscall.Syscall(procAddDllDirectory.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) -+ cookie = uintptr(r0) -+ if cookie == 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ - func AssignProcessToJobObject(job Handle, process Handle) (err error) { - r1, _, e1 := syscall.Syscall(procAssignProcessToJobObject.Addr(), 2, uintptr(job), uintptr(process), 0) - if r1 == 0 { -@@ -2185,6 +2198,14 @@ func GetFileInformationByHandleEx(handle Handle, class uint32, outBuffer *byte, - return - } - -+func GetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) { -+ r1, _, e1 := syscall.Syscall6(procGetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0) -+ if r1 == 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ - func GetFileType(filehandle Handle) (n uint32, err error) { - r0, _, e1 := syscall.Syscall(procGetFileType.Addr(), 1, uintptr(filehandle), 0, 0) - n = uint32(r0) -@@ -2870,6 +2891,14 @@ func RemoveDirectory(path *uint16) (err error) { - return - } - -+func RemoveDllDirectory(cookie uintptr) (err error) { -+ r1, _, e1 := syscall.Syscall(procRemoveDllDirectory.Addr(), 1, uintptr(cookie), 0, 0) -+ if r1 == 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ - func ResetEvent(event Handle) (err error) { - r1, _, e1 := syscall.Syscall(procResetEvent.Addr(), 1, uintptr(event), 0, 0) - if r1 == 0 { -@@ -2960,6 +2989,14 @@ func SetEndOfFile(handle Handle) (err error) { - return - } - -+func SetFileValidData(handle Handle, validDataLength int64) (err error) { -+ r1, _, e1 := syscall.Syscall(procSetFileValidData.Addr(), 2, uintptr(handle), uintptr(validDataLength), 0) -+ if r1 == 0 { -+ err = errnoErr(e1) -+ } -+ return -+} -+ - func SetEnvironmentVariable(name *uint16, value *uint16) (err error) { - r1, _, e1 := syscall.Syscall(procSetEnvironmentVariableW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value)), 0) - if r1 == 0 { -diff --git a/vendor/golang.org/x/term/term_unix.go b/vendor/golang.org/x/term/term_unix.go -index 62c2b3f..1ad0ddf 100644 ---- a/vendor/golang.org/x/term/term_unix.go -+++ b/vendor/golang.org/x/term/term_unix.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos --// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos - - package term - -diff --git a/vendor/golang.org/x/term/term_unix_bsd.go b/vendor/golang.org/x/term/term_unix_bsd.go -index 853b3d6..9dbf546 100644 ---- a/vendor/golang.org/x/term/term_unix_bsd.go -+++ b/vendor/golang.org/x/term/term_unix_bsd.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build darwin || dragonfly || freebsd || netbsd || openbsd --// +build darwin dragonfly freebsd netbsd openbsd - - package term - -diff --git a/vendor/golang.org/x/term/term_unix_other.go b/vendor/golang.org/x/term/term_unix_other.go -index 1e8955c..1b36de7 100644 ---- a/vendor/golang.org/x/term/term_unix_other.go -+++ b/vendor/golang.org/x/term/term_unix_other.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build aix || linux || solaris || zos --// +build aix linux solaris zos - - package term - -diff --git a/vendor/golang.org/x/term/term_unsupported.go b/vendor/golang.org/x/term/term_unsupported.go -index f1df850..3c409e5 100644 ---- a/vendor/golang.org/x/term/term_unsupported.go -+++ b/vendor/golang.org/x/term/term_unsupported.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !zos && !windows && !solaris && !plan9 --// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!zos,!windows,!solaris,!plan9 - - package term - -diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go b/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go -index 8a7392c..784bb88 100644 ---- a/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go -+++ b/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build go1.10 --// +build go1.10 - - package bidirule - -diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go b/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go -index bb0a920..8e1e943 100644 ---- a/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go -+++ b/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go -@@ -3,7 +3,6 @@ - // license that can be found in the LICENSE file. - - //go:build !go1.10 --// +build !go1.10 - - package bidirule - -diff --git a/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go -index 42fa8d7..d2bd711 100644 ---- a/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go -+++ b/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.10 && !go1.13 --// +build go1.10,!go1.13 - - package bidi - -diff --git a/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go -index 56a0e1e..f76bdca 100644 ---- a/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go -+++ b/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.13 && !go1.14 --// +build go1.13,!go1.14 - - package bidi - -diff --git a/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go -index baacf32..3aa2c3b 100644 ---- a/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go -+++ b/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.14 && !go1.16 --// +build go1.14,!go1.16 - - package bidi - -diff --git a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go -index ffadb7b..a713757 100644 ---- a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go -+++ b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.16 && !go1.21 --// +build go1.16,!go1.21 - - package bidi - -diff --git a/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go -index 92cce58..f15746f 100644 ---- a/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go -+++ b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.21 --// +build go1.21 - - package bidi - -diff --git a/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go -index f517fdb..c164d37 100644 ---- a/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go -+++ b/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build !go1.10 --// +build !go1.10 - - package bidi - -diff --git a/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go -index f5a0788..1af161c 100644 ---- a/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go -+++ b/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.10 && !go1.13 --// +build go1.10,!go1.13 - - package norm - -diff --git a/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go -index cb7239c..eb73ecc 100644 ---- a/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go -+++ b/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.13 && !go1.14 --// +build go1.13,!go1.14 - - package norm - -diff --git a/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go -index 11b2733..276cb8d 100644 ---- a/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go -+++ b/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.14 && !go1.16 --// +build go1.14,!go1.16 - - package norm - -diff --git a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go -index f65785e..0cceffd 100644 ---- a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go -+++ b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.16 && !go1.21 --// +build go1.16,!go1.21 - - package norm - -diff --git a/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go -index e1858b8..b0819e4 100644 ---- a/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go -+++ b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build go1.21 --// +build go1.21 - - package norm - -diff --git a/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go -index 0175eae..bf65457 100644 ---- a/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go -+++ b/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go -@@ -1,7 +1,6 @@ - // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - - //go:build !go1.10 --// +build !go1.10 - - package norm - -diff --git a/vendor/modules.txt b/vendor/modules.txt -index 7ef0ab8..c959a8e 100644 ---- a/vendor/modules.txt -+++ b/vendor/modules.txt -@@ -150,8 +150,8 @@ github.com/vishvananda/netlink/nl - # github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f - ## explicit; go 1.12 - github.com/vishvananda/netns --# golang.org/x/net v0.17.0 --## explicit; go 1.17 -+# golang.org/x/net v0.23.0 -+## explicit; go 1.18 - golang.org/x/net/context - golang.org/x/net/html - golang.org/x/net/html/atom -@@ -166,16 +166,16 @@ golang.org/x/net/trace - ## explicit; go 1.17 - golang.org/x/oauth2 - golang.org/x/oauth2/internal --# golang.org/x/sys v0.13.0 --## explicit; go 1.17 -+# golang.org/x/sys v0.18.0 -+## explicit; go 1.18 - golang.org/x/sys/plan9 - golang.org/x/sys/unix - golang.org/x/sys/windows --# golang.org/x/term v0.13.0 --## explicit; go 1.17 -+# golang.org/x/term v0.18.0 -+## explicit; go 1.18 - golang.org/x/term --# golang.org/x/text v0.13.0 --## explicit; go 1.17 -+# golang.org/x/text v0.14.0 -+## explicit; go 1.18 - golang.org/x/text/encoding - golang.org/x/text/encoding/charmap - golang.org/x/text/encoding/htmlindex --- -2.34.1 - diff --git a/SPECS/multus/CVE-2024-45338.patch b/SPECS/multus/CVE-2024-45338.patch deleted file mode 100644 index 368833dbca..0000000000 --- a/SPECS/multus/CVE-2024-45338.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 8525179eff5cd787a9dd5efc1cc6b84646c2d072 Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Thu, 2 Jan 2025 10:22:13 +0000 -Subject: [PATCH] Fix CVE CVE-2024-45338 in multus - ---- - vendor/golang.org/x/net/html/doctype.go | 2 +- - vendor/golang.org/x/net/html/foreign.go | 3 +-- - vendor/golang.org/x/net/html/parse.go | 4 ++-- - 3 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go -index c484e5a..bca3ae9 100644 ---- a/vendor/golang.org/x/net/html/doctype.go -+++ b/vendor/golang.org/x/net/html/doctype.go -@@ -87,7 +87,7 @@ func parseDoctype(s string) (n *Node, quirks bool) { - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && -- strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { -+ strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") { - quirks = true - } - } -diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go -index 9da9e9d..e8515d8 100644 ---- a/vendor/golang.org/x/net/html/foreign.go -+++ b/vendor/golang.org/x/net/html/foreign.go -@@ -40,8 +40,7 @@ func htmlIntegrationPoint(n *Node) bool { - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { -- val := strings.ToLower(a.Val) -- if val == "text/html" || val == "application/xhtml+xml" { -+ if strings.EqualFold(a.Val, "text/html") || strings.EqualFold(a.Val, "application/xhtml+xml") { - return true - } - } -diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go -index 46a89ed..5b8374b 100644 ---- a/vendor/golang.org/x/net/html/parse.go -+++ b/vendor/golang.org/x/net/html/parse.go -@@ -1031,7 +1031,7 @@ func inBodyIM(p *parser) bool { - if p.tok.DataAtom == a.Input { - for _, t := range p.tok.Attr { - if t.Key == "type" { -- if strings.ToLower(t.Val) == "hidden" { -+ if strings.EqualFold(t.Val, "hidden") { - // Skip setting framesetOK = false - return true - } -@@ -1459,7 +1459,7 @@ func inTableIM(p *parser) bool { - return inHeadIM(p) - case a.Input: - for _, t := range p.tok.Attr { -- if t.Key == "type" && strings.ToLower(t.Val) == "hidden" { -+ if t.Key == "type" && strings.EqualFold(t.Val, "hidden") { - p.addElement() - p.oe.pop() - return true --- -2.39.4 - diff --git a/SPECS/multus/CVE-2025-22872.patch b/SPECS/multus/CVE-2025-22872.patch deleted file mode 100644 index 58b8953369..0000000000 --- a/SPECS/multus/CVE-2025-22872.patch +++ /dev/null @@ -1,57 +0,0 @@ -From e1fcd82abba34df74614020343be8eb1fe85f0d9 Mon Sep 17 00:00:00 2001 -From: Roland Shoemaker -Date: Mon, 24 Feb 2025 11:18:31 -0800 -Subject: [PATCH] html: properly handle trailing solidus in unquoted attribute - value in foreign content - -The parser properly treats tags like

as

, but the -tokenizer emits the SelfClosingTagToken token incorrectly. When the -parser is used to parse foreign content, this results in an incorrect -DOM. - -Thanks to Sean Ng (https://ensy.zip) for reporting this issue. - -Fixes golang/go#73070 -Fixes CVE-2025-22872 - -Change-Id: I65c18df6d6244bf943b61e6c7a87895929e78f4f -Reviewed-on: https://go-review.googlesource.com/c/net/+/661256 -Reviewed-by: Neal Patel -Reviewed-by: Roland Shoemaker -LUCI-TryBot-Result: Go LUCI -Auto-Submit: Gopher Robot -Link: https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9 ---- - vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++-- - vendor/golang.org/x/net/html/token_test.go | 18 ++++++++++++++++++ - 2 files changed, 34 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index 3c57880d69..6598c1f7b3 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType { - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } -- // Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken diff --git a/SPECS/multus/multus.signatures.json b/SPECS/multus/multus.signatures.json deleted file mode 100644 index 86536753c6..0000000000 --- a/SPECS/multus/multus.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "multus-4.0.2.tar.gz": "feeb117d805a254bdf15d2854c7b6939a92458aadbfb25f3ea40542d6775e34b" - } -} diff --git a/SPECS/multus/multus.spec b/SPECS/multus/multus.spec deleted file mode 100644 index 4a4af8b0c6..0000000000 --- a/SPECS/multus/multus.spec +++ /dev/null @@ -1,196 +0,0 @@ -# -# spec file for package multus -# -# Copyright (c) 2021 SUSE LLC -# -# All modifications and additions to the file contributed by third parties -# remain the property of their copyright owners, unless otherwise agreed -# upon. The license for this file, and modifications and additions to the -# file, is the same license as for the pristine package itself (unless the -# license for the pristine package is not an Open Source License, in which -# case the license is the MIT License). An "Open Source License" is a -# license that conforms to the Open Source Definition (Version 1.9) -# published by the Open Source Initiative. - -# Please submit bugfixes or comments via https://bugs.opensuse.org/ -# - - -Summary: CNI plugin providing multiple interfaces in containers -Name: multus -Version: 4.0.2 -Release: 7%{?dist} -License: ASL 2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: System/Management -URL: https://github.com/intel/multus-cni -Source0: https://github.com/k8snetworkplumbingwg/multus-cni/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -%define commit efdc0a5c7d1ea4bb236d638403420448b48782b3 -Patch0: CVE-2023-3978.patch -Patch1: CVE-2023-44487.patch -Patch2: CVE-2023-45288.patch -Patch3: CVE-2024-45338.patch -# CVE-2025-22872 will be fixed in go net v0.38 by https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9 -Patch4: CVE-2025-22872.patch -BuildRequires: golang < 1.25 -BuildRequires: golang-packaging - -%description -Multus is a CNI plugin which provides multiple network interfaces in -containers. It allows to use many CNI plugins at the same time and supports all -plugins which implement the CNI specification. - -%package k8s-yaml -Summary: Kubernetes yaml file to run Multus containers -Group: System/Management - -%description k8s-yaml -Multus is a CNI plugin which provides multiple network interfaces in -containers. It allows to use many CNI plugins at the same time and supports all -plugins which implement the CNI specification. - -This package contains the yaml file requried to download and run Multus -containers in a Kubernetes cluster. - -%prep -%autosetup -p1 -n %{name}-cni-%{version} - -%build -VERSION=%{version} COMMIT=%{commit} ./hack/build-go.sh - -%install -mkdir -p %{buildroot}%{_bindir} -install -pm 0755 bin/* %{buildroot}%{_bindir} -install -D -m0644 deployments/multus-daemonset-crio.yml %{buildroot}%{_datadir}/k8s-yaml/multus/multus.yaml - -%files -%license LICENSE -%doc README.md -%{_bindir}/* - -%files k8s-yaml -%dir %{_datarootdir}/k8s-yaml -%dir %{_datarootdir}/k8s-yaml/multus -%{_datarootdir}/k8s-yaml/multus/multus.yaml - -%changelog -* Fri Oct 3 2025 Lee Chee Yang - 4.0.2-7 -- merge from Azure Linux 3.0.20250910-3.0 -- Set BR for golang to < 1.25 - -* Fri May 30 2025 Ranjan Dutta - 4.0.2-6 -- merge from Azure Linux 3.0.20250521-3.0 -- Add patch for CVE-2025-22872 - -* Fri Mar 21 2025 Anuj Mittal - 4.0.2-5 -- Bump Release to rebuild - -* Tue Dec 31 2024 Rohit Rawat - 4.0.2-4 -- Add patch for CVE-2024-45338 - -* Fri Nov 22 2024 Xiaohong Deng - 4.0.2-3 -- Add patches to resolve CVE-2023-39325, CVE-2023-44487 and CVE-2023-45288. -- CVE-2023-39325 is a subset of CVE-2023-44487 and the patches are combined. - -* Wed Aug 21 2024 Sumedh Sharma - 4.0.2-2 -- Add patch to resolve CVE-2023-3978 - -* Mon Jun 24 2024 CBL-Mariner Servicing Account - 4.0.2-1 -- Auto-upgrade to 4.0.2 - upgrade to 4.0.2 - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 3.8-13 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 3.8-12 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 3.8-11 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 3.8-10 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 3.8-9 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 3.8-8 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 3.8-7 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 3.8-6 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 3.8-5 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 3.8-4 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 3.8-3 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 3.8-2 -- Bump release to rebuild with go 1.18.8 - -* Wed Sep 07 2022 Yash Panchal - 3.8-1 -- License verified -- Initial changes to build for Mariner -- Initial CBL-Mariner import from openSUSE TumbleWeed (license: same as "License" tag) - -* Fri Jan 08 2021 Richard Brown rbrown@suse.com -- Update to version 3.6: - * Remove obsolete 0001-build-Allow-to-define-VERSION-and-COMMIT-without-git.patch - * Remove obsolete multus-override-build-date.patch - * Update vendors - * Fix error handling on cmdDel - * Allow to override build date with SOURCE_DATE_EPOCH - * Add infinibandGUID runtime config to delegate netconf - * Struct updates - * build: Enable -mod build flag to be toggled via environment variable - * Add support for log rotation - * README typo for roll-YOUR-own - * Fix network status name/namespace to compliant with multi-net-spec - * Adds code of conduct - * Change the error handling for kubernetes client - * Add deviceid in clusterNetwork - * Simplify examples directory - * Introduce gopkg.in for go module - * Move pre-1.16 Kubernetes assets to a deprecated folder (to later remove) - * Simplify error message in case of delegating CNI error - * Adds development docs note regarding issue policy - * Sets the Kubernetes API calls timeout to 60 seconds - * Allows namespaceIsolation to allow pods in any namespace refer to the default namespace - * Skip docker push action if REPOSITORY_PASS is not set - * Add error message in case of unexpected situation - * Check Pod parameter against nil before calling Eventf - * Updates Dockerfile to golang 1.13 (specifying version) - * Fix pre 1.16 api version for CRDs - -* Wed Jul 8 2020 Bernhard Wiedemann -- Add multus-override-build-date.patch to override build date (boo#1047218) - -* Fri Oct 25 2019 Michał Rostecki -- Update to version 3.3: - * This release updates for parameters necessary to properly - create a CNI configuration under Kubernetes 1.16, among other - recent stability fixes. -- Add multus-k8s-yaml package which provides the Kubernetes yaml - file to run Multus containers. -- Add patch which fixes the build from tarball: - * 0001-build-Allow-to-define-VERSION-and-COMMIT-without-git.patch - -* Tue Nov 27 2018 Michał Rostecki -- Initial version 3.1 - * Update test.sh with coveralls job inclusion - * coveralls code coverage during Travis CI run, adds CI badges - * Fix glide.yaml - * fixing the cmddel fix code - * handling the multiple cmd del call from kubelet - * Add debug log for newly added functions. - * Convert bytes to string in Debugf() - * Add logging message for debug/error - * Enable hairpin in the multus config - * adding error checking in network status creation as well diff --git a/SPECS/opa/0001-Make-telemetry-opt-out.patch b/SPECS/opa/0001-Make-telemetry-opt-out.patch deleted file mode 100644 index 4db4917024..0000000000 --- a/SPECS/opa/0001-Make-telemetry-opt-out.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 6bf97bc3834e88febd30fbad690caddc59adc145 Mon Sep 17 00:00:00 2001 -From: Olivier Lemasle -Date: Tue, 27 Oct 2020 21:59:41 +0100 -Subject: [PATCH] Make telemetry opt-out - ---- - cmd/run.go | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/cmd/run.go b/cmd/run.go -index 0283937c..12811506 100644 ---- a/cmd/run.go -+++ b/cmd/run.go -@@ -206,7 +206,7 @@ To skip bundle verification, use the --skip-verify flag. - addConfigOverrideFiles(runCommand.Flags(), &cmdParams.rt.ConfigOverrideFiles) - addBundleModeFlag(runCommand.Flags(), &cmdParams.rt.BundleMode, false) - -- runCommand.Flags().BoolVar(&cmdParams.skipVersionCheck, "skip-version-check", false, "disables anonymous version reporting (see: https://www.openpolicyagent.org/docs/latest/privacy)") -+ runCommand.Flags().BoolVar(&cmdParams.skipVersionCheck, "skip-version-check", true, "disables anonymous version reporting (see: https://www.openpolicyagent.org/docs/latest/privacy)") - err := runCommand.Flags().MarkDeprecated("skip-version-check", "\"skip-version-check\" is deprecated. Use \"disable-telemetry\" instead") - if err != nil { - fmt.Println("error:", err) diff --git a/SPECS/opa/0001-Skip-tests-requiring-network.patch b/SPECS/opa/0001-Skip-tests-requiring-network.patch deleted file mode 100644 index 56bb45b211..0000000000 --- a/SPECS/opa/0001-Skip-tests-requiring-network.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 194b742484902569e1505ebd0b753a0d16c40553 Mon Sep 17 00:00:00 2001 -From: Olivier Lemasle -Date: Tue, 27 Apr 2021 21:53:41 +0200 -Subject: [PATCH] Skip tests requiring network - ---- - ast/schema_test.go | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/ast/schema_test.go b/ast/schema_test.go -index 2882829b2..879fe672e 100644 ---- a/ast/schema_test.go -+++ b/ast/schema_test.go -@@ -56,6 +56,7 @@ func TestParseSchemaObject(t *testing.T) { - } - - func TestSetTypesWithSchemaRef(t *testing.T) { -+ t.Skip() - var sch interface{} - - ts := kubeSchemaServer(t) -@@ -116,6 +117,7 @@ func TestSetTypesWithSchemaRef(t *testing.T) { - } - - func TestSetTypesWithPodSchema(t *testing.T) { -+ t.Skip() - var sch interface{} - - ts := kubeSchemaServer(t) --- -2.31.1 diff --git a/SPECS/opa/CVE-2023-45288.patch b/SPECS/opa/CVE-2023-45288.patch deleted file mode 100644 index 676fcbace5..0000000000 --- a/SPECS/opa/CVE-2023-45288.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 63b4ddd633bde166d2b2800dbc6ad6a64f77b838 Mon Sep 17 00:00:00 2001 -From: Damien Neil -Date: Wed, 10 Jan 2024 13:41:39 -0800 -Subject: [PATCH] http2: close connections when receiving too many headers - -Maintaining HPACK state requires that we parse and process -all HEADERS and CONTINUATION frames on a connection. -When a request's headers exceed MaxHeaderBytes, we don't -allocate memory to store the excess headers but we do -parse them. This permits an attacker to cause an HTTP/2 -endpoint to read arbitrary amounts of data, all associated -with a request which is going to be rejected. - -Set a limit on the amount of excess header frames we -will process before closing a connection. - -Thanks to Bartek Nowotarski for reporting this issue. - -Fixes CVE-2023-45288 -Fixes golang/go#65051 - -Change-Id: I15df097268df13bb5a9e9d3a5c04a8a141d850f6 -Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2130527 -Reviewed-by: Roland Shoemaker -Reviewed-by: Tatiana Bradley -Reviewed-on: https://go-review.googlesource.com/c/net/+/576155 -Reviewed-by: Dmitri Shuralyov -Auto-Submit: Dmitri Shuralyov -Reviewed-by: Than McIntosh -LUCI-TryBot-Result: Go LUCI ---- - vendor/golang.org/x/net/http2/frame.go | 31 ++++++++++++++++++++++++++ - 1 file changed, 31 insertions(+) - -diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go -index c1f6b90..175c154 100644 ---- a/vendor/golang.org/x/net/http2/frame.go -+++ b/vendor/golang.org/x/net/http2/frame.go -@@ -1565,6 +1565,7 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { - if size > remainSize { - hdec.SetEmitEnabled(false) - mh.Truncated = true -+ remainSize = 0 - return - } - remainSize -= size -@@ -1577,6 +1578,36 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { - var hc headersOrContinuation = hf - for { - frag := hc.HeaderBlockFragment() -+ -+ // Avoid parsing large amounts of headers that we will then discard. -+ // If the sender exceeds the max header list size by too much, -+ // skip parsing the fragment and close the connection. -+ // -+ // "Too much" is either any CONTINUATION frame after we've already -+ // exceeded the max header list size (in which case remainSize is 0), -+ // or a frame whose encoded size is more than twice the remaining -+ // header list bytes we're willing to accept. -+ if int64(len(frag)) > int64(2*remainSize) { -+ if VerboseLogs { -+ log.Printf("http2: header list too large") -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the struture of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ -+ // Also close the connection after any CONTINUATION frame following an -+ // invalid header, since we stop tracking the size of the headers after -+ // an invalid one. -+ if invalid != nil { -+ if VerboseLogs { -+ log.Printf("http2: invalid header: %v", invalid) -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the struture of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ - if _, err := hdec.Write(frag); err != nil { - return nil, ConnectionError(ErrCodeCompression) - } --- -2.44.0 - diff --git a/SPECS/opa/CVE-2025-46569.patch b/SPECS/opa/CVE-2025-46569.patch deleted file mode 100644 index 994c86126c..0000000000 --- a/SPECS/opa/CVE-2025-46569.patch +++ /dev/null @@ -1,373 +0,0 @@ -From 7884928e4539de0a800414e2c68a2912a386344d Mon Sep 17 00:00:00 2001 -From: akhila-guruju -Date: Tue, 10 Jun 2025 07:21:09 +0000 -Subject: [PATCH] Address CVE-2025-46569 - -Upstream Patch Reference: https://github.com/open-policy-agent/opa/commit/ad2063247a14711882f18c387a511fc8094aa79c - ---- - server/server.go | 92 +++++++++++++++---- - server/server_test.go | 150 ++++++++++++++++++++++++++++++- - test/e2e/metrics/metrics_test.go | 1 - - 3 files changed, 226 insertions(+), 17 deletions(-) - -diff --git a/server/server.go b/server/server.go -index 64eeaa6..e5ab876 100644 ---- a/server/server.go -+++ b/server/server.go -@@ -1135,19 +1135,23 @@ func (s *Server) v0QueryPath(w http.ResponseWriter, r *http.Request, urlPath str - } - - if len(rs) == 0 { -- ref := stringPathToDataRef(urlPath) -+ ref, err := stringPathToDataRef(urlPath) -+ if err != nil { -+ writer.Error(w, http.StatusBadRequest, types.NewErrorV1(types.CodeInvalidParameter, "invalid path: %v", err)) -+ return -+ } - - var messageType = types.MsgMissingError - if len(s.getCompiler().GetRulesForVirtualDocument(ref)) > 0 { - messageType = types.MsgFoundUndefinedError - } -- err := types.NewErrorV1(types.CodeUndefinedDocument, fmt.Sprintf("%v: %v", messageType, ref)) -- if err := logger.Log(ctx, txn, urlPath, "", goInput, input, nil, ndbCache, err, m); err != nil { -+ errV1 := types.NewErrorV1(types.CodeUndefinedDocument, "%v: %v", messageType, ref) -+ if err := logger.Log(ctx, txn, urlPath, "", goInput, input, nil, ndbCache, errV1, m); err != nil { - writer.ErrorAuto(w, err) - return - } - -- writer.Error(w, http.StatusNotFound, err) -+ writer.Error(w, http.StatusNotFound, errV1) - return - } - err = logger.Log(ctx, txn, urlPath, "", goInput, input, &rs[0].Expressions[0].Value, ndbCache, nil, m) -@@ -1306,10 +1310,15 @@ func (s *Server) unversionedGetHealthWithPolicy(w http.ResponseWriter, r *http.R - vars := mux.Vars(r) - urlPath := vars["path"] - healthDataPath := fmt.Sprintf("/system/health/%s", urlPath) -- healthDataPath = stringPathToDataRef(healthDataPath).String() -+ -+ healthDataPathQuery, err := stringPathToQuery(healthDataPath) -+ if err != nil { -+ writer.Error(w, http.StatusBadRequest, types.NewErrorV1(types.CodeInvalidParameter, "invalid path: %v", err)) -+ return -+ } - - rego := rego.New( -- rego.Query(healthDataPath), -+ rego.ParsedQuery(healthDataPathQuery), - rego.Compiler(s.getCompiler()), - rego.Store(s.store), - rego.Input(input), -@@ -1324,7 +1333,7 @@ func (s *Server) unversionedGetHealthWithPolicy(w http.ResponseWriter, r *http.R - } - - if len(rs) == 0 { -- writeHealthResponse(w, fmt.Errorf("health check (%v) was undefined", healthDataPath)) -+ writeHealthResponse(w, fmt.Errorf("health check (%v) was undefined", healthDataPathQuery)) - return - } - -@@ -1334,7 +1343,7 @@ func (s *Server) unversionedGetHealthWithPolicy(w http.ResponseWriter, r *http.R - return - } - -- writeHealthResponse(w, fmt.Errorf("health check (%v) returned unexpected value", healthDataPath)) -+ writeHealthResponse(w, fmt.Errorf("health check (%v) returned unexpected value", healthDataPathQuery)) - } - - func writeHealthResponse(w http.ResponseWriter, err error) { -@@ -2551,12 +2560,15 @@ func (s *Server) makeRego(ctx context.Context, - tracer topdown.QueryTracer, - opts []func(*rego.Rego), - ) (*rego.Rego, error) { -- queryPath := stringPathToDataRef(urlPath).String() -+ query, err := stringPathToQuery(urlPath) -+ if err != nil { -+ return nil, types.NewErrorV1(types.CodeInvalidParameter, "invalid path: %v", err) -+ } - - opts = append( - opts, - rego.Transaction(txn), -- rego.Query(queryPath), -+ rego.ParsedQuery(query), - rego.ParsedInput(input), - rego.Metrics(m), - rego.QueryTracer(tracer), -@@ -2571,6 +2583,43 @@ func (s *Server) makeRego(ctx context.Context, - return rego.New(opts...), nil - } - -+func stringPathToQuery(urlPath string) (ast.Body, error) { -+ ref, err := stringPathToDataRef(urlPath) -+ if err != nil { -+ return nil, err -+ } -+ -+ return parseRefQuery(ref.String()) -+} -+ -+// parseRefQuery parses a string into a query ast.Body. -+// The resulting query must be comprised of a single ref, or an error will be returned. -+func parseRefQuery(str string) (ast.Body, error) { -+ query, err := ast.ParseBody(str) -+ if err != nil { -+ return nil, errors.New("failed to parse query") -+ } -+ -+ // assert the query is exactly one statement -+ if l := len(query); l == 0 { -+ return nil, errors.New("no ref") -+ } else if l > 1 { -+ return nil, errors.New("complex query") -+ } -+ -+ // assert the single statement is a lone ref -+ expr := query[0] -+ switch t := expr.Terms.(type) { -+ case *ast.Term: -+ switch t.Value.(type) { -+ case ast.Ref: -+ return query, nil -+ } -+ } -+ -+ return nil, errors.New("complex query") -+} -+ - func (s *Server) prepareV1PatchSlice(root string, ops []types.PatchV1) (result []patchImpl, err error) { - - root = "/" + strings.Trim(root, "/") -@@ -2678,23 +2727,36 @@ func (s *Server) updateNDCache(enabled bool) { - s.ndbCacheEnabled = enabled - } - --func stringPathToDataRef(s string) (r ast.Ref) { -+func stringPathToDataRef(s string) (ast.Ref, error) { - result := ast.Ref{ast.DefaultRootDocument} -- return append(result, stringPathToRef(s)...) -+ r, err := stringPathToRef(s) -+ if err != nil { -+ return nil, err -+ } -+ return append(result, r...), nil - } - --func stringPathToRef(s string) (r ast.Ref) { -+func stringPathToRef(s string) (ast.Ref, error) { -+ r := ast.Ref{} -+ - if len(s) == 0 { -- return r -+ return r, nil - } -+ - p := strings.Split(s, "/") - for _, x := range p { - if x == "" { - continue - } -+ - if y, err := url.PathUnescape(x); err == nil { - x = y - } -+ -+ if strings.Contains(x, "\"") { -+ return nil, fmt.Errorf("invalid ref term '%s'", x) -+ } -+ - i, err := strconv.Atoi(x) - if err != nil { - r = append(r, ast.StringTerm(x)) -@@ -2702,7 +2764,7 @@ func stringPathToRef(s string) (r ast.Ref) { - r = append(r, ast.IntNumberTerm(i)) - } - } -- return r -+ return r, nil - } - - func validateQuery(query string) (ast.Body, error) { -diff --git a/server/server_test.go b/server/server_test.go -index 9a827af..8de136e 100644 ---- a/server/server_test.go -+++ b/server/server_test.go -@@ -2736,7 +2736,6 @@ func TestDataMetricsEval(t *testing.T) { - "counter_disk_read_keys", - "counter_disk_read_bytes", - "timer_rego_input_parse_ns", -- "timer_rego_query_parse_ns", - "timer_rego_query_compile_ns", - "timer_rego_query_eval_ns", - "timer_server_handler_ns", -@@ -5739,3 +5738,152 @@ func zipString(input string) []byte { - } - return b.Bytes() - } -+ -+func TestStringPathToDataRef(t *testing.T) { -+ t.Parallel() -+ -+ cases := []struct { -+ note string -+ path string -+ expRef string -+ expErr string -+ }{ -+ {path: "foo", expRef: `data.foo`}, -+ {path: "foo/", expRef: `data.foo`}, -+ {path: "foo/bar", expRef: `data.foo.bar`}, -+ {path: "foo/bar/", expRef: `data.foo.bar`}, -+ {path: "foo/../bar", expRef: `data.foo[".."].bar`}, -+ -+ // Path injection attack -+ // url path: `foo%22%5D%3Bmalicious_call%28%29%3Bx%3D%5B%22` -+ // url decoded: `foo"];malicious_call();x=["` -+ // data ref .String(): `data.foo["\"];malicious_call();x=[\""]` -+ // Above attack is mitigated by rejecting any ref component containing string terminators (`"`). -+ { -+ note: "string terminals inside ref term", -+ path: "foo%22%5D%3Bmalicious_call%28%29%3Bx%3D%5B%22", // foo"];malicious_call();x=[" -+ expErr: `invalid ref term 'foo"];malicious_call();x=["'`, -+ }, -+ } -+ -+ for _, tc := range cases { -+ note := tc.note -+ if note == "" { -+ note = strings.ReplaceAll(tc.path, "/", "_") -+ } -+ -+ t.Run(note, func(t *testing.T) { -+ ref, err := stringPathToDataRef(tc.path) -+ -+ if tc.expRef != "" { -+ if err != nil { -+ t.Fatalf("Expected ref:\n\n%s\n\nbut got error:\n\n%s", tc.expRef, err) -+ } -+ if refStr := ref.String(); refStr != tc.expRef { -+ t.Fatalf("Expected ref:\n\n%s\n\nbut got:\n\n%s", tc.expRef, refStr) -+ } -+ } -+ -+ if tc.expErr != "" { -+ if ref != nil { -+ t.Fatalf("Expected error:\n\n%s\n\nbut got ref:\n\n%s", tc.expErr, ref.String()) -+ } -+ if errStr := err.Error(); errStr != tc.expErr { -+ t.Fatalf("Expected error:\n\n%s\n\nbut got ref:\n\n%s", tc.expErr, errStr) -+ } -+ } -+ }) -+ } -+} -+ -+func TestParseRefQuery(t *testing.T) { -+ t.Parallel() -+ -+ cases := []struct { -+ note string -+ raw string -+ expBody ast.Body -+ expErr string -+ }{ -+ { -+ note: "unparseable", -+ raw: `}abc{`, -+ expErr: "failed to parse query", -+ }, -+ { -+ note: "empty", -+ raw: ``, -+ expErr: "no ref", -+ }, -+ { -+ note: "single ref", -+ raw: `data.foo.bar`, -+ expBody: ast.MustParseBody(`data.foo.bar`), -+ }, -+ { -+ note: "multiple refs,';' separated", -+ raw: `data.foo.bar;data.baz.qux`, -+ expErr: "complex query", -+ }, -+ { -+ note: "multiple refs,newline separated", -+ raw: `data.foo.bar -+data.baz.qux`, -+ expErr: "complex query", -+ }, -+ { -+ note: "single ref + call", -+ raw: `data.foo.bar;data.baz.qux()`, -+ expErr: "complex query", -+ }, -+ { -+ note: "single ref + assignment", -+ raw: `data.foo.bar;x := 42`, -+ expErr: "complex query", -+ }, -+ { -+ note: "single call", -+ raw: `data.foo.bar()`, -+ expErr: "complex query", -+ }, -+ { -+ note: "single assignment", -+ raw: `x := 42`, -+ expErr: "complex query", -+ }, -+ { -+ note: "single unification", -+ raw: `x = 42`, -+ expErr: "complex query", -+ }, -+ { -+ note: "single equality", -+ raw: `x == 42`, -+ expErr: "complex query", -+ }, -+ } -+ -+ for _, tc := range cases { -+ t.Run(tc.note, func(t *testing.T) { -+ body, err := parseRefQuery(tc.raw) -+ -+ if tc.expBody != nil { -+ if err != nil { -+ t.Fatalf("Expected body:\n\n%s\n\nbut got error:\n\n%s", tc.expBody, err) -+ } -+ if body.String() != tc.expBody.String() { -+ t.Fatalf("Expected body:\n\n%s\n\nbut got:\n\n%s", tc.expBody, body.String()) -+ } -+ } -+ -+ if tc.expErr != "" { -+ if body != nil { -+ t.Fatalf("Expected error:\n\n%s\n\nbut got body:\n\n%s", tc.expErr, body.String()) -+ } -+ if errStr := err.Error(); errStr != tc.expErr { -+ t.Fatalf("Expected error:\n\n%s\n\nbut got body:\n\n%s", tc.expErr, errStr) -+ } -+ } -+ }) -+ } -+} -diff --git a/test/e2e/metrics/metrics_test.go b/test/e2e/metrics/metrics_test.go -index e067909..e90d8fb 100644 ---- a/test/e2e/metrics/metrics_test.go -+++ b/test/e2e/metrics/metrics_test.go -@@ -211,7 +211,6 @@ func assertDataInstrumentationMetricsInMap(t *testing.T, includeCompile bool, me - "timer_server_handler_ns", - } - compileStageKeys := []string{ -- "timer_rego_query_parse_ns", - "timer_rego_query_compile_ns", - "timer_query_compile_stage_build_comprehension_index_ns", - "timer_query_compile_stage_check_safety_ns", --- -2.45.2 - diff --git a/SPECS/opa/opa.signatures.json b/SPECS/opa/opa.signatures.json deleted file mode 100644 index d5856b6013..0000000000 --- a/SPECS/opa/opa.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "opa-0.63.0.tar.gz": "0639466031325de698c61d55850c35d14a7a260ead5d5a06540ee142950818b0" - } -} diff --git a/SPECS/opa/opa.spec b/SPECS/opa/opa.spec deleted file mode 100644 index a95f4ffdc1..0000000000 --- a/SPECS/opa/opa.spec +++ /dev/null @@ -1,166 +0,0 @@ -# https://github.com/open-policy-agent/opa -%global goipath github.com/open-policy-agent/opa -# short_commit is used to display in opa version -%global short_commit e88ad165 -Summary: Open source, general-purpose policy engine -Name: opa -Version: 0.63.0 -Release: 3%{?dist} -# Upstream license specification: MIT and Apache-2.0 -# Main package: ASL 2.0 -# internal/jwx: MIT -# internal/semver: ASL 2.0 -License: ASL 2.0 AND MIT -Vendor: Microsoft Corporation -Distribution: Azure Linux -URL: https://github.com/open-policy-agent/opa -#Source0: https://github.com/open-policy-agent/%{name}/archive/refs/tags/v%{version}.tar.gz -Source0: %{name}-%{version}.tar.gz -# Make telemetry opt-out -Patch0: 0001-Make-telemetry-opt-out.patch -# Skip tests requiring network -Patch1: 0001-Skip-tests-requiring-network.patch -Patch2: CVE-2023-45288.patch -Patch3: CVE-2025-46569.patch -# Warn users about WebAssembly missing -BuildRequires: golang -BuildRequires: make - -%description -An open source, general-purpose policy engine. - -The Open Policy Agent (OPA) is an open source, general-purpose policy engine -that enables unified, context-aware policy enforcement across the entire -stack. - -%prep -%autosetup -p1 -mv internal/jwx/LICENSE LICENSE-jwx - -%build -make build WASM_ENABLED=0 -make man - -%install -install -m 0755 -vd %{buildroot}%{_bindir} -install -m 0755 -vp opa_linux* %{buildroot}%{_bindir}/opa -install -d -p -m 0755 %{buildroot}%{_mandir}/man1 -install -D -p -m 0644 man/* %{buildroot}%{_mandir}/man1/ - -%files -%license LICENSE LICENSE-jwx -%doc docs/content CHANGELOG.md README.md MAINTAINERS.md ADOPTERS.md CODE_OF_CONDUCT.md -%doc CONTRIBUTING.md GOVERNANCE.md SECURITY.md -%{_mandir}/man1/opa*.1* -%{_bindir}/* - -%changelog -* Mon Sep 8 2025 Chee Yang Lee - 0.63.0-3 -- merge from Azure Linux 3.0.20250910-3.0. -- Patch CVE-2025-46569 - -* Fri Mar 21 2025 Anuj Mittal - 0.63.0-2 -- Bump Release to rebuild - -* Fri Jun 28 2024 Pawel Winogrodzki - 0.63.0-1 -- Auto-upgrade to 0.63.0 - CVE-2023-45142 -- Adding a patch for CVE-2023-45288. - -* Fri Oct 27 2023 CBL-Mariner Servicing Account - 0.55.0-1 -- Auto-upgrade to 0.55.0 - Azure Linux 3.0 - package upgrades - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 0.50.2-7 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 0.50.2-6 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 0.50.2-5 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 0.50.2-4 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 0.50.2-3 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 0.50.2-2 -- Bump release to rebuild with go 1.19.8 - -* Mon Mar 27 2023 Dallas Delaney - 0.50.2-1 -- Update to version 0.50.2 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 0.31.0-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 0.31.0-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 0.31.0-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 0.31.0-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 0.31.0-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 0.31.0-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 0.31.0-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 0.31.0-2 -- Bump release to rebuild with golang 1.18.3 - -* Thu Sep 16 2021 Max Brodeur-Urbas - 0.31.0-2 -- Initial CBL-Mariner import from Fedora 35 (license: MIT) -- License Verified -- Remove unused/un-supported macro usage - -* Sun Aug 15 2021 Olivier Lemasle - 0.31.0-1 -- Update to latest upstream 0.31.0 (fixes rhbz#1987088) - -* Thu Jul 22 2021 Fedora Release Engineering - 0.30.2-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Wed Jul 14 2021 Olivier Lemasle - 0.30.2-1 -- Update to latest upstream 0.30.2 (fixes rhbz#1982007) - -* Fri Jul 02 2021 Olivier Lemasle - 0.30.1-1 -- Update to latest upstream 0.30.1 (fixes rhbz#1978733) - -* Thu Jul 01 11:17:03 CEST 2021 Olivier Lemasle - 0.30.0-1 -- Update to latest upstream 0.30.0 (fixes rhbz#1966363) -- Fix license (internal/jwx is licensed under MIT license) - -* Fri May 28 17:03:56 CEST 2021 Olivier Lemasle - 0.29.3-1 -- Update to latest upstream 0.29.3 (fixes rhbz#1965613) - -* Mon May 10 2021 Olivier Lemasle - 0.28.0-1 -- Update to latest upstream 0.28.0 (fixes rhbz#1954091) - -* Sat Mar 13 2021 Olivier Lemasle - 0.27.1-2 -- Fix failing test on 32-bit architectures - -* Sat Mar 13 2021 Olivier Lemasle - 0.27.1-1 -- Update to latest upstream 0.27.1 (fixes #1936740) - -* Tue Jan 26 2021 Olivier Lemasle - 0.26.0-2 -- Remove dependency on github.com/wasmerio/go-ext-wasm (Fixes #1919476) -- Use upstream fix for Go 1.16 compatibility - -* Thu Jan 21 2021 Olivier Lemasle - 0.26.0-1 -- Update to latest upstream 0.26 (note: wasm disabled) - -* Tue Oct 27 2020 Olivier Lemasle - 0.24.0-2 -- Fix failing tests on 32-bit architectures -- Make telemetry service opt-out -- Fix version output - -* Tue Oct 27 2020 Olivier Lemasle - 0.24.0-1 -- Update to latest upstream 0.24 - -* Tue Apr 07 08:15:00 CEST 2020 Olivier Lemasle - 0.18.0-1 -- Initial package diff --git a/SPECS/openssh/CVE-2025-61984.patch b/SPECS/openssh/CVE-2025-61984.patch new file mode 100644 index 0000000000..6525c543ba --- /dev/null +++ b/SPECS/openssh/CVE-2025-61984.patch @@ -0,0 +1,31 @@ +From c3f60955db44c675359e6fa512e16eb2f6fddd0b Mon Sep 17 00:00:00 2001 +From: AllSpark +Date: Tue, 7 Oct 2025 16:06:54 +0000 +Subject: [PATCH] Backport: Improve rules for %-expansion of username. Validate + control chars in usernames, avoid percent expansion for command line or + default users; expand only configuration-specified users without using %r/%C; + update validation rules accordingly. + +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: AI Backport of https://github.com/openssh/openssh-portable/commit/35d5917652106aede47621bb3f64044604164043.patch + +--- + ssh.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/ssh.c b/ssh.c +index 0019281..182c7c3 100644 +--- a/ssh.c ++++ b/ssh.c +@@ -649,6 +649,8 @@ valid_ruser(const char *s) + if (*s == '-') + return 0; + for (i = 0; s[i] != 0; i++) { ++ if (iscntrl((u_char)s[i])) ++ return 0; + if (strchr("'`\";&<>|(){}", s[i]) != NULL) + return 0; + /* Disallow '-' after whitespace */ +-- +2.43.0 + diff --git a/SPECS/openssh/CVE-2025-61985.patch b/SPECS/openssh/CVE-2025-61985.patch new file mode 100644 index 0000000000..24ed7399aa --- /dev/null +++ b/SPECS/openssh/CVE-2025-61985.patch @@ -0,0 +1,47 @@ +From 8c0e088108a64862ca7ffe120d1b75a0dc9393d2 Mon Sep 17 00:00:00 2001 +From: AllSpark +Date: Tue, 7 Oct 2025 15:56:10 +0000 +Subject: [PATCH] misc: urldecode: don't allow NUL in url-encoded strings; + avoid fatal on oversized input\n\nUpstream OpenBSD change: don't allow \0 + characters in url-encoded strings. Suggested by David Leadbeater, ok deraadt@ + +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: AI Backport of https://github.com/openssh/openssh-portable/commit/43b3bff47bb029f2299bacb6a36057981b39fdb0.patch +--- + misc.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/misc.c b/misc.c +index afdf514..275e280 100644 +--- a/misc.c ++++ b/misc.c +@@ -1,4 +1,4 @@ +-/* $OpenBSD: misc.c,v 1.196 2024/06/06 17:15:25 djm Exp $ */ ++/* $OpenBSD: misc.c,v 1.205 2025/09/04 00:30:06 djm Exp $ */ + /* + * Copyright (c) 2000 Markus Friedl. All rights reserved. + * Copyright (c) 2005-2020 Damien Miller. All rights reserved. +@@ -969,7 +969,7 @@ urldecode(const char *src) + size_t srclen; + + if ((srclen = strlen(src)) >= SIZE_MAX) +- fatal_f("input too large"); ++ return NULL; + ret = xmalloc(srclen + 1); + for (dst = ret; *src != '\0'; src++) { + switch (*src) { +@@ -977,9 +977,10 @@ urldecode(const char *src) + *dst++ = ' '; + break; + case '%': ++ /* note: don't allow \0 characters */ + if (!isxdigit((unsigned char)src[1]) || + !isxdigit((unsigned char)src[2]) || +- (ch = hexchar(src + 1)) == -1) { ++ (ch = hexchar(src + 1)) == -1 || ch == 0) { + free(ret); + return NULL; + } +-- +2.45.4 + diff --git a/SPECS/openssh/openssh.spec b/SPECS/openssh/openssh.spec index 1208c931ab..b00dec6b1c 100644 --- a/SPECS/openssh/openssh.spec +++ b/SPECS/openssh/openssh.spec @@ -36,10 +36,13 @@ Patch307: pam_ssh_agent_auth-0.10.2-dereference.patch #This CVE Patches both CVE-2025-26465 and CVE-2025-26466 Patch400: CVE-2025-26465.patch Patch401: CVE-2025-32728.patch +Patch402: CVE-2025-61984.patch +Patch403: CVE-2025-61985.patch # sk-dummy.so built with -fvisibility=hidden does not work # The tests fail with the following error: # dlsym(sk_api_version) failed: (...)/sk-dummy.so: undefined symbol: sk_api_version Patch965: openssh-8.2p1-visibility.patch + BuildRequires: audit-devel BuildRequires: autoconf BuildRequires: e2fsprogs-devel @@ -281,6 +284,10 @@ fi %{_mandir}/man8/ssh-sk-helper.8.gz %changelog +* Tue Jan 6 2025 Lee Chee Yang - 9.8p1-7 +- merge from Azure Linux 3.0.20251206-3.0 +- Patch CVE-2025-61985, CVE-2025-61984 + * Fri May 30 2025 Ranjan Dutta - 9.8p1-7 - merge from Azure Linux 3.0.20250521-3.0 - Patch CVE-2025-32728 diff --git a/SPECS/packer/CVE-2022-3064.patch b/SPECS/packer/CVE-2022-3064.patch deleted file mode 100644 index 621a99437f..0000000000 --- a/SPECS/packer/CVE-2022-3064.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 0360b25ae53f9398cfca462f91698d1887a1ae76 Mon Sep 17 00:00:00 2001 -From: Pawel Winogrodzki -Date: Mon, 1 Jul 2024 16:33:53 -0700 -Subject: [PATCH] Port CVE-2022-3064 fix from go-yaml to zclconf. - -This patch is ported from go-yaml's fix for CVE-2022-3064: -https://github.com/go-yaml/yaml/commit/f221b8435cfb71e54062f6c6e99e9ade30b124d5 - -The patch only applies to "scannerc.go", which seems to have been -copied from go-yaml by zclconf. ---- - .../github.com/zclconf/go-cty-yaml/scannerc.go | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/vendor/github.com/zclconf/go-cty-yaml/scannerc.go b/vendor/github.com/zclconf/go-cty-yaml/scannerc.go -index ea82e3e..8eb8303 100644 ---- a/vendor/github.com/zclconf/go-cty-yaml/scannerc.go -+++ b/vendor/github.com/zclconf/go-cty-yaml/scannerc.go -@@ -906,6 +906,9 @@ func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { - return true - } - -+// max_flow_level limits the flow_level -+const max_flow_level = 10000 -+ - // Increase the flow level and resize the simple key list if needed. - func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { - // Reset the simple key on the next level. -@@ -913,6 +916,11 @@ func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { - - // Increase the flow level. - parser.flow_level++ -+ if parser.flow_level > max_flow_level { -+ return yaml_parser_set_scanner_error(parser, -+ "while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark, -+ fmt.Sprintf("exceeded max depth of %d", max_flow_level)) -+ } - return true - } - -@@ -925,6 +933,9 @@ func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { - return true - } - -+// max_indents limits the indents stack size -+const max_indents = 10000 -+ - // Push the current indentation level to the stack and set the new level - // the current column is greater than the indentation level. In this case, - // append or insert the specified token into the token queue. -@@ -939,6 +950,11 @@ func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml - // indentation level. - parser.indents = append(parser.indents, parser.indent) - parser.indent = column -+ if len(parser.indents) > max_indents { -+ return yaml_parser_set_scanner_error(parser, -+ "while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark, -+ fmt.Sprintf("exceeded max depth of %d", max_indents)) -+ } - - // Create a token and insert it into the queue. - token := yaml_token_t{ --- -2.34.1 - diff --git a/SPECS/packer/CVE-2024-24786.patch b/SPECS/packer/CVE-2024-24786.patch deleted file mode 100644 index 6c80204f5b..0000000000 --- a/SPECS/packer/CVE-2024-24786.patch +++ /dev/null @@ -1,152 +0,0 @@ -From 1576982839ab9771784526720ed0a2f4a2aa2280 Mon Sep 17 00:00:00 2001 -From: bala -Date: Mon, 25 Nov 2024 16:47:53 +0000 -Subject: [PATCH] Vendor patch applied - ---- - .../protobuf/encoding/protojson/decode.go | 12 ++++ - .../encoding/protojson/well_known_types.go | 59 +++++++------------ - .../protobuf/internal/encoding/json/decode.go | 2 +- - 3 files changed, 33 insertions(+), 40 deletions(-) - -diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/decode.go b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go -index 5f28148..67fe4e7 100644 ---- a/vendor/google.golang.org/protobuf/encoding/protojson/decode.go -+++ b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go -@@ -11,6 +11,7 @@ import ( - "strconv" - "strings" - -+ "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/encoding/json" - "google.golang.org/protobuf/internal/encoding/messageset" - "google.golang.org/protobuf/internal/errors" -@@ -47,6 +48,10 @@ type UnmarshalOptions struct { - protoregistry.MessageTypeResolver - protoregistry.ExtensionTypeResolver - } -+ -+ // RecursionLimit limits how deeply messages may be nested. -+ // If zero, a default limit is applied. -+ RecursionLimit int - } - - // Unmarshal reads the given []byte and populates the given proto.Message -@@ -67,6 +72,9 @@ func (o UnmarshalOptions) unmarshal(b []byte, m proto.Message) error { - if o.Resolver == nil { - o.Resolver = protoregistry.GlobalTypes - } -+ if o.RecursionLimit == 0 { -+ o.RecursionLimit = protowire.DefaultRecursionLimit -+ } - - dec := decoder{json.NewDecoder(b), o} - if err := dec.unmarshalMessage(m.ProtoReflect(), false); err != nil { -@@ -114,6 +122,10 @@ func (d decoder) syntaxError(pos int, f string, x ...interface{}) error { - - // unmarshalMessage unmarshals a message into the given protoreflect.Message. - func (d decoder) unmarshalMessage(m protoreflect.Message, skipTypeURL bool) error { -+ d.opts.RecursionLimit-- -+ if d.opts.RecursionLimit < 0 { -+ return errors.New("exceeded max recursion depth") -+ } - if unmarshal := wellKnownTypeUnmarshaler(m.Descriptor().FullName()); unmarshal != nil { - return unmarshal(d, m) - } -diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go -index 6c37d41..4b177c8 100644 ---- a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go -+++ b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go -@@ -176,7 +176,7 @@ func (d decoder) unmarshalAny(m protoreflect.Message) error { - // Use another decoder to parse the unread bytes for @type field. This - // avoids advancing a read from current decoder because the current JSON - // object may contain the fields of the embedded type. -- dec := decoder{d.Clone(), UnmarshalOptions{}} -+ dec := decoder{d.Clone(), UnmarshalOptions{RecursionLimit: d.opts.RecursionLimit}} - tok, err := findTypeURL(dec) - switch err { - case errEmptyObject: -@@ -308,48 +308,29 @@ Loop: - // array) in order to advance the read to the next JSON value. It relies on - // the decoder returning an error if the types are not in valid sequence. - func (d decoder) skipJSONValue() error { -- tok, err := d.Read() -- if err != nil { -- return err -- } -- // Only need to continue reading for objects and arrays. -- switch tok.Kind() { -- case json.ObjectOpen: -- for { -- tok, err := d.Read() -- if err != nil { -- return err -- } -- switch tok.Kind() { -- case json.ObjectClose: -- return nil -- case json.Name: -- // Skip object field value. -- if err := d.skipJSONValue(); err != nil { -- return err -- } -- } -+ var open int -+ for { -+ tok, err := d.Read() -+ if err != nil { -+ return err - } -- -- case json.ArrayOpen: -- for { -- tok, err := d.Peek() -- if err != nil { -- return err -- } -- switch tok.Kind() { -- case json.ArrayClose: -- d.Read() -- return nil -- default: -- // Skip array item. -- if err := d.skipJSONValue(); err != nil { -- return err -- } -+ switch tok.Kind() { -+ case json.ObjectClose, json.ArrayClose: -+ open-- -+ case json.ObjectOpen, json.ArrayOpen: -+ open++ -+ if open > d.opts.RecursionLimit { -+ return errors.New("exceeded max recursion depth") - } -+ case json.EOF: -+ // This can only happen if there's a bug in Decoder.Read. -+ // Avoid an infinite loop if this does happen. -+ return errors.New("unexpected EOF") -+ } -+ if open == 0 { -+ return nil - } - } -- return nil - } - - // unmarshalAnyValue unmarshals the given custom-type message from the JSON -diff --git a/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go b/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go -index d043a6e..d2b3ac0 100644 ---- a/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go -+++ b/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go -@@ -121,7 +121,7 @@ func (d *Decoder) Read() (Token, error) { - - case ObjectClose: - if len(d.openStack) == 0 || -- d.lastToken.kind == comma || -+ d.lastToken.kind&(Name|comma) != 0 || - d.openStack[len(d.openStack)-1] != ObjectOpen { - return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) - } --- -2.39.4 - diff --git a/SPECS/packer/CVE-2024-28180.patch b/SPECS/packer/CVE-2024-28180.patch deleted file mode 100644 index a2207db769..0000000000 --- a/SPECS/packer/CVE-2024-28180.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 93135333edad88bda698e252c9d30c1f699a1bbe Mon Sep 17 00:00:00 2001 -From: Kanishk Bansal -Date: Fri, 31 Jan 2025 12:50:41 +0000 -Subject: [PATCH] Address CVE-2024-28180 for packer - ---- - vendor/gopkg.in/square/go-jose.v2/crypter.go | 6 ++++++ - vendor/gopkg.in/square/go-jose.v2/encoding.go | 20 ++++++++++++++++---- - 2 files changed, 22 insertions(+), 4 deletions(-) - -diff --git a/vendor/gopkg.in/square/go-jose.v2/crypter.go b/vendor/gopkg.in/square/go-jose.v2/crypter.go -index be7433e..763eae0 100644 ---- a/vendor/gopkg.in/square/go-jose.v2/crypter.go -+++ b/vendor/gopkg.in/square/go-jose.v2/crypter.go -@@ -406,6 +406,9 @@ func (ctx *genericEncrypter) Options() EncrypterOptions { - // Decrypt and validate the object and return the plaintext. Note that this - // function does not support multi-recipient, if you desire multi-recipient - // decryption use DecryptMulti instead. -+// -+// Automatically decompresses plaintext, but returns an error if the decompressed -+// data would be >250kB or >10x the size of the compressed data, whichever is larger. - func (obj JSONWebEncryption) Decrypt(decryptionKey interface{}) ([]byte, error) { - headers := obj.mergedHeaders(nil) - -@@ -470,6 +473,9 @@ func (obj JSONWebEncryption) Decrypt(decryptionKey interface{}) ([]byte, error) - // with support for multiple recipients. It returns the index of the recipient - // for which the decryption was successful, the merged headers for that recipient, - // and the plaintext. -+// -+// Automatically decompresses plaintext, but returns an error if the decompressed -+// data would be >250kB or >3x the size of the compressed data, whichever is larger. - func (obj JSONWebEncryption) DecryptMulti(decryptionKey interface{}) (int, Header, []byte, error) { - globalHeaders := obj.mergedHeaders(nil) - -diff --git a/vendor/gopkg.in/square/go-jose.v2/encoding.go b/vendor/gopkg.in/square/go-jose.v2/encoding.go -index 70f7385..2b92116 100644 ---- a/vendor/gopkg.in/square/go-jose.v2/encoding.go -+++ b/vendor/gopkg.in/square/go-jose.v2/encoding.go -@@ -21,6 +21,7 @@ import ( - "compress/flate" - "encoding/base64" - "encoding/binary" -+ "fmt" - "io" - "math/big" - "strings" -@@ -85,7 +86,7 @@ func decompress(algorithm CompressionAlgorithm, input []byte) ([]byte, error) { - } - } - --// Compress with DEFLATE -+// deflate compresses the input. - func deflate(input []byte) ([]byte, error) { - output := new(bytes.Buffer) - -@@ -97,15 +98,26 @@ func deflate(input []byte) ([]byte, error) { - return output.Bytes(), err - } - --// Decompress with DEFLATE -+// inflate decompresses the input. -+// -+// Errors if the decompressed data would be >250kB or >10x the size of the -+// compressed data, whichever is larger. - func inflate(input []byte) ([]byte, error) { - output := new(bytes.Buffer) - reader := flate.NewReader(bytes.NewBuffer(input)) - -- _, err := io.Copy(output, reader) -- if err != nil { -+ maxCompressedSize := 10 * int64(len(input)) -+ if maxCompressedSize < 250000 { -+ maxCompressedSize = 250000 -+ } -+ limit := maxCompressedSize + 1 -+ n, err := io.CopyN(output, reader, limit) -+ if err != nil && err != io.EOF { - return nil, err - } -+ if n == limit { -+ return nil, fmt.Errorf("uncompressed data would be too large (>%d bytes)", maxCompressedSize) -+ } - - err = reader.Close() - return output.Bytes(), err --- -2.43.0 - diff --git a/SPECS/packer/CVE-2024-51744.patch b/SPECS/packer/CVE-2024-51744.patch deleted file mode 100644 index 60cde4197c..0000000000 --- a/SPECS/packer/CVE-2024-51744.patch +++ /dev/null @@ -1,87 +0,0 @@ -From e14563df9567114cdebcafcf68576e3838ce4ad2 Mon Sep 17 00:00:00 2001 -From: Sreenivasulu Malavathula -Date: Wed, 16 Apr 2025 19:02:58 -0500 -Subject: [PATCH] Address CVE-2024-51744 -Upstream Patch Reference: https://github.com/golang-jwt/jwt/commit/7b1c1c00a171c6c79bbdb40e4ce7d197060c1c2c - ---- - vendor/github.com/golang-jwt/jwt/v4/parser.go | 36 +++++++++++-------- - 1 file changed, 21 insertions(+), 15 deletions(-) - -diff --git a/vendor/github.com/golang-jwt/jwt/v4/parser.go b/vendor/github.com/golang-jwt/jwt/v4/parser.go -index 9484f28..0fc510a 100644 ---- a/vendor/github.com/golang-jwt/jwt/v4/parser.go -+++ b/vendor/github.com/golang-jwt/jwt/v4/parser.go -@@ -38,12 +38,21 @@ func NewParser(options ...ParserOption) *Parser { - return p - } - --// Parse parses, validates, verifies the signature and returns the parsed token. --// keyFunc will receive the parsed token and should return the key for validating. -+// Parse parses, validates, verifies the signature and returns the parsed token. keyFunc will -+// receive the parsed token and should return the key for validating. - func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) - } - -+// ParseWithClaims parses, validates, and verifies like Parse, but supplies a default object -+// implementing the Claims interface. This provides default values which can be overridden and -+// allows a caller to use their own type, rather than the default MapClaims implementation of -+// Claims. -+// -+// Note: If you provide a custom claim implementation that embeds one of the standard claims (such -+// as RegisteredClaims), make sure that a) you either embed a non-pointer version of the claims or -+// b) if you are using a pointer, allocate the proper memory for it before passing in the overall -+// claims, otherwise you might run into a panic. - func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - token, parts, err := p.ParseUnverified(tokenString, claims) - if err != nil { -@@ -80,12 +89,17 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - return token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable} - } - -+ // Perform validation -+ token.Signature = parts[2] -+ if err := token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { -+ return token, &ValidationError{Inner: err, Errors: ValidationErrorSignatureInvalid} -+ } -+ - vErr := &ValidationError{} - - // Validate Claims - if !p.SkipClaimsValidation { - if err := token.Claims.Valid(); err != nil { -- - // If the Claims Valid returned an error, check if it is a validation error, - // If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set - if e, ok := err.(*ValidationError); !ok { -@@ -93,22 +107,14 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - } else { - vErr = e - } -+ return token, vErr - } - } - -- // Perform validation -- token.Signature = parts[2] -- if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { -- vErr.Inner = err -- vErr.Errors |= ValidationErrorSignatureInvalid -- } -- -- if vErr.valid() { -- token.Valid = true -- return token, nil -- } -+ // No errors so far, token is valid. -+ token.Valid = true - -- return token, vErr -+ return token, nil - } - - // ParseUnverified parses the token but doesn't validate the signature. --- -2.45.2 - diff --git a/SPECS/packer/CVE-2024-6104.patch b/SPECS/packer/CVE-2024-6104.patch deleted file mode 100644 index e460f13ea6..0000000000 --- a/SPECS/packer/CVE-2024-6104.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 7adb4a9a5fa1d919eb44e53c8515e47073a1b399 Mon Sep 17 00:00:00 2001 -From: Balakumaran Kannan -Date: Mon, 5 Aug 2024 05:39:51 +0000 -Subject: [PATCH] Patch CVE-2024-6104 - ---- - .../hashicorp/go-retryablehttp/client.go | 28 ++++++++++++++----- - 1 file changed, 21 insertions(+), 7 deletions(-) - -diff --git a/vendor/github.com/hashicorp/go-retryablehttp/client.go b/vendor/github.com/hashicorp/go-retryablehttp/client.go -index adbdd92..11d146a 100644 ---- a/vendor/github.com/hashicorp/go-retryablehttp/client.go -+++ b/vendor/github.com/hashicorp/go-retryablehttp/client.go -@@ -546,9 +546,9 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - if logger != nil { - switch v := logger.(type) { - case LeveledLogger: -- v.Debug("performing request", "method", req.Method, "url", req.URL) -+ v.Debug("performing request", "method", req.Method, "url", redactURL(req.URL)) - case Logger: -- v.Printf("[DEBUG] %s %s", req.Method, req.URL) -+ v.Printf("[DEBUG] %s %s", req.Method, redactURL(req.URL)) - } - } - -@@ -599,9 +599,9 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - if doErr != nil { - switch v := logger.(type) { - case LeveledLogger: -- v.Error("request failed", "error", doErr, "method", req.Method, "url", req.URL) -+ v.Error("request failed", "error", doErr, "method", req.Method, "url", redactURL(req.URL)) - case Logger: -- v.Printf("[ERR] %s %s request failed: %v", req.Method, req.URL, doErr) -+ v.Printf("[ERR] %s %s request failed: %v", req.Method, redactURL(req.URL), doErr) - } - } else { - // Call this here to maintain the behavior of logging all requests, -@@ -636,7 +636,7 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - } - - wait := c.Backoff(c.RetryWaitMin, c.RetryWaitMax, i, resp) -- desc := fmt.Sprintf("%s %s", req.Method, req.URL) -+ desc := fmt.Sprintf("%s %s", req.Method, redactURL(req.URL)) - if code > 0 { - desc = fmt.Sprintf("%s (status: %d)", desc, code) - } -@@ -687,11 +687,11 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - // communicate why - if err == nil { - return nil, fmt.Errorf("%s %s giving up after %d attempt(s)", -- req.Method, req.URL, attempt) -+ req.Method, redactURL(req.URL), attempt) - } - - return nil, fmt.Errorf("%s %s giving up after %d attempt(s): %w", -- req.Method, req.URL, attempt, err) -+ req.Method, redactURL(req.URL), attempt, err) - } - - // Try to read the response body so we can reuse this connection. -@@ -772,3 +772,17 @@ func (c *Client) StandardClient() *http.Client { - Transport: &RoundTripper{Client: c}, - } - } -+ -+ -+// Taken from url.URL#Redacted() which was introduced in go 1.15. -+func redactURL(u *url.URL) string { -+ if u == nil { -+ return "" -+ } -+ -+ ru := *u -+ if _, has := ru.User.Password(); has { -+ ru.User = url.UserPassword(ru.User.Username(), "xxxxx") -+ } -+ return ru.String() -+} --- -2.33.8 - diff --git a/SPECS/packer/CVE-2025-21613.patch b/SPECS/packer/CVE-2025-21613.patch deleted file mode 100644 index d31a67b58e..0000000000 --- a/SPECS/packer/CVE-2025-21613.patch +++ /dev/null @@ -1,590 +0,0 @@ -From 36c9359d89bc1525e38c22eded9cbfcf9966a10d Mon Sep 17 00:00:00 2001 -From: Sudipta Pandit -Date: Thu, 9 Jan 2025 16:33:00 +0530 -Subject: [PATCH] Update go-git to v5.13.0 to fix CVE-2025-21613 - ---- - go.mod | 49 +++++++++++--------- - go.sum | 144 ++++++++++++++++++++++++++++++++------------------------- - 2 files changed, 108 insertions(+), 85 deletions(-) - -diff --git a/go.mod b/go.mod -index 21cfd2a..b03fd08 100644 ---- a/go.mod -+++ b/go.mod -@@ -6,12 +6,12 @@ require ( - github.com/cheggaaa/pb v1.0.27 - github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e - github.com/dsnet/compress v0.0.1 -- github.com/go-git/go-git/v5 v5.4.2 -+ github.com/go-git/go-git/v5 v5.13.0 - github.com/go-openapi/runtime v0.25.0 - github.com/gobwas/glob v0.2.3 - github.com/gofrs/flock v0.8.1 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect -- github.com/google/go-cmp v0.5.9 -+ github.com/google/go-cmp v0.6.0 - github.com/google/go-github/v33 v33.0.1-0.20210113204525-9318e629ec69 - github.com/google/go-querystring v1.1.0 // indirect - github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 -@@ -41,19 +41,19 @@ require ( - github.com/pierrec/lz4 v2.6.1+incompatible // indirect - github.com/pkg/sftp v1.13.2 // indirect - github.com/posener/complete v1.2.3 -- github.com/stretchr/testify v1.8.2 -+ github.com/stretchr/testify v1.10.0 - github.com/ulikunitz/xz v0.5.10 - github.com/zclconf/go-cty v1.10.0 - github.com/zclconf/go-cty-yaml v1.0.1 -- golang.org/x/crypto v0.14.0 // indirect -- golang.org/x/mod v0.8.0 -- golang.org/x/net v0.17.0 -+ golang.org/x/crypto v0.31.0 // indirect -+ golang.org/x/mod v0.17.0 -+ golang.org/x/net v0.33.0 - golang.org/x/oauth2 v0.11.0 -- golang.org/x/sync v0.3.0 -- golang.org/x/sys v0.13.0 // indirect -- golang.org/x/term v0.13.0 // indirect -- golang.org/x/text v0.13.0 // indirect -- golang.org/x/tools v0.6.0 -+ golang.org/x/sync v0.10.0 -+ golang.org/x/sys v0.28.0 // indirect -+ golang.org/x/term v0.27.0 // indirect -+ golang.org/x/text v0.21.0 // indirect -+ golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d - google.golang.org/api v0.128.0 // indirect - google.golang.org/grpc v1.59.0 - ) -@@ -79,6 +79,7 @@ require ( - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect - cloud.google.com/go/storage v1.30.1 // indirect -+ dario.cat/mergo v1.0.0 // indirect - github.com/Azure/azure-sdk-for-go v64.0.0+incompatible // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.19 // indirect -@@ -95,9 +96,8 @@ require ( - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.22.0+incompatible // indirect -- github.com/Microsoft/go-winio v0.4.16 // indirect -- github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect -- github.com/acomagu/bufpipe v1.0.3 // indirect -+ github.com/Microsoft/go-winio v0.6.1 // indirect -+ github.com/ProtonMail/go-crypto v1.1.3 // indirect - github.com/agext/levenshtein v1.2.3 // indirect - github.com/apparentlymart/go-cidr v1.0.1 // indirect - github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect -@@ -110,15 +110,17 @@ require ( - github.com/bmatcuk/doublestar v1.1.5 // indirect - github.com/cenkalti/backoff/v3 v3.2.2 // indirect - github.com/chzyer/test v1.0.0 // indirect -+ github.com/cloudflare/circl v1.3.7 // indirect -+ github.com/cyphar/filepath-securejoin v0.2.5 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/digitalocean/go-libvirt v0.0.0-20201209184759-e2a69bcd5bd1 // indirect - github.com/digitalocean/go-qemu v0.0.0-20210326154740-ac9e0b687001 // indirect - github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/dylanmei/iso8601 v0.1.0 // indirect -- github.com/emirpasic/gods v1.12.0 // indirect -+ github.com/emirpasic/gods v1.18.1 // indirect - github.com/fatih/color v1.12.0 // indirect -- github.com/go-git/gcfg v1.5.0 // indirect -- github.com/go-git/go-billy/v5 v5.3.1 // indirect -+ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect -+ github.com/go-git/go-billy/v5 v5.6.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect -@@ -166,12 +168,11 @@ require ( - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/josharian/intern v1.0.0 // indirect -- github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect -+ github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/kr/fs v0.1.0 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/masterzen/simplexml v0.0.0-20190410153822-31eea3082786 // indirect -- github.com/matryer/is v1.4.0 // indirect - github.com/mattn/go-colorable v0.1.8 // indirect - github.com/mattn/go-isatty v0.0.13 // indirect - github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect -@@ -183,19 +184,21 @@ require ( - github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect -+ github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/ryanuber/go-glob v1.0.0 // indirect -- github.com/sergi/go-diff v1.1.0 // indirect -+ github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect - github.com/shoenig/go-m1cpu v0.1.5 // indirect -+ github.com/skeema/knownhosts v1.3.0 // indirect - github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect - github.com/ugorji/go/codec v1.2.6 // indirect - github.com/vmware/govmomi v0.29.0 // indirect -- github.com/xanzy/ssh-agent v0.3.0 // indirect -+ github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.mongodb.org/mongo-driver v1.11.0 // indirect - go.opencensus.io v0.24.0 // indirect -@@ -216,4 +219,6 @@ require ( - gopkg.in/yaml.v3 v3.0.1 // indirect - ) - --go 1.20 -+go 1.21 -+ -+toolchain go1.23.4 -diff --git a/go.sum b/go.sum -index 78887ed..f4571c9 100644 ---- a/go.sum -+++ b/go.sum -@@ -11,6 +11,8 @@ cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= - cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= - cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= - cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -+dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -+dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= - dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= - github.com/Azure/azure-sdk-for-go v51.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= - github.com/Azure/azure-sdk-for-go v64.0.0+incompatible h1:WAA77WBDWYtNfCC95V70VvkdzHe+wM/r2MQ9mG7fnQs= -@@ -70,36 +72,38 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q - github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= - github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= - github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= --github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= - github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= --github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= --github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -+github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -+github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -+github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= - github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= --github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ= --github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= -+github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= -+github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= - github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= --github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= --github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= - github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= - github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= - github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= - github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= - github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= - github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= --github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= --github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -+github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= -+github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= - github.com/antchfx/xpath v1.1.11 h1:WOFtK8TVAjLm3lbgqeP0arlHpvCEeTANeWZ/csPpJkQ= -+github.com/antchfx/xpath v1.1.11/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= - github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0 h1:JaCC8jz0zdMLk2m+qCCVLLLM/PL93p84w4pK3aJWj60= -+github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0/go.mod h1:LzD22aAzDP8/dyiCKFp31He4m2GPjl0AFyzDtZzUu9M= - github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= - github.com/apparentlymart/go-cidr v1.0.1 h1:NmIwLZ/KdsjIUlhf+/Np40atNXm/+lZ5txfTJ/SpF+U= - github.com/apparentlymart/go-cidr v1.0.1/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= - github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhiM5J5RFxEaFvMZVEAM1KvT1YzbEOwB2EAGjA= -+github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= - github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= - github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec= - github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= - github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= - github.com/approvals/go-approval-tests v0.0.0-20210131072903-38d0b0ec12b1 h1:uroQ0JaeVom9Ffv9xFtc7DcqrpGmyQeZCRzHD9FqPBg= -+github.com/approvals/go-approval-tests v0.0.0-20210131072903-38d0b0ec12b1/go.mod h1:PJOqSY8IofNv3heAD6k8E7EfFS6okiSS9bSAasaAUME= - github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= - github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= - github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= -@@ -147,6 +151,8 @@ github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38 - github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= - github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= - github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -+github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= -+github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= - github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= - github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= - github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -@@ -165,6 +171,8 @@ github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDG - github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= - github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= - github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -+github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= -+github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= - github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= - github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= - github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -@@ -177,6 +185,7 @@ github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQ - github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= - github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= - github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= -+github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= - github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= - github.com/docker/docker v1.4.2-0.20200319182547-c7ad2b866182/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= - github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -@@ -188,8 +197,11 @@ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:Htrtb - github.com/dylanmei/iso8601 v0.1.0 h1:812NGQDBcqquTfH5Yeo7lwR0nzx/cKdsmf3qMjPURUI= - github.com/dylanmei/iso8601 v0.1.0/go.mod h1:w9KhXSgIyROl1DefbMYIE7UVSIvELTbMrCfx+QkYnoQ= - github.com/dylanmei/winrmtest v0.0.0-20170819153634-c2fbb09e6c08 h1:0bp6/GrNOrTDtSXe9YYGCwf8jp5Fb/b+4a6MTRm4qzY= --github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= --github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -+github.com/dylanmei/winrmtest v0.0.0-20170819153634-c2fbb09e6c08/go.mod h1:VBVDFSBXCIW8JaHQpI8lldSKfYaLMzP9oyq6IJ4fhzY= -+github.com/elazarl/goproxy v1.2.1 h1:njjgvO6cRG9rIqN2ebkqy6cQz2Njkx7Fsfv/zIZqgug= -+github.com/elazarl/goproxy v1.2.1/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64= -+github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= - github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= - github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= - github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -@@ -202,24 +214,22 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL - github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= - github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= - github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= --github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= - github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= - github.com/frankban/quicktest v1.10.0 h1:Gfh+GAJZOAoKZsIZeZbdn2JF10kN1XHNvjsvQK8gVkE= - github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= - github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= - github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= --github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= --github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -+github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= -+github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= - github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= --github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= --github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= --github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= --github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= --github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= --github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8= --github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= --github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= --github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= -+github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= -+github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -+github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8= -+github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM= -+github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= -+github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -+github.com/go-git/go-git/v5 v5.13.0 h1:vLn5wlGIh/X78El6r3Jr+30W16Blk0CTcxTYcYPWi5E= -+github.com/go-git/go-git/v5 v5.13.0/go.mod h1:Wjo7/JyVKtQgUNdXYXIepzWfJQkUEIGvkvVkiXRR/zw= - github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= - github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= - github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -@@ -273,6 +283,7 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me - github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= - github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= - github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= -+github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= - github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= - github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= - github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -@@ -353,8 +364,9 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ - github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= - github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= - github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= --github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= - github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= - github.com/google/go-github/v33 v33.0.1-0.20210113204525-9318e629ec69 h1:zL0/Ug5CMhV0XRb3A6vnK1SQ9kJM3VIyRxPQ5t9w8Bg= - github.com/google/go-github/v33 v33.0.1-0.20210113204525-9318e629ec69/go.mod h1:GMdDnVZY/2TsWgp/lkYnpSAh6TrzhANBBwm6k6TTEXg= - github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -@@ -362,6 +374,7 @@ github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD - github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= - github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= - github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -+github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= - github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= - github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -@@ -417,6 +430,7 @@ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh - github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g= - github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= - github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -+github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= - github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= - github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= - github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -@@ -504,7 +518,6 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= - github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4= - github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= --github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= - github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= - github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= - github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -@@ -519,8 +532,8 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u - github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= - github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= - github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= --github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= --github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -+github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= -+github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= - github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= - github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= - github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -@@ -538,8 +551,8 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= - github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= - github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= - github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= --github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= --github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= - github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= - github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= - github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -@@ -560,9 +573,6 @@ github.com/masterzen/simplexml v0.0.0-20190410153822-31eea3082786 h1:2ZKn+w/BJeL - github.com/masterzen/simplexml v0.0.0-20190410153822-31eea3082786/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc= - github.com/masterzen/winrm v0.0.0-20210623064412-3b76017826b0 h1:KqYuDbSr8I2X8H65InN8SafDEa0UaLRy6WEmxDqd0F0= - github.com/masterzen/winrm v0.0.0-20210623064412-3b76017826b0/go.mod h1:l31LCh9VvG43RJ83A5JLkFPjuz48cZAxBSLQLaIn1p8= --github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= --github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= --github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= - github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= - github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= - github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -@@ -637,6 +647,8 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn - github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= - github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= - github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -+github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= -+github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= - github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= - github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= - github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -@@ -658,6 +670,8 @@ github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9F - github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= - github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= - github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -+github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -+github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= - github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= - github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= - github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -@@ -694,16 +708,18 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L - github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= - github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= - github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= --github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -+github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -+github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= - github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= - github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= - github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= - github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= - github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= - github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= - github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= --github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= --github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -+github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= -+github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= - github.com/shirou/gopsutil/v3 v3.23.4 h1:hZwmDxZs7Ewt75DV81r4pFMqbq+di2cbt9FsQBqLD2o= - github.com/shirou/gopsutil/v3 v3.23.4/go.mod h1:ZcGxyfzAMRevhUR2+cfhXDH6gQdFYE/t8j1nsU4mPI8= - github.com/shoenig/go-m1cpu v0.1.5 h1:LF57Z/Fpb/WdGLjt2HZilNnmZOxg/q2bSKTQhgbrLrQ= -@@ -715,6 +731,9 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx - github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= - github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= - github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -+github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -+github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= -+github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= - github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= - github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= - github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -@@ -724,8 +743,9 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn - github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= - github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= - github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= --github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= - github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= - github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= - github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= - github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -@@ -735,8 +755,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ - github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= - github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= - github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= --github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= - github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= - github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= - github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= - github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -@@ -756,8 +777,8 @@ github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+ - github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= - github.com/vmware/govmomi v0.29.0 h1:SHJQ7DUc4fltFZv16znJNGHR1/XhiDK5iKxm2OqwkuU= - github.com/vmware/govmomi v0.29.0/go.mod h1:F7adsVewLNHsW/IIm7ziFURaXDaHEwcc+ym4r3INMdY= --github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= --github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= -+github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= -+github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= - github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= - github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= - github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -@@ -786,6 +807,7 @@ go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= - go.opentelemetry.io/otel v1.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4= - go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE= - go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs= -+go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys= - go.opentelemetry.io/otel/trace v1.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ= - go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk= - go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -@@ -793,7 +815,6 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= - golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= - golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= - golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= --golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= - golang.org/x/crypto v0.0.0-20190222235706-ffb98f73852f/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= - golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= - golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -@@ -809,17 +830,18 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh - golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= - golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= - golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= --golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= - golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= - golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= - golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= --golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= --golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= - golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= - golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= - golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= - golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= - golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= - golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= - golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -@@ -834,8 +856,8 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= - golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= - golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= --golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= --golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -+golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -+golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= - golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= - golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= - golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -@@ -861,14 +883,13 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R - golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= - golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= - golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= --golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= - golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= - golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= - golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= - golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= - golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= --golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= --golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= - golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= - golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= - golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -@@ -883,8 +904,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ - golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= - golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= --golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= --golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= - golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= - golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= - golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -@@ -900,7 +921,6 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w - golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= --golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -@@ -912,34 +932,32 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w - golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= --golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= --golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= --golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= --golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= - golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= - golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= - golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= - golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= - golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= - golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= - golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= --golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= --golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= - golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= - golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= --golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= --golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -+golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -+golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= - golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= - golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= - golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -@@ -947,8 +965,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= - golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= - golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= - golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= --golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= --golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= - golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= - golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= - golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= -@@ -973,8 +991,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn - golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= - golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= - golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= --golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= --golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= - golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= - golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= - golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= --- -2.34.1 - diff --git a/SPECS/packer/CVE-2025-21614.nopatch b/SPECS/packer/CVE-2025-21614.nopatch deleted file mode 100644 index 1fd187ee54..0000000000 --- a/SPECS/packer/CVE-2025-21614.nopatch +++ /dev/null @@ -1 +0,0 @@ -# fixed by CVE-2025-21613.patch file diff --git a/SPECS/packer/CVE-2025-22868.patch b/SPECS/packer/CVE-2025-22868.patch deleted file mode 100644 index c4f136f3ca..0000000000 --- a/SPECS/packer/CVE-2025-22868.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 681b4d8edca1bcfea5bce685d77ea7b82ed3e7b3 Mon Sep 17 00:00:00 2001 -From: Neal Patel -Date: Thu, 30 Jan 2025 14:10:09 -0500 -Subject: [PATCH] jws: split token into fixed number of parts - -Thanks to 'jub0bs' for reporting this issue. - -Fixes #71490 -Fixes CVE-2025-22868 - -Change-Id: I2552731f46d4907f29aafe7863c558387b6bd6e2 -Reviewed-on: https://go-review.googlesource.com/c/oauth2/+/652155 -Auto-Submit: Gopher Robot -Reviewed-by: Damien Neil -Reviewed-by: Roland Shoemaker -LUCI-TryBot-Result: Go LUCI ---- - vendor/golang.org/x/oauth2/jws/jws.go | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/oauth2/jws/jws.go b/vendor/golang.org/x/oauth2/jws/jws.go -index 95015648b..6f03a49d3 100644 ---- a/vendor/golang.org/x/oauth2/jws/jws.go -+++ b/vendor/golang.org/x/oauth2/jws/jws.go -@@ -165,11 +165,11 @@ func Encode(header *Header, c *ClaimSet, key *rsa.PrivateKey) (string, error) { - // Verify tests whether the provided JWT token's signature was produced by the private key - // associated with the supplied public key. - func Verify(token string, key *rsa.PublicKey) error { -- parts := strings.Split(token, ".") -- if len(parts) != 3 { -+ if strings.Count(token, ".") != 2 { - return errors.New("jws: invalid token received, token must have 3 parts") - } - -+ parts := strings.SplitN(token, ".", 3) - signedContent := parts[0] + "." + parts[1] - signatureString, err := base64.RawURLEncoding.DecodeString(parts[2]) - if err != nil { diff --git a/SPECS/packer/CVE-2025-22869.patch b/SPECS/packer/CVE-2025-22869.patch deleted file mode 100644 index c0415fddb0..0000000000 --- a/SPECS/packer/CVE-2025-22869.patch +++ /dev/null @@ -1,140 +0,0 @@ -From 041b89a18f81265899e42e6801f830c101a96120 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Sun, 2 Mar 2025 13:46:00 +0000 -Subject: [PATCH] CVE-2025-22869 - -Upstream Reference : https://github.com/golang/crypto/commit/7292932d45d55c7199324ab0027cc86e8198aa22 - -ssh: limit the size of the internal packet queue while waiting for KEX - -In the SSH protocol, clients and servers execute the key exchange to -generate one-time session keys used for encryption and authentication. -The key exchange is performed initially after the connection is -established and then periodically after a configurable amount of data. -While a key exchange is in progress, we add the received packets to an -internal queue until we receive SSH_MSG_KEXINIT from the other side. -This can result in high memory usage if the other party is slow to -respond to the SSH_MSG_KEXINIT packet, or memory exhaustion if a -malicious client never responds to an SSH_MSG_KEXINIT packet during a -large file transfer. -We now limit the internal queue to 64 packets: this means 2MB with the -typical 32KB packet size. -When the internal queue is full we block further writes until the -pending key exchange is completed or there is a read or write error. - -Thanks to Yuichi Watanabe for reporting this issue. - -Change-Id: I1ce2214cc16e08b838d4bc346c74c72addafaeec -Reviewed-on: https://go-review.googlesource.com/c/crypto/+/652135 -Reviewed-by: Neal Patel -Auto-Submit: Gopher Robot -Reviewed-by: Roland Shoemaker -LUCI-TryBot-Result: Go LUCI - ---- - vendor/golang.org/x/crypto/ssh/handshake.go | 47 ++++++++++++++++----- - 1 file changed, 37 insertions(+), 10 deletions(-) - -diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go -index 70a7369..e14eb6c 100644 ---- a/vendor/golang.org/x/crypto/ssh/handshake.go -+++ b/vendor/golang.org/x/crypto/ssh/handshake.go -@@ -24,6 +24,11 @@ const debugHandshake = false - // quickly. - const chanSize = 16 - -+// maxPendingPackets sets the maximum number of packets to queue while waiting -+// for KEX to complete. This limits the total pending data to maxPendingPackets -+// * maxPacket bytes, which is ~16.8MB. -+const maxPendingPackets = 64 -+ - // keyingTransport is a packet based transport that supports key - // changes. It need not be thread-safe. It should pass through - // msgNewKeys in both directions. -@@ -58,11 +63,19 @@ type handshakeTransport struct { - incoming chan []byte - readError error - -- mu sync.Mutex -- writeError error -- sentInitPacket []byte -- sentInitMsg *kexInitMsg -- pendingPackets [][]byte // Used when a key exchange is in progress. -+ mu sync.Mutex -+ // Condition for the above mutex. It is used to notify a completed key -+ // exchange or a write failure. Writes can wait for this condition while a -+ // key exchange is in progress. -+ writeCond *sync.Cond -+ writeError error -+ sentInitPacket []byte -+ sentInitMsg *kexInitMsg -+ // Used to queue writes when a key exchange is in progress. The length is -+ // limited by pendingPacketsSize. Once full, writes will block until the key -+ // exchange is completed or an error occurs. If not empty, it is emptied -+ // all at once when the key exchange is completed in kexLoop. -+ pendingPackets [][]byte - writePacketsLeft uint32 - writeBytesLeft int64 - -@@ -114,6 +127,7 @@ func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, - - config: config, - } -+ t.writeCond = sync.NewCond(&t.mu) - t.resetReadThresholds() - t.resetWriteThresholds() - -@@ -236,6 +250,7 @@ func (t *handshakeTransport) recordWriteError(err error) { - defer t.mu.Unlock() - if t.writeError == nil && err != nil { - t.writeError = err -+ t.writeCond.Broadcast() - } - } - -@@ -339,6 +354,8 @@ write: - } - } - t.pendingPackets = t.pendingPackets[:0] -+ // Unblock writePacket if waiting for KEX. -+ t.writeCond.Broadcast() - t.mu.Unlock() - } - -@@ -526,11 +543,20 @@ func (t *handshakeTransport) writePacket(p []byte) error { - } - - if t.sentInitMsg != nil { -- // Copy the packet so the writer can reuse the buffer. -- cp := make([]byte, len(p)) -- copy(cp, p) -- t.pendingPackets = append(t.pendingPackets, cp) -- return nil -+ if len(t.pendingPackets) < maxPendingPackets { -+ // Copy the packet so the writer can reuse the buffer. -+ cp := make([]byte, len(p)) -+ copy(cp, p) -+ t.pendingPackets = append(t.pendingPackets, cp) -+ return nil -+ } -+ for t.sentInitMsg != nil { -+ // Block and wait for KEX to complete or an error. -+ t.writeCond.Wait() -+ if t.writeError != nil { -+ return t.writeError -+ } -+ } - } - - if t.writeBytesLeft > 0 { -@@ -547,6 +573,7 @@ func (t *handshakeTransport) writePacket(p []byte) error { - - if err := t.pushPacket(p); err != nil { - t.writeError = err -+ t.writeCond.Broadcast() - } - - return nil --- -2.45.2 - diff --git a/SPECS/packer/CVE-2025-22870.patch b/SPECS/packer/CVE-2025-22870.patch deleted file mode 100644 index baa7f27565..0000000000 --- a/SPECS/packer/CVE-2025-22870.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 7ec5d654a9244ad0676849bfd9b8e4af623a7daa Mon Sep 17 00:00:00 2001 -From: Sreenivasulu Malavathula -Date: Wed, 16 Apr 2025 17:59:28 -0500 -Subject: [PATCH] Address CVE-2025-22870 -Upstream Patch Reference: https://github.com/golang/go/commit/25177ecde0922c50753c043579d17828b7ee88e7 - ---- - vendor/golang.org/x/net/http/httpproxy/proxy.go | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/http/httpproxy/proxy.go b/vendor/golang.org/x/net/http/httpproxy/proxy.go -index 6404aaf..d89c257 100644 ---- a/vendor/golang.org/x/net/http/httpproxy/proxy.go -+++ b/vendor/golang.org/x/net/http/httpproxy/proxy.go -@@ -14,6 +14,7 @@ import ( - "errors" - "fmt" - "net" -+ "net/netip" - "net/url" - "os" - "strings" -@@ -177,8 +178,10 @@ func (cfg *config) useProxy(addr string) bool { - if host == "localhost" { - return false - } -- ip := net.ParseIP(host) -- if ip != nil { -+ nip, err := netip.ParseAddr(host) -+ var ip net.IP -+ if err == nil { -+ ip = net.IP(nip.AsSlice()) - if ip.IsLoopback() { - return false - } -@@ -360,6 +363,9 @@ type domainMatch struct { - } - - func (m domainMatch) match(host, port string, ip net.IP) bool { -+ if ip != nil { -+ return false -+ } - if strings.HasSuffix(host, m.host) || (m.matchHost && host == m.host[1:]) { - return m.port == "" || m.port == port - } --- -2.45.2 - diff --git a/SPECS/packer/CVE-2025-22872.patch b/SPECS/packer/CVE-2025-22872.patch deleted file mode 100644 index c86baa1694..0000000000 --- a/SPECS/packer/CVE-2025-22872.patch +++ /dev/null @@ -1,42 +0,0 @@ -From c87c77a12e5554d376945bd488e56d4fc5b9e5ac Mon Sep 17 00:00:00 2001 -From: archana25-ms -Date: Tue, 22 Apr 2025 06:32:35 +0000 -Subject: [PATCH] Address CVE-2025-22872 -Upstream Patch Reference: https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9 - ---- - vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index 3c57880..6598c1f 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType { - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } -- // Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken --- -2.45.3 - diff --git a/SPECS/packer/CVE-2025-27144.patch b/SPECS/packer/CVE-2025-27144.patch deleted file mode 100644 index 6015ed48ca..0000000000 --- a/SPECS/packer/CVE-2025-27144.patch +++ /dev/null @@ -1,50 +0,0 @@ -From fa324fa38481f9d2da9109cb5983326f62ff7507 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Fri, 28 Feb 2025 07:45:53 +0000 -Subject: [PATCH] CVE-2025-27144 -Upstream Ref: https://github.com/go-jose/go-jose/commit/c9ed84d8f0cfadcfad817150158caca6fcbc518b - ---- - vendor/gopkg.in/square/go-jose.v2/jwe.go | 5 +++-- - vendor/gopkg.in/square/go-jose.v2/jws.go | 5 +++-- - 2 files changed, 6 insertions(+), 4 deletions(-) - -diff --git a/vendor/gopkg.in/square/go-jose.v2/jwe.go b/vendor/gopkg.in/square/go-jose.v2/jwe.go -index b5a6dcd..cd1de9e 100644 ---- a/vendor/gopkg.in/square/go-jose.v2/jwe.go -+++ b/vendor/gopkg.in/square/go-jose.v2/jwe.go -@@ -201,10 +201,11 @@ func (parsed *rawJSONWebEncryption) sanitized() (*JSONWebEncryption, error) { - - // parseEncryptedCompact parses a message in compact format. - func parseEncryptedCompact(input string) (*JSONWebEncryption, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 5 { -+ // Five parts is four separators -+ if strings.Count(input, ".") != 4 { - return nil, fmt.Errorf("square/go-jose: compact JWE format must have five parts") - } -+ parts := strings.SplitN(input, ".", 5) - - rawProtected, err := base64.RawURLEncoding.DecodeString(parts[0]) - if err != nil { -diff --git a/vendor/gopkg.in/square/go-jose.v2/jws.go b/vendor/gopkg.in/square/go-jose.v2/jws.go -index 7e261f9..a8d55fb 100644 ---- a/vendor/gopkg.in/square/go-jose.v2/jws.go -+++ b/vendor/gopkg.in/square/go-jose.v2/jws.go -@@ -275,10 +275,11 @@ func (parsed *rawJSONWebSignature) sanitized() (*JSONWebSignature, error) { - - // parseSignedCompact parses a message in compact format. - func parseSignedCompact(input string, payload []byte) (*JSONWebSignature, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 3 { -+ // Three parts is two separators -+ if strings.Count(input, ".") != 2 { - return nil, fmt.Errorf("square/go-jose: compact JWS format must have three parts") - } -+ parts := strings.SplitN(input, ".", 3) - - if parts[1] != "" && payload != nil { - return nil, fmt.Errorf("square/go-jose: payload is not detached") --- -2.45.2 - diff --git a/SPECS/packer/CVE-2025-30204.patch b/SPECS/packer/CVE-2025-30204.patch deleted file mode 100644 index b72c6e6ae2..0000000000 --- a/SPECS/packer/CVE-2025-30204.patch +++ /dev/null @@ -1,72 +0,0 @@ -From 3b49efd441bf131dd895fd75dcf669a493b95638 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Sat, 29 Mar 2025 17:54:57 +0000 -Subject: [PATCH] CVE-2025-30204 - -Upstream Patch Reference : v4: https://github.com/golang-jwt/jwt/commit/2f0e9add62078527821828c76865661aa7718a84 - ---- - vendor/github.com/golang-jwt/jwt/v4/parser.go | 36 +++++++++++++++++++++++--- - 1 file changed, 33 insertions(+), 3 deletions(-) - -diff --git a/vendor/github.com/golang-jwt/jwt/v4/parser.go b/vendor/github.com/golang-jwt/jwt/v4/parser.go -index 2f61a69..9484f28 100644 ---- a/vendor/github.com/golang-jwt/jwt/v4/parser.go -+++ b/vendor/github.com/golang-jwt/jwt/v4/parser.go -@@ -7,6 +7,8 @@ import ( - "strings" - ) - -+const tokenDelimiter = "." -+ - type Parser struct { - // If populated, only these methods will be considered valid. - // -@@ -116,9 +118,10 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf - // It's only ever useful in cases where you know the signature is valid (because it has - // been checked previously in the stack) and you want to extract values from it. - func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { -- parts = strings.Split(tokenString, ".") -- if len(parts) != 3 { -- return nil, parts, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) -+ var ok bool -+ parts, ok = splitToken(tokenString) -+ if !ok { -+ return nil, nil, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) - } - - token = &Token{Raw: tokenString} -@@ -168,3 +171,30 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke - - return token, parts, nil - } -+ -+// splitToken splits a token string into three parts: header, claims, and signature. It will only -+// return true if the token contains exactly two delimiters and three parts. In all other cases, it -+// will return nil parts and false. -+func splitToken(token string) ([]string, bool) { -+ parts := make([]string, 3) -+ header, remain, ok := strings.Cut(token, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[0] = header -+ claims, remain, ok := strings.Cut(remain, tokenDelimiter) -+ if !ok { -+ return nil, false -+ } -+ parts[1] = claims -+ // One more cut to ensure the signature is the last part of the token and there are no more -+ // delimiters. This avoids an issue where malicious input could contain additional delimiters -+ // causing unecessary overhead parsing tokens. -+ signature, _, unexpected := strings.Cut(remain, tokenDelimiter) -+ if unexpected { -+ return nil, false -+ } -+ parts[2] = signature -+ -+ return parts, true -+} --- -2.45.2 - diff --git a/SPECS/packer/packer.signatures.json b/SPECS/packer/packer.signatures.json deleted file mode 100644 index 458be6b9fa..0000000000 --- a/SPECS/packer/packer.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "packer-1.9.5-vendor-v2.tar.gz": "4b77d1bba3adb00a8a410b8a507df96f66e2b36a016d49300b08f77c8d3f7245", - "packer-1.9.5.tar.gz": "a6da3e455578f5373c5e333023a7be483e9c22f4235ccd599fe39d42df55f870" - } -} \ No newline at end of file diff --git a/SPECS/packer/packer.spec b/SPECS/packer/packer.spec deleted file mode 100644 index 82d518c446..0000000000 --- a/SPECS/packer/packer.spec +++ /dev/null @@ -1,157 +0,0 @@ -%global debug_package %{nil} -%define our_gopath %{_topdir}/.gopath - -Summary: Tool for creating identical machine images for multiple platforms from a single source configuration. -Name: packer -Version: 1.9.5 -Release: 10%{?dist} -License: MPLv2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Applications/Tools -URL: https://github.com/hashicorp/packer -Source0: https://github.com/hashicorp/packer/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -# Below is a manually created tarball, no download link. -# We're using pre-populated Go modules from this tarball, since network is disabled during build time. -# How to re-build this file: -# 1. wget https://github.com/hashicorp/packer/archive/v%{version}.tar.gz -O %%{name}-%%{version}.tar.gz -# 2. tar -xf %%{name}-%%{version}.tar.gz -# 3. cd %%{name}-%%{version} -# 4. Apply all patches affecting "go.mod" and "go.sum" files. Example: CVE-2025-21613.patch. -# 5. go mod vendor -# 6. tar --sort=name \ -# --mtime="2021-04-26 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cf %%{name}-%%{version}-vendor.tar.gz vendor -# -# NOTES: -# - You require GNU tar version 1.28+. -# - The additional options enable generation of a tarball with the same hash every time regardless of the environment. -# See: https://reproducible-builds.org/docs/archives/ -# - For the value of "--mtime" use the date "2021-04-26 00:00Z" to simplify future updates. -Source1: %{name}-%{version}-vendor-v2.tar.gz -Patch0: CVE-2022-3064.patch -Patch1: CVE-2024-6104.patch -Patch2: CVE-2024-24786.patch -Patch3: CVE-2025-21613.patch -Patch4: CVE-2024-28180.patch -Patch5: CVE-2025-27144.patch -Patch6: CVE-2025-22869.patch -Patch7: CVE-2025-22868.patch -Patch8: CVE-2025-30204.patch -Patch9: CVE-2025-22870.patch -Patch10: CVE-2024-51744.patch -Patch11: CVE-2025-22872.patch - -BuildRequires: golang >= 1.21 -BuildRequires: kernel-headers -BuildRequires: glibc-devel - -%description -Packer is a tool for building identical machine images for multiple platforms from a single source configuration. - -%prep -%autosetup -p1 -a1 - -%build -export GOPATH=%{our_gopath} -LD_FLAGS="-X github.com/hashicorp/packer/version.Version=%{version} -X github.com/hashicorp/packer/version.VersionPrerelease=" -go build -mod=vendor -v -a -o packer -ldflags="$LD_FLAGS" - -%install -install -m 755 -d %{buildroot}%{_bindir} -install -p -m 755 -t %{buildroot}%{_bindir} ./packer/packer - -%check -go test -mod=vendor -./packer/packer -help - -%files -%defattr(-,root,root) -%license LICENSE -%doc README.md CHANGELOG.md -%{_bindir}/packer - -%changelog -* Fri May 30 2025 Ranjan Dutta - 1.9.5-10 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22872 -- Fix CVE-2025-22870, CVE-2024-51744 with upstream patches -- Patch CVE-2025-30204 - -* Fri Apr 28 2025 Ranjan Dutta - 1.9.5-8 -- merge from Azure Linux tag 3.0.20250423-3.0 - -* Fri Mar 21 2025 Anuj Mittal - 1.9.5-7 -- Bump Release to rebuild - -* Fri Feb 28 2025 Kanishk Bansal - 1.9.5-6 -- Fix CVE-2024-28180, CVE-2025-27144, CVE-2025-22869, CVE-2025-22868 with an upstream patch - -* Thu Jan 09 2025 Sudipta Pandit - 1.9.5-5 -- Add patch for CVE-2025-21613 and CVE-2025-21614 -- Remove patch for CVE-2023-45288, CVE-2023-49569, CVE-2024-45337 - -* Fri Dec 20 2024 Aurelien Bombo - 1.9.5-4 -- Add patch for CVE-2024-45337 - -* Mon Nov 25 2024 Bala - 1.9.5-3 -- Patched CVE-2024-24786 - -* Mon Aug 05 2024 Bala - 1.9.5-2 -- Patched CVE-2024-6104. - -* Mon Jul 01 2024 Pawel Winogrodzki - 1.9.5-1 -- Bump to version 1.9.5. -- Patched CVE-2022-3064. -- Ported patches from 2.0: CVE-2023-45288 and CVE-2023-49569. - -* Fri Oct 27 2023 CBL-Mariner Servicing Account - 1.9.4-1 -- Auto-upgrade to 1.9.4 - Azure Linux 3.0 - package upgrades - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 1.8.1-15 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 1.8.1-14 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.8.1-13 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 1.8.1-12 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 1.8.1-11 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.8.1-10 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 1.8.1-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 1.8.1-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 1.8.1-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 1.8.1-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 1.8.1-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 1.8.1-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 1.8.1-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 1.8.1-2 -- Bump release to rebuild with golang 1.18.3 - -* Tue Jun 07 2022 Suresh Babu Chalamalasetty - 1.8.1-1 -- Original version for CBL-Mariner. -- License verified. diff --git a/SPECS/prebuilt-ca-certificates-base/prebuilt-ca-certificates-base.spec b/SPECS/prebuilt-ca-certificates-base/prebuilt-ca-certificates-base.spec index f9c0dd0876..a3cac099ce 100644 --- a/SPECS/prebuilt-ca-certificates-base/prebuilt-ca-certificates-base.spec +++ b/SPECS/prebuilt-ca-certificates-base/prebuilt-ca-certificates-base.spec @@ -3,7 +3,7 @@ Name: prebuilt-ca-certificates-base # When updating, "Epoch, "Version", AND "Release" tags must be updated in the "ca-certificates" package as well. Epoch: 1 Version: %{emt}.0.0 -Release: 11%{?dist} +Release: 14%{?dist} License: MIT Vendor: Intel Corporation Distribution: Edge Microvisor Toolkit @@ -46,6 +46,10 @@ find %{buildroot} -name README -delete %{_sysconfdir}/pki/java/cacerts %changelog +* Mon Jan 5 2025 Lee Chee Yang - 1:3.0.0-14 +- merge from Azure Linux 3.0.20251206-3.0 +- Making 'Release' match with 'ca-certificates' + * Fri Oct 3 2025 Lee Chee Yang - 1:3.0.0-11 - merge from Azure Linux 3.0.20250910-3.0 - Making 'Release' match with 'ca-certificates' diff --git a/SPECS/prebuilt-ca-certificates/prebuilt-ca-certificates.spec b/SPECS/prebuilt-ca-certificates/prebuilt-ca-certificates.spec index bc8006c989..b9faed0693 100644 --- a/SPECS/prebuilt-ca-certificates/prebuilt-ca-certificates.spec +++ b/SPECS/prebuilt-ca-certificates/prebuilt-ca-certificates.spec @@ -3,7 +3,7 @@ Name: prebuilt-ca-certificates # When updating, "Epoch, "Version", AND "Release" tags must be updated in the "ca-certificates" package as well. Epoch: 1 Version: %{emt}.0.0 -Release: 11%{?dist} +Release: 14%{?dist} License: MIT Vendor: Intel Corporation Distribution: Edge Microvisor Toolkit @@ -49,6 +49,10 @@ find %{buildroot} -name README -delete %{_sysconfdir}/pki/java/cacerts %changelog +* Mon Jan 5 2025 Lee Chee Yang - 1:3.0.0-14 +- merge from Azure Linux 3.0.20251206-3.0 +- Making 'Release' match with 'ca-certificates' + * Fri Oct 3 2025 Lee Chee Yang - 1:3.0.0-11 - merge from Azure Linux 3.0.20250910-3.0 - Making 'Release' match with 'ca-certificates' diff --git a/SPECS/prometheus-adapter/CVE-2024-45338.patch b/SPECS/prometheus-adapter/CVE-2024-45338.patch deleted file mode 100644 index 6cc6480cfe..0000000000 --- a/SPECS/prometheus-adapter/CVE-2024-45338.patch +++ /dev/null @@ -1,63 +0,0 @@ -From c0257297bbeee9a17ba588f7db88aeb7b9ec5b68 Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Thu, 2 Jan 2025 10:22:12 +0000 -Subject: [PATCH] Fix CVE CVE-2024-45338 in prometheus-adapter - ---- - .../vendor/golang.org/x/net/html/doctype.go | 2 +- - .../vendor/golang.org/x/net/html/foreign.go | 3 +-- - .../vendor/golang.org/x/net/html/parse.go | 4 ++-- - 3 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go -index c484e5a..bca3ae9 100644 ---- a/vendor/golang.org/x/net/html/doctype.go -+++ b/vendor/golang.org/x/net/html/doctype.go -@@ -87,7 +87,7 @@ func parseDoctype(s string) (n *Node, quirks bool) { - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && -- strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { -+ strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") { - quirks = true - } - } -diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go -index 9da9e9d..e8515d8 100644 ---- a/vendor/golang.org/x/net/html/foreign.go -+++ b/vendor/golang.org/x/net/html/foreign.go -@@ -40,8 +40,7 @@ func htmlIntegrationPoint(n *Node) bool { - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { -- val := strings.ToLower(a.Val) -- if val == "text/html" || val == "application/xhtml+xml" { -+ if strings.EqualFold(a.Val, "text/html") || strings.EqualFold(a.Val, "application/xhtml+xml") { - return true - } - } -diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go -index 46a89ed..5b8374b 100644 ---- a/vendor/golang.org/x/net/html/parse.go -+++ b/vendor/golang.org/x/net/html/parse.go -@@ -1031,7 +1031,7 @@ func inBodyIM(p *parser) bool { - if p.tok.DataAtom == a.Input { - for _, t := range p.tok.Attr { - if t.Key == "type" { -- if strings.ToLower(t.Val) == "hidden" { -+ if strings.EqualFold(t.Val, "hidden") { - // Skip setting framesetOK = false - return true - } -@@ -1459,7 +1459,7 @@ func inTableIM(p *parser) bool { - return inHeadIM(p) - case a.Input: - for _, t := range p.tok.Attr { -- if t.Key == "type" && strings.ToLower(t.Val) == "hidden" { -+ if t.Key == "type" && strings.EqualFold(t.Val, "hidden") { - p.addElement() - p.oe.pop() - return true --- -2.39.4 - diff --git a/SPECS/prometheus-adapter/CVE-2025-22872.patch b/SPECS/prometheus-adapter/CVE-2025-22872.patch deleted file mode 100644 index c86baa1694..0000000000 --- a/SPECS/prometheus-adapter/CVE-2025-22872.patch +++ /dev/null @@ -1,42 +0,0 @@ -From c87c77a12e5554d376945bd488e56d4fc5b9e5ac Mon Sep 17 00:00:00 2001 -From: archana25-ms -Date: Tue, 22 Apr 2025 06:32:35 +0000 -Subject: [PATCH] Address CVE-2025-22872 -Upstream Patch Reference: https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9 - ---- - vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index 3c57880..6598c1f 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType { - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } -- // Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken --- -2.45.3 - diff --git a/SPECS/prometheus-adapter/generate_source_tarball.sh b/SPECS/prometheus-adapter/generate_source_tarball.sh deleted file mode 100755 index 08941ede57..0000000000 --- a/SPECS/prometheus-adapter/generate_source_tarball.sh +++ /dev/null @@ -1,94 +0,0 @@ -#!/bin/bash - -# The flow of this script is as such: -# 1. Download prometheus-adapter tarball to a temp working directory and extract it. -# 2. Then we run go mod vendor. -# 3. We tar the updated prometheus-adapter - -set -e - -SRC_TARBALL="" -OUT_FOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -PKG_VERSION="" - -# parameters: -# -# --srcTarball : src tarball file -# this file contains the 'initial' source code of the component -# and should be replaced with the new/modified src code -# --outFolder : folder where to copy the new tarball(s) -# --pkgVersion : package version -# -PARAMS="" -while (( "$#" )); do - case "$1" in - --srcTarball) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - SRC_TARBALL=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --outFolder) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - OUT_FOLDER=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - --pkgVersion) - if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then - PKG_VERSION=$2 - shift 2 - else - echo "Error: Argument for $1 is missing" >&2 - exit 1 - fi - ;; - -*|--*=) # unsupported flags - echo "Error: Unsupported flag $1" >&2 - exit 1 - ;; - *) # preserve positional arguments - PARAMS="$PARAMS $1" - shift - ;; - esac -done - -echo "--srcTarball -> $SRC_TARBALL" -echo "--outFolder -> $OUT_FOLDER" -echo "--pkgVersion -> $PKG_VERSION" - -if [ -z "$PKG_VERSION" ]; then - echo "--pkgVersion parameter cannot be empty" - exit 1 -fi - -echo "-- create temp folder" -TEMPDIR=$(mktemp -d) -function cleanup { - echo "+++ cleanup -> remove $TEMPDIR" - rm -rf $TEMPDIR -} -trap cleanup EXIT - -echo "Starting Prometheus-Adapter source tarball creation" -ADAPTER_URL="https://github.com/kubernetes-sigs/prometheus-adapter/archive/refs/tags/v$PKG_VERSION.tar.gz" - -cd "$TEMPDIR" -# sudo chown -R "$USER": . -wget -c $ADAPTER_URL -O "prometheus-adapter-$PKG_VERSION.tar.gz" -tar -xzf "prometheus-adapter-$PKG_VERSION.tar.gz" -cd "prometheus-adapter-$PKG_VERSION" -go mod vendor - -cd "$TEMPDIR" -tar -czf "$OUT_FOLDER/prometheus-adapter-$PKG_VERSION.tar.gz" "prometheus-adapter-$PKG_VERSION" -cd "$START_DIR" -rm -rf "$TEMPDIR" -echo "Source tarball $OUT_FOLDER/prometheus-adapter-$PKG_VERSION.tar.gz successfully created!" \ No newline at end of file diff --git a/SPECS/prometheus-adapter/prometheus-adapter.signatures.json b/SPECS/prometheus-adapter/prometheus-adapter.signatures.json deleted file mode 100644 index ba97e2c7b7..0000000000 --- a/SPECS/prometheus-adapter/prometheus-adapter.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "prometheus-adapter-0.12.0.tar.gz": "56dab72644c1da439dbc7a6df20ded6896b1b6892f8ae84c7b9bf82742b7ffd3" - } -} diff --git a/SPECS/prometheus-adapter/prometheus-adapter.spec b/SPECS/prometheus-adapter/prometheus-adapter.spec deleted file mode 100644 index cb5ca417e6..0000000000 --- a/SPECS/prometheus-adapter/prometheus-adapter.spec +++ /dev/null @@ -1,96 +0,0 @@ -Summary: Kubernetes Custom, Resource, and External Metric APIs implemented to work with Prometheus. -Name: prometheus-adapter -Version: 0.12.0 -Release: 5%{?dist} -License: Apache-2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -URL: https://github.com/kubernetes-sigs/prometheus-adapter -Source0: https://github.com/kubernetes-sigs/%{name}/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -Patch0: CVE-2024-45338.patch -Patch1: CVE-2025-22872.patch -BuildRequires: golang < 1.25 - -%description -Implementation of Prometheus via Kubernetes Custom, Resource, and External Metric API. - -%package docs -Summary: prometheus-adapter docs -Requires: %{name} = %{version}-%{release} - -%description docs -Documentation for prometheus-adapter - -%prep -%autosetup -p1 - -%build -make prometheus-adapter - -%install -install -m 0755 -vd %{buildroot}%{_bindir} -install -m 0755 -vp adapter %{buildroot}%{_bindir}/ - -%check -make test - -%files -%license LICENSE NOTICE -%{_bindir}/* - -%files docs -%doc docs CONTRIBUTING.md OWNERS SECURITY.md SECURITY_CONTACTS VERSION code-of-conduct.md -%doc README.md RELEASE.md - -%changelog -* Fri Oct 3 2025 Lee Chee Yang - 0.12.0-5 -- merge from Azure Linux 3.0.20250910-3.0 -- Set BR for golang to < 1.25 - -* Fri May 30 2025 Ranjan Dutta - 0.12.0-4 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22872 - -* Fri Mar 21 2025 Anuj Mittal - 0.12.0-3 -- Bump Release to rebuild - -* Tue Dec 31 2024 Rohit Rawat - 0.12.0-2 -- Patch CVE-2024-45338 - -* Fri Jul 12 2024 CBL-Mariner Servicing Account - 0.12.0-1 -- Auto-upgrade to 0.12.0 - Fix CVE-2023-39325, CVE-2023-3978, CVE-2023-45142, CVE-2023-45288, and CVE-2024-24786 - -* Tue Dec 19 2023 CBL-Mariner Servicing Account - 0.11.2-1 -- Auto-upgrade to 0.11.2 - Package Upgrades - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 0.10.0-10 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 0.10.0-9 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 0.10.0-8 -- Bump release to rebuild with go 1.19.12 - -* Wed Jul 26 2023 Osama Esmail - 0.10.0-7 -- Removing `prometheus` from BuildRequires -- Making `docs` a separate package - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 0.10.0-6 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 0.10.0-5 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 0.10.0-4 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 0.10.0-3 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 0.10.0-2 -- Bump release to rebuild with go 1.19.6 - -* Wed Feb 15 2023 Osama Esmail - 0.10.0-1 -- Original version for CBL-Mariner -- License verified. diff --git a/SPECS/prometheus-node-exporter/CVE-2023-45288.patch b/SPECS/prometheus-node-exporter/CVE-2023-45288.patch deleted file mode 100644 index 80eaa40216..0000000000 --- a/SPECS/prometheus-node-exporter/CVE-2023-45288.patch +++ /dev/null @@ -1,83 +0,0 @@ -Author: Damien Neil -AuthorDate: 2024-01-10 13:41:39 -0800 -Commit: Gopher Robot -CommitDate: 2024-04-03 17:06:00 +0000 - -[internal-branch.go1.21-vendor] http2: close connections when receiving too many headers - -Maintaining HPACK state requires that we parse and process -all HEADERS and CONTINUATION frames on a connection. -When a request's headers exceed MaxHeaderBytes, we don't -allocate memory to store the excess headers but we do -parse them. This permits an attacker to cause an HTTP/2 -endpoint to read arbitrary amounts of data, all associated -with a request which is going to be rejected. - -Set a limit on the amount of excess header frames we -will process before closing a connection. - -Thanks to Bartek Nowotarski for reporting this issue. - -Fixes CVE-2023-45288 -For golang/go#65051 - -Change-Id: I15df097268df13bb5a9e9d3a5c04a8a141d850f6 -Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2130527 -Reviewed-by: Roland Shoemaker -Reviewed-by: Tatiana Bradley -Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2197243 -Run-TryBot: Damien Neil -Reviewed-by: Dmitri Shuralyov -Reviewed-on: https://go-review.googlesource.com/c/net/+/576057 -LUCI-TryBot-Result: Go LUCI -Auto-Submit: Dmitri Shuralyov - -diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go -index c1f6b90..175c154 100644 ---- a/vendor/golang.org/x/net/http2/frame.go -+++ b/vendor/golang.org/x/net/http2/frame.go -@@ -1565,6 +1565,7 @@ - if size > remainSize { - hdec.SetEmitEnabled(false) - mh.Truncated = true -+ remainSize = 0 - return - } - remainSize -= size -@@ -1577,6 +1578,36 @@ - var hc headersOrContinuation = hf - for { - frag := hc.HeaderBlockFragment() -+ -+ // Avoid parsing large amounts of headers that we will then discard. -+ // If the sender exceeds the max header list size by too much, -+ // skip parsing the fragment and close the connection. -+ // -+ // "Too much" is either any CONTINUATION frame after we've already -+ // exceeded the max header list size (in which case remainSize is 0), -+ // or a frame whose encoded size is more than twice the remaining -+ // header list bytes we're willing to accept. -+ if int64(len(frag)) > int64(2*remainSize) { -+ if VerboseLogs { -+ log.Printf("http2: header list too large") -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the struture of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ -+ // Also close the connection after any CONTINUATION frame following an -+ // invalid header, since we stop tracking the size of the headers after -+ // an invalid one. -+ if invalid != nil { -+ if VerboseLogs { -+ log.Printf("http2: invalid header: %v", invalid) -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the struture of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ - if _, err := hdec.Write(frag); err != nil { - return nil, ConnectionError(ErrCodeCompression) - } diff --git a/SPECS/prometheus-node-exporter/CVE-2025-22870.patch b/SPECS/prometheus-node-exporter/CVE-2025-22870.patch deleted file mode 100644 index b998fe6c1d..0000000000 --- a/SPECS/prometheus-node-exporter/CVE-2025-22870.patch +++ /dev/null @@ -1,48 +0,0 @@ -From ca8ab5f28828d2883483d49135a22187b59ff61f Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Tue, 8 Apr 2025 19:04:20 +0000 -Subject: [PATCH] Fix CVE CVE-2025-22870 in prometheus-node-exporter - -Upstream Patch Reference: https://github.com/golang/go/commit/334de7982f8ec959c74470dd709ceedfd6dbd50a.patch ---- - vendor/golang.org/x/net/http/httpproxy/proxy.go | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/http/httpproxy/proxy.go b/vendor/golang.org/x/net/http/httpproxy/proxy.go -index c3bd9a1..864961c 100644 ---- a/vendor/golang.org/x/net/http/httpproxy/proxy.go -+++ b/vendor/golang.org/x/net/http/httpproxy/proxy.go -@@ -14,6 +14,7 @@ import ( - "errors" - "fmt" - "net" -+ "net/netip" - "net/url" - "os" - "strings" -@@ -180,8 +181,10 @@ func (cfg *config) useProxy(addr string) bool { - if host == "localhost" { - return false - } -- ip := net.ParseIP(host) -- if ip != nil { -+ nip, err := netip.ParseAddr(host) -+ var ip net.IP -+ if err == nil { -+ ip = net.IP(nip.AsSlice()) - if ip.IsLoopback() { - return false - } -@@ -363,6 +366,9 @@ type domainMatch struct { - } - - func (m domainMatch) match(host, port string, ip net.IP) bool { -+ if ip != nil { -+ return false -+ } - if strings.HasSuffix(host, m.host) || (m.matchHost && host == m.host[1:]) { - return m.port == "" || m.port == port - } --- -2.40.4 - diff --git a/SPECS/prometheus-node-exporter/defaults-paths.patch b/SPECS/prometheus-node-exporter/defaults-paths.patch deleted file mode 100644 index e81c6c5b30..0000000000 --- a/SPECS/prometheus-node-exporter/defaults-paths.patch +++ /dev/null @@ -1,22 +0,0 @@ -Description: Change default paths to match Debian packaging -Forwarded: not-needed -Author: Martina Ferrari -Last-Update: 2019-10-29 - ---- - collector/textfile.go | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/collector/textfile.go b/collector/textfile.go -index 469235dc..12353ffd 100644 ---- a/collector/textfile.go -+++ b/collector/textfile.go -@@ -33,7 +33,7 @@ import ( - ) - - var ( -- textFileDirectory = kingpin.Flag("collector.textfile.directory", "Directory to read text files with metrics from.").Default("").String() -+ textFileDirectory = kingpin.Flag("collector.textfile.directory", "Directory to read text files with metrics from.").Default("/var/lib/prometheus/node-exporter").String() - mtimeDesc = prometheus.NewDesc( - "node_textfile_mtime_seconds", - "Unixtime mtime of textfiles successfully read.", diff --git a/SPECS/prometheus-node-exporter/prometheus-node-exporter.conf b/SPECS/prometheus-node-exporter/prometheus-node-exporter.conf deleted file mode 100644 index b452ad6baa..0000000000 --- a/SPECS/prometheus-node-exporter/prometheus-node-exporter.conf +++ /dev/null @@ -1,244 +0,0 @@ -# Set the command-line arguments to pass to the server. -# Due to shell scaping, to pass backslashes for regexes, you need to double -# them (\\d for \d). If running under systemd, you need to double them again -# (\\\\d to mean \d), and escape newlines too. -ARGS='' - -# prometheus-node-exporter supports the following options: -# -# --collector.arp -# Enable the arp collector (default: enabled). -# --collector.bcache -# Enable the bcache collector (default: enabled). -# --collector.bcache.priorityStats -# Expose expensive priority stats. -# --collector.bonding -# Enable the bonding collector (default: enabled). -# --collector.btrfs -# Enable the btrfs collector (default: enabled). -# --collector.buddyinfo -# Enable the buddyinfo collector (default: disabled). -# --collector.conntrack -# Enable the conntrack collector (default: enabled). -# --collector.cpu -# Enable the cpu collector (default: enabled). -# --collector.cpu.guest -# Enables metric node_cpu_guest_seconds_total. -# --collector.cpu.info -# Enables metric cpu_info. -# --collector.cpu.info.bugs-include=COLLECTOR.CPU.INFO.BUGS-INCLUDE -# Filter the `bugs` field in cpuInfo with a value that must be a regular -# expression. -# --collector.cpu.info.flags-include=COLLECTOR.CPU.INFO.FLAGS-INCLUDE -# Filter the `flags` field in cpuInfo with a value that must be a regular -# expression. -# --collector.cpufreq -# Enable the cpufreq collector (default: enabled). -# --collector.disable-defaults -# Set all collectors to disabled by default. -# --collector.diskstats -# Enable the diskstats collector (default: enabled). -# --collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\\d+n\\d+p)\\d+$" -# Regexp of devices to ignore for diskstats. -# --collector.dmi -# Enable the dmi collector (default: enabled). -# --collector.drbd -# Enable the drbd collector (default: disabled). -# --collector.drm -# Enable the drm collector (default: disabled). -# --collector.edac -# Enable the edac collector (default: enabled). -# --collector.entropy -# Enable the entropy collector (default: enabled). -# --collector.ethtool -# Enable the ethtool collector (default: disabled). -# --collector.ethtool.device-exclude=COLLECTOR.ETHTOOL.DEVICE-EXCLUDE -# Regexp of ethtool devices to exclude (mutually exclusive to device-include). -# --collector.ethtool.device-include=COLLECTOR.ETHTOOL.DEVICE-INCLUDE -# Regexp of ethtool devices to include (mutually exclusive to device-exclude). -# --collector.ethtool.metrics-include=".*" -# Regexp of ethtool stats to include. -# --collector.fibrechannel -# Enable the fibrechannel collector (default: enabled). -# --collector.filefd -# Enable the filefd collector (default: enabled). -# --collector.filesystem -# Enable the filesystem collector (default: enabled). -# --collector.filesystem.fs-types-exclude="^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$" -# Regexp of filesystem types to exclude for filesystem collector. -# --collector.filesystem.mount-points-exclude="^/(dev|proc|run|sys|mnt|media|var/lib/docker/.+)($|/)" -# Regexp of mount points to exclude for filesystem collector. -# --collector.hwmon -# Enable the hwmon collector (default: enabled). -# --collector.infiniband -# Enable the infiniband collector (default: enabled). -# --collector.interrupts -# Enable the interrupts collector (default: disabled). -# --collector.ipvs -# Enable the ipvs collector (default: enabled). -# --collector.ipvs.backend-labels="local_address,local_port,remote_address,remote_port,proto,local_mark" -# Comma separated list for IPVS backend stats labels. -# --collector.ksmd -# Enable the ksmd collector (default: disabled). -# --collector.lnstat -# Enable the lnstat collector (default: disabled). -# --collector.loadavg -# Enable the loadavg collector (default: enabled). -# --collector.logind -# Enable the logind collector (default: disabled). -# --collector.mdadm -# Enable the mdadm collector (default: enabled). -# --collector.meminfo -# Enable the meminfo collector (default: enabled). -# --collector.meminfo_numa -# Enable the meminfo_numa collector (default: disabled). -# --collector.mountstats -# Enable the mountstats collector (default: disabled). -# --collector.netclass -# Enable the netclass collector (default: enabled). -# --collector.netclass.ignored-devices="^$" -# Regexp of net devices to ignore for netclass collector. -# --collector.netclass.ignore-invalid-speed -# Ignore devices where the speed is invalid. This will be the default behavior in 2.x. -# --collector.netdev -# Enable the netdev collector (default: enabled). -# --collector.netdev.address-info -# Collect address-info for every device. -# --collector.netdev.device-exclude="^lo$" -# Regexp of net devices to exclude (mutually exclusive to device-include). -# --collector.netdev.device-include=COLLECTOR.NETDEV.DEVICE-INCLUDE -# Regexp of net devices to include (mutually exclusive to device-exclude). -# --collector.netstat -# Enable the netstat collector (default: enabled). -# --collector.netstat.fields="^(.*_(InErrors|InErrs)|Ip_Forwarding|Ip(6|Ext)_(InOctets|OutOctets)|Icmp6?_(InMsgs|OutMsgs)|TcpExt_(Listen.*|Syncookies.*|TCPSynRetrans|TCPTimeouts)|Tcp_(ActiveOpens|InSegs|OutSegs|OutRsts|PassiveOpens|RetransSegs|CurrEstab)|Udp6?_(InDatagrams|OutDatagrams|NoPorts|RcvbufErrors|SndbufErrors))$" -# Regexp of fields to return for netstat collector. -# --collector.network_route -# Enable the network_route collector (default: disabled). -# --collector.nfs -# Enable the nfs collector (default: enabled). -# --collector.nfsd -# Enable the nfsd collector (default: enabled). -# --collector.ntp -# Enable the ntp collector (default: disabled). -# --collector.ntp.ip-ttl=1 -# IP TTL to use while sending NTP query. -# --collector.ntp.local-offset-tolerance=1ms -# Offset between local clock and local ntpd time to tolerate. -# --collector.ntp.max-distance=3.46608s -# Max accumulated distance to the root. -# --collector.ntp.protocol-version=4 -# NTP protocol version. -# --collector.ntp.server-is-local -# Certify that collector.ntp.server address is not a public ntp server. -# --collector.ntp.server="127.0.0.1" -# NTP server to use for ntp collector. -# --collector.nvme -# Enable the nvme collector (default: enabled). -# --collector.os -# Enable the os collector (default: enabled). -# --collector.perf -# Enable the perf collector (default: disabled). -# --collector.perf.cpus="" -# List of CPUs from which perf metrics should be collected. -# --collector.perf.tracepoint=COLLECTOR.PERF.TRACEPOINT... -# Perf tracepoint that should be collected. -# --collector.powersupply.ignored-supplies="^$" -# Regexp of power supplies to ignore for powersupplyclass collector. -# --collector.powersupplyclass -# Enable the powersupplyclass collector (default: enabled). -# --collector.pressure -# Enable the pressure collector (default: enabled). -# --collector.processes -# Enable the processes collector (default: disabled). -# --collector.qdisc -# Enable the qdisc collector (default: disabled). -# --collector.qdisc.fixtures="" -# Test fixtures to use for qdisc collector end-to-end testing. -# --collector.rapl -# Enable the rapl collector (default: enabled). -# --collector.runit -# Enable the runit collector (default: disabled). -# --collector.runit.servicedir="/etc/service" -# Path to runit service directory. -# --collector.schedstat -# Enable the schedstat collector (default: enabled). -# --collector.sockstat -# Enable the sockstat collector (default: enabled). -# --collector.softnet -# Enable the softnet collector (default: enabled). -# --collector.stat -# Enable the stat collector (default: enabled). -# --collector.supervisord -# Enable the supervisord collector (default: disabled). -# --collector.supervisord.url="http://localhost:9001/RPC2" -# XML RPC endpoint. -# --collector.systemd -# Enable the systemd collector (default: enabled). -# --collector.systemd.enable-restarts-metrics -# Enables service unit metric service_restart_total. -# --collector.systemd.enable-start-time-metrics -# Enables service unit metric unit_start_time_seconds. -# --collector.systemd.enable-task-metrics -# Enables service unit tasks metrics unit_tasks_current and unit_tasks_max. -# --collector.systemd.unit-exclude=".+\\.(automount|device|mount|scope|slice|target)" -# Regexp of systemd units to exclude. Units must both match include and not -# match exclude to be included. -# --collector.systemd.unit-include=".+" -# Regexp of systemd units to include. Units must both match include and not -# match exclude to be included. -# --collector.tapestats -# Enable the tapestats collector (default: enabled). -# --collector.tapestats.ignored-devices="^$" -# Regexp of devices to ignore for tapestats. -# --collector.tcpstat -# Enable the tcpstat collector (default: disabled). -# --collector.textfile -# Enable the textfile collector (default: enabled). -# --collector.textfile.directory="/var/lib/prometheus/node-exporter" -# Directory to read text files with metrics from. -# --collector.thermal_zone -# Enable the thermal_zone collector (default: enabled). -# --collector.time -# Enable the time collector (default: enabled). -# --collector.timex -# Enable the timex collector (default: enabled). -# --collector.udp_queues -# Enable the udp_queues collector (default: enabled). -# --collector.uname -# Enable the uname collector (default: enabled). -# --collector.vmstat -# Enable the vmstat collector (default: enabled). -# --collector.vmstat.fields="^(oom_kill|pgpg|pswp|pg.*fault).*" -# Regexp of fields to return for vmstat collector. -# --collector.wifi -# Enable the wifi collector (default: disabled). -# --collector.wifi.fixtures="" -# Test fixtures to use for wifi collector metrics. -# --collector.xfs -# Enable the xfs collector (default: enabled). -# --collector.zfs -# Enable the zfs collector (default: enabled). -# --collector.zoneinfo -# Enable the zoneinfo collector (default: disabled). -# --log.format=logfmt -# Output format of log messages. One of: [logfmt, json]. -# --log.level=info -# Only log messages with the given severity or above. One of: [debug, info, -# warn, error]. -# --path.procfs="/proc" -# Procfs mountpoint. -# --path.rootfs="/" -# Rootfs mountpoint. -# --path.sysfs="/sys" -# Sysfs mountpoint. -# --web.config="" -# [EXPERIMENTAL] Path to config yaml file that can enable TLS or -# authentication. -# --web.disable-exporter-metrics -# Exclude metrics about the exporter itself (promhttp_*, process_*, go_*). -# --web.listen-address=":9100" -# Address on which to expose metrics and web interface. -# --web.max-requests=40 -# Maximum number of parallel scrape requests. Use 0 to disable. -# --web.telemetry-path="/metrics" -# Path under which to expose metrics. diff --git a/SPECS/prometheus-node-exporter/prometheus-node-exporter.logrotate b/SPECS/prometheus-node-exporter/prometheus-node-exporter.logrotate deleted file mode 100644 index f8becf80b7..0000000000 --- a/SPECS/prometheus-node-exporter/prometheus-node-exporter.logrotate +++ /dev/null @@ -1,9 +0,0 @@ -/var/log/prometheus/prometheus-node-exporter.log { - weekly - rotate 10 - copytruncate - compress - delaycompress - notifempty - missingok -} diff --git a/SPECS/prometheus-node-exporter/prometheus-node-exporter.service b/SPECS/prometheus-node-exporter/prometheus-node-exporter.service deleted file mode 100644 index 404177be35..0000000000 --- a/SPECS/prometheus-node-exporter/prometheus-node-exporter.service +++ /dev/null @@ -1,17 +0,0 @@ -[Unit] -Description=Prometheus exporter for machine metrics -Documentation=https://github.com/prometheus/node_exporter -Requires=network-online.target -After=network-online.target - -[Service] -Restart=on-failure -User=prometheus -EnvironmentFile=/etc/default/prometheus-node-exporter -ExecStart=/usr/bin/prometheus-node-exporter $ARGS -ExecReload=/bin/kill -HUP $MAINPID -TimeoutStopSec=20s -SendSIGKILL=no - -[Install] -WantedBy=multi-user.target diff --git a/SPECS/prometheus-node-exporter/prometheus-node-exporter.signatures.json b/SPECS/prometheus-node-exporter/prometheus-node-exporter.signatures.json deleted file mode 100644 index 2a4b58db0a..0000000000 --- a/SPECS/prometheus-node-exporter/prometheus-node-exporter.signatures.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Signatures": { - "prometheus-node-exporter-1.7.0-vendor.tar.gz": "2179316a78a2f9fd1801fbc6a6f2fb19bf38674f3d793bf15f8ea836b31ec6ca", - "prometheus-node-exporter.conf": "af398945dffd2cf49225accf3d6ec0a0161d61906328b82a2f473deda073667a", - "prometheus-node-exporter.logrotate": "ee082283a512e75bbfa365e7e60eba0903ac8082962c96108e53ccfe8afc7b2b", - "prometheus-node-exporter.service": "351a6bf987a56993deca6e57493fcc235c3abef56ed2749153fdba4d2fa0faf6", - "prometheus-node-exporter.sysusers": "bbbfc96aed1bf0a4268f3d21c1f8982c222ccd4e817074599495f24c999d6557", - "prometheus-node-exporter-1.7.0.tar.gz": "5da1dcc3608db663fc1949042c6f3ec29184c9414c37c0e2bdfe9b19fd5d75c7" - } -} diff --git a/SPECS/prometheus-node-exporter/prometheus-node-exporter.spec b/SPECS/prometheus-node-exporter/prometheus-node-exporter.spec deleted file mode 100644 index 11db71edeb..0000000000 --- a/SPECS/prometheus-node-exporter/prometheus-node-exporter.spec +++ /dev/null @@ -1,194 +0,0 @@ -%global build_date $(date +"%%Y%%m%%d-%%T") -%global debug_package %{nil} -%global go_version %(go version | sed -E "s/go version go(\\S+).*/\\1/") - -Summary: Exporter for machine metrics -Name: prometheus-node-exporter -Version: 1.7.0 -Release: 4%{?dist} -# Upstream license specification: Apache-2.0 -License: ASL 2.0 AND MIT -Vendor: Microsoft Corporation -Distribution: Azure Linux -URL: https://github.com/prometheus/node_exporter -Source0: https://github.com/prometheus/node_exporter/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -# Below is a manually created tarball, no download link. -# We're using vendored Go modules from this tarball, since network is disabled during build time. -# How to re-build this file: -# 1. wget https://github.com/prometheus/node_exporter/archive/refs/tags/v%{version}.tar.gz -O %%{name}-%%{version}.tar.gz -# 2. tar -xf %%{name}-%%{version}.tar.gz -# 3. cd %%{name}-%%{version} -# 4. Apply patches from the spec (may change go dependencies). -# 5. go mod vendor -# 6. tar --sort=name \ -# --mtime="2021-04-26 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cf %%{name}-%%{version}-vendor.tar.gz vendor -# -Source1: %{name}-%{version}-vendor.tar.gz -Source2: %{name}.sysusers -Source3: %{name}.service -Source4: %{name}.conf -Source5: %{name}.logrotate -# Replace defaults paths for config files -Patch0: defaults-paths.patch -Patch1: CVE-2023-45288.patch -Patch2: CVE-2025-22870.patch - -BuildRequires: golang -BuildRequires: systemd-rpm-macros - -Requires(pre): shadow-utils - -%description -Prometheus exporter for hardware and OS metrics exposed by *NIX kernels, written -in Go with pluggable metric collectors. - -%prep -%autosetup -n node_exporter-%{version} -p1 -a1 - -%build -export BUILDTAGS="netgo osusergo static_build" -LDFLAGS="-X github.com/prometheus/common/version.Version=%{version} \ - -X github.com/prometheus/common/version.Revision=%{release} \ - -X github.com/prometheus/common/version.Branch=tarball \ - -X github.com/prometheus/common/version.BuildDate=%{build_date} \ - -X github.com/ncabatoff/process-exporter/version.GoVersion=%{go_version}" -go build -ldflags "$LDFLAGS" -mod=vendor -v -a -tags "$BUILDTAGS" -o bin/node_exporter - -%install -install -m 0755 -vd %{buildroot}%{_bindir} -install -m 0755 -vp bin/* %{buildroot}%{_bindir}/ -mv %{buildroot}%{_bindir}/node_exporter %{buildroot}%{_bindir}/%{name} -ln -s %{name} %{buildroot}%{_bindir}/node_exporter - -install -Dpm0644 %{SOURCE2} %{buildroot}%{_sysusersdir}/%{name}.conf -install -Dpm0644 %{SOURCE3} %{buildroot}%{_unitdir}/%{name}.service -install -Dpm0644 %{SOURCE4} %{buildroot}%{_sysconfdir}/default/%{name} -install -Dpm0644 example-rules.yml %{buildroot}%{_datadir}/prometheus/node-exporter/example-rules.yml -install -Dpm0644 %{SOURCE5} %{buildroot}%{_sysconfdir}/logrotate.d/%{name} -mkdir -vp %{buildroot}%{_sharedstatedir}/prometheus/node-exporter - -%check -bin/node_exporter --help && make test - -%pre -# Steps extracted from Fedora's /usr/lib/rpm/sysusers.generate-pre.sh script. -# The script and the RPM macro 'sysusers_create_compat' calling it are not available -# in Mariner's 'systemd-rpm-macros' package. -# Input file for the script was %%{SOURCE2}. -getent group 'prometheus' >/dev/null || groupadd -r 'prometheus' -getent passwd 'prometheus' >/dev/null || useradd -r -g 'prometheus' -d '%{_sharedstatedir}/prometheus' -s '%{_sbindir}/nologin' -c 'Prometheus user account' 'prometheus' - -%post -%systemd_post %{name}.service - -%preun -%systemd_preun %{name}.service - -%postun -%systemd_postun_with_restart %{name}.service - -%files -%license LICENSE NOTICE -%doc docs examples CHANGELOG.md CODE_OF_CONDUCT.md CONTRIBUTING.md -%doc MAINTAINERS.md SECURITY.md README.md -%config(noreplace) %{_sysconfdir}/default/%{name} -%config(noreplace) %{_sysconfdir}/logrotate.d/%{name} -%{_bindir}/* -%{_sysusersdir}/%{name}.conf -%{_unitdir}/%{name}.service -%{_datadir}/prometheus/node-exporter/example-rules.yml -%dir %attr(0755,prometheus,prometheus) %{_sharedstatedir}/prometheus -%dir %attr(0755,prometheus,prometheus) %{_sharedstatedir}/prometheus/node-exporter - -%changelog -* Fri May 30 2025 Ranjan Dutta - 1.7.0-4 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22870 - -* Fri Mar 21 2025 Anuj Mittal - 1.7.0-3 -- Bump Release to rebuild - -* Fri Feb 14 2025 Kanishk Bansal - 1.7.0-2 -- Address CVE-2023-45288 - -* Wed Jan 10 2024 CBL-Mariner Servicing Account - 1.7.0-1 -- Auto-upgrade to 1.7.0 - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 1.3.1-21 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 1.3.1-20 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.3.1-19 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 1.3.1-18 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 1.3.1-17 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.3.1-16 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 1.3.1-15 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 1.3.1-14 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 1.3.1-13 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 1.3.1-12 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 1.3.1-11 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 1.3.1-10 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 1.3.1-9 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 1.3.1-8 -- Bump release to rebuild with golang 1.18.3 - -* Thu Mar 31 2022 Matthew Torr - 1.3.1-7 -- Build executable, not ar archive. - -* Mon Jan 31 2022 Pawel Winogrodzki - 1.3.1-6 -- Initial CBL-Mariner import from Fedora 36 (license: MIT). -- License verified. - -* Thu Jan 20 2022 Fedora Release Engineering 1.3.1-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Sun Jan 16 2022 Robert-André Mauchin 1.3.1-4 -- Add logrotate file - -* Sat Jan 15 2022 Robert-André Mauchin 1.3.1-3 -- Add LDFLAGS - -* Fri Jan 14 2022 Robert-André Mauchin 1.3.1-2 -- Fix home directory permissions - -* Fri Jan 14 2022 Robert-André Mauchin 1.3.1-1 -- Update to 1.3.1 Close: rhbz#2024811 Close: rhbz#2039257 - -* Thu Aug 12 2021 Robert-André Mauchin 1.2.2-1 -- Update to 1.2.2 Close: rhbz#1945422 - -* Thu Jul 22 2021 Fedora Release Engineering - 1.1.1-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Sun Mar 28 18:14:35 CEST 2021 Robert-André Mauchin - 1.1.1-2 -- Fix binary location - -* Wed Feb 17 22:48:22 CET 2021 Robert-André Mauchin - 1.1.1-1 -- Initial package diff --git a/SPECS/prometheus-node-exporter/prometheus-node-exporter.sysusers b/SPECS/prometheus-node-exporter/prometheus-node-exporter.sysusers deleted file mode 100644 index 98d9468ea7..0000000000 --- a/SPECS/prometheus-node-exporter/prometheus-node-exporter.sysusers +++ /dev/null @@ -1,2 +0,0 @@ -#Type Name ID GECOS Home directory Shell -u prometheus - "Prometheus user account" /var/lib/prometheus /sbin/nologin diff --git a/SPECS/prometheus-process-exporter/01-fix-RSS-test-on-non4K-pagesize-systems.patch b/SPECS/prometheus-process-exporter/01-fix-RSS-test-on-non4K-pagesize-systems.patch deleted file mode 100644 index 0ae220ec25..0000000000 --- a/SPECS/prometheus-process-exporter/01-fix-RSS-test-on-non4K-pagesize-systems.patch +++ /dev/null @@ -1,20 +0,0 @@ -Description: Fix TestReadFixture on non 4K page size arches - TestReadFixture checks fixtures/14804/stat RSS which is a number of page - and compares it to hardcoded expected value 0x7b1000 (= 1969 * 4096). - Instead of using a 4k expected value, use system's pagesize like it's - done in proc_stat.go . -Author: Frédéric Bonnard -Forwarded: no ---- -This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ ---- a/proc/read_test.go -+++ b/proc/read_test.go -@@ -83,7 +83,7 @@ - CtxSwitchNonvoluntary: 6, - }, - Memory: Memory{ -- ResidentBytes: 0x7b1000, -+ ResidentBytes: uint64(0x7b1 * os.Getpagesize()), - VirtualBytes: 0x1061000, - VmSwapBytes: 0x2800, - }, diff --git a/SPECS/prometheus-process-exporter/03-disable-fakescraper.patch b/SPECS/prometheus-process-exporter/03-disable-fakescraper.patch deleted file mode 100644 index 3851fd397a..0000000000 --- a/SPECS/prometheus-process-exporter/03-disable-fakescraper.patch +++ /dev/null @@ -1,48 +0,0 @@ -Description: Disable once-to-stdout-delay command flag - This flag would require vendoring / patching in another insignificant package, - so instead we simply disable it for now. -Author: Daniel Swarbrick -Forwarded: not-needed ---- - cmd/process-exporter/main.go | 15 --------------- - 1 file changed, 15 deletions(-) - ---- a/cmd/process-exporter/main.go -+++ b/cmd/process-exporter/main.go -@@ -9,9 +9,7 @@ import ( - "os" - "regexp" - "strings" -- "time" - -- "github.com/ncabatoff/fakescraper" - common "github.com/ncabatoff/process-exporter" - "github.com/ncabatoff/process-exporter/collector" - "github.com/ncabatoff/process-exporter/config" -@@ -150,8 +148,6 @@ func main() { - "Address on which to expose metrics and web interface.") - metricsPath = flag.String("web.telemetry-path", "/metrics", - "Path under which to expose metrics.") -- onceToStdoutDelay = flag.Duration("once-to-stdout-delay", 0, -- "Don't bind, just wait this much time, print the metrics once to stdout, and exit") - procNames = flag.String("procnames", "", - "comma-separated list of process names to monitor") - procfsPath = flag.String("procfs", "/proc", -@@ -248,17 +244,6 @@ func main() { - - prometheus.MustRegister(pc) - -- if *onceToStdoutDelay != 0 { -- // We throw away the first result because that first collection primes the pump, and -- // otherwise we won't see our counter metrics. This is specific to the implementation -- // of NamedProcessCollector.Collect(). -- fscraper := fakescraper.NewFakeScraper() -- fscraper.Scrape() -- time.Sleep(*onceToStdoutDelay) -- fmt.Print(fscraper.Scrape()) -- return -- } -- - http.Handle(*metricsPath, promhttp.Handler()) - - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { diff --git a/SPECS/prometheus-process-exporter/CVE-2025-22870.patch b/SPECS/prometheus-process-exporter/CVE-2025-22870.patch deleted file mode 100644 index 4cb09d667d..0000000000 --- a/SPECS/prometheus-process-exporter/CVE-2025-22870.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 754923e73296ecf844bc1416afd5c88c85db155d Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Tue, 8 Apr 2025 18:20:47 +0000 -Subject: [PATCH] Fix CVE CVE-2025-22870 in prometheus-process-exporter - -Upstream Patch Reference: https://github.com/golang/go/commit/334de7982f8ec959c74470dd709ceedfd6dbd50a.patch ---- - vendor/golang.org/x/net/http/httpproxy/proxy.go | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/http/httpproxy/proxy.go b/vendor/golang.org/x/net/http/httpproxy/proxy.go -index 6404aaf..d89c257 100644 ---- a/vendor/golang.org/x/net/http/httpproxy/proxy.go -+++ b/vendor/golang.org/x/net/http/httpproxy/proxy.go -@@ -14,6 +14,7 @@ import ( - "errors" - "fmt" - "net" -+ "net/netip" - "net/url" - "os" - "strings" -@@ -177,8 +178,10 @@ func (cfg *config) useProxy(addr string) bool { - if host == "localhost" { - return false - } -- ip := net.ParseIP(host) -- if ip != nil { -+ nip, err := netip.ParseAddr(host) -+ var ip net.IP -+ if err == nil { -+ ip = net.IP(nip.AsSlice()) - if ip.IsLoopback() { - return false - } -@@ -360,6 +363,9 @@ type domainMatch struct { - } - - func (m domainMatch) match(host, port string, ip net.IP) bool { -+ if ip != nil { -+ return false -+ } - if strings.HasSuffix(host, m.host) || (m.matchHost && host == m.host[1:]) { - return m.port == "" || m.port == port - } --- -2.40.4 - diff --git a/SPECS/prometheus-process-exporter/prometheus-process-exporter.conf b/SPECS/prometheus-process-exporter/prometheus-process-exporter.conf deleted file mode 100644 index e52fbc904e..0000000000 --- a/SPECS/prometheus-process-exporter/prometheus-process-exporter.conf +++ /dev/null @@ -1,35 +0,0 @@ -# Set the command-line arguments to pass to the server. -# Due to shell escaping, to pass backslashes for regexes, you need to double -# them (\\d for \d). If running under systemd, you need to double them again -# (\\\\d to mean \d), and escape newlines too. -ARGS="" - -# prometheus-process-exporter supports the following options: -# -# -children -# If a proc is tracked, track with it any children that aren't part of their -# own group (default true). -# -config.path string -# Path to YAML config file. -# -debug -# Log debugging information to stdout. -# -gather-smaps -# Gather metrics from smaps file, which contains proportional resident -# memory size (default true). -# -namemapping string -# Comma-separated list, alternating process name and capturing regex to -# apply to cmdline. -# -procfs string -# Path to read proc data from (default "/proc"). -# -procnames string -# Comma-separated list of process names to monitor. -# -recheck -# Recheck process names on each scrape. -# -threads -# Report on per-threadname metrics as well (default true). -# -web.config.file string -# Path to YAML web config file. -# -web.listen-address string -# Address on which to expose metrics and web interface. (default ":9256"). -# -web.telemetry-path string -# Path under which to expose metrics. (default "/metrics"). diff --git a/SPECS/prometheus-process-exporter/prometheus-process-exporter.logrotate b/SPECS/prometheus-process-exporter/prometheus-process-exporter.logrotate deleted file mode 100644 index 6d451fec9d..0000000000 --- a/SPECS/prometheus-process-exporter/prometheus-process-exporter.logrotate +++ /dev/null @@ -1,10 +0,0 @@ -/var/log/prometheus/prometheus-process-exporter.log { - weekly - rotate 10 - copytruncate - compress - delaycompress - notifempty - missingok -} - diff --git a/SPECS/prometheus-process-exporter/prometheus-process-exporter.service b/SPECS/prometheus-process-exporter/prometheus-process-exporter.service deleted file mode 100644 index 3e158efedc..0000000000 --- a/SPECS/prometheus-process-exporter/prometheus-process-exporter.service +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=Prometheus exporter that mines /proc to report on selected processes -Documentation=https://github.com/ncabatoff/process-exporter man:prometheus-process-exporter(1) -After=network.target - -[Service] -Restart=on-failure -User=prometheus -EnvironmentFile=/etc/default/prometheus-process-exporter -ExecStart=/usr/bin/prometheus-process-exporter $ARGS - -[Install] -WantedBy=multi-user.target diff --git a/SPECS/prometheus-process-exporter/prometheus-process-exporter.signatures.json b/SPECS/prometheus-process-exporter/prometheus-process-exporter.signatures.json deleted file mode 100644 index b46315ebce..0000000000 --- a/SPECS/prometheus-process-exporter/prometheus-process-exporter.signatures.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Signatures": { - "prometheus-process-exporter-0.8.2-vendor.tar.gz": "c393be7c6002b3bf97664206d1222dde1c354bd031db668621cf6c185517f7f0", - "prometheus-process-exporter.conf": "ef9dc718b103fee1bcb31c721478164318aba1692eaabdb3ea2df49e43caa7cd", - "prometheus-process-exporter.logrotate": "3a0a2225dacc04968b74b67ae9dc5c273a4d9bdaa358396b322b7093e873f612", - "prometheus-process-exporter.service": "12e5011db5c1b66926a66e7506bd039b6d7ca7ebc72e685cedf5783299adf6bd", - "prometheus-process-exporter-0.8.2.tar.gz": "fbb51f1d64d63f8db3970e32fe8e3b114272b07f3b9ac0a703771a0fbbc72c8e" - } -} diff --git a/SPECS/prometheus-process-exporter/prometheus-process-exporter.spec b/SPECS/prometheus-process-exporter/prometheus-process-exporter.spec deleted file mode 100644 index 2b22ca1d69..0000000000 --- a/SPECS/prometheus-process-exporter/prometheus-process-exporter.spec +++ /dev/null @@ -1,156 +0,0 @@ -%global build_date $(date +"%%Y%%m%%d-%%T") -%global debug_package %{nil} -%global go_version %(go version | sed -E "s/go version go(\\S+).*/\\1/") - -Summary: Prometheus exporter exposing process metrics from procfs -Name: prometheus-process-exporter -Version: 0.8.2 -Release: 4%{?dist} -License: MIT -Vendor: Microsoft Corporation -Distribution: Azure Linux -URL: https://github.com/ncabatoff/process-exporter -Source0: https://github.com/ncabatoff/process-exporter/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -# Below is a manually created tarball, no download link. -# We're using vendored Go modules from this tarball, since network is disabled during build time. -# How to re-build this file: -# 1. wget https://github.com/ncabatoff/process-exporter/archive/refs/tags/v%%{version}.tar.gz -O %%{name}-%%{version}.tar.gz -# 2. tar -xf %%{name}-%%{version}.tar.gz -# 3. cd %%{name}-%%{version} -# 4. go mod vendor -# 5. tar --sort=name \ -# --mtime="2021-04-26 00:00Z" \ -# --owner=0 --group=0 --numeric-owner \ -# --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ -# -cf %%{name}-%%{version}-vendor.tar.gz vendor -# -Source1: %{name}-%{version}-vendor.tar.gz -Source2: %{name}.service -Source3: %{name}.logrotate -Source4: %{name}.conf -Patch0: 01-fix-RSS-test-on-non4K-pagesize-systems.patch -Patch1: 03-disable-fakescraper.patch -Patch2: CVE-2025-22870.patch - -BuildRequires: golang < 1.25 -BuildRequires: systemd-rpm-macros - -Requires(pre): shadow-utils - -%description -Prometheus exporter that exposes process metrics from procfs. - -Some apps are impractical to instrument directly, either because you don't -control the code or they're written in a language that isn't easy to -instrument with Prometheus. This exporter solves that issue by mining -process metrics from procfs. - -%prep -%autosetup -n process-exporter-%{version} -p1 -a1 - -%build -LDFLAGS="-X github.com/ncabatoff/process-exporter/version.Version=%{version} \ - -X github.com/ncabatoff/process-exporter/version.Revision=%{release} \ - -X github.com/ncabatoff/process-exporter/version.Branch=tarball \ - -X github.com/ncabatoff/process-exporter/version.BuildDate=%{build_date} \ - -X github.com/ncabatoff/process-exporter/version.GoVersion=%{go_version}" - -# Modified "build" target from Makefile. -CGO_ENABLED=0 go build -ldflags "$LDFLAGS" -mod=vendor -v -a -tags netgo -o process-exporter ./cmd/process-exporter - -%install -install -m 0755 -vd %{buildroot}%{_bindir} -install -m 0755 -vp process-exporter %{buildroot}%{_bindir}/%{name} -ln -s %{name} %{buildroot}%{_bindir}/process-exporter - -install -Dpm0644 %{SOURCE2} %{buildroot}%{_unitdir}/%{name}.service -install -Dpm0644 %{SOURCE3} %{buildroot}%{_sysconfdir}/logrotate.d/%{name} -install -Dpm0644 %{SOURCE4} %{buildroot}%{_sysconfdir}/default/%{name} - -mkdir -vp %{buildroot}%{_sharedstatedir}/prometheus - -%check -make test - -%pre -# Same user/group creation steps as for "prometheus-node-exporter". -getent group 'prometheus' >/dev/null || groupadd -r 'prometheus' -getent passwd 'prometheus' >/dev/null || useradd -r -g 'prometheus' -d '%{_sharedstatedir}/prometheus' -s '%{_sbindir}/nologin' -c 'Prometheus user account' 'prometheus' - -%post -%systemd_post %{name}.service - -%preun -%systemd_preun %{name}.service - -%postun -%systemd_postun_with_restart %{name}.service - -%files -%license LICENSE -%config(noreplace) %{_sysconfdir}/default/%{name} -%config(noreplace) %{_sysconfdir}/logrotate.d/%{name} -%{_bindir}/*process-exporter -%{_unitdir}/%{name}.service -%dir %attr(0755,prometheus,prometheus) %{_sharedstatedir}/prometheus - -%changelog -* Fri Oct 3 2025 Lee Chee Yang - 0.8.2-4 -- merge from Azure Linux 3.0.20250910-3.0 -- Set BR for golang to < 1.25 - -* Fri May 30 2025 Ranjan Dutta - 0.8.2-3 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22870 - -* Fri Mar 21 2025 Anuj Mittal - 0.8.2-2 -- Bump Release to rebuild - -* Fri Jul 12 2024 CBL-Mariner Servicing Account - 0.8.2-1 -- Auto-upgrade to 0.8.2 - CVE-2022-46146, CVE-2022-21698, CVE-2021-44716 - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 0.7.10-15 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 0.7.10-14 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 0.7.10-13 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 0.7.10-12 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 0.7.10-11 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 0.7.10-10 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 0.7.10-9 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 0.7.10-8 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 0.7.10-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 0.7.10-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 0.7.10-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 0.7.10-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 0.7.10-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 0.7.10-2 -- Bump release to rebuild with golang 1.18.3 - -* Tue Feb 01 2022 Pawel Winogrodzki - 0.7.10-1 -- Initial CBL-Mariner import from Debian source package (license: MIT). -- License verified. diff --git a/SPECS/pyserial/pyserial.signatures.json b/SPECS/pyserial/pyserial.signatures.json deleted file mode 100644 index 3c5afae3d2..0000000000 --- a/SPECS/pyserial/pyserial.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "pyserial-3.5.tar.gz": "3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb" - } -} \ No newline at end of file diff --git a/SPECS/pyserial/pyserial.spec b/SPECS/pyserial/pyserial.spec deleted file mode 100644 index d953ed05a5..0000000000 --- a/SPECS/pyserial/pyserial.spec +++ /dev/null @@ -1,209 +0,0 @@ -Summary: Python serial port access library -Name: pyserial -Version: 3.5 -Release: 11%{?dist} -License: BSD-3-Clause -Vendor: Intel Corporation -Distribution: Edge Microvisor Toolkit -URL: http://pypi.python.org/pypi/pyserial -Source0: %pypi_source -BuildRequires: python3-devel -BuildRequires: python3-setuptools -BuildArch: noarch - -%global _description\ -This module encapsulates the access for the serial port. It provides backends\ -for standard Python running on Windows, Linux, BSD (possibly any POSIX\ -compliant system) and Jython. The module named "serial" automatically selects\ -the appropriate backend. - -%description %_description - - -%package -n python3-pyserial -Summary: %{summary} -Conflicts: python2-pyserial < 3.4-6 - -%description -n python3-pyserial %_description - - -%prep -export UNZIP="-aa" -%setup -q - -# Python 3.13+ has removed unittest.findTestCases() -# Reported upstream: https://github.com/pyserial/pyserial/issues/754 -sed -i 's/unittest.findTestCases(module)/unittest.TestLoader().loadTestsFromModule(module)/' test/run_all_tests.py - -%build -%py3_build - - -%install -%py3_install - - -%check -PYTHONPATH=%{buildroot}/%{python3_sitelib} %{python3} test/run_all_tests.py - - -%files -n python3-pyserial -%doc LICENSE.txt CHANGES.rst README.rst examples -%{python3_sitelib}/serial -%{python3_sitelib}/%{name}-%{version}-py%{python3_version}.egg-info -%{_bindir}/pyserial-miniterm -%{_bindir}/pyserial-ports - -%changelog -* Tue Mar 18 2025 Ranjan Dutta - 3.5-11 -- Bump version for merge AZL tag: 3.0.20250311-3.0 - -* Thu Dec 19 2024 Mun Chun Yep - 3.4-10 -- Revert vendor and distribution tag. - -* Fri Oct 11 2024 Naveen Saini - 3.4-9 -- Package promoted from SPECS-EXTENDED to SPECS. - -* Fri Oct 15 2021 Pawel Winogrodzki - 3.4-8 -- Initial CBL-Mariner import from Fedora 32 (license: MIT). - -* Thu Jan 30 2020 Fedora Release Engineering - 3.4-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Fri Nov 15 2019 Miro Hrončok - 3.4-6 -- Subpackage python2-pyserial has been removed - See https://fedoraproject.org/wiki/Changes/Mass_Python_2_Package_Removal - -* Thu Oct 03 2019 Miro Hrončok - 3.4-5 -- Rebuilt for Python 3.8.0rc1 (#1748018) - -* Fri Aug 16 2019 Miro Hrončok - 3.4-4 -- Rebuilt for Python 3.8 - -* Fri Jul 26 2019 Fedora Release Engineering - 3.4-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Sat Feb 02 2019 Fedora Release Engineering - 3.4-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Tue Oct 16 2018 Eric Smith - 3.4-1 -- Update to latest upstream release. -- Update Source0 and URL to use Pypi. - -* Tue Jul 17 2018 Miro Hrončok - 3.1.1-10 -- Update Python macros to new packaging standards - (See https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_package) - -* Fri Jul 13 2018 Fedora Release Engineering - 3.1.1-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Fri Jun 15 2018 Miro Hrončok - 3.1.1-8 -- Rebuilt for Python 3.7 - -* Wed Feb 14 2018 Iryna Shcherbina - 3.1.1-7 -- Update Python 2 dependency declarations to new packaging standards - (See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3) - -* Fri Feb 09 2018 Fedora Release Engineering - 3.1.1-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Sat Aug 19 2017 Zbigniew Jędrzejewski-Szmek - 3.1.1-5 -- Python 2 binary package renamed to python2-pyserial - See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3 - -* Thu Jul 27 2017 Fedora Release Engineering - 3.1.1-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Sat Feb 11 2017 Fedora Release Engineering - 3.1.1-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Fri Dec 09 2016 Charalampos Stratakis - 3.1.1-2 -- Rebuild for Python 3.6 - -* Mon Aug 1 2016 Paul Komkoff 3.1.1-1 -- new upstream version - -* Tue Jul 19 2016 Fedora Release Engineering - 2.7-6 -- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages - -* Thu Feb 04 2016 Fedora Release Engineering - 2.7-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Tue Nov 10 2015 Fedora Release Engineering - 2.7-4 -- Rebuilt for https://fedoraproject.org/wiki/Changes/python3.5 - -* Mon Nov 02 2015 Michal Cyprian - 2.7-3 -- Resolve python3 dependency problem, make miniterm.py python2 script, add - python3 version of the script - -* Thu Jun 18 2015 Fedora Release Engineering - 2.7-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Sun Mar 08 2015 Paul Komkoff 2.7-1 -- new upstream version - -* Sat Jun 07 2014 Fedora Release Engineering - 2.6-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Tue May 27 2014 Kalev Lember - 2.6-8 -- Rebuilt for https://fedoraproject.org/wiki/Changes/Python_3.4 - -* Sat Sep 07 2013 Till Maas - 2.6-7 -- Add python3 package - -* Sat Sep 07 2013 Paul P. Komkoff - 2.6-6 -- patched to allow arbitrary speeds bz#982368 - -* Sun Aug 04 2013 Fedora Release Engineering - 2.6-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Thu Feb 14 2013 Fedora Release Engineering - 2.6-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild - -* Sat Jul 21 2012 Fedora Release Engineering - 2.6-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Sat Jan 14 2012 Fedora Release Engineering - 2.6-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild - -* Mon Nov 28 2011 Paul P. Komkoff Jr - 2.6-1 -- new upstream version. - -* Tue Feb 08 2011 Fedora Release Engineering - 2.5-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Fri Nov 19 2010 Paul P. Komkoff Jr - 2.5-1 -- new upstream version - -* Wed Jul 21 2010 David Malcolm - 2.4-2 -- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild - -* Sun Oct 18 2009 Paul P Komkoff Jr - 2.4-1 -- new upstream version - -* Sun Jul 26 2009 Fedora Release Engineering - 2.2-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Thu Feb 26 2009 Fedora Release Engineering - 2.2-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - -* Sat Nov 29 2008 Ignacio Vazquez-Abrams - 2.2-7 -- Rebuild for Python 2.6 - -* Fri Aug 29 2008 Tom "spot" Callaway - 2.2-6 -- fix license tag - -* Tue Dec 12 2006 Paul P. Komkoff Jr -- rebuilt - -* Mon Nov 6 2006 Paul P Komkoff Jr - 2.2-4 -- remove "export libdirname" - -* Tue Oct 24 2006 Paul P Komkoff Jr - 2.2-3 -- Minor specfile fixes - -* Sat Oct 14 2006 Paul P Komkoff Jr - 2.2-2 -- Minor specfile fixes - -* Tue May 9 2006 Paul P Komkoff Jr - 2.2-1 -- Fedora Extras submission diff --git a/SPECS/python-dmidecode/python-dmidecode-rhbz2154949.patch b/SPECS/python-dmidecode/python-dmidecode-rhbz2154949.patch deleted file mode 100644 index c26a2abe9d..0000000000 --- a/SPECS/python-dmidecode/python-dmidecode-rhbz2154949.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 2d6530941682595b26067a8b679ec2eb3aceae54 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= -Date: Tue, 17 May 2022 16:00:47 +0200 -Subject: [PATCH 1/3] Make the code future-proof against removal of distutils - module. - ---- - src/setup_common.py | 14 +++++++++++--- - 1 file changed, 11 insertions(+), 3 deletions(-) - -diff --git a/src/setup_common.py b/src/setup_common.py -index aec1f9b..3fb9086 100644 ---- a/src/setup_common.py -+++ b/src/setup_common.py -@@ -30,7 +30,12 @@ - if sys.version_info[0] < 3: - import commands as subprocess - from os import path as os_path --from distutils.sysconfig import get_python_lib -+try: -+ from distutils.sysconfig import get_python_lib, get_config_var -+ __python_lib = get_python_lib(1) -+except ImportError: -+ from sysconfig import get_config_var, get_path -+ __python_lib = get_path('platlib') - - # libxml2 - C flags - def libxml2_include(incdir): -@@ -50,7 +55,7 @@ def libxml2_include(incdir): - - # libxml2 - library flags - def libxml2_lib(libdir, libs): -- libdir.append(get_python_lib(1)) -+ libdir.append(__python_lib) - if os_path.exists("/etc/debian_version"): #. XXX: Debian Workaround... - libdir.append("/usr/lib/pymodules/python%d.%d"%sys.version_info[0:2]) - -From 7c0788b5c5ed7d1c79f70a74047abab161dca13a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= -Date: Mon, 17 Oct 2022 19:59:52 +0200 -Subject: [PATCH 2/3] Don't be too complicated. - -There is actually no reason to use distutils.sysconfig at all, -plain sysconfig works even on 2.7. ---- - Makefile | 3 ++- - src/setup_common.py | 9 ++------- - 2 files changed, 4 insertions(+), 8 deletions(-) - -diff --git a/src/setup_common.py b/src/setup_common.py -index 3fb9086..97ece95 100644 ---- a/src/setup_common.py -+++ b/src/setup_common.py -@@ -30,12 +30,7 @@ - if sys.version_info[0] < 3: - import commands as subprocess - from os import path as os_path --try: -- from distutils.sysconfig import get_python_lib, get_config_var -- __python_lib = get_python_lib(1) --except ImportError: -- from sysconfig import get_config_var, get_path -- __python_lib = get_path('platlib') -+from sysconfig import get_config_var, get_path - - # libxml2 - C flags - def libxml2_include(incdir): -@@ -55,7 +50,7 @@ def libxml2_include(incdir): - - # libxml2 - library flags - def libxml2_lib(libdir, libs): -- libdir.append(__python_lib) -+ libdir.append(get_path('platlib')) - if os_path.exists("/etc/debian_version"): #. XXX: Debian Workaround... - libdir.append("/usr/lib/pymodules/python%d.%d"%sys.version_info[0:2]) - - -From 860c730309366d6062c410ee975a2fc159452dc6 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= -Date: Wed, 26 Oct 2022 17:39:47 +0200 -Subject: [PATCH 3/3] Make the discovery of the build .so file more robust. - -Different versions of Python apparently generate different -directory names, there doesn't seem to be any more reliable -method of the .so file discovery than brutal force of the shell -find command. ---- - Makefile | 12 +++++------- - 1 file changed, 5 insertions(+), 7 deletions(-) - ---- a/Makefile.backup 2022-11-17 06:51:28.000000000 +0100 -+++ b/Makefile 2023-05-20 12:56:07.590575539 +0200 -@@ -44,12 +44,11 @@ - PY_VER := $(shell $(PY_BIN) -c 'import sys; print("%d.%d"%sys.version_info[0:2])') - PY_MV := $(shell echo $(PY_VER) | cut -b 1) - PY := python$(PY_VER) --SO_PATH := build/lib.linux-$(shell uname -m)-$(PY_VER) - ifeq ($(PY_MV),2) -- SO := $(SO_PATH)/dmidecodemod.so -+ SOLIB := dmidecodemod.so - else - SOABI := $(shell $(PY_BIN) -c 'import sysconfig; print(sysconfig.get_config_var("SOABI"))') -- SO := $(SO_PATH)/dmidecodemod.$(SOABI).so -+ SOLIB := dmidecodemod.$(SOABI).so - endif - SHELL := /bin/bash - -@@ -59,13 +58,13 @@ - all : build dmidump - - build: $(PY)-dmidecodemod.so --$(PY)-dmidecodemod.so: $(SO) -- cp $< $@ --$(SO): -+ -+$(PY)-dmidecodemod.so: - $(PY) src/setup.py build -+ cp $$(find build -name $(SOLIB)) $@ - - dmidump : src/util.o src/efi.o src/dmilog.o -- $(CC) -o $@ src/dmidump.c $^ -g -Wall -D_DMIDUMP_MAIN_ -+ $(CC) -o $@ src/dmidump.c $^ ${CFLAGS} -D_DMIDUMP_MAIN_ - - install: - $(PY) src/setup.py install diff --git a/SPECS/python-dmidecode/python-dmidecode.signatures.json b/SPECS/python-dmidecode/python-dmidecode.signatures.json deleted file mode 100644 index bbd4890b56..0000000000 --- a/SPECS/python-dmidecode/python-dmidecode.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "python-dmidecode-3.12.3.tar.gz": "44d45d7d8344290c259c989d3af3f614c7837cbd85052d486adfa46a1c777164" - } -} diff --git a/SPECS/python-dmidecode/python-dmidecode.spec b/SPECS/python-dmidecode/python-dmidecode.spec deleted file mode 100644 index 678bf04a8f..0000000000 --- a/SPECS/python-dmidecode/python-dmidecode.spec +++ /dev/null @@ -1,228 +0,0 @@ -Summary: Python module to access DMI data -Name: python-dmidecode -Version: 3.12.3 -Release: 2%{?dist} -License: GPL-2.0-only -Vendor: Intel Corporation -Distribution: Edge Microvisor Toolkit -URL: https://github.com/nima/python-dmidecode -Source0: %{url}/archive/refs/tags/v%{version}/%{name}-%{version}.tar.gz -Patch0: python-dmidecode-rhbz2154949.patch -BuildRequires: make -BuildRequires: gcc -BuildRequires: libxml2-devel -BuildRequires: python3-devel -BuildRequires: libxml2-python3 -BuildRequires: python3-setuptools - -%global _description\ -python-dmidecode is a python extension module that uses the\ -code-base of the 'dmidecode' utility, and presents the data\ -as python data structures or as XML data using libxml2.\ -\ - -%description %_description - -%package -n python3-dmidecode -Summary: Python 3 module to access DMI data -Requires: libxml2-python3 -%description -n python3-dmidecode %_description - -%prep -%autosetup -n %{name}-%{version} -N -%patch 0 -p1 -b .backup - -%build -# -std=gnu89 is there to avoid `undefined symbol: dmixml_GetContent` -export PYTHON_BIN=%{__python3} -export CFLAGS="%{build_cflags} -std=gnu89" -export CXXFLAGS="%{build_cxxflags} -std=gnu89" -export CC=gcc -export CXX=g++ -%make_build - -%install -%{__python3} src/setup.py install --root %{buildroot} --prefix=%{_prefix} - -%check -export PYTHONPATH=%{buildroot}%{python3_sitearch} -export PYTHON_BIN=%{__python3} -make -C unit-tests - -%files -n python3-dmidecode -%license doc/LICENSE -%doc README doc/AUTHORS doc/AUTHORS.upstream -%{python3_sitearch}/dmidecodemod.cpython-%{python3_version_nodots}*.so -%pycached %{python3_sitearch}/dmidecode.py -%{python3_sitearch}/*.egg-info -%{_datadir}/%{name}/ - -%changelog -* Fri Feb 14 2025 Naveen Saini - 3.12.3-2 -- Fix source url. - -* Wed Sep 18 2024 Mun Chun Yep - 3.12.3-1 -- Upgrade version for Edge Microvisor Toolkit. -- Update version 3.12.3 and patch from Fedora 41 to resolve build error. - -* Fri Oct 15 2021 Pawel Winogrodzki - 3.12.2-20 -- Initial CBL-Mariner import from Fedora 32 (license: MIT). License verified. - -* Thu Jan 30 2020 Fedora Release Engineering - 3.12.2-19 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Thu Oct 03 2019 Miro Hrončok - 3.12.2-18 -- Rebuilt for Python 3.8.0rc1 (#1748018) - -* Mon Aug 19 2019 Miro Hrončok - 3.12.2-17 -- Rebuilt for Python 3.8 - -* Sun Aug 11 2019 Miro Hrončok - 3.12.2-16 -- Subpackage python2-dmidecode has been removed - See https://fedoraproject.org/wiki/Changes/Mass_Python_2_Package_Removal - -* Fri Jul 26 2019 Fedora Release Engineering - 3.12.2-15 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Sat Feb 02 2019 Fedora Release Engineering - 3.12.2-14 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Sat Jul 14 2018 Fedora Release Engineering - 3.12.2-13 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Tue Jun 19 2018 Miro Hrončok - 3.12.2-12 -- Rebuilt for Python 3.7 - -* Fri Feb 09 2018 Fedora Release Engineering - 3.12.2-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Tue Jan 16 2018 Iryna Shcherbina - 3.12.2-10 -- Update Python 2 dependency declarations to new packaging standards - (See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3) - -* Sat Aug 19 2017 Zbigniew Jędrzejewski-Szmek - 3.12.2-9 -- Python 2 binary package renamed to python2-dmidecode - See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3 - -* Thu Aug 03 2017 Fedora Release Engineering - 3.12.2-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Thu Jul 27 2017 Fedora Release Engineering - 3.12.2-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Sat Feb 11 2017 Fedora Release Engineering - 3.12.2-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Mon Dec 19 2016 Miro Hrončok - 3.12.2-5 -- Rebuild for Python 3.6 - -* Tue Jul 19 2016 Fedora Release Engineering - 3.12.2-4 -- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages - -* Thu Feb 04 2016 Fedora Release Engineering - 3.12.2-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Sat Nov 07 2015 Robert Kuska - 3.12.2-2 -- Rebuilt for Python3.5 rebuild - -* Fri Jul 10 2015 Miro Hrončok - 3.12.2-1 -- Update to 3.12.2 -- Add Python 3 subpackage (#1236000) -- Removed deprecated statements -- Moved some docs to license -- Removed pacthes -- Corrected bogus dates in %%changelog -- Build with -std=gnu89 - -* Thu Jun 18 2015 Fedora Release Engineering - 3.10.13-13 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Sun Aug 17 2014 Fedora Release Engineering - 3.10.13-12 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Sat Jun 07 2014 Fedora Release Engineering - 3.10.13-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Sun Aug 04 2013 Fedora Release Engineering - 3.10.13-10 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Thu Jun 20 2013 Ales Ledvinka - 3.10.13-9 -- Attribute installed may appear as duplicate and cause invalid XML. - -* Mon Jun 17 2013 Ales Ledvinka - 3.10.13-8 -- Attribute dmispec may cause invalid XML on some hardware. -- Signal handler for SIGILL. - -* Thu Feb 14 2013 Fedora Release Engineering - 3.10.13-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild - -* Sat Jul 21 2012 Fedora Release Engineering - 3.10.13-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Thu Jul 19 2012 Ales Ledvinka 3.10.14-5 -- Upstream relocated. Document source tag and tarball generation. - -* Sat Jan 14 2012 Fedora Release Engineering - 3.10.13-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild - -* Tue Feb 08 2011 Fedora Release Engineering - 3.10.13-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Thu Jul 22 2010 David Malcolm - 3.10.13-2 -- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild - -* Tue Jun 15 2010 Roman Rakus - 3.10.13-1 -- Update to new release - -* Fri Mar 12 2010 Nima Talebi - 3.10.12-1 -- Update to new release - -* Tue Feb 16 2010 Nima Talebi - 3.10.11-1 -- Update to new release - -* Tue Jan 12 2010 Nima Talebi - 3.10.10-1 -- Update to new release - -* Thu Jan 07 2010 Nima Talebi - 3.10.9-1 -- Update to new release - - -* Tue Dec 15 2009 Nima Talebi - 3.10.8-1 -- New Upstream release. -- Big-endian and little-endian approved. -- Packaged unit-test to tarball. -- Rewritten unit-test to be able to run as non-root user, where it will not - try to read /dev/mem. -- Added two dmidump data files to the unit-test. - -* Thu Nov 26 2009 David Sommerseth - 3.10.7-3 -- Fixed even more .spec file issues and removed explicit mentioning - of /usr/share/python-dmidecode/pymap.xml - -* Wed Nov 25 2009 David Sommerseth - 3.10.7-2 -- Fixed some .spec file issues (proper Requires, use _datadir macro) - -* Wed Sep 23 2009 Nima Talebi - 3.10.7-1 -- Updated source0 to new 3.10.7 tar ball - -* Mon Jul 13 2009 David Sommerseth - 3.10.6-6 -- Only build the python-dmidecode module, not everything - -* Mon Jul 13 2009 David Sommerseth - 3.10.6-5 -- Added missing BuildRequres for libxml2-python - -* Mon Jul 13 2009 David Sommerseth - 3.10.6-4 -- Added missing BuildRequres for python-devel - -* Mon Jul 13 2009 David Sommerseth - 3.10.6-3 -- Added missing BuildRequres for libxml2-devel - -* Mon Jul 13 2009 David Sommerseth - 3.10.6-2 -- Updated release, to avoid build conflict - -* Wed Jun 10 2009 David Sommerseth - 3.10.6-1 -- Updated to work with the new XML based python-dmidecode - -* Sat Mar 7 2009 Clark Williams - 2.10.3-1 -- Initial build. - diff --git a/SPECS/python-pysocks/python-pysocks.signatures.json b/SPECS/python-pysocks/python-pysocks.signatures.json deleted file mode 100644 index 65131bdf4c..0000000000 --- a/SPECS/python-pysocks/python-pysocks.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "PySocks-1.7.1.tar.gz": "3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" - } -} diff --git a/SPECS/python-pysocks/python-pysocks.spec b/SPECS/python-pysocks/python-pysocks.spec deleted file mode 100644 index 4689c35b45..0000000000 --- a/SPECS/python-pysocks/python-pysocks.spec +++ /dev/null @@ -1,208 +0,0 @@ -Vendor: Microsoft Corporation -Distribution: Azure Linux - -%global with_python3_tests 0 - - -%global pypi_name PySocks -%global modname pysocks -%global sum A Python SOCKS client module - -Name: python-%{modname} -Version: 1.7.1 -Release: 5%{?dist} -Summary: %{sum} - -License: BSD -URL: https://github.com/Anorov/%{pypi_name} -Source0: %{pypi_source} -BuildArch: noarch - -%global _description \ -A fork of SocksiPy with bug fixes and extra features.\ -\ -Acts as a drop-in replacement to the socket module. Featuring:\ -\ -- SOCKS proxy client for Python 2.6 - 3.x\ -- TCP and UDP both supported\ -- HTTP proxy client included but not supported or recommended (you should use\ - urllib2's or requests' own HTTP proxy interface)\ -- urllib2 handler included. - -%description -%_description - - -%package -n python%{python3_pkgversion}-%{modname} -Summary: %{sum} -BuildRequires: python%{python3_pkgversion}-devel -BuildRequires: python%{python3_pkgversion}-setuptools -# for tests -%if 0%{?with_python3_tests} -BuildRequires: python%{python3_pkgversion}-pytest -BuildRequires: python%{python3_pkgversion}-psutil -#BuildRequires: python%%{python3_pkgversion}-test_server -%endif -%{?python_provide:%python_provide python%{python3_pkgversion}-%{modname}} - -# This package doesn't actually exist... -# but if it did, we would conflict with it. -Conflicts: python%{python3_pkgversion}-SocksiPy - -%description -n python%{python3_pkgversion}-%{modname} -%_description -This package is for Python3 version %{python3_version} only. - -%if 0%{?python3_other_pkgversion} -%package -n python%{python3_other_pkgversion}-%{modname} -Summary: %{sum} -BuildRequires: python%{python3_other_pkgversion}-devel -BuildRequires: python%{python3_other_pkgversion}-setuptools -# for tests -%if 0%{?with_python3_tests} -BuildRequires: python%{python3_other_pkgversion}-pytest -BuildRequires: python%{python3_other_pkgversion}-psutil -#BuildRequires: python%%{python3_other_pkgversion}-test_server -%endif -%{?python_provide:%python_provide python%{python3_other_pkgversion}-%{modname}} - -%description -n python%{python3_other_pkgversion}-%{modname} -%_description -This package is for Python3 version %{python3_other_version} only. -%endif - - -%prep -%autosetup -n %{pypi_name}-%{version} -# drop useless 3rdparty code -rm -rfv test/bin - -%build -%py3_build -%{?python3_other_pkgversion: %py3_other_build} - -%install -%py3_install -%{?python3_other_pkgversion: %py3_other_install} - -%check -# https://github.com/Anorov/PySocks/issues/37 -# FIXME python module named test_server is needed but not packaged -%if 0 -%if 0%{?with_python3_tests} -%{?with_python3: %{__python3} setup.py test} -%{?python3_other_pkgversion: %{__python3_other} setup.py test} -%endif -%endif - - - -%files -n python%{python3_pkgversion}-%{modname} -%doc README.md -%license LICENSE -%{python3_sitelib}/socks.py* -%{python3_sitelib}/sockshandler.py* -%{python3_sitelib}/__pycache__/*socks* -%{python3_sitelib}/%{pypi_name}-%{version}-* - -%if 0%{?python3_other_pkgversion} -%files -n python%{python3_other_pkgversion}-%{modname} -%doc README.md -%license LICENSE -%{python3_other_sitelib}/socks.py* -%{python3_other_sitelib}/sockshandler.py* -%{python3_other_sitelib}/__pycache__/*socks* -%{python3_other_sitelib}/%{pypi_name}-%{version}-* -%endif - - -%changelog -* Fri Oct 15 2021 Pawel Winogrodzki - 1.7.1-5 -- Initial CBL-Mariner import from Fedora 32 (license: MIT). - -* Thu Jan 30 2020 Fedora Release Engineering - 1.7.1-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Sun Nov 24 2019 Miro Hrončok - 1.7.1-3 -- Subpackage python2-pysocks has been removed - See https://fedoraproject.org/wiki/Changes/Mass_Python_2_Package_Removal - -* Thu Oct 03 2019 Petr Viktorin - 1.7.1-2 -- Remove unused Python 2 test dependencies - -* Sun Sep 22 2019 Kevin Fenzi - 1.7.1-1 -- Update to 1.7.1. Fixes bug #1753823 - -* Fri Aug 16 2019 Miro Hrončok - 1.7.0-4 -- Rebuilt for Python 3.8 - -* Thu Aug 15 2019 Miro Hrončok - 1.7.0-3 -- Bootstrap for Python 3.8 - -* Fri Jul 26 2019 Fedora Release Engineering - 1.7.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Sat May 18 2019 Kevin Fenzi - 1.7.0-1 -- Update to 1.7.0. Fixes bug #1708882 - -* Sat Feb 02 2019 Fedora Release Engineering - 1.6.8-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Sun Nov 11 2018 Kevin Fenzi - 1.6.8-6 -- Add upstream patch to avoid DeprecationWarning. Fixes bug #1648583 - -* Wed Oct 03 2018 Raphael Groner - 1.6.8-5 -- add python3_other subpackage for epel7 -- prepare removal of python2 subpackage in Fedora -- use pypi macros -- try to enable tests provided actually from tarball - -* Sat Jul 14 2018 Fedora Release Engineering - 1.6.8-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Thu Jun 14 2018 Miro Hrončok - 1.6.8-3 -- Rebuilt for Python 3.7 - -* Fri Feb 09 2018 Fedora Release Engineering - 1.6.8-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Fri Dec 22 2017 Kevin Fenzi - 1.6.8-1 -- Update to 1.6.8. Fixes bug #1528490 - -* Mon Sep 11 2017 Carl George - 1.6.7-1 -- Latest upstream -- Add setuptools dependency - -* Thu Jul 27 2017 Fedora Release Engineering - 1.5.7-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Sat Feb 11 2017 Fedora Release Engineering - 1.5.7-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Fri Dec 09 2016 Charalampos Stratakis - 1.5.7-3 -- Rebuild for Python 3.6 - -* Mon Nov 28 2016 Tim Orling - 1.5.7-2 -- Ship python34-pysocks in EL6 - -* Sat Sep 17 2016 Kevin Fenzi - 1.5.7-1 -- Update to 1.5.7 - -* Fri Sep 16 2016 Orion Poplawski - 1.5.6-6 -- Ship python34-pysocks in EPEL7 - -* Tue Jul 19 2016 Fedora Release Engineering - 1.5.6-5 -- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages - -* Fri Jul 15 2016 Ralph Bean - 1.5.6-4 -- Change our conflicts on python-SocksiPy to an obsoletes/provides. - https://bugzilla.redhat.com/show_bug.cgi?id=1334407 - -* Mon May 09 2016 Ralph Bean - 1.5.6-3 -- Fix typo in explicit conflicts. - -* Tue May 03 2016 Ralph Bean - 1.5.6-2 -- We don't actually need setuptools here. - -* Mon May 02 2016 Ralph Bean - 1.5.6-1 -- Initial package for Fedora diff --git a/SPECS/qemu/qemu.spec b/SPECS/qemu/qemu.spec index 44c17befb9..e9ef201ab5 100644 --- a/SPECS/qemu/qemu.spec +++ b/SPECS/qemu/qemu.spec @@ -742,7 +742,7 @@ BuildRequires: python3-tomli %endif %if %{user_static} -BuildRequires: glibc-static >= 2.38-12%{?dist} +BuildRequires: glibc-static >= 2.38-18%{?dist} BuildRequires: glib2-static BuildRequires: zlib-static # -latomic added by GLib 2.81.0, 2024-06-28 @@ -3549,7 +3549,10 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ %changelog -* Tue Jan 30 2025 Rajesh Shanmugam - 9.1.0-7 +* Thu Mar 12 2026 Lee Chee Yang - 9.1.0-7 +- Bump to rebuild with updated glibc + +* Tue Jan 27 2025 Rajesh Shanmugam - 9.1.0-6 - Added 1 patch from Intel Distribution Qemu Commit 8e06d09 - Add patch for CVE-2025-54566 CVE-2025-54567 diff --git a/SPECS/rdma-core/0001-kernel-boot-Do-not-perform-device-rename-on-OPA-devi.patch b/SPECS/rdma-core/0001-kernel-boot-Do-not-perform-device-rename-on-OPA-devi.patch deleted file mode 100644 index e4fce78fc7..0000000000 --- a/SPECS/rdma-core/0001-kernel-boot-Do-not-perform-device-rename-on-OPA-devi.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff -Naur rdma-core-36.3-a/kernel-boot/rdma-persistent-naming.rules rdma-core-36.3-b/kernel-boot/rdma-persistent-naming.rules ---- rdma-core-36.3-a/kernel-boot/rdma-persistent-naming.rules 2022-01-07 00:54:18.000000000 -0800 -+++ rdma-core-36.3-b/kernel-boot/rdma-persistent-naming.rules 2022-02-03 15:10:26.763415015 -0800 -@@ -26,10 +26,10 @@ - # Device type = RoCE - # mlx5_0 -> rocex525400c0fe123455 - # --ACTION=="add", SUBSYSTEM=="infiniband", PROGRAM="rdma_rename %k NAME_FALLBACK" -+ACTION=="add", SUBSYSTEM=="infiniband", KERNEL!="hfi1*", PROGRAM="rdma_rename %k NAME_FALLBACK" - - # Example: - # * NAME_FIXED - # fixed name for specific board_id - # --#ACTION=="add", ATTR{board_id}=="MSF0010110035", SUBSYSTEM=="infiniband", PROGRAM="rdma_rename %k NAME_FIXED myib" -\ No newline at end of file -+#ACTION=="add", ATTR{board_id}=="MSF0010110035", SUBSYSTEM=="infiniband", PROGRAM="rdma_rename %k NAME_FIXED myib" diff --git a/SPECS/rdma-core/rdma-core.signatures.json b/SPECS/rdma-core/rdma-core.signatures.json index 53e5847d7a..9f118bffa4 100644 --- a/SPECS/rdma-core/rdma-core.signatures.json +++ b/SPECS/rdma-core/rdma-core.signatures.json @@ -1,5 +1,5 @@ { - "Signatures": { - "rdma-core-49.1.tar.gz": "2e531d398073dd7ed28d95c94fa698e1a831952b508e9af93e36644dcd399936" - } -} \ No newline at end of file + "Signatures": { + "rdma-core-59.0.tar.gz": "e2c169b13b318cdc3b5ff957cd8b6dcc8bdf96dd9c5d42324129c163bb057ce5" + } +} diff --git a/SPECS/rdma-core/rdma-core.spec b/SPECS/rdma-core/rdma-core.spec index f91f0e12c3..7e5c4cd17f 100644 --- a/SPECS/rdma-core/rdma-core.spec +++ b/SPECS/rdma-core/rdma-core.spec @@ -1,10 +1,10 @@ Summary: RDMA core userspace libraries and daemons Name: rdma-core -Version: 49.1 -Release: 2%{?dist} +Version: 59.0 +Release: 1%{?dist} URL: https://github.com/linux-rdma/rdma-core -Vendor: Intel Corporation -Distribution: Edge Microvisor Toolkit +Vendor: Microsoft Corporation +Distribution: Azure Linux # Almost everything is licensed under the OFA dual GPLv2, 2 Clause BSD license # providers/ipathverbs/ Dual licensed using a BSD license with an extra patent clause @@ -12,7 +12,6 @@ Distribution: Edge Microvisor Toolkit # providers/hfi1verbs Uses the 3 Clause BSD license License: GPLv2 or BSD Source0: https://github.com/linux-rdma/%{name}/releases/download/v%{version}/%{name}-%{version}.tar.gz -Patch1: 0001-kernel-boot-Do-not-perform-device-rename-on-OPA-devi.patch # Do not build static libs by default. %define with_static %{?_with_static: 1} %{?!_with_static: 0} @@ -400,20 +399,21 @@ fi %{_libdir}/lib*.so %{_libdir}/pkgconfig/*.pc %{_mandir}/man3/efadv* +%{_mandir}/man3/hnsdv* %{_mandir}/man3/ibv_* %{_mandir}/man3/rdma* %{_mandir}/man3/umad* %{_mandir}/man3/*_to_ibv_rate.* %{_mandir}/man7/rdma_cm.* +%{_mandir}/man3/manadv* %{_mandir}/man3/mlx5dv* %{_mandir}/man3/mlx4dv* %{_mandir}/man7/efadv* +%{_mandir}/man7/hnsdv* +%{_mandir}/man7/manadv* %{_mandir}/man7/mlx5dv* %{_mandir}/man7/mlx4dv* %{_mandir}/man3/ibnd_* -# New in v49.0 -%{_mandir}/man3/manadv* -%{_mandir}/man7/manadv* %files -n infiniband-diags-compat %{_sbindir}/ibcheckerrs @@ -528,6 +528,7 @@ fi %dir %{_sysconfdir}/libibverbs.d %dir %{_libdir}/libibverbs %{_libdir}/libefa.so.* +%{_libdir}/libhns.so.* %{_libdir}/libibverbs*.so.* %{_libdir}/libibverbs/*.so %{_libdir}/libmlx5.so.* @@ -624,8 +625,12 @@ fi %endif %changelog -* Tue Sep 30 2025 Andy - 49.1-2 -- Bump version for release +* Tue Nov 04 2025 Suresh Babu Chalamalasetty - 59.0-1 +- Upgrade version to 59.0. + +* Tue Jan 07 2025 Elaheh Dehghani - 55.0-1 +- Upgrade to version 55.0 +- Add rdma-core to PMC extended repo * Mon Jan 22 2024 Kanika Nema - 49.1-1 - Upgrade to version 49.1 for AzL 3.0 release diff --git a/SPECS/rpm/define-RPM_LD_FLAGS.patch b/SPECS/rpm/define-RPM_LD_FLAGS.patch deleted file mode 100644 index d278fb3b96..0000000000 --- a/SPECS/rpm/define-RPM_LD_FLAGS.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- rpm-4.18.1/macros.in -+++ rpm-4.18.1/macros.in -@@ -727,10 +727,11 @@ package or when debugging this package.\ - RPM_SOURCE_DIR=\"%{_sourcedir}\"\ - RPM_BUILD_DIR=\"%{_builddir}\"\ - RPM_OPT_FLAGS=\"%{optflags}\"\ -+ RPM_LD_FLAGS=\"%{?build_ldflags}\"\ - RPM_ARCH=\"%{_arch}\"\ - RPM_OS=\"%{_os}\"\ - RPM_BUILD_NCPUS=\"%{_smp_build_ncpus}\"\ -- export RPM_SOURCE_DIR RPM_BUILD_DIR RPM_OPT_FLAGS RPM_ARCH RPM_OS RPM_BUILD_NCPUS\ -+ export RPM_SOURCE_DIR RPM_BUILD_DIR RPM_OPT_FLAGS RPM_ARCH RPM_OS RPM_BUILD_NCPUS RPM_LD_FLAGS\ - RPM_DOC_DIR=\"%{_docdir}\"\ - export RPM_DOC_DIR\ - RPM_PACKAGE_NAME=\"%{NAME}\"\ diff --git a/SPECS/rpm/fix_RPM_GNUC_DEPRECATED_headers.patch b/SPECS/rpm/fix_RPM_GNUC_DEPRECATED_headers.patch deleted file mode 100644 index 63ad0569ba..0000000000 --- a/SPECS/rpm/fix_RPM_GNUC_DEPRECATED_headers.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 1d35f0bc63c7bf9b558233b51bbec480238c44b9 Mon Sep 17 00:00:00 2001 -From: Daniel McIlvaney -Date: Sun, 11 Sep 2022 11:18:28 -0700 -Subject: [PATCH] Include RPM_GNUC_DEPRECATED before use in headers - ---- - include/rpm/rpmfc.h | 1 + - include/rpm/rpmkeyring.h | 1 + - include/rpm/rpmsq.h | 1 + - 3 files changed, 3 insertions(+) - -diff --git a/include/rpm/rpmfc.h b/include/rpm/rpmfc.h -index dfc5841ed..1e80511f6 100644 ---- a/include/rpm/rpmfc.h -+++ b/include/rpm/rpmfc.h -@@ -7,6 +7,7 @@ - */ - - #include -+#include - #include /* for ARGV_t */ - #include /* for Package */ - -diff --git a/include/rpm/rpmkeyring.h b/include/rpm/rpmkeyring.h -index ac1c0a6b3..1f597d240 100644 ---- a/include/rpm/rpmkeyring.h -+++ b/include/rpm/rpmkeyring.h -@@ -9,6 +9,7 @@ - - #include - #include -+#include - - #ifdef __cplusplus - extern "C" { -diff --git a/include/rpm/rpmsq.h b/include/rpm/rpmsq.h -index 048d9788c..50f9be327 100644 ---- a/include/rpm/rpmsq.h -+++ b/include/rpm/rpmsq.h -@@ -7,6 +7,7 @@ - * Signal Queue API (obsolete, do not use) - */ - #include -+#include - #include - - #ifdef __cplusplus --- -2.17.1 - diff --git a/SPECS/rpm/remove-docs-from-makefile.patch b/SPECS/rpm/remove-docs-from-makefile.patch deleted file mode 100644 index 61933ed656..0000000000 --- a/SPECS/rpm/remove-docs-from-makefile.patch +++ /dev/null @@ -1,47 +0,0 @@ -diff --git a/Makefile.am b/Makefile.am -index 7e7d4163d..4904dd591 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -26,7 +26,7 @@ EXTRA_DIST = ChangeLog CREDITS INSTALL \ - BUILT_SOURCES = - - SUBDIRS = po misc --SUBDIRS += rpmio lib sign build scripts fileattrs docs . -+SUBDIRS += rpmio lib sign build scripts fileattrs . - - if ENABLE_PYTHON - SUBDIRS += python -@@ -40,7 +40,7 @@ if HAVE_FAKECHROOT - SUBDIRS += tests - endif - --DIST_SUBDIRS = po misc rpmio lib sign build python scripts fileattrs docs tests plugins -+DIST_SUBDIRS = po misc rpmio lib sign build python scripts fileattrs tests plugins - - pkgconfigdir = $(libdir)/pkgconfig - -@@ -259,24 +259,6 @@ uninstall-local: - - MAINTAINERCLEANFILES = ChangeLog - --# Always build librpm docs --if DOXYGEN --docs/librpm.doxy: docs/librpm.doxy.in docs/librpm/Doxyheader.h Makefile.am configure.ac $(pkginclude_HEADERS) -- files=`echo " $(pkginclude_HEADERS)" | $(SED) -e "s, , \@top_srcdir\@/,g"`; \ -- $(SED) -e "s,[@]pkginclude_HEADERS[@],$$files," \ -- -e "s,\@top_srcdir\@/,$(top_srcdir)/,g" \ -- -e "s,[@]HAVE_DOT[@],$(HAVE_DOT)," \ -- -e "s,[@]PACKAGE[@],$(PACKAGE)," \ -- -e "s,[@]VERSION[@],$(VERSION)," \ -- < $(top_srcdir)/docs/librpm.doxy.in > docs/librpm.doxy -- --docs/librpm/html: docs/librpm.doxy -- @DOXYGEN@ docs/librpm.doxy --noinst_DATA += docs/librpm/html --endif --EXTRA_DIST += docs/librpm.doxy.in docs/librpm/Doxyheader.h --EXTRA_DIST += docs/librpm/html -- - .PHONY: ci - ci: - podman build -t rpm -f $(top_srcdir)/ci/Dockerfile $(top_srcdir) diff --git a/SPECS/rpm/rpm.signatures.json b/SPECS/rpm/rpm.signatures.json deleted file mode 100644 index 1917a0d93b..0000000000 --- a/SPECS/rpm/rpm.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "rpm-4.18.2.tar.bz2": "ba7eee1bc2c6f83be73c0a40d159c625cbaed976b3ac044233404fb25ae1b979" - } -} diff --git a/SPECS/rpm/rpm.spec b/SPECS/rpm/rpm.spec deleted file mode 100644 index 88bd7bc40f..0000000000 --- a/SPECS/rpm/rpm.spec +++ /dev/null @@ -1,490 +0,0 @@ -Summary: Package manager -Name: rpm -Version: 4.18.2 -Release: 1%{?dist} -License: GPLv2+ AND LGPLv2+ AND BSD -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Applications/System -URL: https://rpm.org -Source0: http://ftp.rpm.org/releases/%{name}-%(echo %{version} | cut -d'.' -f1-2).x/%{name}-%{version}.tar.bz2 -Patch0: remove-docs-from-makefile.patch -Patch1: define-RPM_LD_FLAGS.patch -Patch2: fix_RPM_GNUC_DEPRECATED_headers.patch -BuildRequires: autoconf -BuildRequires: automake -BuildRequires: awk -BuildRequires: debugedit -BuildRequires: elfutils-devel -BuildRequires: file-devel -BuildRequires: gettext -BuildRequires: libarchive-devel -BuildRequires: libcap-devel -BuildRequires: libselinux-devel -BuildRequires: libtool -BuildRequires: lua-devel -BuildRequires: openssl-devel -BuildRequires: popt-devel -BuildRequires: python3-devel -BuildRequires: sqlite-devel -BuildRequires: xz-devel -BuildRequires: zstd-devel -Requires: bash -Requires: libarchive -Requires: libselinux -Requires: lua-libs -Requires: rpm-libs = %{version}-%{release} - -%description -RPM package manager - -%package devel -Summary: Libraries and header files for rpm -Requires: %{name} = %{version}-%{release} - -%description devel -Static libraries and header files for the support library for rpm - -%package libs -Summary: Libraries for rpm -Requires: bzip2-libs -Requires: elfutils-libelf -Requires: libcap -Requires: libgcc -Requires: popt -Requires: xz-libs -Requires: zlib -Requires: zstd-libs - -%description libs -Shared libraries librpm and librpmio - -%package build-libs -Summary: Librpmbuild.so.* libraries needed to build rpms. -Requires: %{name}-libs = %{version}-%{release} - -%description build-libs -%{summary} - -%package build -Summary: Binaries, scripts and libraries needed to build rpms. -Requires: %{name}-build-libs = %{version}-%{release} -Requires: %{name}-devel = %{version}-%{release} -Requires: azurelinux-rpm-macros -Requires: bzip2 -Requires: cpio -Requires: debugedit -Requires: diffutils -Requires: elfutils-devel -Requires: elfutils-libelf -Requires: file -Requires: gzip -Requires: lua -Requires: patch -Requires: sed -Requires: tar -Requires: unzip -Requires: util-linux -Requires: xz -Provides: %{name}-sign = %{version}-%{release} - -%description build -%{summary} - -%package lang -Summary: Additional language files for rpm -Group: Applications/System -Requires: %{name} = %{version}-%{release} - -%description lang -These are the additional language files of rpm. - -%package -n python3-rpm -Summary: Python 3 bindings for rpm. -Group: Development/Libraries -Requires: %{name}-build-libs = %{version}-%{release} -Requires: %{name}-libs = %{version}-%{release} -Requires: python3 -Provides: %{name}-python3 = %{version}-%{release} - -%description -n python3-rpm -Python3 rpm. - -%prep -%autosetup -n %{name}-%{version} -p1 - -%build -# pass -L opts to gcc as well to prioritize it over standard libs -sed -i 's/-Wl,-L//g' python/setup.py.in -sed -i '/library_dirs/d' python/setup.py.in -sed -i 's/extra_link_args/library_dirs/g' python/setup.py.in - -./autogen.sh --noconfigure - -%configure \ - CPPFLAGS='-DLUA_COMPAT_APIINTCASTS' \ - --program-prefix= \ - --with-crypto=openssl \ - --enable-ndb \ - --disable-dependency-tracking \ - --disable-static \ - --with-vendor=azl \ - --enable-python \ - --with-cap \ - --disable-silent-rules \ - --with-selinux \ - --with-audit=no - -# Remove manpages translations -rm -r docs/man/{fr,ja,ko,pl,ru,sk} - -%make_build - -pushd python -# prevent error: could not create 'rpm.egg-info': File exists -rm -vf %{_topdir}/BUILD/%{name}-%{version}/python/rpm.egg-info -%py3_build -popd - -%check -make check TESTSUITEFLAGS=-j%{_smp_build_ncpus} -check_result=$? -if [[ $check_result -ne 0 ]]; then - cat tests/rpmtests.log || true -fi -make clean -[[ $check_result -eq 0 ]] - -%install -%make_install - -find %{buildroot} -type f -name "*.la" -delete -print -find %{buildroot} -name 'perl*' -delete - -%find_lang %{name} -# System macros and prefix -install -dm 755 %{buildroot}%{_sysconfdir}/rpm - -pushd python -python3 setup.py install --skip-build --prefix=%{_prefix} --root=%{buildroot} -popd - -%post libs -p /sbin/ldconfig -%postun libs -p /sbin/ldconfig -%post build-libs -p /sbin/ldconfig -%postun build-libs -p /sbin/ldconfig - -%files -%defattr(-,root,root) -%license COPYING -%{_bindir}/rpm -%{_bindir}/gendiff -%{_bindir}/rpm2archive -%{_bindir}/rpm2cpio -%{_bindir}/rpmdb -%{_bindir}/rpmgraph -%{_bindir}/rpmkeys -%{_bindir}/rpmquery -%{_bindir}/rpmverify - -%{_libdir}/rpm/rpmpopt-* -%{_libdir}/rpm/rpmdb_* -%{_libdir}/rpm/rpm.daily -%{_libdir}/rpm/rpm.log -%{_libdir}/rpm/rpm.supp -%{_libdir}/rpm/rpmuncompress -%{_libdir}/rpm/rpm2cpio.sh -%{_libdir}/rpm/tgpg -%{_libdir}/rpm/platform -%{_libdir}/rpm-plugins/* -# Because of no doxygen dependency, we do not produce manpages that require it. -# %{_mandir}/man8/rpm.8.gz -# %{_mandir}/man8/rpm2cpio.8.gz -# %{_mandir}/man8/rpmdb.8.gz -# %{_mandir}/man8/rpmgraph.8.gz -# %{_mandir}/man8/rpmkeys.8.gz -# %{_mandir}/man8/rpm-misc.8.gz -# %{_mandir}/man8/rpm-plugin-systemd-inhibit.8.gz - -%files libs -%defattr(-,root,root) -%{_libdir}/librpmio.so.* -%{_libdir}/librpm.so.* -%{_libdir}/rpm/macros -%{_libdir}/rpm/rpmrc -%{_libdir}/rpm/platform/* - -%files build-libs -%{_libdir}/librpmbuild.so* - -%files build -%{_bindir}/rpmbuild -%{_bindir}/rpmlua -%{_bindir}/rpmsign -%{_bindir}/rpmspec -%{_libdir}/rpm/macros.* -%{_libdir}/rpm/find-lang.sh -%{_libdir}/rpm/rpm_macros_provides.sh -%{_libdir}/rpm/find-provides -%{_libdir}/rpm/find-requires -%{_libdir}/rpm/brp-* -%{_libdir}/rpm/fileattrs/* -%{_libdir}/rpm/script.req -%{_libdir}/rpm/check-buildroot -%{_libdir}/rpm/check-files -%{_libdir}/rpm/check-prereqs -%{_libdir}/rpm/check-rpaths -%{_libdir}/rpm/check-rpaths-worker -%{_libdir}/rpm/elfdeps -%{_libdir}/rpm/mkinstalldirs -%{_libdir}/rpm/pkgconfigdeps.sh -%{_libdir}/rpm/*.prov - -%{_libdir}/rpm/ocamldeps.sh -%{_libdir}/rpm/rpmdeps -# Because of no doxygen dependency, we do not produce manpages that require it. -# %{_mandir}/man1/gendiff.1* -# %{_mandir}/man8/rpmbuild.8* -# %{_mandir}/man8/rpmdeps.8* -# %{_mandir}/man8/rpmspec.8* -# %{_mandir}/man8/rpmsign.8.gz - -%files devel -%defattr(-,root,root) -%{_includedir}/* -%{_libdir}/pkgconfig/rpm.pc -%{_libdir}/librpmio.so -%{_libdir}/librpm.so -%{_libdir}/librpmsign.so -%{_libdir}/librpmsign.so.* - -%files lang -f %{name}.lang -%defattr(-,root,root) - -%files -n python3-rpm -%defattr(-,root,root) -%{python3_sitelib}/* - -%changelog -* Fri Mar 22 2024 Sam Meluch - 4.18.2-1 -- Upgrade rpm to version 4.18.2 - -* Thu Feb 29 2024 Andrew Phelps - 4.18.1-4 -- Remove python generator scripts, which are now provided by the python-rpm-generators package. - -* Thu Feb 22 2024 Pawel Winogrodzki - 4.18.1-3 -- Updating naming for 3.0 version of Azure Linux. - -* Wed Feb 07 2024 Andrew Phelps - 4.18.1-2 -- Remove conflicting `rpm.egg-info` file - -* Tue Jan 30 2024 Andrew Phelps - 4.18.1-1 -- Upgrade to version 4.18.1 - -* Wed Sep 20 2023 Jon Slobodzian - 4.18.0-4 -- Recompile with stack-protection fixed gcc version (CVE-2023-4039) - -* Thu Jun 15 2023 Andrew Phelps - 4.18.0-3 -- Remove brp-strip-debug-symbols and brp-strip-unneeded scripts - -* Fri Sep 30 2022 Andy Caldwell - 4.18.0-2 -- Create versioned dependencies from `python3-rpm` -> `rpm-build-libs` -> `rpm-libs` to ensure ABI compatibility - -* Wed Sep 21 2022 Daniel McIlvaney - 4.18.0-1 -- Update to 4.18.0 to resolve CVE-2021-35938, CVE-2021-35939, and CVE-2021-3521 - -* Mon Jul 18 2022 Nan Liu - 4.17.0-9 -- Add missing dependencies to rpmbuild (sed and util-linux) - -* Tue May 24 2022 Jon Slobodzian - 4.17.0-8 -- Move lua runtime dependency from main rpm package. Move to rpm-build. -- Move python files to rpm-build package. This removes the implied dependency on python3 by the rpm package. - -* Fri May 13 2022 Andy Caldwell - 4.17.0-7 -- Add missing dependencies to rpmbuild (file, diff and patch) - -* Thu Apr 28 2022 Andrew Phelps - 4.17.0-6 -- Remove main package requires for rpm-build -- Move debugedit requires to rpm-build subpackage - -* Thu Apr 21 2022 Daniel McIlvaney - 4.17.0-5 -- rpm-libs needs to run in container environments without systemd, audit was being -- pulled in as an automatic dependency. Explicitly disable the audit config. - -* Wed Apr 13 2022 Suresh Babu Chalamalasetty - 4.17.0-4 -- Update required dependecies for rpm-libs and rpm-build sub-packages. - -* Tue Feb 08 2022 Thomas Crain - 4.17.0-3 -- Remove manual pkgconfig(*) provides in toolchain specs - -* Sat Jan 29 2022 Muhammad Falak - 4.17.0-2 -- Fix ptest build by replacing `%make_build_check` with `make` - -* Wed Sep 15 2021 Mateusz Malisz - 4.17.0-1 -- Upgrade to version 4.17.0. Remove libdb dependency. - -* Mon Jun 07 2021 Thomas Crain - 4.14.2.1-4 -- Add patch to define "$RPM_LD_FLAGS" during spec %%build phases -- Remove %%python3_sitelib redefinition -- Remove %%clean section -- Remove duplicate build-time requirements - -* Wed May 19 2021 Nick Samson - 4.14.2.1-3 -- Removed python-rpm python2 module support - -* Fri Apr 30 2021 Thomas Crain - 4.14.2.1-2 -- Merge the following releases from 1.0 to dev branch -- niontive@microsoft.com, 4.14.2-11: Patch CVE-2021-20271 and CVE-2021-3421 - -* Thu Feb 25 2021 Joe Schmitt - 4.14.2.1-1 -- Upgrade to v4.14.2.1 to fix broken Lua library path. - -* Thu Jan 14 2021 Ruying Chen - 4.14.2-13 -- Apply patch to correctly parse versions for python dist dependencies. - -* Tue Jan 12 2021 Ruying Chen - 4.14.2-12 -- Provide rpm-sign. - -* Fri Dec 11 2020 Joe Schmitt - 4.14.2-11 -- Provide rpm-python3 and rpm-python. - -* Thu Jun 11 2020 Henry Beberman - 4.14.2-10 -- Add a vendor definition so rpm will search /usr/lib/rpm/ for macros. - -* Tue Jun 09 2020 Pawel Winogrodzki - 4.14.2-9 -- Removed 'rpm-build' dependency on 'perl'. -- Defined an 'rpm-build-libs' subpackage to prevent 'python3-rpm' -- from pulling in 'perl'. -- Made 'python3-rpm' dependency on 'rpm-build-libs' explicit. - -* Thu May 28 2020 Ruying Chen - 4.14.2-8 -- Move macros to mariner-rpm-macros - -* Wed May 20 2020 Henry Beberman - 4.14.2-7 -- Add BuildRequires and Requires for zstd support. - -* Sat May 09 2020 Nick Samson - 4.14.2-6 -- Added %%license line automatically - -* Wed May 06 2020 Emre Girgin - 4.14.2-5 -- Enable built-in lua support. -- Update URL. -- License verified. - -* Wed Apr 29 2020 Mateusz Malisz - 4.14.2-4 -- Add packaging tools as runtime requirements for rpm-build - -* Fri Apr 03 2020 Suresh Babu Chalamalasetty - 4.14.2-3 -- Remove rpm-build from requires. - -* Wed Sep 11 2019 Mateusz Malisz - 4.14.2-2 -- Fix Dependency and include build in base package. - -* Tue Sep 03 2019 Mateusz Malisz - 4.14.2-1 -- Initial CBL-Mariner import from Photon (license: Apache2). - -* Wed Oct 03 2018 Alexey Makhalov - 4.14.2-4 -- Clean up the file in accordance to spec file checker - -* Mon Oct 01 2018 Alexey Makhalov - 4.14.2-3 -- Fix python libs dependencies to use current libs version (regression) - -* Fri Sep 28 2018 Alexey Makhalov - 4.14.2-2 -- macros: set _build_id_links to alldebug - -* Fri Sep 14 2018 Keerthana K - 4.14.2-1 -- Update to version 4.14.2 - -* Thu Dec 21 2017 Xiaolin Li - 4.13.0.1-7 -- Fix CVE-2017-7501 - -* Wed Oct 04 2017 Alexey Makhalov - 4.13.0.1-6 -- make python{,3}-rpm depend on current version of librpm - -* Wed Jun 28 2017 Xiaolin Li - 4.13.0.1-5 -- Add file-devel to BuildRequires - -* Mon Jun 26 2017 Chang Lee - 4.13.0.1-4 -- Updated %check - -* Mon Jun 05 2017 Bo Gan - 4.13.0.1-3 -- Fix Dependency - -* Thu May 18 2017 Xiaolin Li - 4.13.0.1-2 -- Remove python2 from requires of rpm-devel subpackages. - -* Wed May 10 2017 Priyesh Padmavilasom - 4.13.0.1-1 -- Update to 4.13.0.1 - -* Fri Apr 21 2017 Priyesh Padmavilasom - 4.13.0-1 -- Update to 4.13.0 - -* Wed Apr 19 2017 Alexey Makhalov - 4.11.2-22 -- Do not allow -debuginfo to own directories to avoid conflicts with - filesystem package and between each other. Patch applied - -* Fri Apr 14 2017 Alexey Makhalov - 4.11.2-21 -- rpm-libs requires nss-libs, xz-libs and bzip2-libs. - -* Tue Mar 21 2017 Xiaolin Li - 4.11.2-20 -- Added python3 packages and moved python2 site packages from devel to python-rpm. - -* Tue Jan 10 2017 Priyesh Padmavilasom - 4.11.2-19 -- added buildrequires for xz-devel for PayloadIsLzma cap - -* Thu Dec 15 2016 Xiaolin Li - 4.11.2-18 -- Moved some files from rpm to rpm-build. - -* Tue Dec 06 2016 Xiaolin Li - 4.11.2-17 -- Added -lang subpackage. - -* Wed Nov 23 2016 Alexey Makhalov - 4.11.2-16 -- Move rpmrc and macros into -libs subpackage -- Move zlib and elfutils-libelf dependency from rpm to rpm-libs -- Add bzip2 dependency to rpm-libs - -* Thu Nov 17 2016 Alexey Makhalov - 4.11.2-15 -- Added -libs subpackage - -* Tue Nov 15 2016 Alexey Makhalov - 4.11.2-14 -- Disable lua support - -* Tue Oct 18 2016 Priyesh Padmavilasom - 4.11.2-13 -- Apply patch for CVE-2014-8118 - -* Wed Oct 05 2016 ChangLee - 4.11.2-12 -- Modified %check - -* Fri Aug 26 2016 Alexey Makhalov - 4.11.2-11 -- find-debuginfo...patch: exclude non existing .build-id from packaging -- Move all files from rpm-system-configuring-scripts tarball to here - -* Wed May 25 2016 Priyesh Padmavilasom - 4.11.2-10 -- Exclude .build-id/.1 and .build-id/.1.debug from debuginfo pkg - -* Tue May 24 2016 Priyesh Padmavilasom - 4.11.2-9 -- GA - Bump release of all rpms - -* Thu May 05 2016 Priyesh Padmavilasom - 4.11.2-8 -- Update rpm version in lock-step with lua update to 5.3.2 - -* Fri Apr 08 2016 Mahmoud Bassiouny - 4.11.2-7 -- Build rpm with capabilities. - -* Wed Aug 05 2015 Sharath George - 4.11.2-6 -- Moving build utils to a different package. - -* Sat Jun 27 2015 Alexey Makhalov - 4.11.2-5 -- Update rpm-system-configuring-scripts. Use tar --no-same-owner for rpmbuild. - -* Thu Jun 18 2015 Anish Swaminathan - 4.11.2-4 -- Add pkgconfig Provides directive - -* Thu Jun 18 2015 Alexey Makhalov - 4.11.2-3 -- Do no strip debug info from .debug files - -* Wed Jun 3 2015 Divya Thaluru - 4.11.2-2 -- Removing perl-module-scandeps package from run time required packages - -* Tue Jan 13 2015 Divya Thaluru - 4.11.2-1 -- Initial build. First version diff --git a/SPECS/runc/runc.signatures.json b/SPECS/runc/runc.signatures.json deleted file mode 100644 index d17c00f6dc..0000000000 --- a/SPECS/runc/runc.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "runc-1.3.3.tar.gz": "3da010af5c2c1c3d12d460255e4a7dc049c223ebc629c80fbbe4c10720997ffe" - } -} diff --git a/SPECS/runc/runc.spec b/SPECS/runc/runc.spec deleted file mode 100644 index 2d9d23a056..0000000000 --- a/SPECS/runc/runc.spec +++ /dev/null @@ -1,149 +0,0 @@ -%define commit_hash d842d7719497cc3b774fd71620278ac9e17710e0 -Summary: CLI tool for spawning and running containers per OCI spec. -Name: runc -# update "commit_hash" above when upgrading version -Version: 1.3.3 -Release: 1%{?dist} -License: ASL 2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Tools/Container -URL: https://github.com/opencontainers/runc -Source0: https://github.com/opencontainers/runc/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -BuildRequires: git -BuildRequires: go-md2man -BuildRequires: golang < 1.25 -BuildRequires: libseccomp-devel -BuildRequires: make -Requires: glibc -Requires: libgcc -Requires: libseccomp -Provides: moby-runc = %{version}-%{release} - -%description -runc is a CLI tool for spawning and running containers according to the OCI specification. Containers are started as a child process of runC and can be embedded into various other systems without having to run a daemon. - -%prep -%autosetup -p1 -n runc-%{version} - -%build -export CGO_ENABLED=1 -make %{?_smp_mflags} BUILDTAGS="seccomp" COMMIT="%{commit_hash}" man runc - -%check -make %{?_smp_mflags} COMMIT="%{commit_hash}" localunittest - -%install -make install DESTDIR=%{buildroot} PREFIX=%{_prefix} BINDIR=%{_bindir} -make install-man DESTDIR=%{buildroot} PREFIX=%{_prefix} - -%files -%license LICENSE NOTICE -%{_bindir}/runc -%{_mandir}/* - -%changelog -* Wed Nov 05 2025 Nan Liu - 1.3.3-1 -- Upgrade to 1.3.3 -- BR golang < 1.25 - -* Mon Nov 25 2024 Nan Liu - 1.2.2-1 -- Bump version to 1.2.2 -- Remove the golang version constraint - -* Tue Oct 15 2024 Muhammad Falak - 1.1.12-2 -- Pin golang version to <= 1.22 - -* Mon Feb 05 2024 Henry Beberman - 1.1.12-1 -- Bump version to 1.1.12 -- Drop cgroups cpuset patch because it's included upstream now -- Rename spec and package to runc instead of moby-runc - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 1.1.9-3 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 1.1.9-2 -- Bump release to rebuild with updated version of Go. - -* Tue Aug 15 2023 Muhammad Falak - 1.1.9-1 -- Bump version to 1.1.9 - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.1.5-4 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 1.1.5-3 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 1.1.5-2 -- Bump release to rebuild with go 1.19.10 - -* Mon Apr 10 2023 CBL-Mariner Servicing Account - 1.1.5-1 -- Auto-upgrade to 1.1.5 - to fix CVE-2023-28642, CVE-2023-27561, CVE-2023-25809 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.1.2-11 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 1.1.2-10 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 1.1.2-9 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 Vince Perri - 1.1.2-8 -- Add 0001-cgroups-cpuset-fix-byte-order-while-parsing-cpuset-r.patch - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 1.1.2-7 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 1.1.2-6 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 1.1.2-5 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 1.1.2-4 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 1.1.2-3 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jun 14 2022 Muhammad Falak - 1.1.2-2 -- Bump release to rebuild with golang 1.18.3 - -* Thu Jun 02 2022 Nicolas Guibourge 1.1.2-1 -- Upgrade to 1.1.2 to fix CVE-2022-29162. - -* Fri Jan 28 2022 Nicolas Guibourge 1.1.0-1 -- Upgrade to 1.1.0. -- Use code from upstream instead of Azure fork. -- License verified. - -* Tue Jun 08 2021 Henry Beberman 1.0.0~rc95+azure-2 -- Increment release to force republishing using golang 1.15.13. - -* Wed May 19 2021 Andrew Phelps 1.0.0~rc95+azure-1 -- Update to version 1.0.0~rc95+azure to fix CVE-2021-30465 - -* Thu May 13 2021 Andrew Phelps 1.0.0~rc94+azure-1 -- Update to version 1.0.0~rc94+azure - -* Mon Apr 26 2021 Nicolas Guibourge 1.0.0~rc10+azure-6 -- Increment release to force republishing using golang 1.15.11. - -* Thu Dec 10 2020 Andrew Phelps 1.0.0~rc10+azure-5 -- Increment release to force republishing using golang 1.15. - -* Wed May 20 2020 Joe Schmitt 1.0.0~rc10+azure-4 -- Remove reliance on existing GOPATH environment variable. - -* Sat May 09 2020 Nick Samson 1.0.0~rc10+azure-3 -- Added %%license line automatically - -* Fri May 01 2020 Emre Girgin 1.0.0~rc10+azure-2 -- Renaming go to golang - -* Fri Apr 03 2020 Mohan Datla 1.0.0~rc10+azure-1 -- Initial CBL-Mariner import from Azure. - -* Thu Jan 23 2020 Brian Goff -- Initial version diff --git a/SPECS/skopeo/CVE-2022-2879.patch b/SPECS/skopeo/CVE-2022-2879.patch deleted file mode 100644 index a39373ee16..0000000000 --- a/SPECS/skopeo/CVE-2022-2879.patch +++ /dev/null @@ -1,65 +0,0 @@ -diff -ru skopeo-1.14.4-orig/vendor/github.com/vbatts/tar-split/archive/tar/format.go skopeo-1.14.4/vendor/github.com/vbatts/tar-split/archive/tar/format.go ---- skopeo-1.14.4-orig/vendor/github.com/vbatts/tar-split/archive/tar/format.go 2024-06-27 14:36:58.955879940 +0000 -+++ skopeo-1.14.4/vendor/github.com/vbatts/tar-split/archive/tar/format.go 2024-06-27 14:37:27.387930441 +0000 -@@ -143,6 +143,10 @@ - blockSize = 512 // Size of each block in a tar stream - nameSize = 100 // Max length of the name field in USTAR format - prefixSize = 155 // Max length of the prefix field in USTAR format -+ -+ // Max length of a special file (PAX header, GNU long name or link). -+ // This matches the limit used by libarchive. -+ maxSpecialFileSize = 1 << 20 - ) - - // blockPadding computes the number of bytes needed to pad offset up to the -diff -ru skopeo-1.14.4-orig/vendor/github.com/vbatts/tar-split/archive/tar/reader.go skopeo-1.14.4/vendor/github.com/vbatts/tar-split/archive/tar/reader.go ---- skopeo-1.14.4-orig/vendor/github.com/vbatts/tar-split/archive/tar/reader.go 2024-06-27 14:36:58.955879940 +0000 -+++ skopeo-1.14.4/vendor/github.com/vbatts/tar-split/archive/tar/reader.go 2024-06-27 14:44:13.452888975 +0000 -@@ -139,7 +139,7 @@ - continue // This is a meta header affecting the next header - case TypeGNULongName, TypeGNULongLink: - format.mayOnlyBe(FormatGNU) -- realname, err := io.ReadAll(tr) -+ realname, err := readSpecialFile(tr) - if err != nil { - return nil, err - } -@@ -333,7 +333,7 @@ - // parsePAX parses PAX headers. - // If an extended header (type 'x') is invalid, ErrHeader is returned - func parsePAX(r io.Reader) (map[string]string, error) { -- buf, err := io.ReadAll(r) -+ buf, err := readSpecialFile(r) - if err != nil { - return nil, err - } -@@ -844,6 +844,16 @@ - } - } - -+// readSpecialFile is like io.ReadAll except it returns -+// ErrFieldTooLong if more than maxSpecialFileSize is read. -+func readSpecialFile(r io.Reader) ([]byte, error) { -+ buf, err := io.ReadAll(io.LimitReader(r, maxSpecialFileSize+1)) -+ if len(buf) > maxSpecialFileSize { -+ return nil, ErrFieldTooLong -+ } -+ return buf, err -+} -+ - func (sr sparseFileReader) LogicalRemaining() int64 { - return sr.sp[len(sr.sp)-1].endOffset() - sr.pos - } -diff -ru skopeo-1.14.4-orig/vendor/github.com/vbatts/tar-split/archive/tar/writer.go skopeo-1.14.4/vendor/github.com/vbatts/tar-split/archive/tar/writer.go ---- skopeo-1.14.4-orig/vendor/github.com/vbatts/tar-split/archive/tar/writer.go 2024-06-27 14:36:58.955879940 +0000 -+++ skopeo-1.14.4/vendor/github.com/vbatts/tar-split/archive/tar/writer.go 2024-06-27 14:45:26.077061393 +0000 -@@ -199,6 +199,9 @@ - flag = TypeXHeader - } - data := buf.String() -+ if len(data) > maxSpecialFileSize { -+ return ErrFieldTooLong -+ } - if err := tw.writeRawFile(name, data, flag, FormatPAX); err != nil || isGlobal { - return err // Global headers return here - } diff --git a/SPECS/skopeo/CVE-2023-45288.patch b/SPECS/skopeo/CVE-2023-45288.patch deleted file mode 100644 index f6360426c2..0000000000 --- a/SPECS/skopeo/CVE-2023-45288.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 224f3ac556af38fe8a2f719cdfe5752acfc276b6 Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Sun, 10 Nov 2024 19:06:25 +0000 -Subject: [PATCH] http2: close connections when receiving too many headers - -Patch from https://go-review.googlesource.com/c/net/+/576057 ---- - vendor/golang.org/x/net/http2/frame.go | 31 ++++++++++++++++++++++++++ - 1 file changed, 31 insertions(+) - -diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go -index c1f6b90..175c154 100644 ---- a/vendor/golang.org/x/net/http2/frame.go -+++ b/vendor/golang.org/x/net/http2/frame.go -@@ -1565,6 +1565,7 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { - if size > remainSize { - hdec.SetEmitEnabled(false) - mh.Truncated = true -+ remainSize = 0 - return - } - remainSize -= size -@@ -1577,6 +1578,36 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { - var hc headersOrContinuation = hf - for { - frag := hc.HeaderBlockFragment() -+ -+ // Avoid parsing large amounts of headers that we will then discard. -+ // If the sender exceeds the max header list size by too much, -+ // skip parsing the fragment and close the connection. -+ // -+ // "Too much" is either any CONTINUATION frame after we've already -+ // exceeded the max header list size (in which case remainSize is 0), -+ // or a frame whose encoded size is more than twice the remaining -+ // header list bytes we're willing to accept. -+ if int64(len(frag)) > int64(2*remainSize) { -+ if VerboseLogs { -+ log.Printf("http2: header list too large") -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the struture of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ -+ // Also close the connection after any CONTINUATION frame following an -+ // invalid header, since we stop tracking the size of the headers after -+ // an invalid one. -+ if invalid != nil { -+ if VerboseLogs { -+ log.Printf("http2: invalid header: %v", invalid) -+ } -+ // It would be nice to send a RST_STREAM before sending the GOAWAY, -+ // but the struture of the server's frame writer makes this difficult. -+ return nil, ConnectionError(ErrCodeProtocol) -+ } -+ - if _, err := hdec.Write(frag); err != nil { - return nil, ConnectionError(ErrCodeCompression) - } --- -2.39.4 - diff --git a/SPECS/skopeo/CVE-2024-6104.patch b/SPECS/skopeo/CVE-2024-6104.patch deleted file mode 100644 index 879a134e1f..0000000000 --- a/SPECS/skopeo/CVE-2024-6104.patch +++ /dev/null @@ -1,81 +0,0 @@ -From b6bb7dacb0086d150cfbd44f1a636c871485b42d Mon Sep 17 00:00:00 2001 -From: Sindhu Karri -Date: Wed, 17 Jul 2024 08:35:51 +0000 -Subject: [PATCH] Fix CVE-2024-6104 - ---- - .../hashicorp/go-retryablehttp/client.go | 28 ++++++++++++++----- - 1 file changed, 21 insertions(+), 7 deletions(-) - -diff --git a/vendor/github.com/hashicorp/go-retryablehttp/client.go b/vendor/github.com/hashicorp/go-retryablehttp/client.go -index c9edbd0..1394fbc 100644 ---- a/vendor/github.com/hashicorp/go-retryablehttp/client.go -+++ b/vendor/github.com/hashicorp/go-retryablehttp/client.go -@@ -609,9 +609,9 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - if logger != nil { - switch v := logger.(type) { - case LeveledLogger: -- v.Debug("performing request", "method", req.Method, "url", req.URL) -+ v.Debug("performing request", "method", req.Method, "url", redactURL(req.URL)) - case Logger: -- v.Printf("[DEBUG] %s %s", req.Method, req.URL) -+ v.Printf("[DEBUG] %s %s", req.Method, redactURL(req.URL)) - } - } - -@@ -666,9 +666,9 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - if err != nil { - switch v := logger.(type) { - case LeveledLogger: -- v.Error("request failed", "error", err, "method", req.Method, "url", req.URL) -+ v.Error("request failed", "error", err, "method", req.Method, "url", redactURL(req.URL)) - case Logger: -- v.Printf("[ERR] %s %s request failed: %v", req.Method, req.URL, err) -+ v.Printf("[ERR] %s %s request failed: %v", req.Method, redactURL(req.URL), err) - } - } else { - // Call this here to maintain the behavior of logging all requests, -@@ -704,7 +704,7 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - - wait := c.Backoff(c.RetryWaitMin, c.RetryWaitMax, i, resp) - if logger != nil { -- desc := fmt.Sprintf("%s %s", req.Method, req.URL) -+ desc := fmt.Sprintf("%s %s", req.Method, redactURL(req.URL)) - if resp != nil { - desc = fmt.Sprintf("%s (status: %d)", desc, resp.StatusCode) - } -@@ -760,11 +760,11 @@ func (c *Client) Do(req *Request) (*http.Response, error) { - // communicate why - if err == nil { - return nil, fmt.Errorf("%s %s giving up after %d attempt(s)", -- req.Method, req.URL, attempt) -+ req.Method, redactURL(req.URL), attempt) - } - - return nil, fmt.Errorf("%s %s giving up after %d attempt(s): %w", -- req.Method, req.URL, attempt, err) -+ req.Method, redactURL(req.URL), attempt, err) - } - - // Try to read the response body so we can reuse this connection. -@@ -845,3 +845,17 @@ func (c *Client) StandardClient() *http.Client { - Transport: &RoundTripper{Client: c}, - } - } -+ -+// Taken from url.URL#Redacted() which was introduced in go 1.15. -+// We can switch to using it directly if we'll bump the minimum required go version. -+func redactURL(u *url.URL) string { -+ if u == nil { -+ return "" -+ } -+ -+ ru := *u -+ if _, has := ru.User.Password(); has { -+ ru.User = url.UserPassword(ru.User.Username(), "xxxxx") -+ } -+ return ru.String() -+} --- -2.33.8 - diff --git a/SPECS/skopeo/CVE-2024-9676.patch b/SPECS/skopeo/CVE-2024-9676.patch deleted file mode 100644 index 2de7c43f12..0000000000 --- a/SPECS/skopeo/CVE-2024-9676.patch +++ /dev/null @@ -1,182 +0,0 @@ -From d461620d47450c72d9f0da215606949272df3398 Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Sun, 10 Nov 2024 18:36:17 +0000 -Subject: [PATCH] Backport CVE-2024-9676 fix - -Patch from https://github.com/containers/storage/pull/2146 by Matt Heon ---- - .../github.com/containers/storage/.cirrus.yml | 2 +- - .../github.com/containers/storage/userns.go | 92 +++++++++++++------ - .../containers/storage/userns_unsupported.go | 14 +++ - 3 files changed, 80 insertions(+), 28 deletions(-) - create mode 100644 vendor/github.com/containers/storage/userns_unsupported.go - -diff --git a/vendor/github.com/containers/storage/.cirrus.yml b/vendor/github.com/containers/storage/.cirrus.yml -index c41dd5d..9e61509 100644 ---- a/vendor/github.com/containers/storage/.cirrus.yml -+++ b/vendor/github.com/containers/storage/.cirrus.yml -@@ -119,7 +119,7 @@ lint_task: - env: - CIRRUS_WORKING_DIR: "/go/src/github.com/containers/storage" - container: -- image: golang -+ image: golang:1.19 - modules_cache: - fingerprint_script: cat go.sum - folder: $GOPATH/pkg/mod -diff --git a/vendor/github.com/containers/storage/userns.go b/vendor/github.com/containers/storage/userns.go -index 32ae830..2c855da 100644 ---- a/vendor/github.com/containers/storage/userns.go -+++ b/vendor/github.com/containers/storage/userns.go -@@ -1,18 +1,21 @@ -+//go:build linux -+ - package storage - - import ( - "fmt" - "os" - "os/user" -- "path/filepath" - "strconv" - - drivers "github.com/containers/storage/drivers" - "github.com/containers/storage/pkg/idtools" - "github.com/containers/storage/pkg/unshare" - "github.com/containers/storage/types" -+ securejoin "github.com/cyphar/filepath-securejoin" - libcontainerUser "github.com/opencontainers/runc/libcontainer/user" - "github.com/sirupsen/logrus" -+ "golang.org/x/sys/unix" - ) - - // getAdditionalSubIDs looks up the additional IDs configured for -@@ -85,40 +88,59 @@ const nobodyUser = 65534 - // parseMountedFiles returns the maximum UID and GID found in the /etc/passwd and - // /etc/group files. - func parseMountedFiles(containerMount, passwdFile, groupFile string) uint32 { -+ var ( -+ passwd *os.File -+ group *os.File -+ size int -+ err error -+ ) - if passwdFile == "" { -- passwdFile = filepath.Join(containerMount, "etc/passwd") -- } -- if groupFile == "" { -- groupFile = filepath.Join(groupFile, "etc/group") -+ passwd, err = secureOpen(containerMount, "/etc/passwd") -+ } else { -+ // User-specified override from a volume. Will not be in -+ // container root. -+ passwd, err = os.Open(passwdFile) - } -- -- size := 0 -- -- users, err := libcontainerUser.ParsePasswdFile(passwdFile) - if err == nil { -- for _, u := range users { -- // Skip the "nobody" user otherwise we end up with 65536 -- // ids with most images -- if u.Name == "nobody" { -- continue -- } -- if u.Uid > size && u.Uid != nobodyUser { -- size = u.Uid -- } -- if u.Gid > size && u.Gid != nobodyUser { -- size = u.Gid -+ defer passwd.Close() -+ -+ users, err := libcontainerUser.ParsePasswd(passwd) -+ if err == nil { -+ for _, u := range users { -+ // Skip the "nobody" user otherwise we end up with 65536 -+ // ids with most images -+ if u.Name == "nobody" || u.Name == "nogroup" { -+ continue -+ } -+ if u.Uid > size && u.Uid != nobodyUser { -+ size = u.Uid + 1 -+ } -+ if u.Gid > size && u.Gid != nobodyUser { -+ size = u.Gid + 1 -+ } - } - } - } - -- groups, err := libcontainerUser.ParseGroupFile(groupFile) -+ if groupFile == "" { -+ group, err = secureOpen(containerMount, "/etc/group") -+ } else { -+ // User-specified override from a volume. Will not be in -+ // container root. -+ group, err = os.Open(groupFile) -+ } - if err == nil { -- for _, g := range groups { -- if g.Name == "nobody" { -- continue -- } -- if g.Gid > size && g.Gid != nobodyUser { -- size = g.Gid -+ defer group.Close() -+ -+ groups, err := libcontainerUser.ParseGroup(group) -+ if err == nil { -+ for _, g := range groups { -+ if g.Name == "nobody" || g.Name == "nogroup" { -+ continue -+ } -+ if g.Gid > size && g.Gid != nobodyUser { -+ size = g.Gid + 1 -+ } - } - } - } -@@ -309,3 +331,19 @@ func getAutoUserNSIDMappings( - gidMap := append(availableGIDs.zip(requestedContainerGIDs), additionalGIDMappings...) - return uidMap, gidMap, nil - } -+ -+// Securely open (read-only) a file in a container mount. -+func secureOpen(containerMount, file string) (*os.File, error) { -+ filePath, err := securejoin.SecureJoin(containerMount, file) -+ if err != nil { -+ return nil, err -+ } -+ -+ flags := unix.O_PATH | unix.O_CLOEXEC | unix.O_RDONLY -+ fileHandle, err := os.OpenFile(filePath, flags, 0) -+ if err != nil { -+ return nil, err -+ } -+ -+ return fileHandle, nil -+} -diff --git a/vendor/github.com/containers/storage/userns_unsupported.go b/vendor/github.com/containers/storage/userns_unsupported.go -new file mode 100644 -index 0000000..e37c18f ---- /dev/null -+++ b/vendor/github.com/containers/storage/userns_unsupported.go -@@ -0,0 +1,14 @@ -+//go:build !linux -+ -+package storage -+ -+import ( -+ "errors" -+ -+ "github.com/containers/storage/pkg/idtools" -+ "github.com/containers/storage/types" -+) -+ -+func (s *store) getAutoUserNS(_ *types.AutoUserNsOptions, _ *Image, _ rwLayerStore, _ []roLayerStore) ([]idtools.IDMap, []idtools.IDMap, error) { -+ return nil, nil, errors.New("user namespaces are not supported on this platform") -+} --- -2.39.4 - diff --git a/SPECS/skopeo/CVE-2025-27144.patch b/SPECS/skopeo/CVE-2025-27144.patch deleted file mode 100644 index 5b897aacac..0000000000 --- a/SPECS/skopeo/CVE-2025-27144.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 4da065cd7a4f7263e96bc7028f674c7730177035 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Fri, 28 Feb 2025 19:31:53 +0000 -Subject: [PATCH] CVE-2025-27144 -Upstream Reference: https://github.com/go-jose/go-jose/commit/5253038e3b5f64a2200b5b6c72107bf9823f4358 - ---- - vendor/github.com/go-jose/go-jose/v3/jwe.go | 5 +++-- - vendor/github.com/go-jose/go-jose/v3/jws.go | 5 +++-- - vendor/gopkg.in/go-jose/go-jose.v2/jwe.go | 5 +++-- - vendor/gopkg.in/go-jose/go-jose.v2/jws.go | 5 +++-- - 4 files changed, 12 insertions(+), 8 deletions(-) - -diff --git a/vendor/github.com/go-jose/go-jose/v3/jwe.go b/vendor/github.com/go-jose/go-jose/v3/jwe.go -index 4267ac7..1ba4ae0 100644 ---- a/vendor/github.com/go-jose/go-jose/v3/jwe.go -+++ b/vendor/github.com/go-jose/go-jose/v3/jwe.go -@@ -202,10 +202,11 @@ func (parsed *rawJSONWebEncryption) sanitized() (*JSONWebEncryption, error) { - - // parseEncryptedCompact parses a message in compact format. - func parseEncryptedCompact(input string) (*JSONWebEncryption, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 5 { -+ // Five parts is four separators -+ if strings.Count(input, ".") != 4 { - return nil, fmt.Errorf("go-jose/go-jose: compact JWE format must have five parts") - } -+ parts := strings.SplitN(input, ".", 5) - - rawProtected, err := base64URLDecode(parts[0]) - if err != nil { -diff --git a/vendor/github.com/go-jose/go-jose/v3/jws.go b/vendor/github.com/go-jose/go-jose/v3/jws.go -index e37007d..401fc18 100644 ---- a/vendor/github.com/go-jose/go-jose/v3/jws.go -+++ b/vendor/github.com/go-jose/go-jose/v3/jws.go -@@ -275,10 +275,11 @@ func (parsed *rawJSONWebSignature) sanitized() (*JSONWebSignature, error) { - - // parseSignedCompact parses a message in compact format. - func parseSignedCompact(input string, payload []byte) (*JSONWebSignature, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 3 { -+ // Three parts is two separators -+ if strings.Count(input, ".") != 2 { - return nil, fmt.Errorf("go-jose/go-jose: compact JWS format must have three parts") - } -+ parts := strings.SplitN(input, ".", 3) - - if parts[1] != "" && payload != nil { - return nil, fmt.Errorf("go-jose/go-jose: payload is not detached") -diff --git a/vendor/gopkg.in/go-jose/go-jose.v2/jwe.go b/vendor/gopkg.in/go-jose/go-jose.v2/jwe.go -index a8966ab..faebb8d 100644 ---- a/vendor/gopkg.in/go-jose/go-jose.v2/jwe.go -+++ b/vendor/gopkg.in/go-jose/go-jose.v2/jwe.go -@@ -201,10 +201,11 @@ func (parsed *rawJSONWebEncryption) sanitized() (*JSONWebEncryption, error) { - - // parseEncryptedCompact parses a message in compact format. - func parseEncryptedCompact(input string) (*JSONWebEncryption, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 5 { -+ // Five parts is four separators -+ if strings.Count(input, ".") != 4 { - return nil, fmt.Errorf("go-jose/go-jose: compact JWE format must have five parts") - } -+ parts := strings.SplitN(input, ".", 5) - - rawProtected, err := base64.RawURLEncoding.DecodeString(parts[0]) - if err != nil { -diff --git a/vendor/gopkg.in/go-jose/go-jose.v2/jws.go b/vendor/gopkg.in/go-jose/go-jose.v2/jws.go -index 1a24fa4..717f04a 100644 ---- a/vendor/gopkg.in/go-jose/go-jose.v2/jws.go -+++ b/vendor/gopkg.in/go-jose/go-jose.v2/jws.go -@@ -275,10 +275,11 @@ func (parsed *rawJSONWebSignature) sanitized() (*JSONWebSignature, error) { - - // parseSignedCompact parses a message in compact format. - func parseSignedCompact(input string, payload []byte) (*JSONWebSignature, error) { -- parts := strings.Split(input, ".") -- if len(parts) != 3 { -+ // Three parts is two separators -+ if strings.Count(input, ".") != 2 { - return nil, fmt.Errorf("go-jose/go-jose: compact JWS format must have three parts") - } -+ parts := strings.SplitN(input, ".", 3) - - if parts[1] != "" && payload != nil { - return nil, fmt.Errorf("go-jose/go-jose: payload is not detached") --- -2.45.2 - diff --git a/SPECS/skopeo/skopeo.signatures.json b/SPECS/skopeo/skopeo.signatures.json deleted file mode 100644 index 5e2d898f70..0000000000 --- a/SPECS/skopeo/skopeo.signatures.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Signatures": { - "skopeo-1.14.4.tar.gz": "5523a9b91516a400cbdf6a2df86a06d5cb2313ea8b3102afd7751427e3d8b0b0" - } -} diff --git a/SPECS/skopeo/skopeo.spec b/SPECS/skopeo/skopeo.spec deleted file mode 100644 index 7dc7aa6d30..0000000000 --- a/SPECS/skopeo/skopeo.spec +++ /dev/null @@ -1,127 +0,0 @@ -Summary: Inspect container images and repositories on registries -Name: skopeo -Version: 1.14.4 -Release: 6%{?dist} -License: Apache-2.0 -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: Applications/Tools -URL: https://github.com/containers/skopeo -Source0: https://github.com/containers/skopeo/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -Patch0: CVE-2022-2879.patch -Patch1: CVE-2024-6104.patch -Patch2: CVE-2023-45288.patch -Patch3: CVE-2024-9676.patch -Patch4: CVE-2025-27144.patch - -%global debug_package %{nil} -%define our_gopath %{_topdir}/.gopath -BuildRequires: btrfs-progs-devel -BuildRequires: device-mapper-devel -BuildRequires: go-md2man -BuildRequires: golang >= 1.18 -BuildRequires: gpgme-devel -BuildRequires: libassuan-devel -BuildRequires: pkgconfig -Requires: libcontainers-common - -%description -Command line utility to inspect images and repositories directly on Docker -registries without the need to pull them. - -%prep -%autosetup -p1 - -%build -export GOPATH=%{our_gopath} -make - -%install -make PREFIX=%{buildroot}%{_prefix} install-binary install-docs - -%check -make test-unit-local -./bin/skopeo --version - -%files -%defattr(-,root,root) -%license LICENSE -%doc README.md -%{_bindir}/%{name} -%{_mandir}/man1/%%{name}* - -%changelog -* Fri May 30 2025 Ranjan Dutta - 1.14.4-6 -- merge from Azure Linux 3.0.20250521-3.0 -- Remove extraction command from build -- Fix CVE-2025-27144 with an upstream patch - -* Fri Apr 28 2025 Ranjan Dutta - 1.14.4-5 -- merge from Azure Linux tag 3.0.20250423-3.0 - -* Fri Mar 21 2025 Anuj Mittal - 1.14.4-4 -- Bump Release to rebuild - -* Mon Nov 11 2024 Rohit Rawat - 1.14.4-3 -- Fix CVE-2023-45288 and CVE-2024-9676 - -* Fri Aug 02 2024 Sindhu Karri - 1.14.4-2 -- Fix CVE-2024-6104 in github.com/hashicorp/go-retryablehttp with a patch - -* Thu Jun 27 2024 Nicolas Guibourge - 1.14.4-1 -- Upgrade to v1.14.4, address CVE-2022-2879 - -* Tue Jan 30 2024 Henry Li - 1.14.1-1 -- Upgrade to v1.14.1 - -* Tue Oct 17 2023 Neha Agarwal - 1.13.3-1 -- Update to v1.13.3 to fix CVE-2023-33199 in rekor. - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 1.12.0-5 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 1.12.0-4 -- Bump release to rebuild with updated version of Go. - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.12.0-3 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 1.12.0-2 -- Bump release to rebuild with go 1.19.11 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.12.0-1 -- Bump skopeo version to 1.12.0 - upgrade to latest - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 1.11.0-5 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 1.11.0-4 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 1.11.0-3 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 1.11.0-2 -- Bump release to rebuild with go 1.19.6 - -* Wed Feb 15 2023 CBL-Mariner Servicing Account - 1.11.0-1 -- Auto-upgrade to 1.11.0 - upgrade to latest - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 1.9.1-6 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 1.9.1-5 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 1.9.1-4 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Nov 01 2022 Olivia Crain - 1.9.1-3 -- Bump release to rebuild with go 1.18.8 - -* Mon Aug 22 2022 Olivia Crain - 1.9.1-2 -- Bump release to rebuild against Go 1.18.5 - -* Tue Jul 26 2022 Tom Fay - 1.9.1-1 -- Original version for CBL-Mariner. -- License verified. diff --git a/SPECS/sriov-network-device-plugin/CVE-2024-45338.patch b/SPECS/sriov-network-device-plugin/CVE-2024-45338.patch deleted file mode 100644 index 826ea3904d..0000000000 --- a/SPECS/sriov-network-device-plugin/CVE-2024-45338.patch +++ /dev/null @@ -1,63 +0,0 @@ -From fac891dc1fe53f118a2669795aaf5db15b4f1558 Mon Sep 17 00:00:00 2001 -From: Rohit Rawat -Date: Thu, 2 Jan 2025 10:22:13 +0000 -Subject: [PATCH] Fix CVE CVE-2024-45338 in sriov-network-device-plugin - ---- - vendor/golang.org/x/net/html/doctype.go | 2 +- - vendor/golang.org/x/net/html/foreign.go | 3 +-- - vendor/golang.org/x/net/html/parse.go | 4 ++-- - 3 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go -index c484e5a..bca3ae9 100644 ---- a/vendor/golang.org/x/net/html/doctype.go -+++ b/vendor/golang.org/x/net/html/doctype.go -@@ -87,7 +87,7 @@ func parseDoctype(s string) (n *Node, quirks bool) { - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && -- strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { -+ strings.EqualFold(lastAttr.Val, "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") { - quirks = true - } - } -diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go -index 9da9e9d..e8515d8 100644 ---- a/vendor/golang.org/x/net/html/foreign.go -+++ b/vendor/golang.org/x/net/html/foreign.go -@@ -40,8 +40,7 @@ func htmlIntegrationPoint(n *Node) bool { - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { -- val := strings.ToLower(a.Val) -- if val == "text/html" || val == "application/xhtml+xml" { -+ if strings.EqualFold(a.Val, "text/html") || strings.EqualFold(a.Val, "application/xhtml+xml") { - return true - } - } -diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go -index 46a89ed..5b8374b 100644 ---- a/vendor/golang.org/x/net/html/parse.go -+++ b/vendor/golang.org/x/net/html/parse.go -@@ -1031,7 +1031,7 @@ func inBodyIM(p *parser) bool { - if p.tok.DataAtom == a.Input { - for _, t := range p.tok.Attr { - if t.Key == "type" { -- if strings.ToLower(t.Val) == "hidden" { -+ if strings.EqualFold(t.Val, "hidden") { - // Skip setting framesetOK = false - return true - } -@@ -1459,7 +1459,7 @@ func inTableIM(p *parser) bool { - return inHeadIM(p) - case a.Input: - for _, t := range p.tok.Attr { -- if t.Key == "type" && strings.ToLower(t.Val) == "hidden" { -+ if t.Key == "type" && strings.EqualFold(t.Val, "hidden") { - p.addElement() - p.oe.pop() - return true --- -2.39.4 - diff --git a/SPECS/sriov-network-device-plugin/CVE-2024-45339.patch b/SPECS/sriov-network-device-plugin/CVE-2024-45339.patch deleted file mode 100644 index c5161cf820..0000000000 --- a/SPECS/sriov-network-device-plugin/CVE-2024-45339.patch +++ /dev/null @@ -1,119 +0,0 @@ -From afd4339ec8682b92eb6bcc870d138106ffd5f58d Mon Sep 17 00:00:00 2001 -From: kavyasree -Date: Fri, 31 Jan 2025 21:16:51 +0530 -Subject: [PATCH] Patch CVE-2024-45339 - -Reference: https://github.com/golang/glog/pull/74 ---- - vendor/github.com/golang/glog/glog_file.go | 60 ++++++++++++++++------ - 1 file changed, 44 insertions(+), 16 deletions(-) - -diff --git a/vendor/github.com/golang/glog/glog_file.go b/vendor/github.com/golang/glog/glog_file.go -index e7d125c..6d239fa 100644 ---- a/vendor/github.com/golang/glog/glog_file.go -+++ b/vendor/github.com/golang/glog/glog_file.go -@@ -118,32 +118,53 @@ var onceLogDirs sync.Once - // contains tag ("INFO", "FATAL", etc.) and t. If the file is created - // successfully, create also attempts to update the symlink for that tag, ignoring - // errors. --func create(tag string, t time.Time) (f *os.File, filename string, err error) { -+func create(tag string, t time.Time, dir string) (f *os.File, filename string, err error) { -+ if dir != "" { -+ f, name, err := createInDir(dir, tag, t) -+ if err == nil { -+ return f, name, err -+ } -+ return nil, "", fmt.Errorf("log: cannot create log: %v", err) -+ } -+ - onceLogDirs.Do(createLogDirs) - if len(logDirs) == 0 { - return nil, "", errors.New("log: no log dirs") - } -- name, link := logName(tag, t) - var lastErr error - for _, dir := range logDirs { -- fname := filepath.Join(dir, name) -- f, err := os.Create(fname) -+ f, name, err := createInDir(dir, tag, t) - if err == nil { -- symlink := filepath.Join(dir, link) -- os.Remove(symlink) // ignore err -- os.Symlink(name, symlink) // ignore err -- if *logLink != "" { -- lsymlink := filepath.Join(*logLink, link) -- os.Remove(lsymlink) // ignore err -- os.Symlink(fname, lsymlink) // ignore err -- } -- return f, fname, nil -+ return f, name, err - } - lastErr = err - } - return nil, "", fmt.Errorf("log: cannot create log: %v", lastErr) - } - -+func createInDir(dir, tag string, t time.Time) (f *os.File, name string, err error) { -+ name, link := logName(tag, t) -+ fname := filepath.Join(dir, name) -+ // O_EXCL is important here, as it prevents a vulnerability. The general idea is that logs often -+ // live in an insecure directory (like /tmp), so an unprivileged attacker could create fname in -+ // advance as a symlink to a file the logging process can access, but the attacker cannot. O_EXCL -+ // fails the open if it already exists, thus prevent our this code from opening the existing file -+ // the attacker points us to. -+ f, err = os.OpenFile(fname, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666) -+ if err == nil { -+ symlink := filepath.Join(dir, link) -+ os.Remove(symlink) // ignore err -+ os.Symlink(name, symlink) // ignore err -+ if *logLink != "" { -+ lsymlink := filepath.Join(*logLink, link) -+ os.Remove(lsymlink) // ignore err -+ os.Symlink(fname, lsymlink) // ignore err -+ } -+ return f, fname, nil -+ } -+ return nil, "", err -+} -+ - // flushSyncWriter is the interface satisfied by logging destinations. - type flushSyncWriter interface { - Flush() error -@@ -247,6 +268,7 @@ type syncBuffer struct { - names []string - sev logsink.Severity - nbytes uint64 // The number of bytes written to this file -+ madeAt time.Time - } - - func (sb *syncBuffer) Sync() error { -@@ -254,9 +276,14 @@ func (sb *syncBuffer) Sync() error { - } - - func (sb *syncBuffer) Write(p []byte) (n int, err error) { -+ // Rotate the file if it is too large, but ensure we only do so, -+ // if rotate doesn't create a conflicting filename. - if sb.nbytes+uint64(len(p)) >= MaxSize { -- if err := sb.rotateFile(time.Now()); err != nil { -- return 0, err -+ now := timeNow() -+ if now.After(sb.madeAt.Add(1*time.Second)) || now.Second() != sb.madeAt.Second() { -+ if err := sb.rotateFile(now); err != nil { -+ return 0, err -+ } - } - } - n, err = sb.Writer.Write(p) -@@ -274,7 +301,8 @@ const footer = "\nCONTINUED IN NEXT FILE\n" - func (sb *syncBuffer) rotateFile(now time.Time) error { - var err error - pn := "" -- file, name, err := create(sb.sev.String(), now) -+ file, name, err := create(sb.sev.String(), now, "") -+ sb.madeAt = now - - if sb.file != nil { - // The current log file becomes the previous log at the end of --- -2.34.1 - diff --git a/SPECS/sriov-network-device-plugin/CVE-2025-22872.patch b/SPECS/sriov-network-device-plugin/CVE-2025-22872.patch deleted file mode 100644 index a9203f2a9a..0000000000 --- a/SPECS/sriov-network-device-plugin/CVE-2025-22872.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 01035da6c5be2080f75765d9ebbb462614d7e81a Mon Sep 17 00:00:00 2001 -From: jykanase -Date: Tue, 22 Apr 2025 08:15:38 +0000 -Subject: [PATCH] CVE-2025-22872 - -Upstream patch reference: https://github.com/golang/net/commit/e1fcd82abba34df74614020343be8eb1fe85f0d9 ---- - vendor/golang.org/x/net/html/token.go | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go -index 3c57880..6598c1f 100644 ---- a/vendor/golang.org/x/net/html/token.go -+++ b/vendor/golang.org/x/net/html/token.go -@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType { - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } -- // Look for a self-closing token like "
". -- if z.err == nil && z.buf[z.raw.end-2] == '/' { -+ // Look for a self-closing token (e.g.
). -+ // -+ // Originally, we did this by just checking that the last character of the -+ // tag (ignoring the closing bracket) was a solidus (/) character, but this -+ // is not always accurate. -+ // -+ // We need to be careful that we don't misinterpret a non-self-closing tag -+ // as self-closing, as can happen if the tag contains unquoted attribute -+ // values (i.e.

). -+ // -+ // To avoid this, we check that the last non-bracket character of the tag -+ // (z.raw.end-2) isn't the same character as the last non-quote character of -+ // the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has -+ // attributes. -+ nAttrs := len(z.attr) -+ if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) { - return SelfClosingTagToken - } - return StartTagToken --- -2.45.2 - diff --git a/SPECS/sriov-network-device-plugin/generate_source_tarball.sh b/SPECS/sriov-network-device-plugin/generate_source_tarball.sh deleted file mode 100755 index d85e60ba17..0000000000 --- a/SPECS/sriov-network-device-plugin/generate_source_tarball.sh +++ /dev/null @@ -1,94 +0,0 @@ -#!/bin/bash -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -set -e - -get_param() { - if [ -n "$2" ] && [ "${2:0:1}" != "-" ]; then - echo "$2" - else - echo "Error: argument for ($1) is missing." >&2 - return 1 - fi -} - -PKG_VERSION="" -SRC_TARBALL="" -OUT_FOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# parameters: -# -# --srcTarball : src tarball file -# --outFolder : folder where to copy the new tarball(s) -# --pkgVersion : package version -# -while (( "$#" )); do - case "$1" in - --srcTarball) - SRC_TARBALL="$(get_param "$1" "$2")" - shift 2 - ;; - --outFolder) - OUT_FOLDER="$(get_param "$1" "$2")" - shift 2 - ;; - --pkgVersion) - PKG_VERSION="$(get_param "$1" "$2")" - shift 2 - ;; - -*) - echo "Error: unsupported flag $1." >&2 - exit 1 - ;; - esac -done - -echo "--srcTarball -> $SRC_TARBALL" -echo "--outFolder -> $OUT_FOLDER" -echo "--pkgVersion -> $PKG_VERSION" - -if [ -z "$PKG_VERSION" ]; then - echo "Error: --pkgVersion parameter cannot be empty." >&2 - exit 1 -fi - -if [ ! -f "$SRC_TARBALL" ]; then - echo "Error: --srcTarball is not a file." >&2 - exit 1 -fi - -SRC_TARBALL="$(realpath "$SRC_TARBALL")" -OUT_FOLDER="$(realpath "$OUT_FOLDER")" - -echo "Creating a tempdir." -tmpdir=$(mktemp -d) -function cleanup { - echo "Clean-up: removing tempdir ($tmpdir)." - rm -rf "$tmpdir" -} -trap cleanup EXIT - -pushd "$tmpdir" > /dev/null - -NAME_VER="sriov-network-device-plugin-$PKG_VERSION" -VENDOR_TARBALL="$(realpath "$OUT_FOLDER/$NAME_VER-vendor.tar.gz")" - -echo "Unpacking the source tarball." -tar -xf "$SRC_TARBALL" - -cd "$NAME_VER" -echo "Getting the vendored modules." -go mod vendor - -mkdir -p "$OUT_FOLDER" - -echo "Tar vendored modules." -tar --sort=name \ - --mtime="2021-04-26 00:00Z" \ - --owner=0 --group=0 --numeric-owner \ - --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ - -czf "$VENDOR_TARBALL" vendor - -echo "sriov-network-device-plugin vendored modules are available at ($VENDOR_TARBALL)." -echo "SHA256: $(sha256sum "$VENDOR_TARBALL")." diff --git a/SPECS/sriov-network-device-plugin/sriov-network-device-plugin.signatures.json b/SPECS/sriov-network-device-plugin/sriov-network-device-plugin.signatures.json deleted file mode 100644 index ab556ee37a..0000000000 --- a/SPECS/sriov-network-device-plugin/sriov-network-device-plugin.signatures.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "Signatures": { - "sriov-network-device-plugin-3.7.0-vendor.tar.gz": "6fc30173218586a9e41267afe91eeebf8c5318efc49a7944056e4e2f9cd17988", - "sriov-network-device-plugin-3.7.0.tar.gz": "bc07ed20477135da3a1f3504dd5050cd2cad875dfd92525173d626a5dfa3dc86" - } -} diff --git a/SPECS/sriov-network-device-plugin/sriov-network-device-plugin.spec b/SPECS/sriov-network-device-plugin/sriov-network-device-plugin.spec deleted file mode 100644 index 2704aff5f7..0000000000 --- a/SPECS/sriov-network-device-plugin/sriov-network-device-plugin.spec +++ /dev/null @@ -1,103 +0,0 @@ -Summary: Plugin for discovering and advertising networking resources -Name: sriov-network-device-plugin -Version: 3.7.0 -Release: 5%{?dist} -License: MIT -Vendor: Microsoft Corporation -Distribution: Azure Linux -URL: https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin -Source0: https://github.com/k8snetworkplumbingwg/%{name}/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -Source1: %{name}-%{version}-vendor.tar.gz -Patch0: CVE-2024-45338.patch -Patch1: CVE-2024-45339.patch -Patch2: CVE-2025-22872.patch -BuildRequires: golang -Requires: gawk -Requires: hwdata - -%description -sriov-network-device-plugin is Kubernetes device plugin for discovering and advertising networking -resources in the form of SR-IOV virtual functions and PCI physical functions - -%prep -%autosetup -N -tar -xf %{SOURCE1} -%autopatch -p1 - -%build -go build -mod vendor -o ./build/sriovdp ./cmd/sriovdp/ - -%install -install -D -m0755 build/sriovdp %{buildroot}%{_bindir}/sriovdp -install -D -m0755 images/entrypoint.sh %{buildroot}%{_bindir}/%{name}-entrypoint.sh -install -D -m0755 images/ddptool-1.0.1.12.tar.gz %{buildroot}%{_datadir}/%{name}/ddptool-1.0.1.12.tar.gz - -%files -%license LICENSE -%doc README.md -%{_bindir}/sriovdp -%{_bindir}/%{name}-entrypoint.sh -%{_datadir}/%{name}/ddptool-1.0.1.12.tar.gz - -%changelog -* Fri May 30 2025 Ranjan Dutta - 3.7.0-5 -- merge from Azure Linux 3.0.20250521-3.0 -- Patch CVE-2025-22872 - -* Fri Mar 21 2025 Anuj Mittal - 3.7.0-4 -- Bump Release to rebuild - -* Fri Jan 31 2025 Kavya Sree Kaitepalli - 3.7.0-3 -- Patch CVE-2024-45339 - -* Tue Dec 31 2024 Rohit Rawat - 3.7.0-2 -- Patch CVE-2024-45338 - -* Thu Jun 06 2024 CBL-Mariner Servicing Account - 3.7.0-1 -- Auto-upgrade to 3.7.0 - address CVE-2022-1996 - -* Mon Oct 16 2023 CBL-Mariner Servicing Account - 3.5.1-3 -- Bump release to rebuild with go 1.20.10 - -* Tue Oct 10 2023 Dan Streetman - 3.5.1-2 -- Bump release to rebuild with updated version of Go. - -* Thu Sep 28 2023 Aditya Dubey - 3.5.1-1 -- Upgrade to v3.5.1 - -* Mon Aug 07 2023 CBL-Mariner Servicing Account - 3.4.0-12 -- Bump release to rebuild with go 1.19.12 - -* Thu Jul 13 2023 CBL-Mariner Servicing Account - 3.4.0-11 -- Bump release to rebuild with go 1.19.11 - -* Thu Jun 15 2023 CBL-Mariner Servicing Account - 3.4.0-10 -- Bump release to rebuild with go 1.19.10 - -* Wed Apr 05 2023 CBL-Mariner Servicing Account - 3.4.0-9 -- Bump release to rebuild with go 1.19.8 - -* Tue Mar 28 2023 CBL-Mariner Servicing Account - 3.4.0-8 -- Bump release to rebuild with go 1.19.7 - -* Wed Mar 15 2023 CBL-Mariner Servicing Account - 3.4.0-7 -- Bump release to rebuild with go 1.19.6 - -* Fri Feb 03 2023 CBL-Mariner Servicing Account - 3.4.0-6 -- Bump release to rebuild with go 1.19.5 - -* Wed Jan 18 2023 CBL-Mariner Servicing Account - 3.4.0-5 -- Bump release to rebuild with go 1.19.4 - -* Fri Dec 16 2022 Daniel McIlvaney - 3.4.0-4 -- Bump release to rebuild with go 1.18.8 with patch for CVE-2022-41717 - -* Tue Dec 06 2022 Aditya Dubey - 3.4.0-3 -- Adding in the hwdata and gawk dependencies - -* Tue Nov 01 2022 Olivia Crain - 3.4.0-2 -- Bump release to rebuild with go 1.18.8 - -* Fri Sep 23 2022 Aditya Dubey - 3.4.0-1 -- Original version for CBL-Mariner -- License Verified diff --git a/SPECS/stunnel/Certificate-Creation b/SPECS/stunnel/Certificate-Creation new file mode 100644 index 0000000000..16d86f9659 --- /dev/null +++ b/SPECS/stunnel/Certificate-Creation @@ -0,0 +1,9 @@ +To generate a key and self signed certificate, execute the following commands: + +cd /etc/pki/tls/certs +make stunnel.pem + +Note that by default, the file containing the key and certificate has its +permissions set to 0600, which means that any service using it needs to be +started as root in order to read it. Such a service should be configured +to switch UIDs using stunnel's "-s" flag. diff --git a/SPECS/stunnel/pop3-redirect.xinetd b/SPECS/stunnel/pop3-redirect.xinetd new file mode 100644 index 0000000000..73b95ad482 --- /dev/null +++ b/SPECS/stunnel/pop3-redirect.xinetd @@ -0,0 +1,17 @@ +# default: off +# description: The POP3 redirector allows client software which does not have \ +# native support for SSL to connect to the local machine's POP3 \ +# port and have the connection forwarded over the network using \ +# SSL. You will need to modify stunnel-pop3s-client.conf to \ +# specify the server to connect to in order for this to be useful. +service pop3 +{ + disable = yes + socket_type = stream + wait = no + user = root + server = /usr/sbin/stunnel + server_args = /etc/stunnel/stunnel-pop3s-client.conf + log_on_success += USERID + log_on_failure += USERID +} diff --git a/SPECS/stunnel/sfinger.xinetd b/SPECS/stunnel/sfinger.xinetd new file mode 100644 index 0000000000..39a91f57f9 --- /dev/null +++ b/SPECS/stunnel/sfinger.xinetd @@ -0,0 +1,11 @@ +# Not that anyone in their right mind would tunnel the finger protocol over +# SSL, but here's how to do it using xinetd.... +service sfinger +{ + disable = yes + socket_type = stream + wait = no + user = root + server = /usr/sbin/stunnel + server_args = /etc/stunnel/stunnel-sfinger.conf +} diff --git a/SPECS/stunnel/stunnel-5.50-authpriv.patch b/SPECS/stunnel/stunnel-5.50-authpriv.patch new file mode 100644 index 0000000000..dbb3b434b8 --- /dev/null +++ b/SPECS/stunnel/stunnel-5.50-authpriv.patch @@ -0,0 +1,73 @@ +From cfbf803dd3338a915f41bdfded69b34e7f21403d Mon Sep 17 00:00:00 2001 +From: Tomas Mraz +Date: Mon, 12 Sep 2022 11:07:38 +0200 +Subject: [PATCH 1/7] Apply patch stunnel-5.50-authpriv.patch + +Patch-name: stunnel-5.50-authpriv.patch +Patch-id: 0 +From-dist-git-commit: 70b3076eb09912b3a11f371b8c523303114fffa3 +--- + doc/stunnel.8.in | 2 +- + doc/stunnel.html.in | 2 +- + doc/stunnel.pod.in | 2 +- + src/options.c | 4 ++++ + 4 files changed, 7 insertions(+), 3 deletions(-) + +diff --git a/doc/stunnel.8.in b/doc/stunnel.8.in +index 8cd8bc0..b5d7d75 100644 +--- a/doc/stunnel.8.in ++++ b/doc/stunnel.8.in +@@ -209,7 +209,7 @@ requested to do so by an stunnel developer, or when you intend to get confused. + .Sp + The default logging level is notice (5). + .Sp +-The syslog 'daemon' facility will be used unless a facility name is supplied. ++The syslog 'authpriv' facility will be used unless a facility name is supplied. + (Facilities are not supported on Win32.) + .Sp + Case is ignored for both facilities and levels. +diff --git a/doc/stunnel.html.in b/doc/stunnel.html.in +index a7931aa..cda5993 100644 +--- a/doc/stunnel.html.in ++++ b/doc/stunnel.html.in +@@ -248,7 +248,7 @@ + +

The default logging level is notice (5).

+ +-

The syslog 'daemon' facility will be used unless a facility name is supplied. (Facilities are not supported on Win32.)

++

The syslog 'authpriv' facility will be used unless a facility name is supplied. (Facilities are not supported on Win32.)

+ +

Case is ignored for both facilities and levels.

+ +diff --git a/doc/stunnel.pod.in b/doc/stunnel.pod.in +index a54b25d..f830cf3 100644 +--- a/doc/stunnel.pod.in ++++ b/doc/stunnel.pod.in +@@ -197,7 +197,7 @@ requested to do so by an stunnel developer, or when you intend to get confused. + + The default logging level is notice (5). + +-The syslog 'daemon' facility will be used unless a facility name is supplied. ++The syslog 'authpriv' facility will be used unless a facility name is supplied. + (Facilities are not supported on Win32.) + + Case is ignored for both facilities and levels. +diff --git a/src/options.c b/src/options.c +index 5f8ad8b..6e4a18b 100644 +--- a/src/options.c ++++ b/src/options.c +@@ -1960,7 +1960,11 @@ NOEXPORT const char *parse_service_option(CMD cmd, SERVICE_OPTIONS **section_ptr + case CMD_SET_DEFAULTS: + section->log_level=LOG_NOTICE; + #if !defined (USE_WIN32) && !defined (__vms) ++#if defined(LOG_AUTHPRIV) ++ new_global_options.log_facility=LOG_AUTHPRIV; ++#else + new_global_options.log_facility=LOG_DAEMON; ++#endif + #endif + break; + case CMD_SET_COPY: +-- +2.39.2 + diff --git a/SPECS/stunnel/stunnel-5.56-curves-doc-update.patch b/SPECS/stunnel/stunnel-5.56-curves-doc-update.patch new file mode 100644 index 0000000000..884b53c990 --- /dev/null +++ b/SPECS/stunnel/stunnel-5.56-curves-doc-update.patch @@ -0,0 +1,97 @@ +From 2d720572b081397b187f502980bb57a8301f06f0 Mon Sep 17 00:00:00 2001 +From: Sahana Prasad +Date: Mon, 12 Sep 2022 11:07:38 +0200 +Subject: [PATCH 5/5] Apply patch stunnel-5.56-curves-doc-update.patch + +Patch-name: stunnel-5.56-curves-doc-update.patch +Patch-id: 6 +From-dist-git-commit: 70b3076eb09912b3a11f371b8c523303114fffa3 +--- + doc/stunnel.8.in | 2 ++ + doc/stunnel.html.in | 2 ++ + doc/stunnel.pl.8.in | 2 ++ + doc/stunnel.pl.html.in | 2 ++ + doc/stunnel.pl.pod.in | 2 ++ + doc/stunnel.pod.in | 2 ++ + 6 files changed, 12 insertions(+) + +diff --git a/doc/stunnel.8.in b/doc/stunnel.8.in +index e74e174..03b503b 100644 +--- a/doc/stunnel.8.in ++++ b/doc/stunnel.8.in +@@ -490,6 +490,8 @@ This file contains multiple CRLs, used with the \fIverifyChain\fR and + .IX Item "curves = list" + ECDH curves separated with ':' + .Sp ++Note: This option is supported for server mode sockets only. ++.Sp + Only a single curve name is allowed for OpenSSL older than 1.1.1. + .Sp + To get a list of supported curves use: +diff --git a/doc/stunnel.html.in b/doc/stunnel.html.in +index df0efdd..385ac8d 100644 +--- a/doc/stunnel.html.in ++++ b/doc/stunnel.html.in +@@ -596,6 +596,8 @@ + +

ECDH curves separated with ':'

+ ++

Note: This option is supported for server mode sockets only.

++ +

Only a single curve name is allowed for OpenSSL older than 1.1.1.

+ +

To get a list of supported curves use:

+diff --git a/doc/stunnel.pl.8.in b/doc/stunnel.pl.8.in +index 4efe602..9683b4c 100644 +--- a/doc/stunnel.pl.8.in ++++ b/doc/stunnel.pl.8.in +@@ -494,6 +494,8 @@ przez opcje \fIverifyChain\fR i \fIverifyPeer\fR. + .IX Item "curves = lista" + krzywe ECDH odddzielone ':' + .Sp ++Uwaga: ta opcja wpływa tylko na gniazda w trybie serwera. ++.Sp + Wersje OpenSSL starsze niż 1.1.1 pozwalają na użycie tylko jednej krzywej. + .Sp + Listę dostępnych krzywych można uzyskać poleceniem: +diff --git a/doc/stunnel.pl.html.in b/doc/stunnel.pl.html.in +index 8e40042..3025e9f 100644 +--- a/doc/stunnel.pl.html.in ++++ b/doc/stunnel.pl.html.in +@@ -586,6 +586,8 @@ + +

krzywe ECDH odddzielone ':'

+ ++

Uwaga: ta opcja wpływa tylko na gniazda w trybie serwera.

++ +

Wersje OpenSSL starsze niż 1.1.1 pozwalają na użycie tylko jednej krzywej.

+ +

Listę dostępnych krzywych można uzyskać poleceniem:

+diff --git a/doc/stunnel.pl.pod.in b/doc/stunnel.pl.pod.in +index 4419f9f..c48387a 100644 +--- a/doc/stunnel.pl.pod.in ++++ b/doc/stunnel.pl.pod.in +@@ -535,6 +535,8 @@ przez opcje I i I. + + krzywe ECDH odddzielone ':' + ++Uwaga: ta opcja wpływa tylko na gniazda w trybie serwera. ++ + Wersje OpenSSL starsze niż 1.1.1 pozwalają na użycie tylko jednej krzywej. + + Listę dostępnych krzywych można uzyskać poleceniem: +diff --git a/doc/stunnel.pod.in b/doc/stunnel.pod.in +index 1a49d42..7a92697 100644 +--- a/doc/stunnel.pod.in ++++ b/doc/stunnel.pod.in +@@ -533,6 +533,8 @@ I options. + + ECDH curves separated with ':' + ++Note: This option is supported for server mode sockets only. ++ + Only a single curve name is allowed for OpenSSL older than 1.1.1. + + To get a list of supported curves use: +-- +2.46.0 diff --git a/SPECS/stunnel/stunnel-5.56.tar.gz.asc b/SPECS/stunnel/stunnel-5.56.tar.gz.asc new file mode 100644 index 0000000000..6142f0f8f6 --- /dev/null +++ b/SPECS/stunnel/stunnel-5.56.tar.gz.asc @@ -0,0 +1,18 @@ +-----BEGIN PGP SIGNATURE----- + +iQKTBAABCgB9FiEEK8fk5n48wMG+py+MLvx/8NQW4BQFAl3YIPhfFIAAAAAALgAo +aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDJC +QzdFNEU2N0UzQ0MwQzFCRUE3MkY4QzJFRkM3RkYwRDQxNkUwMTQACgkQLvx/8NQW +4BTuMw//R+LJhCo2prR6RIxEsYbfzIwkl9NwcE5EPTKse2umTOHsMRfVMpZiKjCl +5UC1tLbqUzSjAydQiFwdvcHZAJLWblr84p+CC5hEaS/rwX4PL221gqqrC8Ut7ap3 +n/v5gCJ8iqnpgZSgHPSGqucG3x1KlZotPnny1RVIjCSHPvoUtocAwJNSChRkyUT0 +ym8qhUPyOmRhYQZew1haxFJa26yc017dN5QZy+H3uo0zPLXaWJpPjJG/1pBtden4 +mL+mg8phZZ9MtBtEOK2NTA+4K24vcM+aHoEyMI/dcmi4NN256N5CJZ13tF3LgHNV +j0vp1a75p5aAMeRTv7zShegZGvJJciyYJKwRnOAUnHVFDhnsgd05VQHeWC1aFKjM +cXwrvHgGn+TG0V29ahnzR7NdVhkuP3etcqx6FuIgcj2omp0Bj4zFRlKSl4x+hY56 +MTvwksIXZTItHvffiE49ExGPA8OQW3S9Sr+lPFk98xjVuTU/P8GIVNp2kof4ezYN +Yhav4mA/KAkMX0fb+Cw6eyZl0aZEPx76hhkKhh2OmR8w3k5X2hetGcXX1/UFEHCm +uNCvWwV5Ry6Kc8Zpr8p6fUOh0Se4cNi59c1FKEwMX1hTgLklbIZioiFM/fR0RLOJ +PU/Cq+NbaZ3O8Cup7PsVjCDgXTcKcQAdQTOxgfW6f+szmTo5Qx4= +=RhpX +-----END PGP SIGNATURE----- diff --git a/SPECS/stunnel/stunnel-5.61-systemd-service.patch b/SPECS/stunnel/stunnel-5.61-systemd-service.patch new file mode 100644 index 0000000000..a7831d8c30 --- /dev/null +++ b/SPECS/stunnel/stunnel-5.61-systemd-service.patch @@ -0,0 +1,27 @@ +From 6cb73d824ac204f5680e469b0474855aaa6b8ddc Mon Sep 17 00:00:00 2001 +From: Clemens Lang +Date: Mon, 12 Sep 2022 11:07:38 +0200 +Subject: [PATCH 2/8] Apply patch stunnel-5.61-systemd-service.patch + +Patch-name: stunnel-5.61-systemd-service.patch +Patch-id: 1 +From-dist-git-commit: 70b3076eb09912b3a11f371b8c523303114fffa3 +--- + tools/stunnel.service.in | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tools/stunnel.service.in b/tools/stunnel.service.in +index fa98996..0c5a216 100644 +--- a/tools/stunnel.service.in ++++ b/tools/stunnel.service.in +@@ -6,6 +6,7 @@ After=syslog.target network-online.target + ExecStart=@bindir@/stunnel + ExecReload=/bin/kill -HUP $MAINPID + Type=forking ++PrivateTmp=true + + [Install] + WantedBy=multi-user.target +-- +2.37.3 + diff --git a/SPECS/stunnel/stunnel-5.69-default-tls-version.patch b/SPECS/stunnel/stunnel-5.69-default-tls-version.patch new file mode 100644 index 0000000000..59bb35a356 --- /dev/null +++ b/SPECS/stunnel/stunnel-5.69-default-tls-version.patch @@ -0,0 +1,117 @@ +From 749c3b57caded6285cb5f76f17c4359e92474875 Mon Sep 17 00:00:00 2001 +From: Clemens Lang +Date: Mon, 12 Sep 2022 11:07:38 +0200 +Subject: [PATCH] Apply patch stunnel-5.69-default-tls-version.patch + +Patch-name: stunnel-5.69-default-tls-version.patch +Patch-id: 5 +From-dist-git-commit: 70b3076eb09912b3a11f371b8c523303114fffa3 +--- + src/ctx.c | 34 ++++++++++++++++++++++------------ + src/options.c | 15 +++++++++++---- + src/prototypes.h | 3 +++ + 3 files changed, 36 insertions(+), 16 deletions(-) + +diff --git a/src/ctx.c b/src/ctx.c +index 3f3dbf8..7935e84 100644 +--- a/src/ctx.c ++++ b/src/ctx.c +@@ -168,19 +168,29 @@ int context_init(SERVICE_OPTIONS *section) { /* init TLS context */ + + /* set supported protocol versions */ + #if OPENSSL_VERSION_NUMBER>=0x10100000L +- if(section->min_proto_version && +- !SSL_CTX_set_min_proto_version(section->ctx, +- section->min_proto_version)) { +- s_log(LOG_ERR, "Failed to set the minimum protocol version 0x%X", +- section->min_proto_version); +- return 1; /* FAILED */ ++ if (section->min_proto_version == USE_DEFAULT_TLS_VERSION) { ++ s_log(LOG_INFO, "Using the default TLS minimum version as specified in" ++ " crypto policies. Not setting explicitly."); ++ } else { ++ if(section->min_proto_version && ++ !SSL_CTX_set_min_proto_version(section->ctx, ++ section->min_proto_version)) { ++ s_log(LOG_ERR, "Failed to set the minimum protocol version 0x%X", ++ section->min_proto_version); ++ return 1; /* FAILED */ ++ } + } +- if(section->max_proto_version && +- !SSL_CTX_set_max_proto_version(section->ctx, +- section->max_proto_version)) { +- s_log(LOG_ERR, "Failed to set the maximum protocol version 0x%X", +- section->max_proto_version); +- return 1; /* FAILED */ ++ if (section->max_proto_version == USE_DEFAULT_TLS_VERSION) { ++ s_log(LOG_INFO, "Using the default TLS maximum version as specified in" ++ " crypto policies. Not setting explicitly"); ++ } else { ++ if(section->max_proto_version && ++ !SSL_CTX_set_max_proto_version(section->ctx, ++ section->max_proto_version)) { ++ s_log(LOG_ERR, "Failed to set the maximum protocol version 0x%X", ++ section->max_proto_version); ++ return 1; /* FAILED */ ++ } + } + #endif /* OPENSSL_VERSION_NUMBER>=0x10100000L */ + +diff --git a/src/options.c b/src/options.c +index 00196fc..1946129 100644 +--- a/src/options.c ++++ b/src/options.c +@@ -3437,8 +3437,9 @@ NOEXPORT const char *parse_service_option(CMD cmd, SERVICE_OPTIONS **section_ptr + return "Invalid protocol version"; + return NULL; /* OK */ + case CMD_INITIALIZE: +- if(section->max_proto_version && section->min_proto_version && +- section->max_proto_versionmin_proto_version) ++ if(section->max_proto_version != USE_DEFAULT_TLS_VERSION ++ && section->min_proto_version != USE_DEFAULT_TLS_VERSION ++ && section->max_proto_versionmin_proto_version) + return "Invalid protocol version range"; + break; + case CMD_PRINT_DEFAULTS: +@@ -3456,7 +3457,10 @@ NOEXPORT const char *parse_service_option(CMD cmd, SERVICE_OPTIONS **section_ptr + /* sslVersionMax */ + switch(cmd) { + case CMD_SET_DEFAULTS: +- section->max_proto_version=0; /* highest supported */ ++ section->max_proto_version=USE_DEFAULT_TLS_VERSION; /* use defaults in ++ OpenSSL crypto ++ policies.Do not ++ override it */ + break; + case CMD_SET_COPY: + section->max_proto_version=new_service_options.max_proto_version; +@@ -3487,7 +3491,10 @@ NOEXPORT const char *parse_service_option(CMD cmd, SERVICE_OPTIONS **section_ptr + /* sslVersionMin */ + switch(cmd) { + case CMD_SET_DEFAULTS: +- section->min_proto_version=0; /* lowest supported */ ++ section->min_proto_version=USE_DEFAULT_TLS_VERSION; /* use defaults in ++ OpenSSL crypto ++ policies. Do not ++ override it */ + break; + case CMD_SET_COPY: + section->min_proto_version=new_service_options.min_proto_version; +diff --git a/src/prototypes.h b/src/prototypes.h +index 83496bd..d443e18 100644 +--- a/src/prototypes.h ++++ b/src/prototypes.h +@@ -960,6 +960,9 @@ ICON_IMAGE load_icon_default(ICON_TYPE); + ICON_IMAGE load_icon_file(const char *); + #endif + ++#define USE_DEFAULT_TLS_VERSION ((int)-2) /* Use defaults in OpenSSL ++ crypto policies */ ++ + #endif /* defined PROTOTYPES_H */ + + /* end of prototypes.h */ +-- +2.45.3 + diff --git a/SPECS/stunnel/stunnel-5.69-system-ciphers.patch b/SPECS/stunnel/stunnel-5.69-system-ciphers.patch new file mode 100644 index 0000000000..c7be57d764 --- /dev/null +++ b/SPECS/stunnel/stunnel-5.69-system-ciphers.patch @@ -0,0 +1,37 @@ +From 6c8c4c8c85204943223b251d09ca1e93571a437a Mon Sep 17 00:00:00 2001 +From: Sahana Prasad +Date: Mon, 12 Sep 2022 11:07:38 +0200 +Subject: [PATCH 3/7] Use cipher configuration from crypto-policies + +On Fedora, CentOS and RHEL, the system's crypto policies are the best +source to determine which cipher suites to accept in TLS. On these +platforms, OpenSSL supports the PROFILE=SYSTEM setting to use those +policies. Change stunnel to default to this setting. + +Co-Authored-by: Sahana Prasad +Patch-name: stunnel-5.69-system-ciphers.patch +Patch-id: 3 +From-dist-git-commit: 70b3076eb09912b3a11f371b8c523303114fffa3 +--- + src/options.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/options.c b/src/options.c +index 6e4a18b..4d31815 100644 +--- a/src/options.c ++++ b/src/options.c +@@ -321,9 +321,9 @@ static const char *option_not_found= + "Specified option name is not valid here"; + + static const char *stunnel_cipher_list= +- "HIGH:!aNULL:!SSLv2:!DH:!kDHEPSK"; ++ "PROFILE=SYSTEM"; + static const char *fips_cipher_list= +- "FIPS:!DH:!kDHEPSK"; ++ "PROFILE=SYSTEM"; + + #ifndef OPENSSL_NO_TLS1_3 + static const char *stunnel_ciphersuites= +-- +2.39.2 + diff --git a/SPECS/stunnel/stunnel-pop3s-client.conf b/SPECS/stunnel/stunnel-pop3s-client.conf new file mode 100644 index 0000000000..eb7fda9a03 --- /dev/null +++ b/SPECS/stunnel/stunnel-pop3s-client.conf @@ -0,0 +1,8 @@ +# Sample configuration for stunnel, tunnelling cleartext connections on the +# default port (without an "accept" setting, stunnel uses stdio) over an +# encrypted channel to pop3s-server.example.com:pop3s. See stunnel(8) for +# more information. +client = yes +connect = pop3s-server.example.com:pop3s +CAfile = /usr/share/ssl/certs/ca-bundle.crt +verify = 2 diff --git a/SPECS/stunnel/stunnel-sfinger.conf b/SPECS/stunnel/stunnel-sfinger.conf new file mode 100644 index 0000000000..912888a403 --- /dev/null +++ b/SPECS/stunnel/stunnel-sfinger.conf @@ -0,0 +1,8 @@ +# Sample configuration for stunnel, forwarding data from encrypted connections +# on the default port (without an "accept" setting, stunnel uses stdio) over +# an unencrypted set of pipes which are used for stdio by in.fingerd. See +# stunnel(8) for more information. +exec = /usr/sbin/in.fingerd +execargs = in.fingerd +key = /etc/stunnel/stunnel.pem +cert = /etc/stunnel/stunnel.pem diff --git a/SPECS/stunnel/stunnel.signatures.json b/SPECS/stunnel/stunnel.signatures.json new file mode 100644 index 0000000000..ac9f8cc0a2 --- /dev/null +++ b/SPECS/stunnel/stunnel.signatures.json @@ -0,0 +1,11 @@ +{ + "Signatures": { + "Certificate-Creation": "d00fa133b7e7b241c6d973a70a2ae24d38afed6dfc06014aeff117f4cf8e0163", + "pop3-redirect.xinetd": "d4953253db8cfd8ea1449911ad32723bf7230a8c8edfb394c83b02feeb25f84b", + "sfinger.xinetd": "e9bb26d7e8fbe978d34168ecbb22205179345cfc1874b00c87de17bcb287d9a9", + "stunnel-5.74.tar.gz": "9bef235ab5d24a2a8dff6485dfd782ed235f4407e9bc8716deb383fc80cd6230", + "stunnel-pop3s-client.conf": "95379ab5046177833b717c4c832748d31ec314f469c67e9fe4b160876ca93066", + "stunnel-sfinger.conf": "4d06bccd910b1c8d89ed560fb8375e5e0b220e368a51ce6714e0bc2cd67dc6e4", + "stunnel@.service": "8e86d44d83d1722371393ff3943e1779111b033da5e89ad1e564d2e5e3be0d89" + } +} \ No newline at end of file diff --git a/SPECS/stunnel/stunnel.spec b/SPECS/stunnel/stunnel.spec new file mode 100644 index 0000000000..c2ab28ac15 --- /dev/null +++ b/SPECS/stunnel/stunnel.spec @@ -0,0 +1,751 @@ +%bcond_with libwrap +# Do not generate provides for private libraries +%global __provides_exclude_from ^%{_libdir}/stunnel/.*$ + +Summary: A TLS-encrypting socket wrapper +Name: stunnel +Version: 5.74 +Release: 2%{?dist} +License: GPLv2 +Vendor: Microsoft Corporation +Distribution: Azure Linux +URL: http://www.stunnel.org/ +Source0: https://www.stunnel.org/downloads/stunnel-%{version}.tar.gz +Source2: Certificate-Creation +Source3: sfinger.xinetd +Source4: stunnel-sfinger.conf +Source5: pop3-redirect.xinetd +Source6: stunnel-pop3s-client.conf +Source7: stunnel@.service +Patch0: stunnel-5.50-authpriv.patch +Patch1: stunnel-5.61-systemd-service.patch +# Use cipher configuration from crypto-policies +# +# On Fedora, CentOS and RHEL, the system's crypto policies are the best +# source to determine which cipher suites to accept in TLS. On these +# platforms, OpenSSL supports the PROFILE=SYSTEM setting to use those +# policies. Change stunnel to default to this setting. +Patch3: stunnel-5.69-system-ciphers.patch +Patch5: stunnel-5.69-default-tls-version.patch +Patch6: stunnel-5.56-curves-doc-update.patch +# build test requirements +BuildRequires: %{_bindir}/nc +BuildRequires: %{_bindir}/pod2html +BuildRequires: %{_bindir}/pod2man +BuildRequires: %{_sbindir}/lsof +BuildRequires: /bin/ps +BuildRequires: autoconf +BuildRequires: automake +# util-linux is needed for rename +BuildRequires: gcc +BuildRequires: libtool +BuildRequires: openssl-devel +BuildRequires: pkgconfig +BuildRequires: systemd +BuildRequires: util-linux +BuildRequires: python3-cryptography +%{?systemd_requires} +%if %{with libwrap} +BuildRequires: tcp_wrappers-devel +%endif + +%description +Stunnel is a socket wrapper which can provide TLS/SSL +(Transport Layer Security/Secure Sockets Layer) support +to ordinary applications. For example, it can be used in +conjunction with imapd to create a TLS secure IMAP server. + +%prep +%autosetup -S gendiff -p1 + +# Fix the configure script output for FIPS mode and stack protector flag +# sed -i '/yes).*result: no/,+1{s/result: no/result: yes/;s/as_echo "no"/as_echo "yes"/};s/-fstack-protector/-fstack-protector-strong/' configure + +# Fix a testcase with system-ciphers support +# sed -i '/client = yes/a \\ ciphers = PSK' tests/recipes/014_PSK_secrets + +%build +#autoreconf -v +CFLAGS="%{optflags} -fPIC"; export CFLAGS +if pkg-config openssl ; then + CFLAGS="$CFLAGS `pkg-config --cflags openssl`"; + LDFLAGS="`pkg-config --libs-only-L openssl`"; export LDFLAGS +fi +%configure --enable-fips --enable-ipv6 --with-ssl=%{_prefix} \ +%if %{with libwrap} +--enable-libwrap \ +%else +--disable-libwrap \ +%endif + CPPFLAGS="-UPIDFILE -DPIDFILE='\"%{_localstatedir}/run/stunnel.pid\"'" +make V=1 LDADD="-pie -Wl,-z,defs,-z,relro,-z,now" + +%install +make install DESTDIR=%{buildroot} +# Move the translated man pages to the right subdirectories, and strip off the +# language suffixes. +#for lang in fr pl ; do +for lang in pl ; do + mkdir -p %{buildroot}/%{_mandir}/${lang}/man8 + mv %{buildroot}/%{_mandir}/man8/*.${lang}.8* %{buildroot}/%{_mandir}/${lang}/man8/ + rename ".${lang}" "" %{buildroot}/%{_mandir}/${lang}/man8/* +done +mkdir srpm-docs +cp %{SOURCE2} %{SOURCE3} %{SOURCE4} %{SOURCE5} %{SOURCE6} srpm-docs + +mkdir -p %{buildroot}%{_unitdir} +cp %{buildroot}%{_docdir}/stunnel/examples/%{name}.service %{buildroot}%{_unitdir}/%{name}.service +cp %{SOURCE7} %{buildroot}%{_unitdir}/%{name}@.service + + +%check +# For unknown reason the 042_inetd test fails in Koji. The failure is not reproducible +# in local build. +rm tests/recipes/042_inetd +# We override the security policy as it is too strict for the tests. +OPENSSL_SYSTEM_CIPHERS_OVERRIDE=xyz_nonexistent_file +export OPENSSL_SYSTEM_CIPHERS_OVERRIDE +OPENSSL_CONF= +export OPENSSL_CONF +make test || (for i in tests/logs/*.log ; do echo "$i": ; cat "$i" ; done) + +%files +%{!?_licensedir:%global license %%doc} +%doc AUTHORS.md BUGS.md CREDITS.md PORTS.md README.md TODO.md +%doc tools/stunnel.conf-sample +%doc srpm-docs/* +%license COPY* +%lang(en) %doc doc/en/* +%lang(pl) %doc doc/pl/* +%{_bindir}/stunnel +%exclude %{_bindir}/stunnel3 +%exclude %{_docdir}/stunnel +%{_libdir}/stunnel +%exclude %{_libdir}/stunnel/libstunnel.la +%{_mandir}/man8/stunnel.8* +%lang(pl) %{_mandir}/pl/man8/stunnel.8* +%dir %{_sysconfdir}/%{name} +%exclude %{_sysconfdir}/stunnel/* + +%{_unitdir}/%{name}*.service + +%post +/sbin/ldconfig +%systemd_post %{name}.service + +%preun +%systemd_preun %{name}.service + +%postun +/sbin/ldconfig +%systemd_postun_with_restart %{name}.service + +%changelog +* Thu Jan 8 2025 Lee Chee Yang - 5.74-2 +- python-cryptography to python3-cryptography. + +* Mon Apr 21 2025 Sandeep Karambelkar - 5.74-1 +- Upgrade to 5.74 and remove unwanted patches +- Verified License + +* Mon Sep 04 2023 Muhammad Falak R Wani - 5.70-1 +- Upgrade version to address CVE-2021-20230 +- Lint spec +- Verified License + +* Fri Mar 26 2021 Henry Li - 5.56-8 +- Initial CBL-Mariner import from Fedora 32 (license: MIT). +- Change /usr/bin/lsof to /usr/sbin/lsof +- Change /usr/bin/ps to /bin/ps + +* Thu Apr 16 2020 Sahana Prasad - 5.56-7 +- Updates documentation to specify that the option "curves" can be used in server mode only. + +* Wed Apr 08 2020 Sahana Prasad - 5.56-6 +- Fixes default tls version patch to handle default values from OpenSSL crypto policies + +* Mon Apr 06 2020 Sahana Prasad - 5.56-5 +- Removes warnings caused by the patch + +* Mon Apr 06 2020 Sahana Prasad - 5.56-4 +- Adds default tls version patch to comply with OpenSSL crypto policies + +* Tue Mar 31 2020 Sahana Prasad - 5.56-3 +- Adds coverity patch + +* Fri Jan 31 2020 Fedora Release Engineering - 5.56-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Wed Jan 08 2020 Sahana Prasad - 5.56-1 +- New upstream release 5.56 + +* Thu Sep 19 2019 Sahana Prasad - 5.55-1 +- New upstream release 5.55 + +* Sat Jul 27 2019 Fedora Release Engineering - 5.50-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Sun Feb 03 2019 Fedora Release Engineering - 5.50-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Mon Jan 14 2019 Tomáš Mráz - 5.50-1 +- New upstream release 5.50 + +* Tue Jul 24 2018 Tomáš Mráz - 5.48-1 +- New upstream release 5.48 + +* Sat Jul 14 2018 Fedora Release Engineering - 5.46-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Thu May 31 2018 Tomáš Mráz - 5.46-1 +- New upstream release 5.46 + +* Fri Mar 2 2018 Tomáš Mráz - 5.44-5 +- Fix bind to localhost (patch backport by Christian Kujau) (#1542361) + +* Fri Feb 09 2018 Fedora Release Engineering - 5.44-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Thu Jan 25 2018 Igor Gnatenko - 5.44-3 +- Fix systemd executions/requirements + +* Mon Jan 15 2018 Tomáš Mráz - 5.44-2 +- Make the disablement of libwrap conditional + +* Thu Jan 11 2018 Tomáš Mráz - 5.44-1 +- New upstream release 5.44 +- Disable libwrap support (#1518789) + +* Tue Aug 22 2017 Tomáš Mráz - 5.42-1 +- New upstream release 5.42 +- Use the system cipher list by default (#1483967) + +* Thu Aug 03 2017 Fedora Release Engineering - 5.41-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 5.41-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon Apr 17 2017 Neal Gompa - 5.41-1 +- New upstream release 5.41 + +* Mon Mar 20 2017 Neal Gompa - 5.40-1 +- New upstream release 5.40 +- Properly mark license files +- Rebase patches +- Eliminate unnecessary Provides +- Small spec cleanups and fixes + +* Sat Feb 11 2017 Fedora Release Engineering - 5.35-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Thu Jul 21 2016 Tomáš Mráz - 5.35-1 +- New upstream release 5.35 with fix for bug #1358810 + +* Wed Jul 13 2016 Tomáš Mráz - 5.34-1 +- New upstream release 5.34 + +* Wed Feb 3 2016 Tomáš Mráz - 5.30-1 +- New upstream release 5.30 +- Add generic stunnel@.service provided by Štefan Gurský (#1195742) + +* Mon Jun 22 2015 Avesh Agarwal - 5.18-1 +- New upstream release 5.18. +- Finally deleted the patch stunnel-5-sample.patch as upstream + has merged those changes. +- Fixes patches as per new code changes. +- Fixed systemd service file related changes. + +* Fri Jun 19 2015 Fedora Release Engineering - 5.17-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Mon Jun 8 2015 Avesh Agarwal - 5.17-1 +- New upstream release 5.17. + +* Fri May 22 2015 Avesh Agarwal - 5.16-1 +- New upstream release 5.16. + +* Mon Apr 27 2015 Avesh Agarwal - 5.15-1 +- New upstream release 5.15. +- 1155977: Fixed upstream too so removed the associated patch +- Updates other patches too. + +* Mon Mar 30 2015 Avesh Agarwal - 5.14-1 +- New upstream release 5.14. + +* Sun Mar 29 2015 Avesh Agarwal - 5.13-1 +- New upstream release 5.13. + +* Sat Mar 28 2015 Avesh Agarwal - 5.12-1 +- New upstream release 5.12. + +* Fri Mar 27 2015 Avesh Agarwal - 5.11-1 +- New upstream release 5.11. + +* Wed Jan 28 2015 Avesh Agarwal - 5.10-1 +- New upstream release 5.10. + +* Thu Jan 8 2015 Avesh Agarwal - 5.09-1 +- 1163349: New upstream release 5.09. + +* Thu Dec 11 2014 Avesh Agarwal - 5.08-1 +- 1163349: New upstream release 5.08 + +* Sun Nov 23 2014 Avesh Agarwal - 5.08b6-1 +- 1163349: New upstream beta release 5.08b6 +- Fixed incorrect reporting of fips status in configure.ac + at compile time, requires autoconf automake at buildtime +- Fixed default OpenSSL directory issue by using with-ssl +- Updates local patches +- 1155977: Fixes man page issues + +* Tue Nov 04 2014 Avesh Agarwal - 5.07-1 +- New upstream release 5.07 + +* Fri Oct 17 2014 Avesh Agarwal - 5.06-1 +- New upstream release 5.06 +- Addresses Poodle security issue + +* Wed Oct 8 2014 Avesh Agarwal - 5.05b5-1 +- rhbz #1144393: New upstream beta release +- systemd socket activation support + +* Fri Sep 26 2014 Avesh Agarwal - 5.04-2 +- Fixes packaging issues mentioned in rhbz#226439 + +* Mon Sep 22 2014 Avesh Agarwal - 5.04-1 +- New upstream realease 5.04 +- Updates local patches so that they apply cleanly to + avoud hunk errors + +* Thu Aug 28 2014 Avesh Agarwal - 5.03-1 +- New upstream realease 5.03 + +* Mon Aug 18 2014 Fedora Release Engineering - 5.02-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Mon Jul 14 2014 Avesh Agarwal - 5.02-1 +- rhbz#1108818: New upstream realease 5.02 +- Updated local patches +- The rhbz#530950 is tested and seems to work. STRLEN has + been no longer allocated statically since 4.36 version. + So it is possible that this bz might have got fixed + around 4.36 release. +- Fixes rpmlint errors + +* Sun Jun 08 2014 Fedora Release Engineering - 5.01-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Mon Apr 28 2014 Avesh Agarwal - 5.01-2 +- Integration with systemd. +- Spec file clean up +- Patched stunnel systemd unit file to have dependency on + network.target. +- rhbz#455815: Packaged systemd service file +- rhbz#782535: Fixed private tmp issue. +- rhbz#995831: Fixed wrong encoding of french man page. + +* Thu Apr 17 2014 Avesh Agarwal - 5.01-1 +- New upstream realease 5.01 +- Supports OpenSSL DLLs 1.0.1g. +- Fixes to take care of OpenSSL,s TLS heartbeat + read overrun (CVE-2014-0160). + +* Fri Mar 7 2014 Avesh Agarwal - 5.00-1 +- New upstream realease 5.00 +- Updated local patches. +- Fix for CVE-2014-0016 +- Fixed changelog date errors +- Fixes rhbz #1006819 + +* Mon Aug 5 2013 Avesh Agarwal - 4.56-3 +- Ftp mirrors for NA does not work, so changing source code + URLs to the correct ones. + +* Sun Aug 04 2013 Fedora Release Engineering - 4.56-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Mon Apr 1 2013 Avesh Agarwal - 4.56-1 +- New upstream realease 4.56. +- Updated local patches. +- Fixed upstream URL in spec file. +- Sourced URL of sha256 hash file in spec file. + +* Tue Mar 26 2013 Avesh Agarwal - 4.55-2 +- Resolves: 927841 + +* Mon Mar 4 2013 Avesh Agarwal - 4.55-1 +- New upstream realease 4.55 +- Updated local patches +- enabled fips mode +- Fixed for pod2man as it build-requires perl-podlators + +* Fri Feb 15 2013 Fedora Release Engineering - 4.54-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Mon Dec 10 2012 Avesh Agarwal - 4.54-2 +- 884183: support for full relro. + +* Tue Oct 16 2012 Avesh Agarwal - 4.54-1 +- New upstream realease 4.54 +- Updated local patches + +* Sat Jul 21 2012 Fedora Release Engineering - 4.53-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Mon May 14 2012 Avesh Agarwal - 4.53-1 +- New upstream realease 4.53 +- Updated local patches + +* Tue Mar 6 2012 Avesh Agarwal - 4.52-1 +- New upstream realease 4.52 +- Updated local patches + +* Sat Jan 14 2012 Fedora Release Engineering - 4.50-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Tue Jan 3 2012 Avesh Agarwal - 4.50-1 +- New upstream realease 4.50 +- Updated local patches + +* Tue Sep 20 2011 Avesh Agarwal - 4.44-1 +- New upstream realease 4.44 +- Updated local patches + +* Fri Aug 19 2011 Avesh Agarwal - 4.42-1 +- New upstream realease 4.42 +- Updated local patches +- Fixes #732069 + +* Mon Aug 1 2011 Avesh Agarwal - 4.41-1 +- New upstream realease 4.41 +- Updated local patches to match the new release + +* Tue Jun 28 2011 Avesh Agarwal - 4.37-1 +- New upstream realease 4.37 +- Updated local patches to match the new release + +* Mon Apr 4 2011 Avesh Agarwal - 4.35-1 +- New upstream realease 4.35 +- Updated authpriv and sample patches to match the new release + +* Wed Feb 09 2011 Fedora Release Engineering - 4.34-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Mon Oct 4 2010 Avesh Agarwal - 4.34-1 +- New upstream realease 4.34 +- Updated authpriv and sample patches to match the new release + +* Wed Apr 7 2010 Avesh Agarwal - 4.33-1 +- New upstream realease 4.33 +- Updated authpriv and sample patches to match the new release +- Addresses bz 580117 (inted mode support issue) + +* Mon Mar 29 2010 Avesh Agarwal - 4.32-1 +- New upstream realease 4.32 +- Updated authpriv and sample patches to match the new release + +* Tue Feb 16 2010 Avesh Agarwal - 4.31-1 +- New upstream realease 4.31 +- Updated authpriv and sample patches to match the new release + +* Tue Jan 26 2010 Avesh Agarwal - 4.30-1 +- New upstream realease 4.30 +- Updated authpriv and sample patches for the new release + +* Wed Dec 09 2009 Avesh Agarwal - 4.29-1 +- New upstream realease 4.29 +- Updated authpriv and sample patches for the new release +- Modified spec file to include dist tag + +* Fri Aug 21 2009 Tomas Mraz - 4.27-5 +- rebuilt with new openssl + +* Sun Jul 26 2009 Fedora Release Engineering - 4.27-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Sun May 3 2009 Miloslav Trmač - 4.27-3 +- Fix the previous patch. + +* Wed Apr 29 2009 Miloslav Trmač - 4.27-2 +- Avoid aliasing undefined by ISO C + +* Thu Apr 16 2009 Miloslav Trmač - 4.27-1 +- Update to stunnel-4.27. + +* Wed Feb 25 2009 Fedora Release Engineering - 4.26-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Sun Jan 18 2009 Tomas Mraz - 4.26-2 +- disable openssl upstream fips mode + +* Mon Sep 22 2008 Miloslav Trmač - 4.26-1 +- Update to stunnel-4.26. + +* Sun Jun 8 2008 Miloslav Trmač - 4.25-2 +- Use a clearer error message if the service name is unknown in "accept" + Resolves: #450344 + +* Mon Jun 2 2008 Miloslav Trmač - 4.25-1 +- Update to stunnel-4.25 + +* Tue May 20 2008 Miloslav Trmač - 4.24-2 +- Drop stunnel3 + Resolves: #442842 + +* Mon May 19 2008 Miloslav Trmač - 4.24-1 +- Update to stunnel-4.24 + +* Fri Mar 28 2008 Miloslav Trmač - 4.22-1 +- Update to stunnel-4.22 + +* Tue Feb 19 2008 Fedora Release Engineering - 4.20-6 +- Autorebuild for GCC 4.3 + +* Tue Dec 4 2007 Miloslav Trmač - 4.20-5 +- Rebuild with openssl-0.9.8g + +* Tue Oct 16 2007 Miloslav Trmač - 4.20-4 +- Revert the port to NSS, wait for NSS-based stunnel 5.x instead + Resolves: #301971 +- Mark localized man pages with %%lang (patch by Ville Skyttä) + Resolves: #322281 + +* Tue Aug 28 2007 Miloslav Trmač - 4.20-3.nss +- Port to NSS + +* Mon Dec 4 2006 Miloslav Trmac - 4.20-2 +- Update BuildRequires for the separate tcp_wrappers-devel package + +* Thu Nov 30 2006 Miloslav Trmac - 4.20-1 +- Update to stunnel-4.20 + +* Sat Nov 11 2006 Miloslav Trmac - 4.19-1 +- Update to stunnel-4.19 + +* Wed Oct 25 2006 Miloslav Trmac - 4.18-1 +- Update to stunnel-4.18 +- Remove unused stunnel.cnf from the src.rpm +- Fix some rpmlint warnings + +* Fri Aug 18 2006 Jesse Keating - 4.15-2 +- rebuilt with latest binutils to pick up 64K -z commonpagesize on ppc* + (#203001) + +* Wed Jul 12 2006 Jesse Keating - 4.15-1.1 +- rebuild + +* Sat Mar 18 2006 Miloslav Trmac - 4.15-1 +- Update to stunnel-4.15 + +* Fri Feb 10 2006 Jesse Keating - 4.14-3.2 +- bump again for double-long bug on ppc(64) + +* Tue Feb 07 2006 Jesse Keating - 4.14-3.1 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Tue Jan 31 2006 Miloslav Trmac - 4.14-3 +- Use pthread threading to fix crash on x86_64 (#179236) + +* Fri Dec 09 2005 Jesse Keating +- rebuilt + +* Wed Nov 9 2005 Miloslav Trmac - 4.14-2 +- Rebuild with newer openssl + +* Thu Nov 3 2005 Miloslav Trmac - 4.14-1 +- Update to stunnel-4.14 +- Override changed default pid file location, keep it in %%{_localstatedir}/run + +* Sat Oct 22 2005 Miloslav Trmac - 4.13-1 +- Update to stunnel-4.13 + +* Fri Sep 30 2005 Miloslav Trmac - 4.12-1 +- Update to stunnel-4.12 + +* Thu Sep 22 2005 Miloslav Trmac - 4.11-2 +- Enable IPv6 (#169050, patch by Peter Bieringer) +- Don't ship another copy of man pages in HTML + +* Tue Jul 12 2005 Miloslav Trmac - 4.11-1 +- Update to stunnel-4.11 +- Fix int/size_t mismatches in stack_info () +- Update Certificate-Creation for /etc/pki + +* Wed Jun 1 2005 Miloslav Trmac - 4.10-2 +- Fix inetd mode +- Remove unnecessary Requires: and BuildRequires: +- Clean up the spec file + +* Tue Apr 26 2005 Nalin Dahyabhai 4.10-1 +- update to 4.10 + +* Tue Apr 26 2005 Nalin Dahyabhai 4.08-2 +- add buildprereqs on libtool, util-linux; change textutils/fileutils dep to + coreutils (#133961) + +* Wed Mar 16 2005 Nalin Dahyabhai 4.08-1 +- update to 4.08 +- build stunnel as a PIE binary + +* Mon Nov 22 2004 Miloslav Trmac - 4.05-4 +- Convert man pages to UTF-8 + +* Tue Jun 15 2004 Elliot Lee +- rebuilt + +* Thu May 27 2004 Nalin Dahyabhai 4.05-2 +- move the sample configuration to %%doc, it shouldn't be used as-is (#124373) + +* Thu Mar 11 2004 Nalin Dahyabhai 4.05-1 +- update to 4.05 + +* Tue Mar 02 2004 Elliot Lee +- rebuilt + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Thu Aug 7 2003 Elliot Lee 4.04-6 +- Fix libtool + +* Wed Jun 04 2003 Elliot Lee +- rebuilt + +* Fri Mar 21 2003 Nalin Dahyabhai 4.04-4 +- fix xinetd configuration samples + +* Mon Feb 10 2003 Nalin Dahyabhai 4.04-3 +- rebuild + +* Wed Jan 22 2003 Tim Powers +- rebuilt + +* Wed Jan 15 2003 Nalin Dahyabhai 4.04-1 +- update to 4.04 + +* Tue Jan 7 2003 Nalin Dahyabhai 4.03-1 +- use pkgconfig for information about openssl, if available + +* Fri Jan 3 2003 Nalin Dahyabhai +- update to 4.03 + +* Mon Oct 21 2002 Nalin Dahyabhai 4.02-1 +- update to 4.02 + +* Fri Oct 4 2002 Nalin Dahyabhai 4.00-1 +- don't create a dummy cert + +* Wed Sep 25 2002 Nalin Dahyabhai +- update to 4.00 +- remove textutils and fileutils as buildreqs, add automake/autoconf + +* Fri Jun 21 2002 Tim Powers +- automated rebuild + +* Sun May 26 2002 Tim Powers +- automated rebuild + +* Fri May 17 2002 Nalin Dahyabhai 3.22-2 +- rebuild in new environment + +* Wed Jan 2 2002 Nalin Dahyabhai 3.22-1 +- update to 3.22, correcting a format-string vulnerability + +* Wed Oct 31 2001 Nalin Dahyabhai 3.21a-1 +- update to 3.21a + +* Tue Aug 28 2001 Nalin Dahyabhai 3.20-1 +- log using LOG_AUTHPRIV facility by default (#47289) +- make permissions on stunnel binary 0755 +- implicitly trust certificates in %%{_datadir}/ssl/trusted (#24034) + +* Fri Aug 10 2001 Nalin Dahyabhai 3.19-1 +- update to 3.19 to avoid problems with stunnel being multithreaded, but + tcp wrappers not being thrad-safe + +* Mon Jul 30 2001 Nalin Dahyabhai +- update to 3.17 + +* Mon Jul 23 2001 Nalin Dahyabhai +- update to 3.16 + +* Mon Jul 16 2001 Nalin Dahyabhai +- update to 3.15 +- enable tcp-wrappers support + +* Tue May 29 2001 Nalin Dahyabhai +- remove explicit requirement on openssl (specific version isn't enough, + we have to depend on shared library version anyway) + +* Fri Apr 27 2001 Nalin Dahyabhai +- update to 3.14 + +* Mon Mar 26 2001 Preston Brown +- depend on make (#33148) + +* Fri Mar 2 2001 Nalin Dahyabhai +- rebuild in new environment + +* Tue Feb 6 2001 Nalin Dahyabhai +- update to 3.13 to get pthread, OOB, 64-bit fixes +- don't need sdf any more + +* Thu Dec 28 2000 Nalin Dahyabhai +- pull in sdf to build the man page (#22892) + +* Fri Dec 22 2000 Nalin Dahyabhai +- update to 3.11 +- chuck the SIGHUP patch (went upstream) +- chuck parts of the 64-bit clean patch (went upstream) + +* Thu Dec 21 2000 Nalin Dahyabhai +- update to 3.10 +- more 64-bit clean changes, hopefully the last bunch + +* Wed Dec 20 2000 Nalin Dahyabhai +- change piddir from the default /var/stunnel to /var/run +- clean out pid file on SIGHUP + +* Fri Dec 15 2000 Nalin Dahyabhai +- update to 3.9 to get a security fix + +* Wed Oct 25 2000 Matt Wilson +- change all unsigned longs to u_int32_t when dealing with network + addresses + +* Fri Aug 18 2000 Nalin Dahyabhai +- make stunnel.pem also be (missingok) + +* Thu Jun 29 2000 Nalin Dahyabhai +- move to Applications/Internet group +- clean up %%post script +- make stunnel.pem %%ghost %%config(noreplace) +- provide a sample file for use with xinetd + +* Thu Jun 8 2000 Nalin Dahyabhai +- FHS compliance fixes +- modify defaults + +* Tue Mar 14 2000 Florian La Roche +- update to 3.8 +- do not create certificate if one already exists + +* Mon Feb 21 2000 Florian La Roche +- update to 3.7 +- add patch to find /usr/share/ssl +- change some perms + +* Sat Oct 30 1999 Bernhard Rosenkraenzer +- Modify spec file to match Red Hat standards + +* Thu Aug 12 1999 Damien Miller +- Updated to 3.4a +- Patched for OpenSSL 0.9.4 +- Cleaned up files section + +* Sun Jul 11 1999 Damien Miller +- Updated to 3.3 + +* Sat Nov 28 1998 Damien Miller +- Initial RPMification diff --git a/SPECS/stunnel/stunnel@.service b/SPECS/stunnel/stunnel@.service new file mode 100644 index 0000000000..d31ac9c906 --- /dev/null +++ b/SPECS/stunnel/stunnel@.service @@ -0,0 +1,11 @@ +[Unit] +Description=TLS tunnel for %I +After=syslog.target network.target + +[Service] +ExecStart=/usr/bin/stunnel /etc/stunnel/%i.conf +Type=forking +PrivateTmp=true + +[Install] +WantedBy=multi-user.target diff --git a/SPECS/supermin/supermin.spec b/SPECS/supermin/supermin.spec index 35eac3a9bb..022b7cc490 100644 --- a/SPECS/supermin/supermin.spec +++ b/SPECS/supermin/supermin.spec @@ -21,7 +21,7 @@ Summary: Tool for creating supermin appliances Name: supermin Version: 5.3.4 -Release: 7%{?dist} +Release: 13%{?dist} License: GPLv2+ Vendor: Intel Corporation Distribution: Edge Microvisor Toolkit @@ -54,7 +54,7 @@ BuildRequires: systemd-udev %if %{with dietlibc} BuildRequires: dietlibc-devel %else -BuildRequires: glibc-static >= 2.38-12%{?dist} +BuildRequires: glibc-static >= 2.38-18%{?dist} %endif %if 0%{?with_check} @@ -129,6 +129,10 @@ make check || { %{_rpmconfigdir}/supermin-find-requires %changelog +* Thu Mar 12 2026 Lee Chee Yang - 5.3.4-13 +- merge from Azure Linux 3.0.20260204-3.0 +- Bump to rebuild with updated glibc + * Fri Oct 3 2025 Lee Chee Yang - 5.3.4-7 - merge from Azure Linux 3.0.20250910-3.0 - Bump to rebuild with updated glibc diff --git a/SPECS/systemd/CVE-2025-4598.patch b/SPECS/systemd/CVE-2025-4598.patch new file mode 100644 index 0000000000..71bde3afbd --- /dev/null +++ b/SPECS/systemd/CVE-2025-4598.patch @@ -0,0 +1,175 @@ +From 254ab8d2a7866679cee006d844d078774cbac3c9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= +Date: Tue, 29 Apr 2025 14:47:59 +0200 +Subject: [PATCH] coredump: use %d in kernel core pattern +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The kernel provides %d which is documented as +"dump mode—same as value returned by prctl(2) PR_GET_DUMPABLE". + +We already query /proc/pid/auxv for this information, but unfortunately this +check is subject to a race, because the crashed process may be replaced by an +attacker before we read this data, for example replacing a SUID process that +was killed by a signal with another process that is not SUID, tricking us into +making the coredump of the original process readable by the attacker. + +With this patch, we effectively add one more check to the list of conditions +that need be satisfied if we are to make the coredump accessible to the user. + +Reportedy-by: Qualys Security Advisory + +(cherry-picked from commit 0c49e0049b7665bb7769a13ef346fef92e1ad4d6) +(cherry-picked from commit c58a8a6ec9817275bb4babaa2c08e0e35090d4e3) +(cherry picked from commit 19d439189ab85dd7222bdd59fd442bbcc8ea99a7) + +Modified to apply to Azure Linux +Modified by: akhila-guruju +Date: Fri, 13 Jun 2025 06:54:43 +0000 + +Upstream Patch Reference: https://github.com/systemd/systemd-stable/commit/254ab8d2a7866679cee006d844d078774cbac3c9.patch + +--- + man/systemd-coredump.xml | 12 ++++++++++++ + man/version-info.xml | 2 ++ + src/coredump/coredump.c | 21 ++++++++++++++++++--- + sysctl.d/50-coredump.conf.in | 2 +- + test/units/testsuite-74.coredump.sh | 5 +++++ + 5 files changed, 38 insertions(+), 4 deletions(-) + +diff --git a/man/systemd-coredump.xml b/man/systemd-coredump.xml +index 762873a..70bfb86 100644 +--- a/man/systemd-coredump.xml ++++ b/man/systemd-coredump.xml +@@ -292,6 +292,18 @@ COREDUMP_FILENAME=/var/lib/systemd/coredump/core.Web….552351.….zst +
+ + ++ ++ COREDUMP_DUMPABLE= ++ ++ The PR_GET_DUMPABLE field as reported by the kernel, see ++ prctl2. ++ ++ ++ ++ ++ ++ + + COREDUMP_OPEN_FDS= + +diff --git a/man/version-info.xml b/man/version-info.xml +index 5dabf9d..9311c0c 100644 +--- a/man/version-info.xml ++++ b/man/version-info.xml +@@ -78,4 +78,6 @@ + Added in version 254. + Added in version 255. + Added in version 256. ++ Added in version 257. ++ Added in version 258. + +diff --git a/src/coredump/coredump.c b/src/coredump/coredump.c +index 32c1766..64d68ab 100644 +--- a/src/coredump/coredump.c ++++ b/src/coredump/coredump.c +@@ -96,6 +96,7 @@ enum { + META_ARGV_TIMESTAMP, /* %t: time of dump, expressed as seconds since the Epoch (we expand this to μs granularity) */ + META_ARGV_RLIMIT, /* %c: core file size soft resource limit */ + META_ARGV_HOSTNAME, /* %h: hostname */ ++ META_ARGV_DUMPABLE, /* %d: as set by the kernel */ + _META_ARGV_MAX, + + /* The following indexes are cached for a couple of special fields we use (and +@@ -123,6 +124,7 @@ static const char * const meta_field_names[_META_MAX] = { + [META_ARGV_TIMESTAMP] = "COREDUMP_TIMESTAMP=", + [META_ARGV_RLIMIT] = "COREDUMP_RLIMIT=", + [META_ARGV_HOSTNAME] = "COREDUMP_HOSTNAME=", ++ [META_ARGV_DUMPABLE] = "COREDUMP_DUMPABLE=", + [META_COMM] = "COREDUMP_COMM=", + [META_EXE] = "COREDUMP_EXE=", + [META_UNIT] = "COREDUMP_UNIT=", +@@ -135,6 +137,7 @@ typedef struct Context { + pid_t pid; + uid_t uid; + gid_t gid; ++ unsigned dumpable; + bool is_pid1; + bool is_journald; + } Context; +@@ -393,14 +396,16 @@ static int grant_user_access(int core_fd, const Context *context) { + if (r < 0) + return r; + +- /* We allow access if we got all the data and at_secure is not set and +- * the uid/gid matches euid/egid. */ ++ /* We allow access if dumpable on the command line was exactly 1, we got all the data, ++ * at_secure is not set, and the uid/gid match euid/egid. */ + bool ret = ++ context->dumpable == 1 && + at_secure == 0 && + uid != UID_INVALID && euid != UID_INVALID && uid == euid && + gid != GID_INVALID && egid != GID_INVALID && gid == egid; +- log_debug("Will %s access (uid="UID_FMT " euid="UID_FMT " gid="GID_FMT " egid="GID_FMT " at_secure=%s)", ++ log_debug("Will %s access (dumpable=%u uid="UID_FMT " euid="UID_FMT " gid="GID_FMT " egid="GID_FMT " at_secure=%s)", + ret ? "permit" : "restrict", ++ context->dumpable, + uid, euid, gid, egid, yes_no(at_secure)); + return ret; + } +@@ -987,6 +992,16 @@ static int save_context(Context *context, const struct iovec_wrapper *iovw) { + if (r < 0) + return log_error_errno(r, "Failed to parse GID \"%s\": %m", context->meta[META_ARGV_GID]); + ++ /* The value is set to contents of /proc/sys/fs/suid_dumpable, which we set to 2, ++ * if the process is marked as not dumpable, see PR_SET_DUMPABLE(2const). */ ++ if (context->meta[META_ARGV_DUMPABLE]) { ++ r = safe_atou(context->meta[META_ARGV_DUMPABLE], &context->dumpable); ++ if (r < 0) ++ return log_error_errno(r, "Failed to parse dumpable field \"%s\": %m", context->meta[META_ARGV_DUMPABLE]); ++ if (context->dumpable > 2) ++ log_notice("Got unexpected %%d/dumpable value %u.", context->dumpable); ++ } ++ + unit = context->meta[META_UNIT]; + context->is_pid1 = streq(context->meta[META_ARGV_PID], "1") || streq_ptr(unit, SPECIAL_INIT_SCOPE); + context->is_journald = streq_ptr(unit, SPECIAL_JOURNALD_SERVICE); +diff --git a/sysctl.d/50-coredump.conf.in b/sysctl.d/50-coredump.conf.in +index 90c080b..a550c87 100644 +--- a/sysctl.d/50-coredump.conf.in ++++ b/sysctl.d/50-coredump.conf.in +@@ -13,7 +13,7 @@ + # the core dump. + # + # See systemd-coredump(8) and core(5). +-kernel.core_pattern=|{{LIBEXECDIR}}/systemd-coredump %P %u %g %s %t %c %h ++kernel.core_pattern=|{{LIBEXECDIR}}/systemd-coredump %P %u %g %s %t %c %h %d + + # Allow 16 coredumps to be dispatched in parallel by the kernel. + # We collect metadata from /proc/%P/, and thus need to make sure the crashed +diff --git a/test/units/testsuite-74.coredump.sh b/test/units/testsuite-74.coredump.sh +index 6552643..f9b56ac 100755 +--- a/test/units/testsuite-74.coredump.sh ++++ b/test/units/testsuite-74.coredump.sh +@@ -191,10 +191,15 @@ rm -f /tmp/core.{output,redirected} + # systemd-coredump args: PID UID GID SIGNUM TIMESTAMP CORE_SOFT_RLIMIT HOSTNAME + journalctl -b -n 1 --output=export --output-fields=MESSAGE,COREDUMP COREDUMP_EXE="/usr/bin/test-dump" | + /usr/lib/systemd/systemd-coredump --backtrace $$ 0 0 6 1679509994 12345 mymachine ++journalctl -b -n 1 --output=export --output-fields=MESSAGE,COREDUMP COREDUMP_EXE="/usr/bin/test-dump" | ++ /usr/lib/systemd/systemd-coredump --backtrace $$ 0 0 6 1679509902 12345 youmachine 1 + # Wait a bit for the coredump to get processed + timeout 30 bash -c "while [[ \$(coredumpctl list -q --no-legend $$ | wc -l) -eq 0 ]]; do sleep 1; done" + coredumpctl info "$$" + coredumpctl info COREDUMP_HOSTNAME="mymachine" ++coredumpctl info COREDUMP_TIMESTAMP=1679509902000000 ++coredumpctl info COREDUMP_HOSTNAME="youmachine" ++coredumpctl info COREDUMP_DUMPABLE="1" + + # This used to cause a stack overflow + systemd-run -t --property CoredumpFilter=all ls /tmp +-- +2.45.2 + diff --git a/SPECS/systemd/fix-stackoverflow-when-dropping-tclass-or-qdisc.patch b/SPECS/systemd/fix-stackoverflow-when-dropping-tclass-or-qdisc.patch new file mode 100644 index 0000000000..e9c237d3eb --- /dev/null +++ b/SPECS/systemd/fix-stackoverflow-when-dropping-tclass-or-qdisc.patch @@ -0,0 +1,201 @@ +From a5afac6ee6535b2bcb5214beb648c16b3fd3e99b Mon Sep 17 00:00:00 2001 +From: Rohit Rawat +Date: Tue, 25 Nov 2025 12:22:08 +0000 +Subject: [PATCH] network/tc: fix stack overflow when dropping tclass or qdisc + +This patch is combination of two patches that fixed the issue in v255-stable: +1. network/tc: fix stack overflow when dropping tclass or qdisc by Yu Watanabe at + https://github.com/systemd/systemd-stable/commit/af95833d49ee4a77511d5ce9a507f9c74352347c +2. network/tc: Avoid concurrent set modification in tclass_drop()/qdisc_drop() by Daan De Meyer at + https://github.com/systemd/systemd-stable/commit/b3fd8fa1cae7837043bfb1096c413a086f720a4b + +Note: This patch is needed only in systemd v255 and is already present in + later releases(v256 and above) + +--- + src/network/tc/qdisc.c | 52 ++++++++++++++++++++++++++++++----------- + src/network/tc/qdisc.h | 2 ++ + src/network/tc/tclass.c | 51 +++++++++++++++++++++++++++++----------- + src/network/tc/tclass.h | 2 ++ + 4 files changed, 81 insertions(+), 26 deletions(-) + +diff --git a/src/network/tc/qdisc.c b/src/network/tc/qdisc.c +index f20f410..43f5c73 100644 +--- a/src/network/tc/qdisc.c ++++ b/src/network/tc/qdisc.c +@@ -285,31 +285,57 @@ int link_find_qdisc(Link *link, uint32_t handle, const char *kind, QDisc **ret) + return -ENOENT; + } + +-QDisc* qdisc_drop(QDisc *qdisc) { ++void qdisc_mark_recursive(QDisc *qdisc) { + TClass *tclass; +- Link *link; + + assert(qdisc); ++ assert(qdisc->link); ++ ++ if (qdisc_is_marked(qdisc)) ++ return; + +- link = ASSERT_PTR(qdisc->link); ++ qdisc_mark(qdisc); + +- /* also drop all child classes assigned to the qdisc. */ +- SET_FOREACH(tclass, link->tclasses) { ++ /* also mark all child classes assigned to the qdisc. */ ++ SET_FOREACH(tclass, qdisc->link->tclasses) { + if (TC_H_MAJ(tclass->classid) != qdisc->handle) + continue; + +- tclass_drop(tclass); ++ tclass_mark_recursive(tclass); + } ++} + +- qdisc_enter_removed(qdisc); ++void link_qdisc_drop_marked(Link *link) { ++ QDisc *qdisc; + +- if (qdisc->state == 0) { +- log_qdisc_debug(qdisc, link, "Forgetting"); +- qdisc = qdisc_free(qdisc); +- } else +- log_qdisc_debug(qdisc, link, "Removed"); ++ assert(link); ++ ++ SET_FOREACH(qdisc, link->qdiscs) { ++ if (!qdisc_is_marked(qdisc)) ++ continue; ++ ++ qdisc_unmark(qdisc); ++ qdisc_enter_removed(qdisc); ++ ++ if (qdisc->state == 0) { ++ log_qdisc_debug(qdisc, link, "Forgetting"); ++ qdisc_free(qdisc); ++ } else ++ log_qdisc_debug(qdisc, link, "Removed"); ++ } ++} ++ ++QDisc* qdisc_drop(QDisc *qdisc) { ++ assert(qdisc); ++ assert(qdisc->link); ++ ++ qdisc_mark_recursive(qdisc); ++ ++ /* link_qdisc_drop_marked() may invalidate qdisc, so run link_tclass_drop_marked() first. */ ++ link_tclass_drop_marked(qdisc->link); ++ link_qdisc_drop_marked(qdisc->link); + +- return qdisc; ++ return NULL; + } + + static int qdisc_handler(sd_netlink *rtnl, sd_netlink_message *m, Request *req, Link *link, QDisc *qdisc) { +diff --git a/src/network/tc/qdisc.h b/src/network/tc/qdisc.h +index a62b941..cbba1be 100644 +--- a/src/network/tc/qdisc.h ++++ b/src/network/tc/qdisc.h +@@ -77,7 +77,9 @@ DEFINE_NETWORK_CONFIG_STATE_FUNCTIONS(QDisc, qdisc); + QDisc* qdisc_free(QDisc *qdisc); + int qdisc_new_static(QDiscKind kind, Network *network, const char *filename, unsigned section_line, QDisc **ret); + ++void qdisc_mark_recursive(QDisc *qdisc); + QDisc* qdisc_drop(QDisc *qdisc); ++void link_qdisc_drop_marked(Link *link); + + int link_find_qdisc(Link *link, uint32_t handle, const char *kind, QDisc **qdisc); + +diff --git a/src/network/tc/tclass.c b/src/network/tc/tclass.c +index 0a5fec0..fc74c48 100644 +--- a/src/network/tc/tclass.c ++++ b/src/network/tc/tclass.c +@@ -252,31 +252,56 @@ static void log_tclass_debug(TClass *tclass, Link *link, const char *str) { + strna(tclass_get_tca_kind(tclass))); + } + +-TClass* tclass_drop(TClass *tclass) { ++void tclass_mark_recursive(TClass *tclass) { + QDisc *qdisc; +- Link *link; + + assert(tclass); ++ assert(tclass->link); ++ ++ if (tclass_is_marked(tclass)) ++ return; + +- link = ASSERT_PTR(tclass->link); ++ tclass_mark(tclass); + +- /* Also drop all child qdiscs assigned to the class. */ +- SET_FOREACH(qdisc, link->qdiscs) { ++ /* Also mark all child qdiscs assigned to the class. */ ++ SET_FOREACH(qdisc, tclass->link->qdiscs) { + if (qdisc->parent != tclass->classid) + continue; + +- qdisc_drop(qdisc); ++ qdisc_mark_recursive(qdisc); + } ++} + +- tclass_enter_removed(tclass); ++void link_tclass_drop_marked(Link *link) { ++ TClass *tclass; + +- if (tclass->state == 0) { +- log_tclass_debug(tclass, link, "Forgetting"); +- tclass = tclass_free(tclass); +- } else +- log_tclass_debug(tclass, link, "Removed"); ++ assert(link); ++ ++ SET_FOREACH(tclass, link->tclasses) { ++ if (!tclass_is_marked(tclass)) ++ continue; ++ ++ tclass_unmark(tclass); ++ tclass_enter_removed(tclass); ++ ++ if (tclass->state == 0) { ++ log_tclass_debug(tclass, link, "Forgetting"); ++ tclass_free(tclass); ++ } else ++ log_tclass_debug(tclass, link, "Removed"); ++ } ++} ++ ++TClass* tclass_drop(TClass *tclass) { ++ assert(tclass); ++ ++ tclass_mark_recursive(tclass); ++ ++ /* link_tclass_drop_marked() may invalidate tclass, so run link_qdisc_drop_marked() first. */ ++ link_qdisc_drop_marked(tclass->link); ++ link_tclass_drop_marked(tclass->link); + +- return tclass; ++ return NULL; + } + + static int tclass_handler(sd_netlink *rtnl, sd_netlink_message *m, Request *req, Link *link, TClass *tclass) { +diff --git a/src/network/tc/tclass.h b/src/network/tc/tclass.h +index e73e23c..85df57d 100644 +--- a/src/network/tc/tclass.h ++++ b/src/network/tc/tclass.h +@@ -58,7 +58,9 @@ DEFINE_NETWORK_CONFIG_STATE_FUNCTIONS(TClass, tclass); + TClass* tclass_free(TClass *tclass); + int tclass_new_static(TClassKind kind, Network *network, const char *filename, unsigned section_line, TClass **ret); + ++void tclass_mark_recursive(TClass *tclass); + TClass* tclass_drop(TClass *tclass); ++void link_tclass_drop_marked(Link *link); + + int link_find_tclass(Link *link, uint32_t classid, TClass **ret); + +-- +2.45.4 + diff --git a/SPECS/systemd/ipc-call-0001-path-util-add-flavour-of-path_startswith-that-leaves.patch b/SPECS/systemd/ipc-call-0001-path-util-add-flavour-of-path_startswith-that-leaves.patch new file mode 100644 index 0000000000..02af3778ff --- /dev/null +++ b/SPECS/systemd/ipc-call-0001-path-util-add-flavour-of-path_startswith-that-leaves.patch @@ -0,0 +1,164 @@ +From 0247730a13284be4bb1ccd16181b34ba94b2da04 Mon Sep 17 00:00:00 2001 +From: Lennart Poettering +Date: Mon, 19 May 2025 12:58:52 +0200 +Subject: [PATCH 1/4] path-util: add flavour of path_startswith() that leaves a + leading slash in place + +(cherry picked from commit ee19edbb9f3455db3f750089082f3e5a925e3a0c) +(cherry picked from commit 20021e7686426052e3a7505425d7e12085feb2a6) +--- + src/basic/fs-util.c | 2 +- + src/basic/mkdir.c | 2 +- + src/basic/path-util.c | 39 ++++++++++++++++++++++++++++----------- + src/basic/path-util.h | 10 ++++++++-- + src/test/test-path-util.c | 16 ++++++++++++++++ + 5 files changed, 54 insertions(+), 15 deletions(-) + +diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c +index ee38e0266a..cc89f48fb7 100644 +--- a/src/basic/fs-util.c ++++ b/src/basic/fs-util.c +@@ -65,7 +65,7 @@ int rmdir_parents(const char *path, const char *stop) { + assert(*slash == '/'); + *slash = '\0'; + +- if (path_startswith_full(stop, p, /* accept_dot_dot= */ false)) ++ if (path_startswith_full(stop, p, /* flags= */ 0)) + return 0; + + if (rmdir(p) < 0 && errno != ENOENT) +diff --git a/src/basic/mkdir.c b/src/basic/mkdir.c +index c770e5ed32..7bc73361a5 100644 +--- a/src/basic/mkdir.c ++++ b/src/basic/mkdir.c +@@ -155,7 +155,7 @@ int mkdir_parents_internal(const char *prefix, const char *path, mode_t mode, ui + assert(_mkdirat != mkdirat); + + if (prefix) { +- p = path_startswith_full(path, prefix, /* accept_dot_dot= */ false); ++ p = path_startswith_full(path, prefix, /* flags= */ 0); + if (!p) + return -ENOTDIR; + } else +diff --git a/src/basic/path-util.c b/src/basic/path-util.c +index 6810bf66aa..e73f5d708e 100644 +--- a/src/basic/path-util.c ++++ b/src/basic/path-util.c +@@ -403,8 +403,8 @@ char* path_simplify_full(char *path, PathSimplifyFlags flags) { + return path; + } + +-char* path_startswith_full(const char *path, const char *prefix, bool accept_dot_dot) { +- assert(path); ++char* path_startswith_full(const char *original_path, const char *prefix, PathStartWithFlags flags) { ++ assert(original_path); + assert(prefix); + + /* Returns a pointer to the start of the first component after the parts matched by +@@ -417,28 +417,45 @@ char* path_startswith_full(const char *path, const char *prefix, bool accept_dot + * Returns NULL otherwise. + */ + ++ const char *path = original_path; ++ + if ((path[0] == '/') != (prefix[0] == '/')) + return NULL; + + for (;;) { + const char *p, *q; +- int r, k; ++ int m, n; + +- r = path_find_first_component(&path, accept_dot_dot, &p); +- if (r < 0) ++ m = path_find_first_component(&path, FLAGS_SET(flags, PATH_STARTSWITH_ACCEPT_DOT_DOT), &p); ++ if (m < 0) + return NULL; + +- k = path_find_first_component(&prefix, accept_dot_dot, &q); +- if (k < 0) ++ n = path_find_first_component(&prefix, FLAGS_SET(flags, PATH_STARTSWITH_ACCEPT_DOT_DOT), &q); ++ if (n < 0) + return NULL; + +- if (k == 0) +- return (char*) (p ?: path); ++ if (n == 0) { ++ if (!p) ++ p = path; ++ ++ if (FLAGS_SET(flags, PATH_STARTSWITH_RETURN_LEADING_SLASH)) { ++ ++ if (p <= original_path) ++ return NULL; ++ ++ p--; ++ ++ if (*p != '/') ++ return NULL; ++ } ++ ++ return (char*) p; ++ } + +- if (r != k) ++ if (m != n) + return NULL; + +- if (!strneq(p, q, r)) ++ if (!strneq(p, q, m)) + return NULL; + } + } +diff --git a/src/basic/path-util.h b/src/basic/path-util.h +index 6d943e967f..e0ec05f4db 100644 +--- a/src/basic/path-util.h ++++ b/src/basic/path-util.h +@@ -53,9 +53,15 @@ int safe_getcwd(char **ret); + int path_make_absolute_cwd(const char *p, char **ret); + int path_make_relative(const char *from, const char *to, char **ret); + int path_make_relative_parent(const char *from_child, const char *to, char **ret); +-char* path_startswith_full(const char *path, const char *prefix, bool accept_dot_dot) _pure_; ++ ++typedef enum PathStartWithFlags { ++ PATH_STARTSWITH_ACCEPT_DOT_DOT = 1U << 0, ++ PATH_STARTSWITH_RETURN_LEADING_SLASH = 1U << 1, ++} PathStartWithFlags; ++ ++char* path_startswith_full(const char *path, const char *prefix, PathStartWithFlags flags) _pure_; + static inline char* path_startswith(const char *path, const char *prefix) { +- return path_startswith_full(path, prefix, true); ++ return path_startswith_full(path, prefix, PATH_STARTSWITH_ACCEPT_DOT_DOT); + } + + int path_compare(const char *a, const char *b) _pure_; +diff --git a/src/test/test-path-util.c b/src/test/test-path-util.c +index f5a425689a..5b164facc0 100644 +--- a/src/test/test-path-util.c ++++ b/src/test/test-path-util.c +@@ -754,6 +754,22 @@ TEST(path_startswith) { + test_path_startswith_one("/foo/bar/barfoo/", "/fo", NULL, NULL); + } + ++static void test_path_startswith_return_leading_slash_one(const char *path, const char *prefix, const char *expected) { ++ const char *p; ++ ++ log_debug("/* %s(%s, %s) */", __func__, path, prefix); ++ ++ p = path_startswith_full(path, prefix, PATH_STARTSWITH_RETURN_LEADING_SLASH); ++ assert_se(streq(p, expected)); ++} ++ ++TEST(path_startswith_return_leading_slash) { ++ test_path_startswith_return_leading_slash_one("/foo/bar", "/", "/foo/bar"); ++ test_path_startswith_return_leading_slash_one("/foo/bar", "/foo", "/bar"); ++ test_path_startswith_return_leading_slash_one("/foo/bar", "/foo/bar", NULL); ++ test_path_startswith_return_leading_slash_one("/foo/bar/", "/foo/bar", "/"); ++} ++ + static void test_prefix_root_one(const char *r, const char *p, const char *expected) { + _cleanup_free_ char *s = NULL; + const char *t; +-- +2.51.0 + diff --git a/SPECS/systemd/ipc-call-0002-path-util-invert-PATH_STARTSWITH_ACCEPT_DOT_DOT-flag.patch b/SPECS/systemd/ipc-call-0002-path-util-invert-PATH_STARTSWITH_ACCEPT_DOT_DOT-flag.patch new file mode 100644 index 0000000000..58011269c2 --- /dev/null +++ b/SPECS/systemd/ipc-call-0002-path-util-invert-PATH_STARTSWITH_ACCEPT_DOT_DOT-flag.patch @@ -0,0 +1,83 @@ +From 647d009c240dbeadf586e69b3c9121b6b6cb12d7 Mon Sep 17 00:00:00 2001 +From: Lennart Poettering +Date: Fri, 23 May 2025 06:45:40 +0200 +Subject: [PATCH 2/4] path-util: invert PATH_STARTSWITH_ACCEPT_DOT_DOT flag + +As requested: https://github.com/systemd/systemd/pull/37572#pullrequestreview-2861928094 + +(cherry picked from commit ceed11e465f1c8efff1931412a85924d9de7c08d) +(cherry picked from commit 7ac3220213690e8a8d6d2a6e81e43bd1dce01d69) +--- + src/basic/fs-util.c | 2 +- + src/basic/mkdir.c | 2 +- + src/basic/path-util.c | 4 ++-- + src/basic/path-util.h | 4 ++-- + 4 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c +index cc89f48fb7..f7c91680d8 100644 +--- a/src/basic/fs-util.c ++++ b/src/basic/fs-util.c +@@ -65,7 +65,7 @@ int rmdir_parents(const char *path, const char *stop) { + assert(*slash == '/'); + *slash = '\0'; + +- if (path_startswith_full(stop, p, /* flags= */ 0)) ++ if (path_startswith_full(stop, p, PATH_STARTSWITH_REFUSE_DOT_DOT)) + return 0; + + if (rmdir(p) < 0 && errno != ENOENT) +diff --git a/src/basic/mkdir.c b/src/basic/mkdir.c +index 7bc73361a5..8f14c47214 100644 +--- a/src/basic/mkdir.c ++++ b/src/basic/mkdir.c +@@ -155,7 +155,7 @@ int mkdir_parents_internal(const char *prefix, const char *path, mode_t mode, ui + assert(_mkdirat != mkdirat); + + if (prefix) { +- p = path_startswith_full(path, prefix, /* flags= */ 0); ++ p = path_startswith_full(path, prefix, PATH_STARTSWITH_REFUSE_DOT_DOT); + if (!p) + return -ENOTDIR; + } else +diff --git a/src/basic/path-util.c b/src/basic/path-util.c +index e73f5d708e..a65a5c32f6 100644 +--- a/src/basic/path-util.c ++++ b/src/basic/path-util.c +@@ -426,11 +426,11 @@ char* path_startswith_full(const char *original_path, const char *prefix, PathSt + const char *p, *q; + int m, n; + +- m = path_find_first_component(&path, FLAGS_SET(flags, PATH_STARTSWITH_ACCEPT_DOT_DOT), &p); ++ m = path_find_first_component(&path, !FLAGS_SET(flags, PATH_STARTSWITH_REFUSE_DOT_DOT), &p); + if (m < 0) + return NULL; + +- n = path_find_first_component(&prefix, FLAGS_SET(flags, PATH_STARTSWITH_ACCEPT_DOT_DOT), &q); ++ n = path_find_first_component(&prefix, !FLAGS_SET(flags, PATH_STARTSWITH_REFUSE_DOT_DOT), &q); + if (n < 0) + return NULL; + +diff --git a/src/basic/path-util.h b/src/basic/path-util.h +index e0ec05f4db..11a1078df9 100644 +--- a/src/basic/path-util.h ++++ b/src/basic/path-util.h +@@ -55,13 +55,13 @@ int path_make_relative(const char *from, const char *to, char **ret); + int path_make_relative_parent(const char *from_child, const char *to, char **ret); + + typedef enum PathStartWithFlags { +- PATH_STARTSWITH_ACCEPT_DOT_DOT = 1U << 0, ++ PATH_STARTSWITH_REFUSE_DOT_DOT = 1U << 0, + PATH_STARTSWITH_RETURN_LEADING_SLASH = 1U << 1, + } PathStartWithFlags; + + char* path_startswith_full(const char *path, const char *prefix, PathStartWithFlags flags) _pure_; + static inline char* path_startswith(const char *path, const char *prefix) { +- return path_startswith_full(path, prefix, PATH_STARTSWITH_ACCEPT_DOT_DOT); ++ return path_startswith_full(path, prefix, 0); + } + + int path_compare(const char *a, const char *b) _pure_; +-- +2.51.0 + diff --git a/SPECS/systemd/ipc-call-0003-core-cgroup-avoid-one-unnecessary-strjoina.patch b/SPECS/systemd/ipc-call-0003-core-cgroup-avoid-one-unnecessary-strjoina.patch new file mode 100644 index 0000000000..69e525234e --- /dev/null +++ b/SPECS/systemd/ipc-call-0003-core-cgroup-avoid-one-unnecessary-strjoina.patch @@ -0,0 +1,108 @@ +From 2e169664aff3236331d1cb7063d5241dc68b7461 Mon Sep 17 00:00:00 2001 +From: Mike Yuan +Date: Thu, 26 Feb 2026 11:06:00 +0100 +Subject: [PATCH 3/4] core/cgroup: avoid one unnecessary strjoina() + +(cherry picked from commit 42aee39107fbdd7db1ccd402a2151822b2805e9f) +(cherry picked from commit 80acea4ef80a4bb78560ed970c34952299b890d6) +(cherry picked from commit b5fd14693057e5f2c9b4a49603be64ec3608ff6c) +(cherry picked from commit 21167006574d6b83813c7596759b474f56562412) +--- + src/core/cgroup.c | 29 ++++++++++++++--------------- + 1 file changed, 14 insertions(+), 15 deletions(-) + +diff --git a/src/core/cgroup.c b/src/core/cgroup.c +index 61ac4df1a6..1fedc6e72f 100644 +--- a/src/core/cgroup.c ++++ b/src/core/cgroup.c +@@ -2565,12 +2565,13 @@ static int unit_update_cgroup( + return 0; + } + +-static int unit_attach_pid_to_cgroup_via_bus(Unit *u, pid_t pid, const char *suffix_path) { ++static int unit_attach_pid_to_cgroup_via_bus(Unit *u, const char *cgroup_path, pid_t pid) { + _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; +- char *pp; + int r; + + assert(u); ++ assert(cgroup_path); ++ assert(pid_is_valid(pid)); + + if (MANAGER_IS_SYSTEM(u->manager)) + return -EINVAL; +@@ -2578,17 +2579,13 @@ static int unit_attach_pid_to_cgroup_via_bus(Unit *u, pid_t pid, const char *suf + if (!u->manager->system_bus) + return -EIO; + +- if (!u->cgroup_path) +- return -EINVAL; +- + /* Determine this unit's cgroup path relative to our cgroup root */ +- pp = path_startswith(u->cgroup_path, u->manager->cgroup_root); ++ const char *pp = path_startswith_full(cgroup_path, ++ u->manager->cgroup_root, ++ PATH_STARTSWITH_RETURN_LEADING_SLASH|PATH_STARTSWITH_REFUSE_DOT_DOT); + if (!pp) + return -EINVAL; + +- pp = strjoina("/", pp, suffix_path); +- path_simplify(pp); +- + r = bus_call_method(u->manager->system_bus, + bus_systemd_mgr, + "AttachProcessesToUnit", +@@ -2627,8 +2624,10 @@ int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path) { + return r; + + if (isempty(suffix_path)) +- p = u->cgroup_path; ++ p = empty_to_root(u->cgroup_path); + else { ++ assert(path_is_absolute(suffix_path)); ++ + joined = path_join(u->cgroup_path, suffix_path); + if (!joined) + return -ENOMEM; +@@ -2646,7 +2645,7 @@ int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path) { + * before we use it */ + r = pidref_verify(pid); + if (r < 0) { +- log_unit_info_errno(u, r, "PID " PID_FMT " vanished before we could move it to target cgroup '%s', skipping: %m", pid->pid, empty_to_root(p)); ++ log_unit_info_errno(u, r, "PID " PID_FMT " vanished before we could move it to target cgroup '%s', skipping: %m", pid->pid, p); + continue; + } + +@@ -2657,7 +2656,7 @@ int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path) { + + log_unit_full_errno(u, again ? LOG_DEBUG : LOG_INFO, r, + "Couldn't move process "PID_FMT" to%s requested cgroup '%s': %m", +- pid->pid, again ? " directly" : "", empty_to_root(p)); ++ pid->pid, again ? " directly" : "", p); + + if (again) { + int z; +@@ -2667,9 +2666,9 @@ int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path) { + * Since it's more privileged it might be able to move the process across the + * leaves of a subtree whose top node is not owned by us. */ + +- z = unit_attach_pid_to_cgroup_via_bus(u, pid->pid, suffix_path); ++ z = unit_attach_pid_to_cgroup_via_bus(u, p, pid->pid); + if (z < 0) +- log_unit_info_errno(u, z, "Couldn't move process "PID_FMT" to requested cgroup '%s' (directly or via the system bus): %m", pid->pid, empty_to_root(p)); ++ log_unit_info_errno(u, z, "Couldn't move process "PID_FMT" to requested cgroup '%s' (directly or via the system bus): %m", pid->pid, p); + else { + if (ret >= 0) + ret++; /* Count successful additions */ +@@ -2707,7 +2706,7 @@ int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path) { + continue; /* Success! */ + + log_unit_debug_errno(u, r, "Failed to attach PID " PID_FMT " to requested cgroup %s in controller %s, falling back to unit's cgroup: %m", +- pid->pid, empty_to_root(p), cgroup_controller_to_string(c)); ++ pid->pid, p, cgroup_controller_to_string(c)); + } + + /* So this controller is either not delegate or realized, or something else weird happened. In +-- +2.51.0 + diff --git a/SPECS/systemd/ipc-call-0004-core-validate-input-cgroup-path-more-prudently.patch b/SPECS/systemd/ipc-call-0004-core-validate-input-cgroup-path-more-prudently.patch new file mode 100644 index 0000000000..4e197aeff2 --- /dev/null +++ b/SPECS/systemd/ipc-call-0004-core-validate-input-cgroup-path-more-prudently.patch @@ -0,0 +1,33 @@ +From a0b95d16a9d6a382d05bc8507de400329f7a1c14 Mon Sep 17 00:00:00 2001 +From: Mike Yuan +Date: Thu, 26 Feb 2026 11:06:34 +0100 +Subject: [PATCH 4/4] core: validate input cgroup path more prudently + +(cherry picked from commit efa6ba2ab625aaa160ac435a09e6482fc63bdbe8) +(cherry picked from commit 3cee294fe8cf4fa0eff933ab21416d099942cabd) +(cherry picked from commit 1d22f706bd04f45f8422e17fbde3f56ece17758a) +(cherry picked from commit 54588d2dedff54bfb6036670820650e4ea74628f) +--- + src/core/dbus-manager.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c +index 745f5cc17c..74a603da58 100644 +--- a/src/core/dbus-manager.c ++++ b/src/core/dbus-manager.c +@@ -646,6 +646,12 @@ static int method_get_unit_by_control_group(sd_bus_message *message, void *userd + if (r < 0) + return r; + ++ if (!path_is_absolute(cgroup)) ++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Control group path is not absolute: %s", cgroup); ++ ++ if (!path_is_normalized(cgroup)) ++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Control group path is not normalized: %s", cgroup); ++ + u = manager_get_unit_by_cgroup(m, cgroup); + if (!u) + return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_UNIT, +-- +2.51.0 + diff --git a/SPECS/systemd/systemd.spec b/SPECS/systemd/systemd.spec index 13a931d7cf..f4f777969f 100644 --- a/SPECS/systemd/systemd.spec +++ b/SPECS/systemd/systemd.spec @@ -50,7 +50,7 @@ Version: 255 # determine the build information from local checkout Version: %(tools/meson-vcs-tag.sh . error | sed -r 's/-([0-9])/.^\1/; s/-g/_g/') %endif -Release: 32%{?dist} +Release: 33%{?dist} # FIXME - hardcode to 'stable' for now as that's what we have in our blobstore %global stable 1 @@ -156,6 +156,12 @@ Patch0491: azurelinux-use-system-auth-in-pam-systemd-user.patch Patch0900: do-not-test-openssl-sm3.patch Patch0901: networkd-default-use-domains.patch Patch0902: CVE-2023-7008.patch +Patch0903: CVE-2025-4598.patch +Patch0904: fix-stackoverflow-when-dropping-tclass-or-qdisc.patch +Patch0905: ipc-call-0001-path-util-add-flavour-of-path_startswith-that-leaves.patch +Patch0906: ipc-call-0003-core-cgroup-avoid-one-unnecessary-strjoina.patch +Patch0907: ipc-call-0002-path-util-invert-PATH_STARTSWITH_ACCEPT_DOT_DOT-flag.patch +Patch0908: ipc-call-0004-core-validate-input-cgroup-path-more-prudently.patch %ifarch %{ix86} x86_64 aarch64 %global want_bootloader 1 @@ -1256,6 +1262,12 @@ rm -f %{name}.lang # %autochangelog. So we need to continue manually maintaining the # changelog here. %changelog +* Tue Mar 17 2026 Lee Chee Yang - 255-33 +- merge from Azure Linux 3.0.20260304-3.0 +- Add fix-stackoverflow-when-dropping-tclass-or-qdisc.patch +- Patch CVE-2025-4598 +- Apply patches for ipc issue. + * Mon Nov 10 2025 Lishan Liu - 255-32 - Define empty macro to resolve GCC compatibility issue for kernel 6.17 diff --git a/SPECS/telegraf/CVE-2025-10543.patch b/SPECS/telegraf/CVE-2025-10543.patch new file mode 100644 index 0000000000..6afbba5e2c --- /dev/null +++ b/SPECS/telegraf/CVE-2025-10543.patch @@ -0,0 +1,33 @@ +From dc05ddc627c4d247ffa5e401b3763b6465a3446c Mon Sep 17 00:00:00 2001 +From: AllSpark +Date: Mon, 8 Dec 2025 13:24:03 +0000 +Subject: [PATCH] Fields over 65535 bytes noe encoded correctly + +When encoding strings (1.5.3 in spec), and some other variable length fields, if the user passed in more then 65535 bytes the ouput would not be as expected (due to 16 byte header there is a hard limit). This change truncates output to 65535 bytes. + +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: AI Backport of https://github.com/eclipse-paho/paho.mqtt.golang/commit/3162447fa892038e82256e918b681dc0c63a21ff.patch +--- + .../github.com/eclipse/paho.mqtt.golang/packets/packets.go | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/vendor/github.com/eclipse/paho.mqtt.golang/packets/packets.go b/vendor/github.com/eclipse/paho.mqtt.golang/packets/packets.go +index b2d7ed1b..0f876c79 100644 +--- a/vendor/github.com/eclipse/paho.mqtt.golang/packets/packets.go ++++ b/vendor/github.com/eclipse/paho.mqtt.golang/packets/packets.go +@@ -330,6 +330,12 @@ func decodeBytes(b io.Reader) ([]byte, error) { + } + + func encodeBytes(field []byte) []byte { ++ // Attempting to encode more than 65,535 bytes would lead to an unexpected 16-bit length and extra data written ++ // (which would be parsed as later parts of the message). The safest option is to truncate. ++ if len(field) > 65535 { ++ field = field[0:65535] ++ } ++ + fieldLength := make([]byte, 2) + binary.BigEndian.PutUint16(fieldLength, uint16(len(field))) + return append(fieldLength, field...) +-- +2.45.4 + diff --git a/SPECS/telegraf/CVE-2025-11065.patch b/SPECS/telegraf/CVE-2025-11065.patch new file mode 100644 index 0000000000..b9ec72d7aa --- /dev/null +++ b/SPECS/telegraf/CVE-2025-11065.patch @@ -0,0 +1,283 @@ +From fc678501cbc2fba6edee65d3f1ef2295b185f1f5 Mon Sep 17 00:00:00 2001 +From: Mark Sagi-Kazar +Date: Sat, 12 Jul 2025 07:25:50 +0200 +Subject: [PATCH] fix: error message leaks + +Signed-off-by: Mark Sagi-Kazar + +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/go-viper/mapstructure/commit/742921c9ba2854d27baa64272487fc5075d2c39c.patch +--- + .../mitchellh/mapstructure/decode_hooks.go | 12 +- + .../mitchellh/mapstructure/error.go | 156 ++++++++++++++++++ + .../mitchellh/mapstructure/mapstructure.go | 10 +- + 3 files changed, 169 insertions(+), 9 deletions(-) + +diff --git a/vendor/github.com/mitchellh/mapstructure/decode_hooks.go b/vendor/github.com/mitchellh/mapstructure/decode_hooks.go +index 3a754ca7..4dfab7d3 100644 +--- a/vendor/github.com/mitchellh/mapstructure/decode_hooks.go ++++ b/vendor/github.com/mitchellh/mapstructure/decode_hooks.go +@@ -134,7 +134,9 @@ func StringToTimeDurationHookFunc() DecodeHookFunc { + } + + // Convert it by parsing +- return time.ParseDuration(data.(string)) ++ d, err := time.ParseDuration(data.(string)) ++ ++ return d, wrapTimeParseDurationError(err) + } + } + +@@ -155,7 +157,7 @@ func StringToIPHookFunc() DecodeHookFunc { + // Convert it by parsing + ip := net.ParseIP(data.(string)) + if ip == nil { +- return net.IP{}, fmt.Errorf("failed parsing ip %v", data) ++ return net.IP{}, fmt.Errorf("failed parsing ip") + } + + return ip, nil +@@ -178,7 +180,7 @@ func StringToIPNetHookFunc() DecodeHookFunc { + + // Convert it by parsing + _, net, err := net.ParseCIDR(data.(string)) +- return net, err ++ return net, wrapNetParseError(err) + } + } + +@@ -197,7 +199,9 @@ func StringToTimeHookFunc(layout string) DecodeHookFunc { + } + + // Convert it by parsing +- return time.Parse(layout, data.(string)) ++ ti, err := time.Parse(layout, data.(string)) ++ ++ return ti, wrapTimeParseError(err) + } + } + +diff --git a/vendor/github.com/mitchellh/mapstructure/error.go b/vendor/github.com/mitchellh/mapstructure/error.go +index 47a99e5a..8c3b0786 100644 +--- a/vendor/github.com/mitchellh/mapstructure/error.go ++++ b/vendor/github.com/mitchellh/mapstructure/error.go +@@ -3,8 +3,12 @@ package mapstructure + import ( + "errors" + "fmt" ++ "net" ++ "net/url" + "sort" ++ "strconv" + "strings" ++ "time" + ) + + // Error implements the error interface and can represents multiple +@@ -48,3 +52,155 @@ func appendErrors(errors []string, err error) []string { + return append(errors, e.Error()) + } + } ++ ++func wrapStrconvNumError(err error) error { ++ if err == nil { ++ return nil ++ } ++ ++ if err, ok := err.(*strconv.NumError); ok { ++ return &strconvNumError{Err: err} ++ } ++ ++ return err ++} ++ ++type strconvNumError struct { ++ Err *strconv.NumError ++} ++ ++func (e *strconvNumError) Error() string { ++ return "strconv." + e.Err.Func + ": " + e.Err.Err.Error() ++} ++ ++func (e *strconvNumError) Unwrap() error { return e.Err } ++ ++func wrapUrlError(err error) error { ++ if err == nil { ++ return nil ++ } ++ ++ if err, ok := err.(*url.Error); ok { ++ return &urlError{Err: err} ++ } ++ ++ return err ++} ++ ++type urlError struct { ++ Err *url.Error ++} ++ ++func (e *urlError) Error() string { ++ return fmt.Sprintf("%s", e.Err.Err) ++} ++ ++func (e *urlError) Unwrap() error { return e.Err } ++ ++func wrapNetParseError(err error) error { ++ if err == nil { ++ return nil ++ } ++ ++ if err, ok := err.(*net.ParseError); ok { ++ return &netParseError{Err: err} ++ } ++ ++ return err ++} ++ ++type netParseError struct { ++ Err *net.ParseError ++} ++ ++func (e *netParseError) Error() string { ++ return "invalid " + e.Err.Type ++} ++ ++func (e *netParseError) Unwrap() error { return e.Err } ++ ++func wrapTimeParseError(err error) error { ++ if err == nil { ++ return nil ++ } ++ ++ if err, ok := err.(*time.ParseError); ok { ++ return &timeParseError{Err: err} ++ } ++ ++ return err ++} ++ ++type timeParseError struct { ++ Err *time.ParseError ++} ++ ++func (e *timeParseError) Error() string { ++ if e.Err.Message == "" { ++ return fmt.Sprintf("parsing time as %q: cannot parse as %q", e.Err.Layout, e.Err.LayoutElem) ++ } ++ ++ return "parsing time " + e.Err.Message ++} ++ ++func (e *timeParseError) Unwrap() error { return e.Err } ++ ++func wrapNetIPParseAddrError(err error) error { ++ if err == nil { ++ return nil ++ } ++ ++ if errMsg := err.Error(); strings.HasPrefix(errMsg, "ParseAddr") { ++ errPieces := strings.Split(errMsg, ": ") ++ ++ return fmt.Errorf("ParseAddr: %s", errPieces[len(errPieces)-1]) ++ } ++ ++ return err ++} ++ ++func wrapNetIPParseAddrPortError(err error) error { ++ if err == nil { ++ return nil ++ } ++ ++ errMsg := err.Error() ++ if strings.HasPrefix(errMsg, "invalid port ") { ++ return errors.New("invalid port") ++ } else if strings.HasPrefix(errMsg, "invalid ip:port ") { ++ return errors.New("invalid ip:port") ++ } ++ ++ return err ++} ++ ++func wrapNetIPParsePrefixError(err error) error { ++ if err == nil { ++ return nil ++ } ++ ++ if errMsg := err.Error(); strings.HasPrefix(errMsg, "netip.ParsePrefix") { ++ errPieces := strings.Split(errMsg, ": ") ++ ++ return fmt.Errorf("netip.ParsePrefix: %s", errPieces[len(errPieces)-1]) ++ } ++ ++ return err ++} ++ ++func wrapTimeParseDurationError(err error) error { ++ if err == nil { ++ return nil ++ } ++ ++ errMsg := err.Error() ++ if strings.HasPrefix(errMsg, "time: unknown unit ") { ++ return errors.New("time: unknown unit") ++ } else if strings.HasPrefix(errMsg, "time: ") { ++ idx := strings.LastIndex(errMsg, " ") ++ ++ return errors.New(errMsg[:idx]) ++ } ++ ++ return err ++} +diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/vendor/github.com/mitchellh/mapstructure/mapstructure.go +index 7581806a..4845a28f 100644 +--- a/vendor/github.com/mitchellh/mapstructure/mapstructure.go ++++ b/vendor/github.com/mitchellh/mapstructure/mapstructure.go +@@ -642,7 +642,7 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er + if err == nil { + val.SetInt(i) + } else { +- return fmt.Errorf("cannot parse '%s' as int: %s", name, err) ++ return fmt.Errorf("cannot parse '%s' as int: %s", name, wrapStrconvNumError(err)) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) +@@ -699,14 +699,14 @@ func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) e + if err == nil { + val.SetUint(i) + } else { +- return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) ++ return fmt.Errorf("cannot parse '%s' as uint: %s", name, wrapStrconvNumError(err)) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := strconv.ParseUint(string(jn), 0, 64) + if err != nil { + return fmt.Errorf( +- "error decoding json.Number into %s: %s", name, err) ++ "error decoding json.Number into %s: %s", name, wrapStrconvNumError(err)) + } + val.SetUint(i) + default: +@@ -738,7 +738,7 @@ func (d *Decoder) decodeBool(name string, data interface{}, val reflect.Value) e + } else if dataVal.String() == "" { + val.SetBool(false) + } else { +- return fmt.Errorf("cannot parse '%s' as bool: %s", name, err) ++ return fmt.Errorf("cannot parse '%s' as bool: %s", name, wrapStrconvNumError(err)) + } + default: + return fmt.Errorf( +@@ -777,7 +777,7 @@ func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value) + if err == nil { + val.SetFloat(f) + } else { +- return fmt.Errorf("cannot parse '%s' as float: %s", name, err) ++ return fmt.Errorf("cannot parse '%s' as float: %s", name, wrapStrconvNumError(err)) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) +-- +2.45.4 + diff --git a/SPECS/telegraf/CVE-2025-47911.patch b/SPECS/telegraf/CVE-2025-47911.patch new file mode 100644 index 0000000000..da79865718 --- /dev/null +++ b/SPECS/telegraf/CVE-2025-47911.patch @@ -0,0 +1,100 @@ +From ca2fcd298c93ce202150fafa6e48d22e41b328fd Mon Sep 17 00:00:00 2001 +From: Roland Shoemaker +Date: Mon, 29 Sep 2025 16:33:18 -0700 +Subject: [PATCH] html: impose open element stack size limit + +The HTML specification contains a number of algorithms which are +quadratic in complexity by design. Instead of adding complicated +workarounds to prevent these cases from becoming extremely expensive in +pathological cases, we impose a limit of 512 to the size of the stack of +open elements. It is extremely unlikely that non-adversarial HTML +documents will ever hit this limit (but if we see cases of this, we may +want to make the limit configurable via a ParseOption). + +Thanks to Guido Vranken and Jakub Ciolek for both independently +reporting this issue. + +Fixes CVE-2025-47911 +Fixes golang/go#75682 + +Change-Id: I890517b189af4ffbf427d25d3fde7ad7ec3509ad +Reviewed-on: https://go-review.googlesource.com/c/net/+/709876 +Reviewed-by: Damien Neil +LUCI-TryBot-Result: Go LUCI +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/golang/net/commit/59706cdaa8f95502fdec64b67b4c61d6ca58727d.patch +--- + vendor/golang.org/x/net/html/escape.go | 2 +- + vendor/golang.org/x/net/html/parse.go | 21 +++++++++++++++++---- + 2 files changed, 18 insertions(+), 5 deletions(-) + +diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go +index 04c6bec2..12f22737 100644 +--- a/vendor/golang.org/x/net/html/escape.go ++++ b/vendor/golang.org/x/net/html/escape.go +@@ -299,7 +299,7 @@ func escape(w writer, s string) error { + case '\r': + esc = " " + default: +- panic("unrecognized escape character") ++ panic("html: unrecognized escape character") + } + s = s[i+1:] + if _, err := w.WriteString(esc); err != nil { +diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go +index 979ef17e..4d12a1c1 100644 +--- a/vendor/golang.org/x/net/html/parse.go ++++ b/vendor/golang.org/x/net/html/parse.go +@@ -231,7 +231,14 @@ func (p *parser) addChild(n *Node) { + } + + if n.Type == ElementNode { +- p.oe = append(p.oe, n) ++ p.insertOpenElement(n) ++ } ++} ++ ++func (p *parser) insertOpenElement(n *Node) { ++ p.oe = append(p.oe, n) ++ if len(p.oe) > 512 { ++ panic("html: open stack of elements exceeds 512 nodes") + } + } + +@@ -810,7 +817,7 @@ func afterHeadIM(p *parser) bool { + p.im = inFramesetIM + return true + case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title: +- p.oe = append(p.oe, p.head) ++ p.insertOpenElement(p.head) + defer p.oe.remove(p.head) + return inHeadIM(p) + case a.Head: +@@ -2320,9 +2327,13 @@ func (p *parser) parseCurrentToken() { + } + } + +-func (p *parser) parse() error { ++func (p *parser) parse() (err error) { ++ defer func() { ++ if panicErr := recover(); panicErr != nil { ++ err = fmt.Errorf("%s", panicErr) ++ } ++ }() + // Iterate until EOF. Any other error will cause an early return. +- var err error + for err != io.EOF { + // CDATA sections are allowed only in foreign content. + n := p.oe.top() +@@ -2351,6 +2362,8 @@ func (p *parser) parse() error { + // s. Conversely, explicit s in r's data can be silently dropped, + // with no corresponding node in the resulting tree. + // ++// Parse will reject HTML that is nested deeper than 512 elements. ++// + // The input is assumed to be UTF-8 encoded. + func Parse(r io.Reader) (*Node, error) { + return ParseWithOptions(r) +-- +2.45.4 + diff --git a/SPECS/telegraf/CVE-2025-47913.patch b/SPECS/telegraf/CVE-2025-47913.patch new file mode 100644 index 0000000000..968cdb6cee --- /dev/null +++ b/SPECS/telegraf/CVE-2025-47913.patch @@ -0,0 +1,50 @@ +From bfcec8590886ef05b312d567b7079be006ed23c2 Mon Sep 17 00:00:00 2001 +From: AllSpark +Date: Tue, 18 Nov 2025 16:24:10 +0000 +Subject: [PATCH] ssh/agent: return an error for unexpected message types + +Previously, receiving an unexpected message type in response to a key +listing or a signing request could cause a panic due to a failed type +assertion. + +This change adds a default case to the type switch in order to detect +and explicitly handle unknown or invalid message types, returning a +descriptive error instead of crashing. + +Fixes golang/go#75178 + +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: AI Backport of https://github.com/golang/crypto/commit/559e062ce8bfd6a39925294620b50906ca2a6f95.patch +--- + vendor/golang.org/x/crypto/ssh/agent/client.go | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/vendor/golang.org/x/crypto/ssh/agent/client.go b/vendor/golang.org/x/crypto/ssh/agent/client.go +index fecba8eb..6dc73e09 100644 +--- a/vendor/golang.org/x/crypto/ssh/agent/client.go ++++ b/vendor/golang.org/x/crypto/ssh/agent/client.go +@@ -430,8 +430,9 @@ func (c *client) List() ([]*Key, error) { + return keys, nil + case *failureAgentMsg: + return nil, errors.New("agent: failed to list keys") ++ default: ++ return nil, fmt.Errorf("agent: failed to list keys, unexpected message type %T", msg) + } +- panic("unreachable") + } + + // Sign has the agent sign the data using a protocol 2 key as defined +@@ -462,8 +463,9 @@ func (c *client) SignWithFlags(key ssh.PublicKey, data []byte, flags SignatureFl + return &sig, nil + case *failureAgentMsg: + return nil, errors.New("agent: failed to sign challenge") ++ default: ++ return nil, fmt.Errorf("agent: failed to sign challenge, unexpected message type %T", msg) + } +- panic("unreachable") + } + + // unmarshal parses an agent message in packet, returning the parsed +-- +2.45.4 + diff --git a/SPECS/telegraf/CVE-2025-58190.patch b/SPECS/telegraf/CVE-2025-58190.patch new file mode 100644 index 0000000000..25b54a8f8f --- /dev/null +++ b/SPECS/telegraf/CVE-2025-58190.patch @@ -0,0 +1,126 @@ +From b55299b135a4734bfb23ba12e71b32e67aa1a79f Mon Sep 17 00:00:00 2001 +From: Roland Shoemaker +Date: Mon, 29 Sep 2025 19:38:24 -0700 +Subject: [PATCH] html: align in row insertion mode with spec + +Update inRowIM to match the HTML specification. This fixes an issue +where a specific HTML document could cause the parser to enter an +infinite loop when trying to parse a and implied next to +each other. + +Fixes CVE-2025-58190 +Fixes golang/go#70179 + +Change-Id: Idcb133c87c7d475cc8c7eb1f1550ea21d8bdddea +Reviewed-on: https://go-review.googlesource.com/c/net/+/709875 +LUCI-TryBot-Result: Go LUCI +Reviewed-by: Damien Neil +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/golang/net/commit/6ec8895aa5f6594da7356da7d341b98133629009.patch +--- + vendor/golang.org/x/net/html/parse.go | 36 ++++++++++++++++++--------- + 1 file changed, 24 insertions(+), 12 deletions(-) + +diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go +index 5b8374bf..979ef17e 100644 +--- a/vendor/golang.org/x/net/html/parse.go ++++ b/vendor/golang.org/x/net/html/parse.go +@@ -136,7 +136,7 @@ func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int { + return -1 + } + default: +- panic("unreachable") ++ panic(fmt.Sprintf("html: internal error: indexOfElementInScope unknown scope: %d", s)) + } + } + switch s { +@@ -179,7 +179,7 @@ func (p *parser) clearStackToContext(s scope) { + return + } + default: +- panic("unreachable") ++ panic(fmt.Sprintf("html: internal error: clearStackToContext unknown scope: %d", s)) + } + } + } +@@ -1674,7 +1674,7 @@ func inTableBodyIM(p *parser) bool { + return inTableIM(p) + } + +-// Section 12.2.6.4.14. ++// Section 13.2.6.4.14. + func inRowIM(p *parser) bool { + switch p.tok.Type { + case StartTagToken: +@@ -1686,7 +1686,9 @@ func inRowIM(p *parser) bool { + p.im = inCellIM + return true + case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead, a.Tr: +- if p.popUntil(tableScope, a.Tr) { ++ if p.elementInScope(tableScope, a.Tr) { ++ p.clearStackToContext(tableRowScope) ++ p.oe.pop() + p.im = inTableBodyIM + return false + } +@@ -1696,22 +1698,28 @@ func inRowIM(p *parser) bool { + case EndTagToken: + switch p.tok.DataAtom { + case a.Tr: +- if p.popUntil(tableScope, a.Tr) { ++ if p.elementInScope(tableScope, a.Tr) { ++ p.clearStackToContext(tableRowScope) ++ p.oe.pop() + p.im = inTableBodyIM + return true + } + // Ignore the token. + return true + case a.Table: +- if p.popUntil(tableScope, a.Tr) { ++ if p.elementInScope(tableScope, a.Tr) { ++ p.clearStackToContext(tableRowScope) ++ p.oe.pop() + p.im = inTableBodyIM + return false + } + // Ignore the token. + return true + case a.Tbody, a.Tfoot, a.Thead: +- if p.elementInScope(tableScope, p.tok.DataAtom) { +- p.parseImpliedToken(EndTagToken, a.Tr, a.Tr.String()) ++ if p.elementInScope(tableScope, p.tok.DataAtom) && p.elementInScope(tableScope, a.Tr) { ++ p.clearStackToContext(tableRowScope) ++ p.oe.pop() ++ p.im = inTableBodyIM + return false + } + // Ignore the token. +@@ -2218,16 +2226,20 @@ func parseForeignContent(p *parser) bool { + p.acknowledgeSelfClosingTag() + } + case EndTagToken: ++ if strings.EqualFold(p.oe[len(p.oe)-1].Data, p.tok.Data) { ++ p.oe = p.oe[:len(p.oe)-1] ++ return true ++ } + for i := len(p.oe) - 1; i >= 0; i-- { +- if p.oe[i].Namespace == "" { +- return p.im(p) +- } + if strings.EqualFold(p.oe[i].Data, p.tok.Data) { + p.oe = p.oe[:i] ++ return true ++ } ++ if i > 0 && p.oe[i-1].Namespace == "" { + break + } + } +- return true ++ return p.im(p) + default: + // Ignore the token. + } +-- +2.45.4 + diff --git a/SPECS/telegraf/CVE-2026-2303.patch b/SPECS/telegraf/CVE-2026-2303.patch new file mode 100644 index 0000000000..6992facd11 --- /dev/null +++ b/SPECS/telegraf/CVE-2026-2303.patch @@ -0,0 +1,44 @@ +From fb04605cdd425ccf4dff7f7e18a11a3ad6fecf5d Mon Sep 17 00:00:00 2001 +From: Preston Vasquez +Date: Mon, 26 Jan 2026 09:48:19 -0700 +Subject: [PATCH] =?UTF-8?q?GODRIVER-3770=20Fix=20buffer=20handling=20in=20?= + =?UTF-8?q?GSSAPI=20error=20description=20and=20use=E2=80=A6=20(#2304)?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/mongodb/mongo-go-driver/commit/76ec2daba15f743989040ce2fdaf83f4a3e69bcb.patch +--- + .../x/mongo/driver/auth/internal/gssapi/gss_wrapper.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/internal/gssapi/gss_wrapper.c b/vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/internal/gssapi/gss_wrapper.c +index 68b72541..e426037e 100644 +--- a/vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/internal/gssapi/gss_wrapper.c ++++ b/vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/internal/gssapi/gss_wrapper.c +@@ -72,8 +72,8 @@ int gssapi_error_desc( + free(*desc); + } + +- *desc = malloc(desc_buffer.length+1); +- memcpy(*desc, desc_buffer.value, desc_buffer.length+1); ++ *desc = calloc(1, desc_buffer.length + 1); ++ memcpy(*desc, desc_buffer.value, desc_buffer.length); + + gss_release_buffer(&local_min_stat, &desc_buffer); + } +@@ -144,8 +144,8 @@ int gssapi_client_username( + return GSSAPI_ERROR; + } + +- *username = malloc(name_buffer.length+1); +- memcpy(*username, name_buffer.value, name_buffer.length+1); ++ *username = calloc(1, name_buffer.length + 1); ++ memcpy(*username, name_buffer.value, name_buffer.length); + + gss_release_buffer(&ignored, &name_buffer); + gss_release_name(&ignored, &name); +-- +2.45.4 + diff --git a/SPECS/telegraf/CVE-2026-26014.patch b/SPECS/telegraf/CVE-2026-26014.patch new file mode 100644 index 0000000000..084f3cdbc9 --- /dev/null +++ b/SPECS/telegraf/CVE-2026-26014.patch @@ -0,0 +1,63 @@ +From d3834beb654c05530528ff450f2707818edc92fb Mon Sep 17 00:00:00 2001 +From: theodorsm +Date: Thu, 12 Feb 2026 21:13:38 +0100 +Subject: [PATCH] Backport security fix for CVE-2026-26014 + +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/pion/dtls/commit/90e241cfec2985715efdd3d005972847462a67d6.patch +--- + .../github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ccm.go | 6 ++---- + .../github.com/pion/dtls/v2/pkg/crypto/ciphersuite/gcm.go | 6 ++---- + 2 files changed, 4 insertions(+), 8 deletions(-) + +diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ccm.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ccm.go +index 24050dc9..1cf6aac0 100644 +--- a/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ccm.go ++++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ccm.go +@@ -5,7 +5,6 @@ package ciphersuite + + import ( + "crypto/aes" +- "crypto/rand" + "encoding/binary" + "fmt" + +@@ -66,9 +65,8 @@ func (c *CCM) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) + raw = raw[:recordlayer.HeaderSize] + + nonce := append(append([]byte{}, c.localWriteIV[:4]...), make([]byte, 8)...) +- if _, err := rand.Read(nonce[4:]); err != nil { +- return nil, err +- } ++ seq64 := (uint64(pkt.Header.Epoch) << 48) | (pkt.Header.SequenceNumber & 0x0000ffffffffffff) ++ binary.BigEndian.PutUint64(nonce[4:], seq64) + + additionalData := generateAEADAdditionalData(&pkt.Header, len(payload)) + encryptedPayload := c.localCCM.Seal(nil, nonce, payload, additionalData) +diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/gcm.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/gcm.go +index c0fd1f76..ce557737 100644 +--- a/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/gcm.go ++++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/gcm.go +@@ -6,7 +6,6 @@ package ciphersuite + import ( + "crypto/aes" + "crypto/cipher" +- "crypto/rand" + "encoding/binary" + "fmt" + +@@ -60,9 +59,8 @@ func (g *GCM) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) + + nonce := make([]byte, gcmNonceLength) + copy(nonce, g.localWriteIV[:4]) +- if _, err := rand.Read(nonce[4:]); err != nil { +- return nil, err +- } ++ seq64 := (uint64(pkt.Header.Epoch) << 48) | (pkt.Header.SequenceNumber & 0x0000ffffffffffff) ++ binary.BigEndian.PutUint64(nonce[4:], seq64) + + additionalData := generateAEADAdditionalData(&pkt.Header, len(payload)) + encryptedPayload := g.localGCM.Seal(nil, nonce, payload, additionalData) +-- +2.45.4 + diff --git a/SPECS/telegraf/CVE-2026-27571.patch b/SPECS/telegraf/CVE-2026-27571.patch new file mode 100644 index 0000000000..4b17e594bd --- /dev/null +++ b/SPECS/telegraf/CVE-2026-27571.patch @@ -0,0 +1,97 @@ +From 5490a512d99134eb2c8cdf0b0735bd72a14e5945 Mon Sep 17 00:00:00 2001 +From: Ivan Kozlovic +Date: Mon, 8 Dec 2025 10:25:20 -0700 +Subject: [PATCH] Websocket: limit buffer size during decompression of a frame + +When the server would decompress a compressed websocket frame, it would +not limit the resulting size of the uncompressed buffer. Once uncompressed +the maximum payload size would still be used to reject messages that +are too big, but the server would have already uncompressed a possibly +very big buffer (if the frame contained highly compressed data). + +This PR limits the number of bytes that are being decompressed using +the maximum payload size as a limit. + +Credit goes to: +Pavel Kohout, Aisle Research (www.aisle.com) for reporting the issue +and providing a path. + +The propose patched as been updated a bit (need to use atomic to +use the connection's max payload value) and some tweaks around +the use of the `io.LimitedReader`. + +Signed-off-by: Ivan Kozlovic +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/nats-io/nats-server/commit/f77fb7c4535e6727cc1a2899cd8e6bbdd8ba2017.patch +--- + .../nats-server/v2/server/websocket.go | 26 ++++++++++++++++--- + 1 file changed, 22 insertions(+), 4 deletions(-) + +diff --git a/vendor/github.com/nats-io/nats-server/v2/server/websocket.go b/vendor/github.com/nats-io/nats-server/v2/server/websocket.go +index e026674d..1804b4de 100644 +--- a/vendor/github.com/nats-io/nats-server/v2/server/websocket.go ++++ b/vendor/github.com/nats-io/nats-server/v2/server/websocket.go +@@ -31,6 +31,7 @@ import ( + "strconv" + "strings" + "sync" ++ "sync/atomic" + "time" + "unicode/utf8" + +@@ -203,6 +204,7 @@ func (c *client) wsRead(r *wsReadInfo, ior io.Reader, buf []byte) ([][]byte, err + err error + pos int + max = len(buf) ++ mpay = int(atomic.LoadInt32(&c.mpay)) + ) + for pos != max { + if r.fs { +@@ -316,7 +318,7 @@ func (c *client) wsRead(r *wsReadInfo, ior io.Reader, buf []byte) ([][]byte, err + // When we have the final frame and we have read the full payload, + // we can decompress it. + if r.ff && r.rem == 0 { +- b, err = r.decompress() ++ b, err = r.decompress(mpay) + if err != nil { + return bufs, err + } +@@ -390,7 +392,16 @@ func (r *wsReadInfo) ReadByte() (byte, error) { + return b, nil + } + +-func (r *wsReadInfo) decompress() ([]byte, error) { ++// decompress decompresses the collected buffers. ++// The size of the decompressed buffer will be limited to the `mpay` value. ++// If, while decompressing, the resulting uncompressed buffer exceeds this ++// limit, the decompression stops and an empty buffer and the ErrMaxPayload ++// error are returned. ++func (r *wsReadInfo) decompress(mpay int) ([]byte, error) { ++ // If not limit is specified, use the default maximum payload size. ++ if mpay <= 0 { ++ mpay = MAX_PAYLOAD_SIZE ++ } + r.coff = 0 + // As per https://tools.ietf.org/html/rfc7692#section-7.2.2 + // add 0x00, 0x00, 0xff, 0xff and then a final block so that flate reader +@@ -405,8 +416,15 @@ func (r *wsReadInfo) decompress() ([]byte, error) { + } else { + d.(flate.Resetter).Reset(r, nil) + } +- // This will do the decompression. +- b, err := io.ReadAll(d) ++ // Use a LimitedReader to limit the decompressed size. ++ // We use "limit+1" bytes for "N" so we can detect if the limit is exceeded. ++ lr := io.LimitedReader{R: d, N: int64(mpay + 1)} ++ b, err := io.ReadAll(&lr) ++ if err == nil && len(b) > mpay { ++ // Decompressed data exceeds the maximum payload size. ++ b, err = nil, ErrMaxPayload ++ } ++ lr.R = nil + decompressorPool.Put(d) + // Now reset the compressed buffers list. + r.cbufs = nil +-- +2.45.4 + diff --git a/SPECS/telegraf/telegraf.spec b/SPECS/telegraf/telegraf.spec index 300366a9d9..e1ff32230a 100644 --- a/SPECS/telegraf/telegraf.spec +++ b/SPECS/telegraf/telegraf.spec @@ -1,7 +1,7 @@ Summary: agent for collecting, processing, aggregating, and writing metrics. Name: telegraf Version: 1.31.0 -Release: 24%{?dist} +Release: 26%{?dist} License: MIT Vendor: Intel Corporation Distribution: Edge Microvisor Toolkit @@ -24,8 +24,17 @@ Patch8: CVE-2025-30204.patch Patch9: CVE-2025-27144.patch Patch10: CVE-2025-30215.patch Patch11: CVE-2025-22872.patch +Patch12: CVE-2025-47913.patch +Patch13: CVE-2025-10543.patch +Patch14: CVE-2026-27571.patch +Patch15: CVE-2025-11065.patch +Patch16: CVE-2025-47911.patch +Patch17: CVE-2025-58190.patch +Patch18: CVE-2026-2303.patch +Patch19: CVE-2026-26014.patch -BuildRequires: golang + +BuildRequires: golang < 1.26.0 BuildRequires: systemd-devel Requires: logrotate Requires: procps-ng @@ -128,6 +137,17 @@ fi %selinux_modules_uninstall -s %{selinuxtype} %{modulename} %changelog +* Mon Feb 23 2026 Lee Chee Yang - 1.31.0-26 +- merge from Azure Linux 3.0.20260304-3.0 +- Patch for CVE-2025-10543 +- Patch for CVE-2026-26014, CVE-2026-2303, CVE-2025-58190, CVE-2025-47911 +- Patch for CVE-2025-11065 +- Patch for CVE-2026-27571 + +* Tue Jan 6 2026 Lee Chee Yang - 1.31.0-25 +- merge from Azure Linux 3.0.20251206-3.0 +- Patch for CVE-2025-47913 + * Thu Nov 05 2025 Kishan Mochi - 1.31.0-24 - remove inbm selinux diff --git a/SPECS/thrift/configure-java-prefix.patch b/SPECS/thrift/configure-java-prefix.patch deleted file mode 100644 index 8e68f541e7..0000000000 --- a/SPECS/thrift/configure-java-prefix.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/configure.ac b/configure.ac -index 0972abf..77107fc 100755 ---- a/configure.ac -+++ b/configure.ac -@@ -34,10 +34,7 @@ AC_ARG_VAR([PY_PREFIX], [Prefix for installing Python modules. - AS_IF([test "x$PY_PREFIX" = x], [PY_PREFIX="/usr"]) - - AC_ARG_VAR([JAVA_PREFIX], [Prefix for installing the Java lib jar. -- Default = "/usr/local/lib"]) --AS_IF([test "x$JAVA_PREFIX" != x], [JAVA_PREFIX="$JAVA_PREFIX/usr/local/lib"], -- [test "x$PREFIX" != x], [JAVA_PREFIX="$PREFIX/usr/local/lib"], -- [JAVA_PREFIX="/usr/local/lib"]) -+ Default = "/usr/share/java"]) - - AC_ARG_VAR([RUBY_PREFIX], [Prefix for installing Ruby modules. - (Normal --prefix is ignored for Ruby because - diff --git a/SPECS/thrift/thrift.signatures.json b/SPECS/thrift/thrift.signatures.json deleted file mode 100644 index 30193859a4..0000000000 --- a/SPECS/thrift/thrift.signatures.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Signatures": { - "bootstrap.sh": "ad4d6eb9fcd1bdc068dd98966516a32db760223a2b9ec9527bc6ac50240d6de5", - "libthrift-0.15.0.pom": "18975af7be5790578a9570f5716fce49c769bff05fab8ad6829c768c2120208b", - "thrift-0.15.0.tar.gz": "d5883566d161f8f6ddd4e21f3a9e3e6b8272799d054820f1c25b11e86718f86b" - } -} - \ No newline at end of file diff --git a/SPECS/thrift/thrift.spec b/SPECS/thrift/thrift.spec deleted file mode 100644 index 2672361ef4..0000000000 --- a/SPECS/thrift/thrift.spec +++ /dev/null @@ -1,693 +0,0 @@ -%global php_extdir %(php-config --extension-dir 2>/dev/null || echo "undefined") - -%{?perl_default_filter} -%global __provides_exclude_from ^(%{python3_sitearch}/.*\\.so|%{php_extdir}/.*\\.so)$ - -%global have_mongrel 0 - -# erlang-jsx is available in F19 but orphaned in F22 -%global have_jsx 0 - -# We should be able to enable this in the future -%global want_d 0 - -# Can't do anything with java with all the build deps in modules -%global want_java 0 - -%if 0%{?want_java} == 0 -%global java_configure --without-java -%else -%global java_configure --with-java -%endif - -# Thrift's Ruby support depends on Mongrel. Since Mongrel is -# deprecated in Fedora, we can't support Ruby bindings for Thrift -# unless and until Thrift is patched to use a different HTTP server. -%if 0%{?have_mongrel} == 0 -%global ruby_configure --without-ruby -%global with_ruby 0 -%else -%global ruby_configure --with-ruby -%global want_ruby 1 -%endif - -# Thrift's Erlang support depends on the JSX library, which is not -# currently available in Fedora. - -%if 0%{?have_jsx} == 0 -%global erlang_configure --without-erlang -%global want_erlang 0 -%else -%global erlang_configure --with-erlang -%global want_erlang 1 -%endif - -# PHP appears broken in Thrift 0.9.1 -%global want_php 0 - -%if 0%{?want_php} == 0 -%global php_langname %{nil} -%global php_configure --without-php -%else -%global php_langname PHP,\ -%global php_configure --with-php -%endif - -# Thrift's GO support doesn't build under Fedora -%global want_golang 0 -%global golang_configure --without-go - -# Thrift's Lua support has not yet been worked on -%global want_lua 0 -%global lua_configure --without-lua - -# NOTE: thrift versions their libraries by package version, so each version -# change is a SONAME change and dependencies need to be rebuilt -Summary: Software framework for cross-language services development -Name: thrift -Version: 0.15.0 -Release: 6%{?dist} - -# Parts of the source are used under the BSD and zlib licenses, but -# these are OK for inclusion in an Apache 2.0-licensed whole: -# https://www.apache.org/legal/3party.html - -# Here's the breakdown: -# ./lib/py/compat/win32/stdint.h is 2-clause BSD -# ./compiler/cpp/src/md5.[ch] are zlib -License: Apache-2.0 AND BSD-3-Clause AND Zlib -Vendor: Microsoft Corporation -Distribution: Azure Linux -URL: https://thrift.apache.org/ - -Source0: https://archive.apache.org/dist/%{name}/%{version}/%{name}-%{version}.tar.gz - -Source1: https://repo1.maven.org/maven2/org/apache/thrift/lib%{name}/%{version}/lib%{name}-%{version}.pom -Source2: https://raw.github.com/apache/%{name}/%{version}/bootstrap.sh - -# fix configure.ac insistence on using /usr/local/lib for JAVA_PREFIX -Patch1: configure-java-prefix.patch - - -# BuildRequires for language-specific bindings are listed under these -# subpackages, to facilitate enabling or disabling individual language -# bindings in the future - -BuildRequires: pkgconfig(libcrypto) -BuildRequires: python3-six -%if 0%{?want_java} > 0 -BuildRequires: ant >= 1.7 -%endif -BuildRequires: make -BuildRequires: autoconf -BuildRequires: automake -BuildRequires: bison -BuildRequires: boost-devel -BuildRequires: boost-static -BuildRequires: flex -BuildRequires: gcc-c++ -BuildRequires: glib2-devel -BuildRequires: libevent-devel -BuildRequires: libstdc++-devel -BuildRequires: libtool -BuildRequires: openssl-devel -BuildRequires: openssl-libs -BuildRequires: zlib-devel - -%if 0%{?want_golang} > 0 -BuildRequires: golang -Requires: golang -%endif - -%description - -The Apache Thrift software framework for cross-language services -development combines a software stack with a code generation engine to -build services that work efficiently and seamlessly between C++, Java, -Python, %{?php_langname}and other languages. - -%package devel -Summary: Development files for %{name} -Requires: %{name}%{?_isa} = %{version}-%{release} -Requires: pkgconfig -Requires: boost-devel - -%description devel -The %{name}-devel package contains libraries and header files for -developing applications that use %{name}. - -%package -n python3-%{name} -Summary: Python 3 support for %{name} -BuildRequires: python3-devel -BuildRequires: python3-setuptools -Requires: %{name}%{?_isa} = %{version}-%{release} -Requires: python3 -Obsoletes: python-%{name} < 0.10.0-1%{?dist} -Obsoletes: python2-%{name} < 0.10.0-14%{?dist} - -%description -n python3-%{name} -The python3-%{name} package contains Python bindings for %{name}. - -%package -n perl-%{name} -Summary: Perl support for %{name} -Provides: perl(Thrift) = %{version}-%{release} -BuildRequires: perl-Bit-Vector -BuildRequires: perl-ExtUtils-MakeMaker -BuildRequires: perl-generators -Requires: perl-Bit-Vector -Requires: perl(Encode) -Requires: perl(HTTP::Request) -Requires: perl(IO::Select) -Requires: perl(IO::Socket::INET) -Requires: perl(LWP::UserAgent) -Requires: perl(POSIX) -Requires: perl(base) -Requires: perl(constant) -Requires: perl(strict) -Requires: perl(utf8) -Requires: perl(warnings) -# thrift improperly packages some components in files with names different -# than the package they contain -Provides: perl(Thrift::Exception) -Provides: perl(Thrift::MessageType) -Provides: perl(Thrift::Type) -BuildArch: noarch - -%description -n perl-%{name} -The perl-%{name} package contains Perl bindings for %{name}. - -%if %{?want_d} -%package -n d-%{name} -Summary: D support for %{name} -BuildRequires: ldc - -%description -n d-%{name} -The d-%{name} package contains D bindings for %{name}. -%endif - -%if 0%{?want_php} != 0 -%package -n php-%{name} -Summary: PHP support for %{name} -Requires: %{name}%{?_isa} = %{version}-%{release} -Requires: php(zend-abi) = %{php_zend_api} -Requires: php(api) = %{php_core_api} -Requires: php(language) >= 5.3.0 -Requires: php-date -Requires: php-json -BuildRequires: php-devel - -%description -n php-%{name} -The php-%{name} package contains PHP bindings for %{name}. -%endif - -%if 0%{?want_java} > 0 -%package -n lib%{name}-javadoc -Summary: API documentation for java-%{name} -Requires: lib%{name}-java = %{version}-%{release} -BuildArch: noarch - -%description -n lib%{name}-javadoc -The lib%{name}-javadoc package contains API documentation for the -Java bindings for %{name}. - -%package -n lib%{name}-java -Summary: Java support for %{name} - -BuildRequires: apache-commons-codec -BuildRequires: apache-commons-lang -BuildRequires: apache-commons-logging -BuildRequires: httpcomponents-client -BuildRequires: httpcomponents-core -BuildRequires: java-devel -BuildRequires: javapackages-tools -BuildRequires: javapackages-local -BuildRequires: junit -BuildRequires: log4j -BuildRequires: slf4j -# javax.servlet-api 3.1.0 is provided by glassfish-servlet-api -BuildRequires: mvn(javax.servlet:javax.servlet-api) = 3.1.0 - -Requires: java-headless >= 1:1.6.0 -Requires: javapackages-tools -Requires: mvn(org.slf4j:slf4j-api) -Requires: mvn(commons-lang:commons-lang) -Requires: mvn(org.apache.httpcomponents:httpclient) -Requires: mvn(org.apache.httpcomponents:httpcore) -BuildArch: noarch - -%description -n lib%{name}-java -The lib%{name}-java package contains Java bindings for %{name}. -%endif - -%if 0%{?want_ruby} > 0 -%package -n ruby-%{name} -Summary: Ruby support for %{name} -Requires: %{name}%{?_isa} = %{version}-%{release} -Requires: ruby(release) -BuildRequires: ruby-devel - -%description -n ruby-%{name} -The ruby-%{name} package contains Ruby bindings for %{name}. -%endif - -%if 0%{?want_erlang} > 0 -%package -n erlang-%{name} -Summary: Erlang support for %{name} -Requires: %{name}%{?_isa} = %{version}-%{release} -Requires: erlang -Requires: erlang-jsx -BuildRequires: erlang -BuildRequires: erlang-rebar - -%description -n erlang-%{name} -The erlang-%{name} package contains Erlang bindings for %{name}. -%endif - - -%prep -%autosetup -p1 - -%{?!el5:sed -i -e 's/^AC_PROG_LIBTOOL/LT_INIT/g' configure.ac} - -# avoid spurious executable permissions in debuginfo package -find . -name \*.cpp -or -name \*.cc -or -name \*.h | xargs -r chmod 644 - -cp -p %{SOURCE2} bootstrap.sh - -# work around linking issues -echo 'libthriftz_la_LIBADD = $(ZLIB_LIBS) -lthrift -L.libs' >> lib/cpp/Makefile.am -echo 'EXTRA_libthriftz_la_DEPENDENCIES = libthrift.la' >> lib/cpp/Makefile.am - -# fix broken upstream check for ant version; we enforce this with BuildRequires, so no need to check here -sed -i 's|ANT_VALID=.*|ANT_VALID=1|' aclocal/ax_javac_and_java.m4 - -# explicitly set python3 -shopt -s globstar -sed -i -E 's@^(#!.*/env) *python *$@\1 python3@' **/*.py - -%build -export PY_PREFIX=%{_prefix} -export PERL_PREFIX=%{_prefix} -export PHP_PREFIX=%{php_extdir} -export JAVA_PREFIX=%{_javadir} -export RUBY_PREFIX=%{_prefix} -export GOBJECT_LIBS=$(pkg-config --libs gobject-2.0) -export GOBJECT_CFLAGS=$(pkg-config --cflags gobject-2.0) - -find %{_builddir} -name rebar -exec rm -f '{}' \; -find . -name Makefile\* -exec sed -i -e 's/[.][/]rebar/rebar/g' {} \; - -# install javadocs in proper places -sed -i 's|-Dinstall.javadoc.path=$(DESTDIR)$(docdir)/java|-Dinstall.javadoc.path=$(DESTDIR)%{_javadocdir}/%{name}|' lib/java/Makefile.* - -# build a jar without a version number -#sed -i 's|${thrift.artifactid}-${version}|${thrift.artifactid}|' lib/java/build.xml - -# Proper permissions for Erlang files -sed -i 's|$(INSTALL) $$p|$(INSTALL) --mode 644 $$p|g' lib/erl/Makefile.am - -sh ./bootstrap.sh - -# use unversioned doc dirs where appropriate (via _pkgdocdir macro) -export PYTHON=%{_bindir}/python3 -%configure --disable-dependency-tracking --disable-static --with-boost=/usr \ - --docdir=%{?_pkgdocdir}%{!?_pkgdocdir:%{_docdir}/%{name}-%{version}} \ - %{java_configure} %{ruby_configure} %{erlang_configure} %{golang_configure} %{php_configure} %{lua_configure} - -# eliminate unused direct shlib dependencies -sed -i -e 's/ -shared / -Wl,--as-needed\0/g' libtool - -%make_build - -%install -%make_install -find %{buildroot} -name '*.la' -exec rm -f {} ';' -find %{buildroot} -name fastbinary.so | xargs -r chmod 755 -find %{buildroot} -name \*.erl -or -name \*.hrl -or -name \*.app | xargs -r chmod 644 - -# Remove javadocs jar -%if 0%{?want_java} > 0 -find %{buildroot}/%{_javadir} -name lib%{name}-javadoc.jar -exec rm -f '{}' \; -# Add POM file and depmap -mkdir -p %{buildroot}%{_mavenpomdir} -install -pm 644 %{SOURCE1} %{buildroot}%{_mavenpomdir}/JPP-libthrift.pom -%add_maven_depmap JPP-libthrift.pom libthrift.jar -%endif - -# Remove bundled jar files -find %{buildroot} -name \*.jar -a \! -name \*thrift\* -exec rm -f '{}' \; - -# Move perl files into appropriate places -find %{buildroot} -name \*.pod -exec rm -f '{}' \; -find %{buildroot} -name .packlist -exec rm -f '{}' \; - - -%if 0%{?want_php} != 0 - -# Move arch-independent php files into the appropriate place -mkdir -p %{buildroot}/%{_datadir}/php/ -mv %{buildroot}/%{php_extdir}/Thrift %{buildroot}/%{_datadir}/php/ -%endif - -# Fix permissions on Thread.h -find %{buildroot} -name Thread.h -exec chmod a-x '{}' \; - -# Ensure all python scripts are executable -find %{buildroot} -name \*.py -exec grep -q /usr/bin/env {} \; -print | xargs -r chmod 755 -%ldconfig_scriptlets - - -%files -%doc LICENSE NOTICE -%{_bindir}/thrift -%{_libdir}/libthrift-%{version}.so -%{_libdir}/libthriftz-%{version}.so -%{_libdir}/libthriftnb-%{version}.so - -%files devel -%{_includedir}/thrift -%{_libdir}/*.so -%{_libdir}/*.so.0 -%{_libdir}/*.so.0.0.0 -%exclude %{_libdir}/lib*-%{version}.so -%{_libdir}/pkgconfig/thrift-z.pc -%{_libdir}/pkgconfig/thrift-nb.pc -%{_libdir}/pkgconfig/thrift.pc -%{_libdir}/pkgconfig/thrift_c_glib.pc -%doc LICENSE NOTICE - - -%if 0%{?want_php} != 0 -%files -n php-%{name} -%config(noreplace) /etc/php.d/thrift_protocol.ini -%{_datadir}/php/Thrift/ -%{php_extdir}/thrift_protocol.so -%doc LICENSE NOTICE -%endif - -%if %{?want_erlang} > 0 -%files -n erlang-%{name} -%{_libdir}/erlang/lib/%{name}-%{version}/ -%doc LICENSE NOTICE -%endif - -%files -n python3-%{name} -%{python3_sitearch}/%{name} -%{python3_sitearch}/%{name}-%{version}-py%{python3_version}.egg-info -%doc LICENSE NOTICE - -%if 0%{?want_java} > 0 -%files -n lib%{name}-javadoc -%{_javadocdir}/%{name} -%doc LICENSE NOTICE - -%files -n lib%{name}-java -f .mfiles -%doc LICENSE NOTICE -%endif - -%changelog -* Fri Mar 21 2025 Anuj Mittal - 0.15.0-6 -- Bump Release to rebuild - -* Tue Mar 19 2024 Himaja Kesari - 0.15.0-5 -- Initial CBL-Mariner import from Fedora 40 (license: MIT). -- License verified. - -* Sat Jan 27 2024 Fedora Release Engineering - 0.15.0-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Sat Jul 22 2023 Fedora Release Engineering - 0.15.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Fri Jun 16 2023 Orion Poplawski - 0.15.0-2 -- Re-enable LTO, seems to be working again - -* Thu Jun 15 2023 Orion Poplawski - 0.15.0-1 -- Update to 0.15.0 - -* Tue Jun 13 2023 Python Maint - 0.14.0-14 -- Rebuilt for Python 3.12 - -* Sat Jan 21 2023 Fedora Release Engineering - 0.14.0-13 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Fri Nov 18 2022 Christopher Tubbs - 0.14.0-12 -- Convert license tags to SPDX - -* Sat Jul 23 2022 Fedora Release Engineering - 0.14.0-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Mon Jun 13 2022 Python Maint - 0.14.0-10 -- Rebuilt for Python 3.11 - -* Tue Jun 07 2022 Benjamin A. Beasley - 0.14.0-9 -- Work around GCC 12 error by disabling LTO (close RHBZ#2046213) - -* Wed Jun 01 2022 Jitka Plesnikova - 0.14.0-8 -- Perl 5.36 rebuild - -* Sat Jan 22 2022 Fedora Release Engineering - 0.14.0-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Tue Sep 14 2021 Sahana Prasad - 0.14.0-6 -- Rebuilt with OpenSSL 3.0.0 - -* Fri Jul 23 2021 Fedora Release Engineering - 0.14.0-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Fri Jun 04 2021 Python Maint - 0.14.0-4 -- Rebuilt for Python 3.10 - -* Sun May 23 2021 Jitka Plesnikova - 0.14.0-3 -- Perl 5.34 rebuild - -* Thu Feb 18 2021 Orion Poplawski - 0.14.0-2 -- Add patch to fix compilation on non-x86 - -* Mon Feb 15 2021 Orion Poplawski - 0.14.0-1 -- Update to 0.14.0 (bz#1928172) CVE-2020-13949 - -* Wed Jan 27 2021 Fedora Release Engineering - 0.13.0-10 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Mon Oct 05 2020 Orion Poplawski - 0.13.0-9 -- Add BR python3-setuptools - -* Wed Sep 23 2020 Christopher Tubbs - 0.13.0-8 -- rebuilt for side tag f34-build-side-30069 - -* Thu Sep 17 2020 Orion Poplawski - 0.13.0-7 -- Drop unneeded BR on flex-devel (bz#1871095) - -* Wed Jul 29 2020 Fedora Release Engineering - 0.13.0-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Tue Jun 23 2020 Jitka Plesnikova - 0.13.0-5 -- Perl 5.32 rebuild - -* Tue May 26 2020 Miro Hrončok - 0.13.0-4 -- Rebuilt for Python 3.9 - -* Fri Jan 31 2020 Fedora Release Engineering - 0.13.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Wed Dec 4 2019 Orion Poplawski - 0.13.0-2 -- Fix perl dependencies -- Explicitly disable lua - -* Sun Dec 1 2019 Orion Poplawski - 0.13.0-1 -- Update to 0.13.0 (bz#1778343) -- Drops fb303 package -- Switch to Qt5 - -* Thu Oct 03 2019 Miro Hrončok - 0.10.0-20 -- Rebuilt for Python 3.8.0rc1 (#1748018) - -* Tue Aug 20 2019 Christopher Tubbs - 0.10.0-19 -- Fix FTBFS (by removing Java support) and fix Python3 issues (rhbz#1738810 and rhbz#1533306) - -* Sat Jul 27 2019 Fedora Release Engineering - 0.10.0-18 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Sat Jun 01 2019 Jitka Plesnikova - 0.10.0-17 -- Perl 5.30 rebuild - -* Sun Feb 03 2019 Fedora Release Engineering - 0.10.0-16 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Wed Jul 18 2018 Christopher Tubbs - 0.10.0-15 -- Rebuild to address transient error - -* Wed Jul 18 2018 Christopher Tubbs - 0.10.0-14 -- Migrate to python3; rhbz#1533306 - -* Sat Jul 14 2018 Fedora Release Engineering - 0.10.0-13 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Fri Jun 29 2018 Jitka Plesnikova - 0.10.0-12 -- Perl 5.28 rebuild - -* Wed May 30 2018 Christopher Tubbs - 0.10.0-11 -- Fix FTBFS; update servlet-api dependency (rhbz#1581175) - -* Thu Mar 08 2018 Christopher Tubbs - 0.10.0-10 -- Add gcc-c++ BuildRequires - -* Fri Feb 09 2018 Fedora Release Engineering - 0.10.0-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Fri Dec 22 2017 Christopher Tubbs - 0.10.0-8 -- Fix for rhbz#1507518 - -* Thu Aug 03 2017 Fedora Release Engineering - 0.10.0-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Thu Jul 27 2017 Fedora Release Engineering - 0.10.0-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Thu Jul 06 2017 Christopher Tubbs - 0.10.0-5 -- Fix FTBFS in rawhide: add BR javapackages-local - -* Sun Jun 04 2017 Jitka Plesnikova - 0.10.0-4 -- Perl 5.26 rebuild - -* Mon May 15 2017 Fedora Release Engineering - 0.10.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_27_Mass_Rebuild - -* Mon Mar 13 2017 Christopher Tubbs - 0.10.0-2 -- Build TNonblockingServer, remove useless man page, and use java-headless - -* Tue Mar 07 2017 Christopher Tubbs - 0.10.0-1 -- Update to thrift 0.10.0 - -* Sat Feb 11 2017 Fedora Release Engineering - 0.9.1-17.6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Tue Jul 19 2016 Fedora Release Engineering - 0.9.1-17.5 -- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages - -* Tue May 17 2016 Jitka Plesnikova - 0.9.1-17.4 -- Perl 5.24 rebuild - -* Wed Mar 30 2016 Petr Pisar - 0.9.1-17.3 -- Adapt to GCC 6 (bug #1306671) - -* Fri Feb 05 2016 Fedora Release Engineering - 0.9.1-17.2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Sat Jan 16 2016 Jonathan Wakely - 0.9.1-17.1 -- Rebuilt for Boost 1.60 - -* Mon Nov 23 2015 Peter Robinson 0.9.1-17 -- Fix release - -* Wed Oct 21 2015 Marcin Juszkiewicz - 0.9.1-16.6 -- Backport THRIFT-2214 fix to get package built on aarch64. - -* Thu Aug 27 2015 Jonathan Wakely - 0.9.1-16.5 -- Rebuilt for Boost 1.59 - -* Wed Jul 29 2015 Fedora Release Engineering - 0.9.1-16.4 -- Rebuilt for https://fedoraproject.org/wiki/Changes/F23Boost159 - -* Wed Jul 22 2015 David Tardon - 0.9.1-16.3 -- rebuild for Boost 1.58 - -* Fri Jun 19 2015 Fedora Release Engineering - 0.9.1-16.2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Sat Jun 06 2015 Jitka Plesnikova - 0.9.1-16.1 -- Perl 5.22 rebuild - -* Fri Apr 24 2015 Michal Srb - 0.9.1-16 -- Fix FTBFS (Resolves: rhbz#1195364) - -* Mon Apr 20 2015 Will Benton - 0.9.1-15 -- Dropped Erlang support for F22 and above, since erlang-jsx is orphaned - -* Wed Apr 8 2015 Haïkel Guémar - 0.9.1-14 -- Split Qt4/GLib runtimes into separate subpackages -- Drop mono support, it's broken and not even shipped (and it pulls mono-core) - -* Mon Jan 26 2015 Petr Machata - 0.9.1-13.3 -- Rebuild for boost 1.57.0 -* Thu Aug 28 2014 Jitka Plesnikova - 0.9.1-13.2 -- Perl 5.20 rebuild - -* Mon Aug 18 2014 Fedora Release Engineering - 0.9.1-13.1 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Fri Jun 27 2014 Petr Pisar - 0.9.1-13 -- Use add_maven_depmap-generated file lists (bug #1107448) - -* Sun Jun 08 2014 Fedora Release Engineering - 0.9.1-12.2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Fri May 23 2014 Petr Machata - 0.9.1-12.1 -- Rebuild for boost 1.55.0 - -* Mon May 05 2014 Lubomir Rintel - 0.9.1-12 -- Fix EPEL build - -* Fri Feb 21 2014 willb - 0.9.1-11 -- fix BZ 1068561 - -* Fri Dec 20 2013 willb - 0.9.1-10 -- fix BZ 1045544 - -* Wed Oct 16 2013 willb - 0.9.1-9 -- Remove spurious dependencies -- Move some versioned shared libraries from -devel - -* Wed Oct 16 2013 Dan Horák - 0.9.1-8 -- Mono available only on selected arches - -* Sun Oct 13 2013 willb - 0.9.1-7 -- minor specfile cleanups - -* Fri Oct 11 2013 willb - 0.9.1-6 -- added thrift man page -- integrated fb303 -- fixed many fb303 library dependency problems - -* Tue Oct 1 2013 willb - 0.9.1-5 -- fixed extension library linking when an older thrift package is not - already installed -- fixed extension library dependencies in Makefile - -* Tue Oct 1 2013 willb - 0.9.1-4 -- addresses rpmlint warnings and errors -- properly links glib, qt, and z extension libraries - -* Mon Sep 30 2013 willb - 0.9.1-3 -- adds QT support -- clarified multiple licensing -- uses parallel make -- removes obsolete M4 macros -- specifies canonical location for source archive - -* Tue Sep 24 2013 willb - 0.9.1-2 -- fixes for i686 -- fixes bogus requires for Java package - -* Fri Sep 20 2013 willb - 0.9.1-1 -- updated to upstream version 0.9.1 -- disables PHP support, which FTBFS in this version - -* Fri Sep 20 2013 willb - 0.9.0-5 -- patch build xml to generate unversioned jars instead of moving after the fact -- unversioned doc dirs on Fedora versions where this is appropriate -- replaced some stray hardcoded paths with macros -- thanks to Gil for the above observations and suggestions for fixes - -* Thu Aug 22 2013 willb - 0.9.0-4 -- removed version number from jar name (obs pmackinn) - -* Thu Aug 22 2013 willb - 0.9.0-3 -- Fixes for F19 and Erlang support - -* Thu Aug 15 2013 willb - 0.9.0-2 -- Incorporates feedback from comments on review request - -* Mon Jul 1 2013 willb - 0.9.0-1 -- Initial package diff --git a/SPECS/tink-worker/tink-worker.spec b/SPECS/tink-worker/tink-worker.spec index 0dde2d15a0..f353b77f1b 100644 --- a/SPECS/tink-worker/tink-worker.spec +++ b/SPECS/tink-worker/tink-worker.spec @@ -13,6 +13,7 @@ Source1: tink-worker.service Source2: tink-worker-v%{version}-vendor.tar.gz %{?systemd_requires} +BuildRequires: golang < 1.26.0 BuildRequires: golang >= 1.25.7 BuildRequires: systemd-rpm-macros diff --git a/SPECS/usbip/extract_usbip.sh b/SPECS/usbip/extract_usbip.sh deleted file mode 100755 index 11c76890bc..0000000000 --- a/SPECS/usbip/extract_usbip.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -if [ "q$1" = "q" ]; then - echo "Usage: $0 " - exit 1 -fi -if [ "q$2" = "q" ]; then - echo "Usage: $0 " - exit 1 -fi -echo "Extracting linux source" -tar -xvf "$1".tar.gz -if [ "$?" -ne "0" ]; then - echo "Error extracting kernel source" - exit 1 -fi -if [ -d "usbip-$1" ]; then - rm -rf "usbip-$1" -fi -mv "CBL-Mariner-Linux-Kernel-rolling-lts-mariner-${2}-${1}"/tools/usb/usbip "usbip-$1" -echo "Creating usbip archive" -tar -cJvf "usbip-$1".tar.xz "usbip-$1" -rm -rf "linux-$1" -rm -rf "usbip-$1" diff --git a/SPECS/usbip/usbip-5.5-fix-gcc9.patch b/SPECS/usbip/usbip-5.5-fix-gcc9.patch deleted file mode 100644 index 21212aa024..0000000000 --- a/SPECS/usbip/usbip-5.5-fix-gcc9.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -urb usbip-5.5/src/usbip_network.h usbip-5.5b/src/usbip_network.h ---- usbip-5.5/src/usbip_network.h 2020-01-27 00:23:03.000000000 +0000 -+++ usbip-5.5b/src/usbip_network.h 2020-02-03 19:55:55.760558946 +0000 -@@ -14,6 +14,8 @@ - - #include - -+#pragma GCC diagnostic ignored "-Waddress-of-packed-member" -+ - extern int usbip_port; - extern char *usbip_port_string; - void usbip_setup_port_number(char *arg); diff --git a/SPECS/usbip/usbip-client.service b/SPECS/usbip/usbip-client.service deleted file mode 100644 index b10b74b25f..0000000000 --- a/SPECS/usbip/usbip-client.service +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=USB/IP client modules - -[Service] -Type=oneshot -RemainAfterExit=true -ExecStart=/sbin/modprobe -qab vhci-hcd - -[Install] -WantedBy=multi-user.target diff --git a/SPECS/usbip/usbip-server.service b/SPECS/usbip/usbip-server.service deleted file mode 100644 index 52bf9ed478..0000000000 --- a/SPECS/usbip/usbip-server.service +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=USB/IP server daemon - -[Service] -ExecStartPre=/sbin/modprobe -qab usbip_host -ExecStart=/usr/sbin/usbipd - -[Install] -WantedBy=multi-user.target diff --git a/SPECS/usbip/usbip.signatures.json b/SPECS/usbip/usbip.signatures.json deleted file mode 100644 index 15a2aa5e1b..0000000000 --- a/SPECS/usbip/usbip.signatures.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Signatures": { - "extract_usbip.sh": "166037eb914ad5495f2d29c92d803325a2143dd105794283d2e6d47df12ee885", - "usbip-6.6.14.1.tar.xz": "5eec720d9dec5e00387c0d19bd65667d3357a3be73689cdb36a95ca749c5a695", - "usbip-client.service": "7b83311e550793014a897b43fe7b4e5339f114924b3d5f52cceb58787fc65008", - "usbip-server.service": "68a727d13e270564b5e2c97cad5ccdb97086c4d1065b6ef70205b54769260b0f" - } -} diff --git a/SPECS/usbip/usbip.spec b/SPECS/usbip/usbip.spec deleted file mode 100644 index a59d3e5920..0000000000 --- a/SPECS/usbip/usbip.spec +++ /dev/null @@ -1,233 +0,0 @@ -%define _legacy_common_support 1 - -Name: usbip -Summary: USB/IP user-space -Version: 6.6.14.1 -Release: 1%{?dist} -License: GPLv2+ -Vendor: Microsoft Corporation -Distribution: Azure Linux -Group: System/Kernel -# https://github.com/microsoft/CBL-Mariner-Linux-Kernel/archive/rolling-lts/mariner-%%{emt}/%%{version}.tar.gz -# In the interests of keeping the source rpm from being ridiculously large, -# download the Linux kernel from above and run `extract_usbip.sh ` -# in the SOURCE directory. -URL: https://github.com/microsoft/CBL-Mariner-Linux-Kernel -# The kernel modules require working USB and there's no USB for s390x -# See bug #1483403 -ExcludeArch: s390x -Source: %{_distro_sources_url}/usbip-%{version}.tar.xz -Source1: usbip-server.service -Source2: usbip-client.service -Source99: extract_usbip.sh -Patch0: usbip-5.5-fix-gcc9.patch - -BuildRequires: make -BuildRequires: systemd -BuildRequires: libudev-devel -BuildRequires: libtool autoconf -BuildRequires: kernel-devel - -Requires: kernel -Requires: hwdata -Requires(post): systemd -Requires(preun): systemd -Requires(postun): systemd - -# Use the same directory of the main package for subpackage licence and docs -%global _docdir_fmt %{name} - -%description -USB/IP allows you to share USB devices over a network. With USB/IP, you can -plug a USB device into one computer and use it on a different computer on the -network. - -This package contains the user-space tools for USB/IP, both for servers and -clients - -%package devel -Summary: USB/IP headers and development libraries -Requires: %{name} = %{version}-%{release} - -%description devel -This package contains headers and static libraries for USB/IP user-space -development - -%prep -%autosetup -p1 - -%build -./autogen.sh -%configure --disable-static --with-usbids-dir=%{_datadir}/hwdata -make %{?_smp_mflags} - -%install -%make_install -rm -f %{buildroot}%{_libdir}/libusbip*.la -mkdir -p %{buildroot}%{_unitdir} -install -pm 644 %{SOURCE1} %{buildroot}%{_unitdir} -install -pm 644 %{SOURCE2} %{buildroot}%{_unitdir} - -%post -%systemd_post usbip-client.service usbip-server.service - -%preun -%systemd_preun usbip-client.service usbip-server.service - -%postun -%systemd_postun_with_restart usbip-client.service usbip-server.service - -%files -%license COPYING -%doc README AUTHORS -%{_sbindir}/* -%{_libdir}/*.so.* -%{_mandir}/man8/* -%{_unitdir}/* - -%files devel -%license COPYING -%{_includedir}/* -%{_libdir}/*.so - -%changelog -* Fri Mar 15 2024 Daniel McIlvaney - 6.6.14.1-1 -- Update version to 6.6.14.1 - -* Thu Feb 22 2024 Pawel Winogrodzki - 5.15.34.1-3 -- Updating naming for 3.0 version of Azure Linux. - -* Wed Apr 27 2022 Pawel Winogrodzki - 5.15.34.1-2 -- Updating source URL. - -* Wed Apr 20 2022 Cameron Baird - 5.15.34.1-1 -- Update version to 5.15.34.1 - -* Wed Apr 13 2022 Suresh Babu Chalamalasetty - 5.15.32.1-1 -- Update version to 5.15.32.1 - -* Thu Feb 24 2022 Suresh Babu Chalamalasetty - 5.15.18.1-1 -- Initial CBL-Mariner import from Fedora 36 (license: MIT) -- License verified -- Updated extract_usbip.sh to get sources from Mariner kernel version. -- Added Group and updated URL with CBL-Mariner kernel sources path - -* Sat Jan 22 2022 Fedora Release Engineering - 5.7.9-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Fri Jul 23 2021 Fedora Release Engineering - 5.7.9-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Tue Mar 02 2021 Zbigniew Jędrzejewski-Szmek - 5.7.9-4 -- Rebuilt for updated systemd-rpm-macros - See https://pagure.io/fesco/issue/2583. - -* Wed Jan 27 2021 Fedora Release Engineering - 5.7.9-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Wed Jul 29 2020 Fedora Release Engineering - 5.7.9-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Fri Jul 17 2020 Jonathan Dieter - 5-7.9-1 -- Update to 5.7.9 to hopefully fix #1856443 - -* Mon Feb 03 2020 Jonathan Dieter - 5.5-1 -- Update to 5.5 -- Work around build failure on GCC 10 -- Remove unneeded hardened build flag (since all builds are hardened by default) - -* Fri Jan 31 2020 Fedora Release Engineering - 4.20.12-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Sat Jul 27 2019 Fedora Release Engineering - 4.20.12-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Mon Feb 25 2019 Jonathan Dieter - 4.20.12-1 -- Update to 4.20.12 -- Fix build failure on GCC 9.0 - -* Sun Feb 03 2019 Fedora Release Engineering - 4.18.9-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Thu Sep 20 2018 Jonathan Dieter - 4.18.9-1 -- Update to 4.18.9 -- Add patch to fix problem importing device when another device is in - /sys/devices/platform after vhci (#1631148) -- Fix missing period in patch - -* Sat Jul 14 2018 Fedora Release Engineering - 4.15.10-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Thu Jun 28 2018 Jonathan Dieter - 4.15.10-2 -- Remove unneeded ldconfig scriptlets - -* Thu Mar 15 2018 Jonathan Dieter - 4.15.10-1 -- Attempt another build after supposed failure the last time -- Update to 4.15.10 to fix GCC 8 build failure - -* Fri Feb 09 2018 Fedora Release Engineering - 4.14.11-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Thu Feb 08 2018 Jonathan Dieter - 4.14.11-2 -- Remove obsolete Group tag - -* Sat Jan 13 2018 Jonathan Dieter - 4.14.11-1 -- Update usbip to 4.14.11 - -* Fri Jan 12 2018 Zamir SUN - 4.14.0-1 -- Update usbip to 4.14.0 (Fixes bug #1533864) - -* Sat Aug 26 2017 Jonathan Dieter - 4.9.9-6 -- Exclude s390x because it doesn't support USB - -* Thu Aug 03 2017 Fedora Release Engineering - 4.9.9-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Thu Jul 27 2017 Fedora Release Engineering - 4.9.9-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Mon Feb 27 2017 Jonathan Dieter - 4.9.9-3 -- Fix 32-bit build failures - -* Mon Feb 20 2017 Jonathan Dieter - 4.9.9-2 -- Add patches to fix continuing build failures with GCC 7 - -* Sun Feb 12 2017 Jonathan Dieter - 4.9.9-1 -- Update to 4.9.9 with build fixes - -* Sat Feb 11 2017 Fedora Release Engineering - 4.5-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Mon Apr 25 2016 Jonathan Dieter - 4.5-1 -- Update to 4.5 with very minor fixes -- Add dependency to kernel-modules-extra (fixes #1329313) - -* Fri Feb 05 2016 Fedora Release Engineering - 3.18-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Fri Jun 19 2015 Fedora Release Engineering - 3.18-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Thu Feb 5 2015 - Jonathan Dieter - 3.18-4 -- Fix datadir (#1189855) -- Fix client service type - -* Thu Jan 15 2015 - Jonathan Dieter - 3.18-3 -- Improve description - -* Wed Jan 14 2015 - Jonathan Dieter - 3.18-2 -- Remove clean section -- Remove defattr in files list -- Use license macro for COPYING -- Use combined doc directory -- Combine systemd macros into one -- Remove /etc/default config file -- Stop rmmoding when services stop -- Remove unneeded After=syslog.target in services -- Update to 3.18 -- Replace /usr/share with datadir macro in configure -- Switch to make_install macro -- When manually using install, preserve timestamps - -* Tue Dec 16 2014 - Jonathan Dieter - 3.17-1 -- Initial release diff --git a/SPECS/xterm/16colors.txt b/SPECS/xterm/16colors.txt deleted file mode 100644 index 9b09e77f20..0000000000 --- a/SPECS/xterm/16colors.txt +++ /dev/null @@ -1,24 +0,0 @@ -ANSI-Colors v1.0 -(c)1994 by: Pablo Ariel Kohan - |3 9 3 9 3 9 3 9 3 9 3 9 3 9 3 9| - |0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7| ----+-------------------------------+--- -040|X X X X X X X X X X X X X X X X|040 -100|X X X X X X X X X X X X X X X X|100 -041|X X X X X X X X X X X X X X X X|041 -101|X X X X X X X X X X X X X X X X|101 -042|X X X X X X X X X X X X X X X X|042 -102|X X X X X X X X X X X X X X X X|102 -043|X X X X X X X X X X X X X X X X|043 -103|X X X X X X X X X X X X X X X X|103 -044|X X X X X X X X X X X X X X X X|044 -104|X X X X X X X X X X X X X X X X|104 -045|X X X X X X X X X X X X X X X X|045 -105|X X X X X X X X X X X X X X X X|105 -046|X X X X X X X X X X X X X X X X|046 -106|X X X X X X X X X X X X X X X X|106 -047|X X X X X X X X X X X X X X X X|047 -107|X X X X X X X X X X X X X X X X|107 ----+-------------------------------+--- - |3 9 3 9 3 9 3 9 3 9 3 9 3 9 3 9| - |0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7| diff --git a/SPECS/xterm/dickey@invisible-island.net-rsa3072.asc b/SPECS/xterm/dickey@invisible-island.net-rsa3072.asc deleted file mode 100644 index 33a8ce32b9..0000000000 --- a/SPECS/xterm/dickey@invisible-island.net-rsa3072.asc +++ /dev/null @@ -1,42 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQGNBGEEhmgBDAD3TTylJvq42rjYW1ISL2bXcNDvvqOyzhacLayhgHwe90yHPRtH -6v4kyOnltv3txWmbHpqSPFKOj+hi6SYO5o0iIc81p0BCtqu6za8WoGqfvyZ/N5V/ -dNkKcU3dRVBgub62ZlRMagWWBvHY8Hu6FqDHwlaQqJtckUIfbVbUDteMYOhIZ6Fb -rdT4d4n1TMIN6pqgNcs6yHSrqfZUkgWkRMVtxf+nu6X0H1ntbn/9X0UqOG/vcoMD -j5QQK8s1xItCovjy69UNRDV+bvtb9YOXTkv1tDgqPCBGidOr9oznN91S5hbUjoUu -rZNwlZsQZ7GGz5MXt2I4aL6sPyvKSj7IdVa3R2g+z8QLxvQWCN6V2FOcrziZ/EK+ -Rpnaw3C7+siz+lWGxVo1CJBks+V0lviA9Sd9MLJBJoxgJSao1YLkBSE9UXTBx1Va -RU1buTg/0+2BrxEdX+9qIb4Qp/kaa33+Jw1IDauO6TQALilw2D1idkLZwlzMcfH0 -Mvlvd6DVWkVZ29EAEQEAAbRFVGhvbWFzIEUuIERpY2tleSAoc2VsZi1zaWduZWQg -dy9vIFNIQTEpIDxkaWNrZXlAaW52aXNpYmxlLWlzbGFuZC5uZXQ+iQHUBBMBCgA+ -FiEEGYgtkt2kxADCLA1WzCr0RyFnvgMFAmEEhmgCGwMFCQPCZwAFCwkIBwIGFQoJ -CAsCBBYCAwECHgECF4AACgkQzCr0RyFnvgNwgQv/cwwRUoDCw9C6OjblqEa2eA0O -TwkKqT5QcUUtXsMTNHZ5RZ8BHbJjiODTC4uKt7IaxkcYH72MLbMQLXAybJJhJ9Gs -JOvtu7OXS+tKhRjCYrdooFyupjuhq7kzY9Q7AsNPYyfGjLzxkJx4DQYe7UzzIsMn -FkUBP4nBl4VwzfFyZrKT3WO7+1RWyuNKVwX39vF7JZH8C7j/FE8iFxCHJvfzqs5S -MSw4EkvJFRMdqljNkypMEqW4jh3T1RGU3/BXfwgJE3MJ+F6kdgXGe9UecKx/Arb1 -n7JxCfIe4cq/J2jiWnhGXqE/Jay8n4voC0LHhrLIjoQQkFMDpqp9rc+bqEjVm/CA -Wuv+f0F5Ppf4ctGrat+Q0fOTYo80jgFPHw3krJLgAxP9EaIPfX31zFnwyEdwfYy+ -qaLnmyNAjUR/KAilW9tagXLPXI9TJeJxV5dbT5XbDY4cx5ksjtuA8fcRyKtcmi4U -jya6rrcrCgr5Ooix8UHUEzDTNZWlMvmG6GMKsr3PuQGNBGEEhmgBDAC8liudPkt0 -jbBeUvOvVun2rhPSf7Ge4i4xNO2LjM3o6hy2xsqKqi5QhUl9vasf4ObcYh8rh2Wx -wDWJcLhcQSTRtRAufqjdVtemH9hncUsn28HRuw/E7syYQbRBdXVE1BTWFu6byheK -crZ7uV8tpB5FTZSfacLYVUc1GZSy3Q1J04aVqWZWre9fkN9ELVJp9sM96s/20Z60 -xrCyQSW9d+FM/NzB0C7O77QrrTEcotcXGi0GbRD6FCz518lcwiTFU+YvhpD9QSek -UlujF2keHFMdajH2aHuIzyuu2k8bbN80fG7s/G8C+hNwIlcR05a7f0o9loKUwq7E -67Fs4P6ZSXmoYU5wGBzsMoM8hM7UsvIDX28KRcz9n753NsIX2HtO26sJu3Z9kBj1 -SFdUTV20sxbKmbF6I0etVpc7x4tc1bBPXEFKeBZph+Zu3mzxcvtlZYraOuqSZFr0 -4Mx+4njIKeHklwr/GW5oaZG1JIPH0HddzPROUpwYXElCJRiEq1ObNesAEQEAAYkB -vAQYAQoAJhYhBBmILZLdpMQAwiwNVswq9EchZ74DBQJhBIZoAhsMBQkDwmcAAAoJ -EMwq9EchZ74DamgL/3ipBSBQgvLk/4A7y1mC1fntoaZwwcGJxgXsqCId8jo4jBFC -yg72nLrDEHYH9AWy1tS4xXdFw0gEAnb2pm87t+GkKoGdeyH2sgFNfMT106OgQRpk -Vmg7NoVc+qPJcmJCOU1jqSx1PvmJPM/mhTftf+KLljP8a6XhMy1IuhqonOA1HTtf -ebo+J/dZmMjCGQKoP2ib8WenI+JAdtuEIw5BUCEhosRnGuMuBbrZwq4+usdZQy70 -9l0TeUQLDvKJJrycpy93HrB38Z299QmwlxAgUv3gPjiqf48JC8SqlOnbRVcZXNlb -0EnypnBxSjo+myC1sysl4sa23XN64+a/yMmDvB2VQykB2bKS1B1aVbGxMYtSctV+ -+7kC3BYuFXkTkXWybbzvqPp9Nci2cugeak1qwJRZq7f0s5oJZobaSqkMIwXmY9Gj -snvWC9WYkWAfYL92TPghI8LOawz6UW2TKePrZlTRlApeOwc5M3K2ep1ScW8aJO3X -P46cd3aSov0rfNS/zg== -=cr15 ------END PGP PUBLIC KEY BLOCK----- diff --git a/SPECS/xterm/xterm-395.tgz.asc b/SPECS/xterm/xterm-395.tgz.asc deleted file mode 100644 index 38d2647e1b..0000000000 --- a/SPECS/xterm/xterm-395.tgz.asc +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Comment: See https://invisible-island.net/public/public.html for info - -iQGzBAABCgAdFiEEGYgtkt2kxADCLA1WzCr0RyFnvgMFAmca72MACgkQzCr0RyFn -vgN2agwA9iAfTrQrXeXl8sbzBrD3Cd7hRHrlncX24cJve7lG8fSUoqpKSWEYcBub -37tcTLwnN6zCTJwJbwrcYdU5JMGlZMFg+lwPFVpHh7dc3Zf4vDW+ws6FMAU4nxAV -45LwQG3fUWe96ffZDvJIiinqTkYq+0YqmdjTHDHVXt4393Sa7XrV4jRkj4QdXWDK -XAsbp8HGdcDD+j+MuGHC8d4xN4Zg/L5taZxgYBuPhj0a16SKjT9XE/PccCLdTpy5 -wjXnjdUagAtqStscW0o1v3J7PO8DihYzeAFoZ+Ha9eQsz0SLT2wRWLoibdRFhDAz -micvRIOAt/gJO66pC+IUxt2Szv1QESbHXBp3aYr1I8jRHFnix5ZpJqDm5wGMVVPY -vZucOWMOzQCGfhZz2Ji8TjmsFFq8MJLOFhCEE8KVHa0P3Ua92GtWZtCOPnUQa8Sx -SejKMwNCSQIT7uTpTKa0A7OcwIV4xocR1u/QgRIL+pLjljIyBd/pBLsuhFo0bgw8 -JLkLih21 -=gqKZ ------END PGP SIGNATURE----- diff --git a/SPECS/xterm/xterm-defaults.patch b/SPECS/xterm/xterm-defaults.patch deleted file mode 100644 index 4e1c7ecbb2..0000000000 --- a/SPECS/xterm/xterm-defaults.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -up xterm-333/XTerm.ad.defaults xterm-333/XTerm.ad ---- xterm-333/XTerm.ad.defaults 2016-12-22 03:07:39.000000000 +0100 -+++ xterm-333/XTerm.ad 2018-05-30 15:44:53.325426803 +0200 -@@ -259,3 +259,11 @@ - !*allowTcapOps: false - !*allowTitleOps: false - !*allowWindowOps: false -+ -+! Red Hat Defaults: -+*allowFontOps: false -+*allowTcapOps: false -+*VT100*eightBitInput: false -+*VT100*scrollBar: true -+*VT100*utf8Title: true -+*termName: xterm-256color diff --git a/SPECS/xterm/xterm-desktop.patch b/SPECS/xterm/xterm-desktop.patch deleted file mode 100644 index affbd88356..0000000000 --- a/SPECS/xterm/xterm-desktop.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/xterm.desktop b/xterm.desktop -index b6b27d0..e9a2c6c 100644 ---- a/xterm.desktop -+++ b/xterm.desktop -@@ -32,13 +32,13 @@ - # ----------------------------------------------------------------------------- - [Desktop Entry] - Name=XTerm --#GenericName=Terminal -+GenericName=Terminal - Comment=standard terminal emulator for the X window system - Exec=xterm - Terminal=false - Type=Application - Encoding=UTF-8 --Icon=xterm-color_48x48 -+Icon=xterm-color - Categories=System;TerminalEmulator; - Keywords=shell;prompt;command;commandline;cmd; - StartupWMClass=XTerm diff --git a/SPECS/xterm/xterm-man-paths.patch b/SPECS/xterm/xterm-man-paths.patch deleted file mode 100644 index be7c180505..0000000000 --- a/SPECS/xterm/xterm-man-paths.patch +++ /dev/null @@ -1,53 +0,0 @@ -diff --git a/minstall.in b/minstall.in -index ec3c936..e4f2911 100644 ---- a/minstall.in -+++ b/minstall.in -@@ -109,6 +109,11 @@ USE_chr1=`echo "$USE_name" | sed -e 's/^.//'` - USE_Name=${USE_chr0}${USE_chr1} - USE_NAME=`echo "$USE_name" | tr "$lower" "$upper"` - -+fontpath=/usr/share/X11/fonts -+xorgcfgdir=/etc/X11 -+xorgcfgfil=xorg.conf -+X_MANSECT=7 -+ - sed -e 's%__vendorversion__%"X Window System"%' \ - -e 's%__app_version__%Patch\ \#'"$PATCH_NUM"% \ - -e 's%__app_date__%'"$PATCH_YMD"% \ -@@ -135,6 +140,9 @@ sed -e 's%__vendorversion__%"X Window System"%' \ - -e "s%__wtmp_name__%@WTMP_NAME@%g" \ - -e "s%__wtmp_path__%@WTMP_PATH@%g" \ - -e 's%/\\(\*\*%/*%g' \ -+ -e s%__fontpath__%$fontpath%g \ -+ -e s%__xorgcfgdir__%$xorgcfgdir%g \ -+ -e s%__xorgcfgfil__%$xorgcfgfil%g \ - "$OLD_FILE" >$NEW_FILE - # diff -u $OLD_FILE $NEW_FILE - -diff --git a/xterm.man b/xterm.man -index 1792099..9b63f79 100644 ---- a/xterm.man -+++ b/xterm.man -@@ -2580,19 +2580,18 @@ Since X11R6, bitmap fonts have been scaled. - The font server claims to provide the bold font that \fI\*n\fP requests, - but the result is not always readable. - XFree86 introduced a feature which can be used to suppress the scaling. --In the X server's configuration file (e.g., \*(``/etc/X11/XFree86\*('' --or \*(``/etc/X11/xorg.conf\*(''), you -+In the X server's configuration file (e.g., \*(``__xorgcfgdir__/__xorgcfgfil__\*(''), you - can add \*(``:unscaled\*('' to the end of the directory specification for the - \*(``misc\*('' fonts, - which comprise the fixed-pitch fonts that are used by \fI\*n\fP. - For example - .NS --FontPath "/usr/lib/X11/fonts/misc/" -+FontPath "__fontpath__/misc/" - .NE - .IP - would become - .NS --FontPath "/usr/lib/X11/fonts/misc/:unscaled" -+FontPath "__fontpath__/misc/:unscaled" - .NE - .IP - Depending on your configuration, the font server may have its own configuration diff --git a/SPECS/xterm/xterm.signatures.json b/SPECS/xterm/xterm.signatures.json deleted file mode 100644 index 304ba13fa7..0000000000 --- a/SPECS/xterm/xterm.signatures.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Signatures": { - "16colors.txt": "a2342029672532256110ef28a0ea1addb7f6fd1f08aacc382d0fbe2308f178c2", - "dickey@invisible-island.net-rsa3072.asc": "59ac84797cd902c55f22d550155fa9e02f7e0c923ad64d6d81b2c88668e265bb", - "xterm-395.tgz": "286e3caa5938eae38e202827621567629dfeaae689e8070b413ca11398093dc8", - "xterm-395.tgz.asc": "021949ae527c2a4286dcd5021017caf39cfe049242f08287fa4d6b885db6f1be" - } -} \ No newline at end of file diff --git a/SPECS/xterm/xterm.spec b/SPECS/xterm/xterm.spec deleted file mode 100644 index 59502f08b6..0000000000 --- a/SPECS/xterm/xterm.spec +++ /dev/null @@ -1,916 +0,0 @@ -Vendor: Intel Corporation -Distribution: Edge Microvisor Toolkit - -%bcond_with trace - -Summary: Terminal emulator for the X Window System -Name: xterm -Version: 395 -Release: 3%{?dist} -URL: https://invisible-island.net/xterm -License: MIT AND X11 AND HPND AND CC-BY-4.0 -BuildRequires: make -BuildRequires: gcc pkgconfig ncurses-devel libutempter-devel -BuildRequires: libXft-devel libXaw-devel libXext-devel desktop-file-utils -BuildRequires: libxkbfile-devel pcre2-devel pkgconfig(libpcre2-posix) -BuildRequires: gnupg2 -Recommends: xorg-x11-fonts-misc - -Source0: https://invisible-island.net/archives/xterm/%{name}-%{version}.tgz -Source1: https://invisible-island.net/archives/xterm/%{name}-%{version}.tgz.asc -Source2: https://invisible-island.net/public/dickey@invisible-island.net-rsa3072.asc -Source3: https://invisible-island.net/archives/xterm/16colors.txt - -Patch1: xterm-defaults.patch -Patch2: xterm-desktop.patch -Patch3: xterm-man-paths.patch - -%global x11_app_defaults_dir %(pkg-config --variable appdefaultdir xt) - -%description -The xterm program is a terminal emulator for the X Window System. It -provides DEC VT102 and Tektronix 4014 compatible terminals for -programs that can't use the window system directly. - -%package resize -Summary: Set environment and terminal settings to current window size - -%description resize -Prints a shell command for setting the appropriate environment variables to -indicate the current size of the window from which the command is run. - -%prep -%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}' -%setup -q - -%patch 1 -p1 -b .defaults -%patch 2 -p1 -b .desk -%patch 3 -p1 -b .man-paths - -for f in THANKS; do - iconv -f iso8859-1 -t utf8 -o ${f}{_,} && - touch -r ${f}{,_} && mv -f ${f}{_,} -done - -%build -%configure \ - --enable-meta-sends-esc \ - --disable-backarrow-key \ - --enable-exec-xterm \ -%{?with_trace: --enable-trace} \ - --enable-warnings \ - --with-app-defaults=%{x11_app_defaults_dir} \ - --with-icon-theme=hicolor \ - --with-icondir=%{_datadir}/icons \ - --with-utempter \ - --with-tty-group=tty \ - --disable-full-tgetent \ - --with-pcre2 \ - --enable-readline-mouse \ - --enable-logging - -%make_build - -%install -%make_install - -cp -fp %{SOURCE3} 16colors.txt - -desktop-file-install \ -%if 0%{?fedora} && 0%{?fedora} < 19 - --vendor=fedora \ -%endif - --dir=$RPM_BUILD_ROOT%{_datadir}/applications \ - xterm.desktop - -mkdir -p $RPM_BUILD_ROOT%{_datadir}/appdata -install -m644 -p xterm.appdata.xml $RPM_BUILD_ROOT%{_datadir}/appdata - -%files -%doc xterm.log.html ctlseqs.txt 16colors.txt README.i18n THANKS -%{_bindir}/xterm -%{_bindir}/koi8rxterm -%{_bindir}/uxterm -%{_mandir}/man1/koi8rxterm.1* -%{_mandir}/man1/uxterm.1* -%{_mandir}/man1/xterm.1* -%{_datadir}/appdata/xterm.appdata.xml -%{_datadir}/applications/*xterm.desktop -%{_datadir}/icons/hicolor/*/apps/*xterm* -%{_datadir}/pixmaps/*xterm*.xpm -%{x11_app_defaults_dir}/KOI8RXTerm* -%{x11_app_defaults_dir}/UXTerm* -%{x11_app_defaults_dir}/XTerm* - -%files resize -%{_bindir}/resize -%{_mandir}/man1/resize.1* - -%changelog -* Thu Jul 03 2025 Swee Yee Fonn - 395-3 -- Initial Edge Microvisor Toolkit import from Azure Linux (license: MIT). -- License verified - -* Mon Jan 13 2025 Archana Shettigar - 395-2 -- Initial Azure Linux import from Fedora 41 (license: MIT). -- License verified - -* Fri Nov 01 2024 Tomas Korbar - 395-1 -- Rebase to version 395 -- Resolves: rhbz#2321689 - -* Thu Sep 05 2024 Tomas Korbar - 394-1 -- Rebase to version 394 -- Resolves: rhbz#2309329 - -* Thu Aug 01 2024 Tomas Korbar - 393-1 -- Rebase to version 393 -- Resolves: rhbz#2297922 - -* Sat Jul 20 2024 Fedora Release Engineering - 392-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Thu Jun 27 2024 Tomas Korbar - 392-1 -- Rebase to version 392 -- Resolves: rhbz#2282801 - -* Wed Mar 13 2024 Tomas Korbar - 390-1 -- Rebase to version 390 -- Resolves: rhbz#2265040 - -* Mon Jan 29 2024 Fedora Release Engineering - 389-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Wed Jan 03 2024 Tomas Korbar - 389-1 -- Rebase to version 389 -- Resolves: rhbz#2256390 - -* Tue Nov 28 2023 Florian Weimer - 388-3 -- Fix C compatibility issue in the configure script (#2251945) - -* Wed Nov 01 2023 Tomas Korbar - 388-2 -- Add licenses to fully conform to SPDX - -* Wed Oct 25 2023 Tomas Korbar - 388-1 -- Rebase to version 388 -- Resolves: rhbz#2242865 - -* Tue Oct 03 2023 Tomas Korbar - 385-1 -- Rebase to version 385 -- Resolves: rhbz#2241681 - -* Sat Jul 22 2023 Fedora Release Engineering - 384-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Tue Jul 11 2023 Tomas Korbar - 384-1 -- Rebase to version 384 -- Resolves: rhbz#2221827 - -* Fri Jul 07 2023 Tomas Korbar - 383-1 -- Rebase to version 383 -- Resolves: rhbz#2218033 - -* Wed May 31 2023 Tomas Korbar - 382-1 -- Rebase to version 382 -- Resolves: rhbz#2211276 - -* Mon May 29 2023 Tomas Korbar - 381-1 -- Rebase to version 381 -- Resolves:rhbz#2210609 - -* Tue May 16 2023 Tomas Korbar - 380-1 -- Rebase to version 380 -- Resolves: rhbz#2204459 - -* Thu Mar 16 2023 Tomas Korbar - 379-2 -- Enable logging feature - -* Sun Feb 19 2023 Tomas Korbar - 379-1 -- Rebase to version 379 -- Resolves: rhbz#2170296 - -* Wed Feb 08 2023 Tomas Korbar - 378-3 -- Enable readline-mouse configuration option -- Resolves: rhbz#2166860 - -* Sat Jan 21 2023 Fedora Release Engineering - 378-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Thu Jan 12 2023 Tomas Korbar - 378-1 -- Rebase to version 378 -- Resolves: rhbz#2159449 - -* Thu Dec 08 2022 Tomas Korbar - 377-1 -- Rebase to version 377 -- Remove unnecessary dependency on xterm-resize -- Resolves: rhbz#2143618 -- Resolves: rhbz#2142751 - -* Mon Oct 31 2022 Tomas Korbar - 375-1 -- Rebase to version 375 -- Resolves: rhbz#2137784 - -* Tue Oct 11 2022 Tomas Korbar - 374-1 -- Rebase to version 374 -- Resolves: rhbz#2133585 - -* Wed Oct 05 2022 Tomas Korbar - 373-1 -- Rebase to version 373 -- Resolves: rhbz#2129661 - -* Sat Jul 23 2022 Fedora Release Engineering - 372-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Mon Apr 25 2022 Tomas Korbar - 372-1 -- Rebase to version 372 -- Resolves: rhbz#2062511 - -* Mon Feb 28 2022 Tomas Korbar - 371-1 -- Rebase to version 371 -- Resolves: rhbz#2058442 - -* Sat Jan 22 2022 Fedora Release Engineering - 370-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Fri Jan 07 2022 Thomas E. Dickey - 370-2 -- Trim configure options which are no longer necessary. -- Resolves: rhbz#2038247 - -* Tue Nov 30 2021 Tomas Korbar - 370-1 -- Rebase to version 370 -- Resolves: rhbz#2023017 - -* Wed Sep 22 2021 Tomas Korbar - 369-1 -- Rebase to version 369 -- Resolves: rhbz#2006589 - -* Fri Jul 23 2021 Fedora Release Engineering - 368-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Wed Jul 14 2021 Petr Pisar - 368-2 -- Rebuild against pcre2-10.37 (bug #1965025) - -* Tue Jun 08 2021 Tomas Korbar - 368-1 -- Rebase to version 368 -- Resolves: rhbz#1969214 - -* Fri May 21 2021 Joe Orton - 367-3 -- drop luit support - -* Mon May 17 2021 Peter Hutterer 367-2 -- Add luit to Requires -- Resolves: rhbz#1959210 - -* Mon Apr 12 2021 Tomas Korbar - 367-1 -- Rebase to version 367 -- Resolves: rhbz#1943741 - -* Thu Feb 11 2021 Tomas Korbar - 366-1 -- Rebase to version 366 -- Resolves: rhbz#1927543 - -* Wed Feb 03 2021 Tomas Korbar - 364-1 -- Rebase to version 364 (#1924362) -- Build with pcre2 support (#1909609) - -* Thu Jan 28 2021 Fedora Release Engineering - 363-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Tue Jan 19 2021 Tomas Korbar - 363-1 -- Rebase to version 363 (#1910995) -- Build with pcre2 support (#1909609) - -* Fri Nov 13 2020 Tomas Korbar - 362-1 -- Rebase to version 362 (#1896986) - -* Thu Oct 22 2020 Tomas Korbar - 361-1 -- Rebase to version 361 (#1888488) - -* Mon Sep 21 2020 Tomas Korbar - 360-1 -- Rebase to version 360 (#1880883) - -* Tue Aug 18 2020 Tomas Korbar - 359-1 -- Rebase to version 359 (#1869418) - -* Tue Jul 28 2020 Adam Jackson - 358-2 -- BuildRequires luit, not xorg-x11-apps - -* Mon Jul 13 2020 Tomas Korbar - 358-1 -- Rebase to version 358 (#1856126) - -* Mon Jul 06 2020 Tomas Korbar - 357-1 -- Rebase to version 357 (#1853951) - -* Sun May 03 2020 Tomas Korbar - 356-1 -- Rebase to version 356 (#1830237) - -* Wed Apr 29 2020 Tomas Korbar - 354-1 -- Rebase to version 354 (#1828107) - -* Mon Feb 24 2020 Tomas Korbar - 353-1 -- Rebase to version 353 (#1792091) - -* Fri Jan 31 2020 Fedora Release Engineering - 351-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Mon Nov 25 2019 Tomas Korbar - 351-1 -- update to 351 - -* Tue Nov 12 2019 Tomas Korbar - 350-1 -- update to 350 - -* Tue Oct 29 2019 Tomas Korbar - 349-2 -- enable sixel graphics (#1763712) - -* Tue Sep 24 2019 Tomas Korbar - 349-1 -- update to 349 - -* Mon Aug 26 2019 Tomas Korbar - 348-1 -- update to 348 - -* Sat Jul 27 2019 Fedora Release Engineering - 346-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Tue May 28 2019 Miroslav Lichvar 346-1 -- update to 346 - -* Tue May 14 2019 Miroslav Lichvar 345-1 -- update to 345 - -* Tue Feb 26 2019 Miroslav Lichvar 344-1 -- update to 344 - -* Sun Feb 03 2019 Fedora Release Engineering - 334-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Mon Aug 13 2018 Miroslav Lichvar 334-1 -- update to 334 - -* Sat Jul 14 2018 Fedora Release Engineering - 333-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Wed May 30 2018 Miroslav Lichvar 333-2 -- change default termName to xterm-256color (#1577159) - -* Mon Apr 16 2018 Miroslav Lichvar 332-1 -- update to 332 - -* Thu Mar 29 2018 Miroslav Lichvar 331-1 -- update to 331 -- add gcc to build requirements - -* Fri Feb 09 2018 Fedora Release Engineering - 330-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Sat Jan 06 2018 Igor Gnatenko - 330-4 -- Remove obsolete scriptlets - -* Thu Aug 03 2017 Fedora Release Engineering - 330-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Thu Jul 27 2017 Fedora Release Engineering - 330-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Wed Jun 21 2017 Miroslav Lichvar 330-1 -- update to 330 - -* Mon Jun 12 2017 Miroslav Lichvar 329-1 -- update to 329 - -* Thu Jun 01 2017 Miroslav Lichvar 328-1 -- update to 328 - -* Mon Feb 06 2017 Miroslav Lichvar 327-3 -- recommend xorg-x11-fonts-misc (#487499) - -* Wed Nov 16 2016 Jason L Tibbitts III 327-2 -- move resize tool to a subpackage (#1349582) - -* Mon Oct 10 2016 Miroslav Lichvar 327-1 -- update to 327 - -* Fri Oct 07 2016 Miroslav Lichvar 326-1 -- update to 326 -- buildrequire xorg-x11-apps to get correct path of luit - -* Wed Jun 08 2016 Miroslav Lichvar 325-1 -- update to 325 - -* Mon Mar 14 2016 Miroslav Lichvar 324-1 -- update to 324 - -* Tue Mar 08 2016 Miroslav Lichvar 323-1 -- update to 323 - -* Fri Feb 05 2016 Fedora Release Engineering - 322-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Fri Jan 08 2016 Miroslav Lichvar 322-1 -- update to 322 - -* Thu Sep 03 2015 Miroslav Lichvar 320-1 -- update to 320 - -* Mon Aug 24 2015 Miroslav Lichvar 319-1 -- update to 319 - -* Fri Jun 19 2015 Fedora Release Engineering - 318-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Thu Apr 16 2015 Miroslav Lichvar 318-1 -- update to 318 - -* Fri Mar 13 2015 Miroslav Lichvar 316-1 -- update to 316 - -* Tue Mar 03 2015 Miroslav Lichvar 315-1 -- update to 315 - -* Mon Jan 05 2015 Miroslav Lichvar 314-1 -- update to 314 - -* Mon Dec 08 2014 Adam Jackson 313-2 -- Don't BuildRequire: imake, we're not actually using it to build. - -* Mon Dec 08 2014 Miroslav Lichvar 313-1 -- update to 313 - -* Mon Sep 29 2014 Miroslav Lichvar 312-1 -- update to 312 - -* Fri Sep 19 2014 Miroslav Lichvar 311-1 -- update to 311 - -* Mon Aug 18 2014 Fedora Release Engineering - 310-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Tue Jul 29 2014 Miroslav Lichvar 310-1 -- update to 310 - -* Thu Jul 17 2014 Miroslav Lichvar 309-1 -- update to 309 - -* Mon Jun 23 2014 Miroslav Lichvar 308-1 -- update to 308 - -* Mon Jun 09 2014 Miroslav Lichvar 306-1 -- update to 306 - -* Sun Jun 08 2014 Fedora Release Engineering - 305-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Tue Jun 03 2014 Miroslav Lichvar 305-1 -- update to 305 - -* Wed May 07 2014 Miroslav Lichvar 304-1 -- update to 304 - -* Tue Mar 11 2014 Miroslav Lichvar 303-1 -- update to 303 - -* Wed Mar 05 2014 Miroslav Lichvar 302-1 -- update to 302 - -* Tue Jan 21 2014 Miroslav Lichvar 301-1 -- update to 301 - -* Tue Dec 10 2013 Miroslav Lichvar 300-1 -- update to 300 - -* Tue Dec 03 2013 Miroslav Lichvar 299-1 -- update to 299 - -* Thu Nov 28 2013 Miroslav Lichvar 298-1 -- update to 298 - -* Thu Sep 19 2013 Miroslav Lichvar 297-1 -- update to 297 - -* Sun Aug 04 2013 Fedora Release Engineering - 295-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Wed Jul 10 2013 Miroslav Lichvar 295-1 -- update to 295 - -* Wed May 29 2013 Miroslav Lichvar 293-1 -- update to 293 - -* Mon Apr 29 2013 Miroslav Lichvar 292-1 -- update to 292 - -* Thu Feb 28 2013 Miroslav Lichvar 291-1 -- update to 291 - -* Sun Feb 10 2013 Parag Nemade - 289-2 -- Remove vendor tag from desktop file as per https://fedorahosted.org/fesco/ticket/1077 - -* Fri Feb 08 2013 Miroslav Lichvar 289-1 -- update to 289 - -* Thu Jan 10 2013 Miroslav Lichvar 288-1 -- update to 288 - -* Mon Nov 26 2012 Miroslav Lichvar 287-1 -- update to 287 - -* Tue Oct 30 2012 Miroslav Lichvar 286-1 -- update to 286 - -* Mon Oct 15 2012 Miroslav Lichvar 284-1 -- update to 284 - -* Wed Oct 10 2012 Miroslav Lichvar 283-1 -- update to 283 -- install icon to hicolor theme and use it in desktop file (#804279) -- use new configure options to set some resource defaults (#819588) -- fix URL (#856957) -- remove obsolete macros - -* Thu Oct 04 2012 Rex Dieter 278-4 -- revert bad -3 build - -* Tue Sep 25 2012 Rex Dieter 278-3 -- xterm.desktop: +Path=$HOME - -* Sun Jul 22 2012 Fedora Release Engineering - 278-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Thu Jan 26 2012 Miroslav Lichvar 278-1 -- update to 278 - -* Mon Jan 09 2012 Miroslav Lichvar 277-1 -- update to 277 - -* Tue Oct 11 2011 Miroslav Lichvar 276-1 -- update to 276 - -* Mon Sep 12 2011 Miroslav Lichvar 275-1 -- update to 275 - -* Tue Aug 30 2011 Miroslav Lichvar 273-1 -- update to 273 - -* Fri Jul 15 2011 Miroslav Lichvar 271-1 -- update to 271 - -* Wed Apr 27 2011 Miroslav Lichvar 270-1 -- update to 270 - -* Mon Feb 21 2011 Miroslav Lichvar 269-1 -- update to 269 - -* Mon Feb 14 2011 Miroslav Lichvar 268-1 -- update to 268 - -* Tue Feb 08 2011 Fedora Release Engineering - 267-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Tue Nov 23 2010 Miroslav Lichvar 267-1 -- update to 267 - -* Fri Nov 05 2010 Miroslav Lichvar 266-1 -- update to 266 -- fix building with new libXaw - -* Mon Oct 18 2010 Miroslav Lichvar 264-1 -- update to 264 - -* Tue Sep 07 2010 Miroslav Lichvar 262-1 -- update to 262 - -* Fri Jul 02 2010 Miroslav Lichvar 261-2 -- remove NoDisplay=true from desktop file, use upstream version (#607018) - -* Tue Jun 29 2010 Miroslav Lichvar 261-1 -- update to 261 - -* Mon Jun 21 2010 Miroslav Lichvar 260-1 -- update to 260 - -* Thu Jun 10 2010 Miroslav Lichvar 259-1 -- update to 259 -- link with -lICE -- convert THANKS to UTF-8 - -* Wed May 05 2010 Miroslav Lichvar 258-1 -- update to 258 - -* Tue Mar 09 2010 Miroslav Lichvar 256-1 -- update to 256 -- enable XKB Bell support (#568748) - -* Tue Feb 02 2010 Miroslav Lichvar 255-1 -- update to 255 - -* Fri Dec 11 2009 Miroslav Lichvar 253-1 -- update to 253 - -* Tue Dec 08 2009 Miroslav Lichvar 252-1 -- update to 252 - -* Thu Nov 19 2009 Miroslav Lichvar 251-1 -- update to 251 - -* Tue Oct 20 2009 Miroslav Lichvar 250-1 -- update to 250 - -* Thu Oct 08 2009 Miroslav Lichvar 249-1 -- update to 249 - -* Tue Sep 29 2009 Miroslav Lichvar 248-2 -- fix various bugs when display is scrolled up (#524503) - -* Thu Sep 17 2009 Miroslav Lichvar 248-1 -- update to 248 - -* Tue Sep 01 2009 Miroslav Lichvar 247-1 -- update to 247 - -* Tue Aug 18 2009 Miroslav Lichvar 246-1 -- update to 246 - -* Thu Aug 13 2009 Miroslav Lichvar 245-1 -- update to 245 - -* Mon Jul 27 2009 Fedora Release Engineering - 242-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Mon Mar 02 2009 Miroslav Lichvar 242-3 -- fix bell (#487829) - -* Thu Feb 26 2009 Fedora Release Engineering - 242-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - -* Wed Feb 18 2009 Miroslav Lichvar 242-1 -- update to 242 -- use upstream default value for modifyFunctionKeys resource -- remove png suffix from icon name in desktop file - -* Tue Jan 06 2009 Miroslav Lichvar 238-1 -- update to 238 (#479000, CVE-2008-2383) -- set default values of allowWindowOps and allowFontOps resources to false - -* Tue Sep 16 2008 Miroslav Lichvar 237-1 -- update to 237 - -* Wed Jul 30 2008 Miroslav Lichvar 236-1 -- update to 236 -- enable support for spawn-new-terminal action (#457130) - -* Tue Apr 22 2008 Miroslav Lichvar 235-1 -- update to 235 - -* Mon Mar 03 2008 Miroslav Lichvar 234-1 -- update to 234 - -* Wed Feb 27 2008 Miroslav Lichvar 233-1 -- update to 233 - -* Thu Jan 31 2008 Miroslav Lichvar 232-1 -- update to 232 - -* Mon Jan 07 2008 Miroslav Lichvar 231-1 -- update to 231 -- remove setgid utempter from xterm binary (#229360) - -* Fri Jan 04 2008 Miroslav Lichvar 230-1 -- update to 230 - -* Wed Aug 22 2007 Miroslav Lichvar 229-2 -- rebuild - -* Mon Aug 13 2007 Miroslav Lichvar 229-1 -- update to 229 - -* Mon Jul 23 2007 Miroslav Lichvar 228-1 -- update to 228 - -* Fri Jun 29 2007 Miroslav Lichvar 227-1 -- update to 227 - -* Fri Jun 22 2007 Miroslav Lichvar 226-1 -- update to 226 - -* Thu Apr 12 2007 Miroslav Lichvar 225-2 -- fix sections in man pages - -* Tue Mar 27 2007 Miroslav Lichvar 225-1 -- update to 225 - -* Tue Mar 20 2007 Miroslav Lichvar 224-2 -- fix background color setting in alternate screen -- don't display xterm in menus (#231000) - -* Fri Feb 16 2007 Miroslav Lichvar 224-1 -- update to 224 -- drop utempter group before creating pty -- add Icon to desktop file (#227925) - -* Wed Feb 07 2007 Miroslav Lichvar 223-3 -- spec cleanup (#226660) - -* Thu Jan 18 2007 Miroslav Lichvar 223-2 -- make xterm binary sgid utempter (#222847) -- fix font size changes with -fa option (#222340) -- fix redrawing of internal border (#223027) -- enable metaSendsEscape resource and set modifyFunctionKeys to 0 by default - -* Thu Dec 07 2006 Miroslav Lichvar 223-1 -- update to 223 - -* Thu Nov 23 2006 Miroslav Lichvar 222-1 -- update to 222 -- link with libncurses instead of libtermcap -- spec cleanup - -* Mon Sep 04 2006 Miroslav Lichvar 215-3.fc6 -- fix segfault when /etc/termcap is missing (#201246) - -* Wed Jul 26 2006 Mike A. Harris 215-2.fc6 -- Replace BuildRequires utempter with libutempter-devel -- Change BuildRoot tag to comply with Fedora packaging guidelines -- Use pkg-config to autodetect the location of the system app-defaults dir -- Add BuildRequires: pkgconfig - -* Mon Jul 17 2006 Jason Vas Dias - 215-1.fc6 -- Upgrade to upstream version 215 - -* Wed Jul 12 2006 Jesse Keating - 213-2.1 -- rebuild - -* Tue Jul 11 2006 Adam Jackson - 213-2.fc6 -- Use correct dist tag in Release string. - -* Wed May 31 2006 Jason Vas Dias - 213-1 -- Upgrade to upstream version 213 (fixes bug 192627) -- fix bug 189161 : make -r/-rv do reverseVideo with or without - xterm*{fore,back}ground set - -* Thu Apr 13 2006 Jason Vas Dias - 212-1 -- Upgrade to upstream version 212 -- fix bug 188031 : paths in man-page - -* Wed Mar 29 2006 Jason Vas Dias - 211-4 -- fix bug 186935: cursor GCs must be freed with XtReleaseGC - -* Tue Mar 21 2006 Jason Vas Dias - 211-1 -- Upgrade to upstream version 211 (fixes bug 186094). -- Enable new 'utf8Title' resource by default - -* Tue Mar 07 2006 Jason Vas Dias - 209-4 -- fix bug 183993: call set_cursor_gcs in ReverseVideo - -* Wed Feb 22 2006 Jason Vas Dias - 209-2 -- fix bug 182382: check for (VWindow(screen)!=0) in set_cursor_gcs -- further fix for bug 178302: allow *vt100*cursorColor to be same as fg - -* Tue Feb 14 2006 Jason Vas Dias - 209-1 -- Upgrade to upstream version 209 (fixes bug 180450) - -* Fri Feb 10 2006 Jesse Keating - 208-1.2 -- bump again for double-long bug on ppc(64) - -* Tue Feb 07 2006 Jesse Keating - 208-1.1 -- rebuilt for new gcc4.1 snapshot and glibc changes - -* Tue Jan 17 2006 Jason Vas Dias - 208-1 -- Upgrade to upstream version 208 -- Allow root user to grab the console, even if /dev/console - not owned by root -- restore Red Hat '*VT100*scrollBar:1' default Xresource - -* Wed Dec 21 2005 Jason Vas Dias - 207-10 -- Fix bug 164210: tek4014 support should be enabled by default - -* Wed Dec 14 2005 Jason Vas Dias - 207-8 -- Fix bug 175684: compile with --enable-256-color -- Fix bug 155538 addenda - restore '*VT100*backarrowKey:0' - -* Fri Dec 09 2005 Jesse Keating -- rebuilt - -* Mon Nov 21 2005 Jason Vas Dias - 207-5 -- fix bug 173703: remove reference to /usr/X11R6/bin/luit : - PROJECTROOT should be /usr, not /usr/X11R6 - -* Fri Nov 18 2005 Jason Vas Dias - 207-4 -- fix bug 173541: better fix for freetype configuration problem - -* Mon Nov 14 2005 Jason Vas Dias - 207-1 -- Upgrade to upstream version 207 -- Fix app-defaults directory for modular X11 - -* Sun Nov 13 2005 Jeremy Katz - 206-4 -- rebuild for newer modular X - -* Fri Nov 04 2005 Jason Vas Dias 206-1 -- Upgrade to upstream version 206 - -* Wed Oct 12 2005 Jason Vas Dias 205-1 -- Upgrade to upstream version 205 - fixes bugs: 124421, 129146, 159562, 161894, 169347 - -* Sat Sep 24 2005 Mike A. Harris 200-10 -- Updated xterm-resources-redhat.patch to add "xterm*ttyModes: erase ^?" - resource to fix bug (#155538,160354,163812,162549) - -* Wed Sep 14 2005 Mike A. Harris 200-9 -- Updated xterm-resources-redhat.patch to remove utf8 resource which was - added in the 200-7 build, as it was incorrectly set to 'true' instead - of '1', and bug #138681 turned out to be a gdm bug instead of an xterm - bug. This fixes bug (#163568). - -* Mon Aug 29 2005 Mike A. Harris 200-8 -- Added --disable-tek4014 to ./configure flags, to disable tek support - for bug (#164210) - -* Mon May 2 2005 Mike A. Harris 200-7 -- Updated xterm-resources-redhat.patch to enable xterm utf8 resource by - default, as our default OS environment is UTF-8, for bug (#138681) - -* Sat Apr 16 2005 Mike A. Harris 200-6 -- Added option to spec file to allow easy rebuilding with 256 color option - for those who prefer this non-default behaviour (#103402) - -* Tue Mar 8 2005 Soeren Sandmann 200-5 -- Ported xterm-resources-redhat.patch to newer xterms. (#126855) - -* Sun Mar 6 2005 Mike A. Harris 200-4 -- Added libtermcap-devel and utempter to BuildRequires -- Changed BuildRequires from XFree86-devel to xorg-x11-devel - -* Sun Mar 6 2005 Mike A. Harris 200-3 -- Rebuild with gcc 4 for FC4 development - -* Mon Feb 7 2005 Mike A. Harris 200-2 -- Removed chmod from prep, and updated comment to refect (#128341c12) - -* Mon Feb 7 2005 Mike A. Harris 200-1 -- Updated main tarball to xterm-200 for FC4 devel -- Disabled xterm-179-ppc-fix-bug-101472.patch for now, to see if the problem - occurs on ppc still or not. - -* Tue Jul 13 2004 Mike A. Harris 192-1 -- Updated main tarball to xterm-192 for FC3 devel -- Resolved bugs #126569,127132 - -* Fri Jun 18 2004 Mike A. Harris 191-1 -- Updated main tarball to xterm-191 for FC3 devel -- Disabled xterm-resources-redhat.patch to see what if anything breaks, as - it no longer applies cleanly. Hopefully we can just ship stock xterm - resources now, although I realize that is more likely to be a pie in the - sky fantasy once the bug reports trickle in from this change. ;o) - -* Tue Jun 15 2004 Elliot Lee 179-8 -- rebuilt - -* Thu Jun 3 2004 Mike A. Harris 179-7 -- Rebuilt for FC3 devel - -* Fri Feb 13 2004 Elliot Lee 179-6.EL -- rebuilt - -* Mon Sep 8 2003 Mike A. Harris 179-5.EL -- Rebuilt 179-5 for Taroon - -* Mon Sep 8 2003 Mike A. Harris 179-5 -- Added xterm-179-ppc-fix-bug-101472.patch ifarch ppc ppc64 to fix bug (#101472) - -* Wed Aug 27 2003 Bill Nottingham 179-4.1 -- fix symlink -- rebuild - -* Wed Aug 13 2003 Mike A. Harris 179-3.EL -- Rebuilt for Taroon with symlink fixes. - -* Wed Aug 13 2003 Mike A. Harris 179-3 -- Added symlink /usr/X11R6/bin/xterm pointing to _bindir/xterm so that apps - and scripts which invoke xterm explicitly as /usr/X11R6/bin/xterm, will - continue to work correctly without surprises (#101994) - -* Wed Jun 04 2003 Elliot Lee 179-2.EL -- rebuilt - -* Fri May 30 2003 Mike A. Harris 179-1.EL -- Bump release to 1.EL for Red Hat Enterprise Linux build - -* Mon May 26 2003 Mike A. Harris 179-1 -- Updated to upstream xterm 179 -- [SECURITY] Added xterm-can-2003-0063.patch from XFree86 4.3.0-12 package -- Added Red Hat xterm-resources-redhat.patch from XFree86 4.3.0-12 package -- Added "chmod -R u+w *" after source is decompressed or else patches can not - be applied due to upstream source being read only files -- Built xterm 179-1 in rawhide - -* Mon May 5 2003 Mike A. Harris 177-2.0.EL -- Bump release to 2.0.EL for Red Hat Enterprise Linux build - -* Mon May 5 2003 Mike A. Harris 177-2 -- Build fix for lib64: _x11datadir == /usr/X11R6/lib -- Another lib64 build fix: xterm uses /usr/%%{_lib}/X11/app-defaults when it - should be using an arch-neutral dir {_x11datadir}/X11/app-defaults instead - -* Tue Apr 15 2003 Mike A. Harris 177-1 -- Call configure with "--enable-luit --enable-warnings --enable-wide-chars - --with-utempter" -- Initial build. diff --git a/azurelinux b/azurelinux index ef7f9eb220..25bde1f998 160000 --- a/azurelinux +++ b/azurelinux @@ -1 +1 @@ -Subproject commit ef7f9eb220f7fb5b05bc2f0c5cf94686f7742bb5 +Subproject commit 25bde1f99877f485a18f9edd996101c0fd393db6 diff --git a/cgmanifest.json b/cgmanifest.json index f1fb0ed904..85c072c73d 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -1247,8 +1247,8 @@ "type": "other", "other": { "name": "booth", - "version": "1.0", - "downloadUrl": "https://github.com/ClusterLabs/booth/archive/5d837d2b5bf1c240a5f1c5efe4e8d79f55727cca/booth-5d837d2.tar.gz" + "version": "1.2", + "downloadUrl": "https://github.com/ClusterLabs/booth/releases/download/v1.2/booth-1.2.tar.gz" } } }, @@ -1857,8 +1857,8 @@ "type": "other", "other": { "name": "cloud-hypervisor", - "version": "41.0.139", - "downloadUrl": "https://github.com/microsoft/cloud-hypervisor/archive/refs/tags/msft/v41.0.139.tar.gz" + "version": "48.0.246", + "downloadUrl": "https://github.com/microsoft/cloud-hypervisor/archive/refs/tags/msft/v48.0.246.tar.gz" } } }, @@ -2117,8 +2117,8 @@ "type": "other", "other": { "name": "containerized-data-importer", - "version": "1.57.0", - "downloadUrl": "https://github.com/kubevirt/containerized-data-importer/archive/refs/tags/v1.57.0.tar.gz" + "version": "1.62.0", + "downloadUrl": "https://github.com/kubevirt/containerized-data-importer/archive/refs/tags/v1.62.0.tar.gz" } } }, @@ -2297,8 +2297,8 @@ "type": "other", "other": { "name": "crash", - "version": "8.0.4", - "downloadUrl": "https://github.com/crash-utility/crash/archive/8.0.4.tar.gz" + "version": "9.0.0", + "downloadUrl": "https://github.com/crash-utility/crash/archive/9.0.0.tar.gz" } } }, @@ -2322,6 +2322,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "crun", + "version": "1.24", + "downloadUrl": "https://github.com/containers/crun/releases/download/1.24/crun-1.24.tar.gz" + } + } + }, { "component": { "type": "other", @@ -2357,8 +2367,8 @@ "type": "other", "other": { "name": "criu", - "version": "3.15", - "downloadUrl": "http://download.openvz.org/criu/criu-3.15.tar.bz2" + "version": "4.1.1", + "downloadUrl": "https://github.com/checkpoint-restore/criu/archive/v4.1.1/criu-4.1.1.tar.gz" } } }, @@ -3163,6 +3173,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "ed25519-java", + "version": "0.3.0", + "downloadUrl": "https://github.com/str4d/ed25519-java/archive/v0.3.0/ed25519-java-0.3.0.tar.gz" + } + } + }, { "component": { "type": "other", @@ -4580,8 +4600,8 @@ "type": "other", "other": { "name": "gnome-desktop-testing", - "version": "2018.1", - "downloadUrl": "https://gitlab.gnome.org/GNOME/gnome-desktop-testing/-/archive/v2018.1/gnome-desktop-testing-v2018.1.tar.gz" + "version": "2021.1", + "downloadUrl": "https://gitlab.gnome.org/GNOME/gnome-desktop-testing/-/archive/v2021.1/gnome-desktop-testing-v2021.1.tar.gz" } } }, @@ -4670,8 +4690,8 @@ "type": "other", "other": { "name": "gnupg2", - "version": "2.4.7", - "downloadUrl": "https://gnupg.org/ftp/gcrypt/gnupg/gnupg-2.4.7.tar.bz2" + "version": "2.4.9", + "downloadUrl": "https://gnupg.org/ftp/gcrypt/gnupg/gnupg-2.4.9.tar.bz2" } } }, @@ -5350,8 +5370,8 @@ "type": "other", "other": { "name": "hdf5", - "version": "1.14.4.3", - "downloadUrl": "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.14/hdf5-1.14.4/src/hdf5-1.14.4-3.tar.gz" + "version": "1.14.6", + "downloadUrl": "https://support.hdfgroup.org/releases/hdf5/v1_14/v1_14_6/downloads/hdf5-1.14.6.tar.gz" } } }, @@ -5430,8 +5450,8 @@ "type": "other", "other": { "name": "highlight", - "version": "3.54", - "downloadUrl": "http://www.andre-simon.de/zip/highlight-3.54.tar.bz2" + "version": "4.18", + "downloadUrl": "https://gitlab.com/saalen/highlight/-/archive/v4.18/highlight-v4.18.tar.bz2" } } }, @@ -5520,8 +5540,8 @@ "type": "other", "other": { "name": "httpd", - "version": "2.4.65", - "downloadUrl": "https://archive.apache.org/dist/httpd/httpd-2.4.65.tar.bz2" + "version": "2.4.66", + "downloadUrl": "https://archive.apache.org/dist/httpd/httpd-2.4.66.tar.bz2" } } }, @@ -7150,8 +7170,8 @@ "type": "other", "other": { "name": "ibarr", - "version": "0.1.3", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/ibarr-0.1.3.tar.gz" + "version": "0.1.5", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/ibarr-0.1.5.tar.gz" } } }, @@ -7160,8 +7180,8 @@ "type": "other", "other": { "name": "ibsim", - "version": "0.12", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/ibsim-0.12.tar.gz" + "version": "0.12.1", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/ibsim-0.12.1.tar.gz" } } }, @@ -7210,8 +7230,8 @@ "type": "other", "other": { "name": "ibus-libzhuyin", - "version": "1.9.1", - "downloadUrl": "http://downloads.sourceforge.net/libzhuyin/ibus-libzhuyin/ibus-libzhuyin-1.9.1.tar.gz" + "version": "1.10.4", + "downloadUrl": "https://downloads.sourceforge.net/libzhuyin/ibus-libzhuyin/ibus-libzhuyin-1.10.4.tar.gz" } } }, @@ -7250,8 +7270,8 @@ "type": "other", "other": { "name": "ibus-table", - "version": "1.12.4", - "downloadUrl": "https://github.com/mike-fabian/ibus-table/archive/refs/tags/1.12.4.tar.gz" + "version": "1.17.16", + "downloadUrl": "https://github.com/mike-fabian/ibus-table/releases/download/1.17.16/ibus-table-1.17.16.tar.gz" } } }, @@ -7846,6 +7866,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "jbcrypt", + "version": "1.0.2", + "downloadUrl": "https://github.com/kruton/jbcrypt/archive/refs/tags/1.0.2.tar.gz" + } + } + }, { "component": { "type": "other", @@ -7861,8 +7891,8 @@ "type": "other", "other": { "name": "iser", - "version": "24.10", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/iser-24.10.tgz" + "version": "25.07", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/iser-25.07.tgz" } } }, @@ -7871,8 +7901,8 @@ "type": "other", "other": { "name": "isert", - "version": "24.10", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/isert-24.10.tgz" + "version": "25.07", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/isert-25.07.tgz" } } }, @@ -8341,8 +8371,8 @@ "type": "other", "other": { "name": "jtidy", - "version": "8.0", - "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/jtidy-r813.tar.bz2" + "version": "1.0.4", + "downloadUrl": "https://github.com/jtidy/jtidy/archive/refs/tags/jtidy-1.0.4.tar.gz" } } }, @@ -8841,8 +8871,8 @@ "type": "other", "other": { "name": "lasso", - "version": "2.8.0", - "downloadUrl": "http://dev.entrouvert.org/lasso/lasso-2.8.0.tar.gz" + "version": "2.9.0", + "downloadUrl": "https://git.entrouvert.org/entrouvert/lasso/archive/v2.9.0.tar.gz" } } }, @@ -10941,8 +10971,8 @@ "type": "other", "other": { "name": "libpcap", - "version": "1.10.5", - "downloadUrl": "https://github.com/the-tcpdump-group/libpcap/archive/libpcap-1.10.5.tar.gz" + "version": "1.10.6", + "downloadUrl": "https://github.com/the-tcpdump-group/libpcap/archive/libpcap-1.10.6.tar.gz" } } }, @@ -10981,8 +11011,8 @@ "type": "other", "other": { "name": "libpinyin", - "version": "2.9.92", - "downloadUrl": "https://downloads.sourceforge.net/libpinyin/libpinyin/libpinyin-2.9.92.tar.gz" + "version": "2.10.3", + "downloadUrl": "https://downloads.sourceforge.net/libpinyin/libpinyin/libpinyin-2.10.3.tar.gz" } } }, @@ -11191,8 +11221,8 @@ "type": "other", "other": { "name": "libreport", - "version": "2.13.1", - "downloadUrl": "https://github.com/abrt/libreport/archive/2.13.1/libreport-2.13.1.tar.gz" + "version": "2.17.15", + "downloadUrl": "https://github.com/abrt/libreport/archive/2.17.15/libreport-2.17.15.tar.gz" } } }, @@ -11422,7 +11452,7 @@ "other": { "name": "libsodium", "version": "1.0.19", - "downloadUrl": "https://download.libsodium.org/libsodium/releases/libsodium-1.0.19.tar.gz" + "downloadUrl": "https://github.com/jedisct1/libsodium/archive/refs/tags/1.0.19-FINAL.tar.gz" } } }, @@ -11726,6 +11756,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "libvma", + "version": "9.8.72", + "downloadUrl": "https://github.com/Mellanox/libvma/archive/9.8.72/libvma-9.8.72.tar.gz" + } + } + }, { "component": { "type": "other", @@ -11881,8 +11921,8 @@ "type": "other", "other": { "name": "libvirt", - "version": "10.0.0", - "downloadUrl": "https://download.libvirt.org/libvirt-10.0.0.tar.xz" + "version": "10.10.0", + "downloadUrl": "https://download.libvirt.org/libvirt-10.10.0.tar.xz" } } }, @@ -12336,6 +12376,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "llhttp", + "version": "9.3.0", + "downloadUrl": "https://github.com/nodejs/llhttp/archive/refs/tags/release/v9.3.0/llhttp-release-v9.3.0.tar.gz" + } + } + }, { "component": { "type": "other", @@ -13251,8 +13301,8 @@ "type": "other", "other": { "name": "mariadb", - "version": "10.11.11", - "downloadUrl": "https://downloads.mariadb.org/interstitial/mariadb-10.11.11/source/mariadb-10.11.11.tar.gz" + "version": "10.11.15", + "downloadUrl": "https://downloads.mariadb.org/interstitial/mariadb-10.11.15/source/mariadb-10.11.15.tar.gz" } } }, @@ -13571,8 +13621,8 @@ "type": "other", "other": { "name": "mft_kernel", - "version": "4.30.0", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/kernel-mft-4.30.0.tgz" + "version": "4.33.0", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/kernel-mft-4.33.0.tgz" } } }, @@ -13662,8 +13712,8 @@ "type": "other", "other": { "name": "mlnx-ethtool", - "version": "6.9", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/mlnx-ethtool-6.9.tar.gz" + "version": "6.14", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/mlnx-ethtool-6.14.tar.gz" } } }, @@ -13672,8 +13722,8 @@ "type": "other", "other": { "name": "mlnx-iproute2", - "version": "6.10.0", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/mlnx-iproute2-6.10.0.tar.gz" + "version": "6.15.0", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/mlnx-iproute2-6.15.0.tar.gz" } } }, @@ -13682,8 +13732,8 @@ "type": "other", "other": { "name": "mlnx-nfsrdma", - "version": "24.10", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/mlnx-nfsrdma-24.10.tgz" + "version": "25.07", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/mlnx-nfsrdma-25.07.tgz" } } }, @@ -13692,8 +13742,8 @@ "type": "other", "other": { "name": "mlnx-ofa_kernel", - "version": "24.10", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/mlnx-ofa_kernel-24.10.tgz" + "version": "25.07", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/mlnx-ofa_kernel-25.07.tgz" } } }, @@ -13702,8 +13752,8 @@ "type": "other", "other": { "name": "mlnx-tools", - "version": "24.10", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/mlnx-tools-24.10.tar.gz" + "version": "25.07", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/mlnx-tools-25.07.tar.gz" } } }, @@ -14112,8 +14162,8 @@ "type": "other", "other": { "name": "munge", - "version": "0.5.15", - "downloadUrl": "https://github.com/dun/munge/releases/download/munge-0.5.15/munge-0.5.15.tar.xz" + "version": "0.5.18", + "downloadUrl": "https://github.com/dun/munge/releases/download/munge-0.5.18/munge-0.5.18.tar.xz" } } }, @@ -14427,6 +14477,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "nodejs24", + "version": "24.13.0", + "downloadUrl": "https://nodejs.org/download/release/v24.13.0/node-v24.13.0.tar.xz" + } + } + }, { "component": { "type": "other", @@ -14482,8 +14542,8 @@ "type": "other", "other": { "name": "net-snmp", - "version": "5.9.4", - "downloadUrl": "https://sourceforge.net/projects/net-snmp/files/net-snmp/5.9.4/net-snmp-5.9.4.tar.gz" + "version": "5.9.5.2", + "downloadUrl": "https://sourceforge.net/projects/net-snmp/files/net-snmp/5.9.5.2/net-snmp-5.9.5.2.tar.gz" } } }, @@ -14642,8 +14702,8 @@ "type": "other", "other": { "name": "nginx", - "version": "1.25.4", - "downloadUrl": "https://nginx.org/download/nginx-1.25.4.tar.gz" + "version": "1.28.2", + "downloadUrl": "https://nginx.org/download/nginx-1.28.2.tar.gz" } } }, @@ -15567,6 +15627,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "openssl-fips-provider", + "version": "3.1.2", + "downloadUrl": "https://github.com/openssl/openssl/releases/download/openssl-3.1.2/openssl-3.1.2.tar.gz" + } + } + }, { "component": { "type": "other", @@ -15613,8 +15683,8 @@ "type": "other", "other": { "name": "ofed-docs", - "version": "24.10", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/ofed-docs-24.10.tar.gz" + "version": "25.07", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/ofed-docs-25.07.tar.gz" } } }, @@ -15623,8 +15693,8 @@ "type": "other", "other": { "name": "ofed-scripts", - "version": "24.10", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/ofed-scripts-24.10.tar.gz" + "version": "25.07", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/ofed-scripts-25.07.tar.gz" } } }, @@ -16073,8 +16143,8 @@ "type": "other", "other": { "name": "osgi-core", - "version": "7.0.0", - "downloadUrl": "https://repo1.maven.org/maven2/org/osgi/osgi.core/7.0.0/osgi.core-7.0.0-sources.jar" + "version": "8.0.0", + "downloadUrl": "https://repo1.maven.org/maven2/org/osgi/osgi.core/8.0.0/osgi.core-8.0.0-sources.jar" } } }, @@ -16163,8 +16233,8 @@ "type": "other", "other": { "name": "pacemaker", - "version": "2.1.5", - "downloadUrl": "https://github.com/ClusterLabs/pacemaker/archive/refs/tags/Pacemaker-2.1.5.tar.gz" + "version": "3.0.1", + "downloadUrl": "https://github.com/ClusterLabs/pacemaker/archive/refs/tags/Pacemaker-3.0.1.tar.gz" } } }, @@ -16433,8 +16503,8 @@ "type": "other", "other": { "name": "perftest", - "version": "24.10.0", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/perftest-24.10.0-0.65.g9093bae.tar.gz" + "version": "25.07.0", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/perftest-25.07.0-0.104.g0c03534.tar.gz" } } }, @@ -16493,8 +16563,8 @@ "type": "other", "other": { "name": "perl-Alien-pkgconf", - "version": "0.20", - "downloadUrl": "https://cpan.metacpan.org/authors/id/P/PL/PLICEASE/Alien-pkgconf-0.20.tar.gz" + "version": "0.21", + "downloadUrl": "https://cpan.metacpan.org/authors/id/P/PL/PLICEASE/Alien-pkgconf-0.21.tar.gz" } } }, @@ -17963,8 +18033,8 @@ "type": "other", "other": { "name": "perl-FFI-CheckLib", - "version": "0.26", - "downloadUrl": "https://cpan.metacpan.org/authors/id/P/PL/PLICEASE/FFI-CheckLib-0.26.tar.gz" + "version": "0.31", + "downloadUrl": "https://cpan.metacpan.org/authors/id/P/PL/PLICEASE/FFI-CheckLib-0.31.tar.gz" } } }, @@ -19683,8 +19753,8 @@ "type": "other", "other": { "name": "perl-Params-ValidationCompiler", - "version": "0.30", - "downloadUrl": "https://cpan.metacpan.org/modules/by-module/Params/Params-ValidationCompiler-0.30.tar.gz" + "version": "0.31", + "downloadUrl": "https://cpan.metacpan.org/modules/by-module/Params/Params-ValidationCompiler-0.31.tar.gz" } } }, @@ -20053,8 +20123,8 @@ "type": "other", "other": { "name": "perl-Return-MultiLevel", - "version": "0.05", - "downloadUrl": "https://cpan.metacpan.org/authors/id/M/MA/MAUKE/Return-MultiLevel-0.05.tar.gz" + "version": "0.08", + "downloadUrl": "https://cpan.metacpan.org/authors/id/P/PL/PLICEASE/Return-MultiLevel-0.08.tar.gz" } } }, @@ -21533,8 +21603,8 @@ "type": "other", "other": { "name": "pgbouncer", - "version": "1.24.1", - "downloadUrl": "https://pgbouncer.github.io/downloads/files/1.24.1/pgbouncer-1.24.1.tar.gz" + "version": "1.25.1", + "downloadUrl": "https://pgbouncer.github.io/downloads/files/1.25.1/pgbouncer-1.25.1.tar.gz" } } }, @@ -21553,8 +21623,8 @@ "type": "other", "other": { "name": "php", - "version": "8.3.23", - "downloadUrl": "https://www.php.net/distributions/php-8.3.23.tar.xz" + "version": "8.3.29", + "downloadUrl": "https://www.php.net/distributions/php-8.3.29.tar.xz" } } }, @@ -23033,8 +23103,8 @@ "type": "other", "other": { "name": "python-debtcollector", - "version": "1.22.0", - "downloadUrl": "https://tarballs.openstack.org/debtcollector/debtcollector-1.22.0.tar.gz" + "version": "3.0.0", + "downloadUrl": "https://tarballs.openstack.org/debtcollector/debtcollector-3.0.0.tar.gz" } } }, @@ -23273,8 +23343,8 @@ "type": "other", "other": { "name": "python-filelock", - "version": "3.14.0", - "downloadUrl": "https://files.pythonhosted.org/packages/source/f/filelock/filelock-3.14.0.tar.gz" + "version": "3.20.3", + "downloadUrl": "https://files.pythonhosted.org/packages/source/f/filelock/filelock-3.20.3.tar.gz" } } }, @@ -23293,8 +23363,8 @@ "type": "other", "other": { "name": "python-flake8", - "version": "3.7.7", - "downloadUrl": "https://files.pythonhosted.org/packages/source/f/flake8/flake8-3.7.7.tar.gz" + "version": "7.3.0", + "downloadUrl": "https://github.com/PyCQA/flake8/archive/refs/tags/7.3.0.tar.gz" } } }, @@ -24363,8 +24433,8 @@ "type": "other", "other": { "name": "python-oslo-i18n", - "version": "5.1.0", - "downloadUrl": "https://tarballs.openstack.org/oslo.i18n/oslo.i18n-5.1.0.tar.gz" + "version": "6.7.1", + "downloadUrl": "https://files.pythonhosted.org/packages/source/o/oslo_i18n/oslo_i18n-6.7.1.tar.gz" } } }, @@ -24628,16 +24698,6 @@ } } }, - { - "component": { - "type": "other", - "other": { - "name": "python3-pycares", - "version": "4.5.0", - "downloadUrl": "https://github.com/saghul/pycares/archive/refs/tags/v4.5.0.tar.gz" - } - } - }, { "component": { "type": "other", @@ -24768,6 +24828,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "python-scikit-build-core", + "version": "0.11.5", + "downloadUrl": "https://files.pythonhosted.org/packages/source/s/scikit_build_core/scikit_build_core-0.11.5.tar.gz" + } + } + }, { "component": { "type": "other", @@ -24843,8 +24913,8 @@ "type": "other", "other": { "name": "python-pytest-flake8", - "version": "1.0.4", - "downloadUrl": "https://files.pythonhosted.org/packages/source/p/pytest-flake8/pytest-flake8-1.0.4.tar.gz" + "version": "1.3.0", + "downloadUrl": "https://github.com/coherent-oss/pytest-flake8/archive/refs/tags/v1.3.0.tar.gz" } } }, @@ -25228,6 +25298,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "python-toml", + "version": "0.10.2", + "downloadUrl": "https://files.pythonhosted.org/packages/source/t/toml/toml-0.10.2.tar.gz" + } + } + }, { "component": { "type": "other", @@ -25688,6 +25768,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "python3-pycares", + "version": "4.5.0", + "downloadUrl": "https://github.com/saghul/pycares/archive/refs/tags/v4.5.0.tar.gz" + } + } + }, { "component": { "type": "other", @@ -25963,8 +26053,8 @@ "type": "other", "other": { "name": "python-virtualenv", - "version": "20.25.0", - "downloadUrl": "https://files.pythonhosted.org/packages/94/d7/adb787076e65dc99ef057e0118e25becf80dd05233ef4c86f07aa35f6492/virtualenv-20.25.0.tar.gz" + "version": "20.36.1", + "downloadUrl": "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz" } } }, @@ -26163,8 +26253,8 @@ "type": "other", "other": { "name": "python-zmq", - "version": "18.1.0", - "downloadUrl": "https://github.com/zeromq/pyzmq/archive/v18.1.0.tar.gz" + "version": "27.1.0", + "downloadUrl": "https://github.com/zeromq/pyzmq/archive/refs/tags/v27.1.0.tar.gz" } } }, @@ -26372,9 +26462,9 @@ "component": { "type": "other", "other": { - "name": "qt5-qtconnectivity", - "version": "5.14.2", - "downloadUrl": "https://download.qt.io/official_releases/qt/5.14/5.14.2/submodules/qtconnectivity-everywhere-src-5.14.2.tar.xz" + "name": "qt6-qtconnectivity", + "version": "6.5.7", + "downloadUrl": "https://download.qt.io/official_releases/qt/6.5/6.5.7/src/submodules/qtconnectivity-everywhere-opensource-src-6.5.7.tar.xz" } } }, @@ -26382,9 +26472,9 @@ "component": { "type": "other", "other": { - "name": "qt5-qtsensors", - "version": "5.14.2", - "downloadUrl": "https://download.qt.io/official_releases/qt/5.14/5.14.2/submodules/qtsensors-everywhere-src-5.14.2.tar.xz" + "name": "qt6-qtsensors", + "version": "6.5.7", + "downloadUrl": "https://download.qt.io/official_releases/qt/6.5/6.5.7/src/submodules/qtsensors-everywhere-opensource-src-6.5.7.tar.xz" } } }, @@ -26392,9 +26482,9 @@ "component": { "type": "other", "other": { - "name": "qt5-qtserialport", - "version": "5.15.9", - "downloadUrl": "https://download.qt.io/official_releases/qt/5.15/5.15.9/submodules/qtserialport-everywhere-opensource-src-5.15.9.tar.xz" + "name": "qt6-qtserialport", + "version": "6.5.7", + "downloadUrl": "https://download.qt.io/official_releases/qt/6.5/6.5.7/src/submodules/qtserialport-everywhere-opensource-src-6.5.7.tar.xz" } } }, @@ -26444,7 +26534,7 @@ "other": { "name": "quagga", "version": "1.2.4", - "downloadUrl": "http://download.savannah.gnu.org/releases/quagga/quagga-1.2.4.tar.gz" + "downloadUrl": "https://github.com/quagga/quagga/releases/download/quagga-1.2.4/quagga-1.2.4.tar.gz" } } }, @@ -26583,8 +26673,8 @@ "type": "other", "other": { "name": "rdma-core", - "version": "55.0", - "downloadUrl": "https://github.com/linux-rdma/rdma-core/releases/download/v55.0/rdma-core-55.0.tar.gz" + "version": "59.0", + "downloadUrl": "https://github.com/linux-rdma/rdma-core/releases/download/v59.0/rdma-core-59.0.tar.gz" } } }, @@ -26744,8 +26834,8 @@ "type": "other", "other": { "name": "rhino", - "version": "1.7.7.1", - "downloadUrl": "https://github.com/mozilla/rhino/archive/Rhino1_7_7_1_RELEASE.tar.gz" + "version": "1.7.15.1", + "downloadUrl": "https://github.com/mozilla/rhino/archive/Rhino1_7_15_1_Release.tar.gz" } } }, @@ -26914,8 +27004,8 @@ "type": "other", "other": { "name": "rshim", - "version": "2.1.5", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/rshim-2.1.5.tar.gz" + "version": "2.4.4", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/rshim-2.4.4.tar.gz" } } }, @@ -28034,8 +28124,8 @@ "type": "other", "other": { "name": "rust", - "version": "1.86.0", - "downloadUrl": "https://static.rust-lang.org/dist/rustc-1.86.0-src.tar.xz" + "version": "1.90.0", + "downloadUrl": "https://static.rust-lang.org/dist/rustc-1.90.0-src.tar.xz" } } }, @@ -28104,8 +28194,8 @@ "type": "other", "other": { "name": "satyr", - "version": "0.30", - "downloadUrl": "https://github.com/abrt/satyr/archive/0.30/satyr-0.30.tar.gz" + "version": "0.43", + "downloadUrl": "https://github.com/abrt/satyr/releases/download/0.43/satyr-0.43.tar.gz" } } }, @@ -29066,8 +29156,8 @@ "type": "other", "other": { "name": "srp", - "version": "24.10", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/srp-24.10.tgz" + "version": "25.07", + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/srp-25.07.tgz" } } }, @@ -29206,8 +29296,8 @@ "type": "other", "other": { "name": "suitesparse", - "version": "5.4.0", - "downloadUrl": "https://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-5.4.0.tar.gz" + "version": "7.11.0", + "downloadUrl": "https://github.com/DrTimothyAldenDavis/SuiteSparse/archive/v7.11.0/suitesparse-7.11.0.tar.gz" } } }, @@ -29291,6 +29381,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "trident", + "version": "0.21.0", + "downloadUrl": "https://github.com/microsoft/trident/archive/refs/tags/v0.21.0.tar.gz" + } + } + }, { "component": { "type": "other", @@ -29876,8 +29976,8 @@ "type": "other", "other": { "name": "trilead-ssh2", - "version": "217.8", - "downloadUrl": "https://github.com/jenkinsci/trilead-ssh2/archive/trilead-ssh2-build217-jenkins-8.tar.gz" + "version": "217.371.vc1d30dc5a_b_32", + "downloadUrl": "https://github.com/jenkinsci/trilead-ssh2/archive/refs/tags/build-217-jenkins-371.vc1d30dc5a_b_32.tar.gz" } } }, @@ -30006,8 +30106,8 @@ "type": "other", "other": { "name": "ucx", - "version": "1.18.0", - "downloadUrl": "https://github.com/openucx/ucx/releases/download/v1.18.0-rc3/ucx-1.18.0.tar.gz" + "version": "1.19.0", + "downloadUrl": "https://github.com/openucx/ucx/releases/download/v1.19.0/ucx-1.19.0.tar.gz" } } }, @@ -30436,8 +30536,8 @@ "type": "other", "other": { "name": "vim", - "version": "9.1.1616", - "downloadUrl": "https://github.com/vim/vim/archive/v9.1.1616.tar.gz" + "version": "9.2.0088", + "downloadUrl": "https://github.com/vim/vim/archive/v9.2.0088.tar.gz" } } }, @@ -30847,8 +30947,8 @@ "type": "other", "other": { "name": "xbean", - "version": "4.18", - "downloadUrl": "http://repo2.maven.org/maven2/org/apache/xbean/xbean/4.18/xbean-4.18-source-release.zip" + "version": "4.24", + "downloadUrl": "https://repo1.maven.org/maven2/org/apache/xbean/xbean/4.24/xbean-4.24-source-release.zip" } } }, @@ -31317,8 +31417,8 @@ "type": "other", "other": { "name": "xmldb-api", - "version": "0.1", - "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/xmldb-xapi-20041010-src.tar.bz2" + "version": "1.7.0", + "downloadUrl": "https://github.com/xmldb-org/xmldb-api/archive/xmldb-api-1.7.tar.gz" } } }, @@ -31519,7 +31619,7 @@ "other": { "name": "xpmem", "version": "2.7.4", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/xpmem-2.7.4.tar.gz" + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/xpmem-2.7.4.tar.gz" } } }, @@ -31529,7 +31629,7 @@ "other": { "name": "xpmem-lib", "version": "2.7", - "downloadUrl": "https://linux.mellanox.com/public/repo/mlnx_ofed/24.10-0.7.0.0/SRPMS/xpmem-lib-2.7.tar.gz" + "downloadUrl": "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/xpmem-lib-2.7.tar.gz" } } }, @@ -31939,8 +32039,8 @@ "type": "other", "other": { "name": "zlib", - "version": "1.3.1", - "downloadUrl": "https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.xz" + "version": "1.3.2", + "downloadUrl": "https://github.com/madler/zlib/releases/download/v1.3.2/zlib-1.3.2.tar.xz" } } }, @@ -31986,4 +32086,4 @@ } ], "Version": 1 -} +} \ No newline at end of file diff --git a/toolkit/resources/manifests/package/license_file_exceptions.json b/toolkit/resources/manifests/package/license_file_exceptions.json index 579698214e..be32bc0e0f 100644 --- a/toolkit/resources/manifests/package/license_file_exceptions.json +++ b/toolkit/resources/manifests/package/license_file_exceptions.json @@ -31,6 +31,13 @@ "^/usr/share/doc/tar-[0-9\\.]+/tar\\.html/GNU-Free-Documentation-License\\.html$" ] }, + { + "PackageName": "apache-commons-net-javadoc", + "IgnoredFilesRegexList": [ + "^/usr/share/javadoc/apache-commons-net/org/apache/commons/net/bsd/.*", + "^/usr/share/javadoc/apache-commons-net/src-html/org/apache/commons/net/bsd/.*" + ] + }, { "_comment1": "OpenSSL has multiple structs, constants and procedures that have the word 'NOTICE' in them, like 'NOTICEREF_free'.", "_comment2": "These man pages are for those items, not actual license notices.", diff --git a/toolkit/resources/manifests/package/pkggen_core_x86_64.txt b/toolkit/resources/manifests/package/pkggen_core_x86_64.txt index 81c8c45f2f..3e573cd0b0 100644 --- a/toolkit/resources/manifests/package/pkggen_core_x86_64.txt +++ b/toolkit/resources/manifests/package/pkggen_core_x86_64.txt @@ -1,20 +1,20 @@ filesystem-1.1-21.emt3.x86_64.rpm kernel-headers-6.18.15-1.emt3.noarch.rpm -glibc-2.38-12.emt3.x86_64.rpm -glibc-devel-2.38-12.emt3.x86_64.rpm -glibc-i18n-2.38-12.emt3.x86_64.rpm -glibc-iconv-2.38-12.emt3.x86_64.rpm -glibc-lang-2.38-12.emt3.x86_64.rpm -glibc-locales-all-2.38-12.emt3.x86_64.rpm -glibc-nscd-2.38-12.emt3.x86_64.rpm -glibc-tools-2.38-12.emt3.x86_64.rpm -zlib-1.3.1-1.emt3.x86_64.rpm -zlib-devel-1.3.1-1.emt3.x86_64.rpm +glibc-2.38-18.emt3.x86_64.rpm +glibc-devel-2.38-18.emt3.x86_64.rpm +glibc-i18n-2.38-18.emt3.x86_64.rpm +glibc-iconv-2.38-18.emt3.x86_64.rpm +glibc-lang-2.38-18.emt3.x86_64.rpm +glibc-locales-all-2.38-18.emt3.x86_64.rpm +glibc-nscd-2.38-18.emt3.x86_64.rpm +glibc-tools-2.38-18.emt3.x86_64.rpm +zlib-1.3.2-1.emt3.x86_64.rpm +zlib-devel-1.3.2-1.emt3.x86_64.rpm file-5.45-1.emt3.x86_64.rpm file-devel-5.45-1.emt3.x86_64.rpm file-libs-5.45-1.emt3.x86_64.rpm -binutils-2.41-7.emt3.x86_64.rpm -binutils-devel-2.41-7.emt3.x86_64.rpm +binutils-2.41-10.emt3.x86_64.rpm +binutils-devel-2.41-10.emt3.x86_64.rpm gmp-6.3.0-1.emt3.x86_64.rpm gmp-devel-6.3.0-1.emt3.x86_64.rpm mpfr-4.2.1-1.emt3.x86_64.rpm @@ -70,9 +70,9 @@ make-4.4.1-2.emt3.x86_64.rpm patch-2.7.6-9.emt3.x86_64.rpm libcap-ng-0.8.4-1.emt3.x86_64.rpm libcap-ng-devel-0.8.4-1.emt3.x86_64.rpm -util-linux-2.40.2-1.emt3.x86_64.rpm -util-linux-devel-2.40.2-1.emt3.x86_64.rpm -util-linux-libs-2.40.2-1.emt3.x86_64.rpm +util-linux-2.40.2-3.emt3.x86_64.rpm +util-linux-devel-2.40.2-3.emt3.x86_64.rpm +util-linux-libs-2.40.2-3.emt3.x86_64.rpm tar-1.35-2.emt3.x86_64.rpm xz-5.4.4-2.emt3.x86_64.rpm xz-devel-5.4.4-2.emt3.x86_64.rpm @@ -91,17 +91,17 @@ popt-lang-1.19-1.emt3.x86_64.rpm sqlite-3.44.0-2.emt3.x86_64.rpm sqlite-devel-3.44.0-2.emt3.x86_64.rpm sqlite-libs-3.44.0-2.emt3.x86_64.rpm -elfutils-0.189-7.emt3.x86_64.rpm -elfutils-default-yama-scope-0.189-7.emt3.noarch.rpm -elfutils-devel-0.189-7.emt3.x86_64.rpm -elfutils-devel-static-0.189-7.emt3.x86_64.rpm -elfutils-libelf-0.189-7.emt3.x86_64.rpm -elfutils-libelf-devel-0.189-7.emt3.x86_64.rpm -elfutils-libelf-devel-static-0.189-7.emt3.x86_64.rpm -elfutils-libelf-lang-0.189-7.emt3.x86_64.rpm -expat-2.6.4-1.emt3.x86_64.rpm -expat-devel-2.6.4-1.emt3.x86_64.rpm -expat-libs-2.6.4-1.emt3.x86_64.rpm +elfutils-0.189-8.emt3.x86_64.rpm +elfutils-default-yama-scope-0.189-8.emt3.noarch.rpm +elfutils-devel-0.189-8.emt3.x86_64.rpm +elfutils-devel-static-0.189-8.emt3.x86_64.rpm +elfutils-libelf-0.189-8.emt3.x86_64.rpm +elfutils-libelf-devel-0.189-8.emt3.x86_64.rpm +elfutils-libelf-devel-static-0.189-8.emt3.x86_64.rpm +elfutils-libelf-lang-0.189-8.emt3.x86_64.rpm +expat-2.6.4-4.emt3.x86_64.rpm +expat-devel-2.6.4-4.emt3.x86_64.rpm +expat-libs-2.6.4-4.emt3.x86_64.rpm libpipeline-1.5.7-1.emt3.x86_64.rpm libpipeline-devel-1.5.7-1.emt3.x86_64.rpm gdbm-1.23-1.emt3.x86_64.rpm @@ -170,16 +170,16 @@ gtk-doc-1.33.2-1.emt3.noarch.rpm autoconf-2.72-2.emt3.noarch.rpm automake-1.16.5-2.emt3.noarch.rpm ocaml-srpm-macros-9-4.emt3.noarch.rpm -openssl-3.3.3-3.emt3.x86_64.rpm -openssl-devel-3.3.3-3.emt3.x86_64.rpm -openssl-libs-3.3.3-3.emt3.x86_64.rpm -openssl-perl-3.3.3-3.emt3.x86_64.rpm -openssl-static-3.3.3-3.emt3.x86_64.rpm -libcap-2.69-6.emt3.x86_64.rpm -libcap-devel-2.69-6.emt3.x86_64.rpm +openssl-3.3.5-4.emt3.x86_64.rpm +openssl-devel-3.3.5-4.emt3.x86_64.rpm +openssl-libs-3.3.5-4.emt3.x86_64.rpm +openssl-perl-3.3.5-4.emt3.x86_64.rpm +openssl-static-3.3.5-4.emt3.x86_64.rpm +libcap-2.69-12.emt3.x86_64.rpm +libcap-devel-2.69-12.emt3.x86_64.rpm debugedit-5.0-2.emt3.x86_64.rpm -libarchive-3.7.7-3.emt3.x86_64.rpm -libarchive-devel-3.7.7-3.emt3.x86_64.rpm +libarchive-3.7.7-4.emt3.x86_64.rpm +libarchive-devel-3.7.7-4.emt3.x86_64.rpm rpm-4.18.2-1.emt3.x86_64.rpm rpm-build-4.18.2-1.emt3.x86_64.rpm rpm-build-libs-4.18.2-1.emt3.x86_64.rpm @@ -195,20 +195,20 @@ libsolv-0.7.28-3.emt3.x86_64.rpm libsolv-devel-0.7.28-3.emt3.x86_64.rpm libssh2-1.11.1-1.emt3.x86_64.rpm libssh2-devel-1.11.1-1.emt3.x86_64.rpm -krb5-1.21.3-2.emt3.x86_64.rpm -krb5-devel-1.21.3-2.emt3.x86_64.rpm +krb5-1.21.3-3.emt3.x86_64.rpm +krb5-devel-1.21.3-3.emt3.x86_64.rpm nghttp2-1.61.0-2.emt3.x86_64.rpm nghttp2-devel-1.61.0-2.emt3.x86_64.rpm -curl-8.11.1-3.emt3.x86_64.rpm -curl-devel-8.11.1-3.emt3.x86_64.rpm -curl-libs-8.11.1-3.emt3.x86_64.rpm +curl-8.11.1-5.emt3.x86_64.rpm +curl-devel-8.11.1-5.emt3.x86_64.rpm +curl-libs-8.11.1-5.emt3.x86_64.rpm createrepo_c-1.0.3-1.emt3.x86_64.rpm -libxml2-2.11.5-6.emt3.x86_64.rpm -libxml2-devel-2.11.5-6.emt3.x86_64.rpm +libxml2-2.11.5-9.emt3.x86_64.rpm +libxml2-devel-2.11.5-9.emt3.x86_64.rpm docbook-dtd-xml-4.5-11.emt3.noarch.rpm docbook-style-xsl-1.79.1-14.emt3.noarch.rpm libsepol-3.6-2.emt3.x86_64.rpm -glib-2.78.6-3.emt3.x86_64.rpm +glib-2.78.6-8.emt3.x86_64.rpm libltdl-2.4.7-1.emt3.x86_64.rpm libltdl-devel-2.4.7-1.emt3.x86_64.rpm lua-5.4.6-1.emt3.x86_64.rpm @@ -225,32 +225,32 @@ libgpg-error-1.48-1.emt3.x86_64.rpm libgcrypt-1.10.3-1.emt3.x86_64.rpm libksba-1.6.4-1.emt3.x86_64.rpm libksba-devel-1.6.4-1.emt3.x86_64.rpm -libxslt-1.1.43-1.emt3.x86_64.rpm +libxslt-1.1.43-3.emt3.x86_64.rpm npth-1.6-4.emt3.x86_64.rpm pinentry-1.2.1-1.emt3.x86_64.rpm -gnupg2-2.4.7-1.emt3.x86_64.rpm -gnupg2-lang-2.4.7-1.emt3.x86_64.rpm +gnupg2-2.4.9-2.emt3.x86_64.rpm +gnupg2-lang-2.4.9-2.emt3.x86_64.rpm gpgme-1.23.2-2.emt3.x86_64.rpm edge-rpm-macros-3.0-2.emt3.noarch.rpm edge-check-macros-3.0-2.emt3.noarch.rpm libffi-3.4.4-1.emt3.x86_64.rpm libffi-devel-3.4.4-1.emt3.x86_64.rpm -libtasn1-4.19.0-2.emt3.x86_64.rpm +libtasn1-4.19.0-3.emt3.x86_64.rpm p11-kit-0.25.0-1.emt3.x86_64.rpm p11-kit-trust-0.25.0-1.emt3.x86_64.rpm -ca-certificates-shared-3.0.0-11.emt3.noarch.rpm -ca-certificates-tools-3.0.0-11.emt3.noarch.rpm -ca-certificates-base-3.0.0-11.emt3.noarch.rpm -ca-certificates-3.0.0-11.emt3.noarch.rpm +ca-certificates-shared-3.0.0-14.emt3.noarch.rpm +ca-certificates-tools-3.0.0-14.emt3.noarch.rpm +ca-certificates-base-3.0.0-14.emt3.noarch.rpm +ca-certificates-3.0.0-14.emt3.noarch.rpm dwz-0.14-2.emt3.x86_64.rpm unzip-6.0-22.emt3.x86_64.rpm -python3-3.12.9-4.emt3.x86_64.rpm -python3-devel-3.12.9-4.emt3.x86_64.rpm -python3-libs-3.12.9-4.emt3.x86_64.rpm +python3-3.12.9-9.emt3.x86_64.rpm +python3-devel-3.12.9-9.emt3.x86_64.rpm +python3-libs-3.12.9-9.emt3.x86_64.rpm python3-setuptools-69.0.3-5.emt3.noarch.rpm python3-pygments-2.7.4-2.emt3.noarch.rpm which-2.21-8.emt3.x86_64.rpm -libselinux-3.6-3.emt3.x86_64.rpm +libselinux-3.6-4.emt3.x86_64.rpm slang-2.3.3-1.emt3.x86_64.rpm newt-0.52.23-1.emt3.x86_64.rpm newt-lang-0.52.23-1.emt3.x86_64.rpm diff --git a/toolkit/resources/manifests/package/toolchain_x86_64.txt b/toolkit/resources/manifests/package/toolchain_x86_64.txt index e077d30f9e..6bc8f21f56 100644 --- a/toolkit/resources/manifests/package/toolchain_x86_64.txt +++ b/toolkit/resources/manifests/package/toolchain_x86_64.txt @@ -13,21 +13,21 @@ bash-5.2.15-3.emt3.x86_64.rpm bash-debuginfo-5.2.15-3.emt3.x86_64.rpm bash-devel-5.2.15-3.emt3.x86_64.rpm bash-lang-5.2.15-3.emt3.x86_64.rpm -binutils-2.41-7.emt3.x86_64.rpm -binutils-aarch64-linux-gnu-2.41-7.emt3.x86_64.rpm -binutils-debuginfo-2.41-7.emt3.x86_64.rpm -binutils-devel-2.41-7.emt3.x86_64.rpm +binutils-2.41-10.emt3.x86_64.rpm +binutils-aarch64-linux-gnu-2.41-10.emt3.x86_64.rpm +binutils-debuginfo-2.41-10.emt3.x86_64.rpm +binutils-devel-2.41-10.emt3.x86_64.rpm bison-3.8.2-1.emt3.x86_64.rpm bison-debuginfo-3.8.2-1.emt3.x86_64.rpm bzip2-1.0.8-1.emt3.x86_64.rpm bzip2-debuginfo-1.0.8-1.emt3.x86_64.rpm bzip2-devel-1.0.8-1.emt3.x86_64.rpm bzip2-libs-1.0.8-1.emt3.x86_64.rpm -ca-certificates-3.0.0-11.emt3.noarch.rpm -ca-certificates-base-3.0.0-11.emt3.noarch.rpm -ca-certificates-legacy-3.0.0-11.emt3.noarch.rpm -ca-certificates-shared-3.0.0-11.emt3.noarch.rpm -ca-certificates-tools-3.0.0-11.emt3.noarch.rpm +ca-certificates-3.0.0-14.emt3.noarch.rpm +ca-certificates-base-3.0.0-14.emt3.noarch.rpm +ca-certificates-legacy-3.0.0-14.emt3.noarch.rpm +ca-certificates-shared-3.0.0-14.emt3.noarch.rpm +ca-certificates-tools-3.0.0-14.emt3.noarch.rpm ccache-4.8.3-3.emt3.x86_64.rpm ccache-debuginfo-4.8.3-3.emt3.x86_64.rpm check-0.15.2-1.emt3.x86_64.rpm @@ -35,8 +35,8 @@ check-debuginfo-0.15.2-1.emt3.x86_64.rpm chkconfig-1.25-1.emt3.x86_64.rpm chkconfig-debuginfo-1.25-1.emt3.x86_64.rpm chkconfig-lang-1.25-1.emt3.x86_64.rpm -cmake-3.30.3-9.emt3.x86_64.rpm -cmake-debuginfo-3.30.3-9.emt3.x86_64.rpm +cmake-3.30.3-12.emt3.x86_64.rpm +cmake-debuginfo-3.30.3-12.emt3.x86_64.rpm coreutils-9.4-6.emt3.x86_64.rpm coreutils-debuginfo-9.4-6.emt3.x86_64.rpm coreutils-lang-9.4-6.emt3.x86_64.rpm @@ -51,12 +51,12 @@ cracklib-lang-2.9.11-1.emt3.x86_64.rpm createrepo_c-1.0.3-1.emt3.x86_64.rpm createrepo_c-debuginfo-1.0.3-1.emt3.x86_64.rpm createrepo_c-devel-1.0.3-1.emt3.x86_64.rpm -cross-binutils-common-2.41-7.emt3.noarch.rpm +cross-binutils-common-2.41-10.emt3.noarch.rpm cross-gcc-common-13.2.0-7.emt3.noarch.rpm -curl-8.11.1-3.emt3.x86_64.rpm -curl-debuginfo-8.11.1-3.emt3.x86_64.rpm -curl-devel-8.11.1-3.emt3.x86_64.rpm -curl-libs-8.11.1-3.emt3.x86_64.rpm +curl-8.11.1-5.emt3.x86_64.rpm +curl-debuginfo-8.11.1-5.emt3.x86_64.rpm +curl-devel-8.11.1-5.emt3.x86_64.rpm +curl-libs-8.11.1-5.emt3.x86_64.rpm Cython-debuginfo-3.0.5-2.emt3.x86_64.rpm debugedit-5.0-2.emt3.x86_64.rpm debugedit-debuginfo-5.0-2.emt3.x86_64.rpm @@ -75,19 +75,19 @@ edge-check-macros-3.0-2.emt3.noarch.rpm edge-repos-3.0-8.emt3.noarch.rpm edge-repos-shared-3.0-8.emt3.noarch.rpm edge-rpm-macros-3.0-2.emt3.noarch.rpm -elfutils-0.189-7.emt3.x86_64.rpm -elfutils-debuginfo-0.189-7.emt3.x86_64.rpm -elfutils-default-yama-scope-0.189-7.emt3.noarch.rpm -elfutils-devel-0.189-7.emt3.x86_64.rpm -elfutils-devel-static-0.189-7.emt3.x86_64.rpm -elfutils-libelf-0.189-7.emt3.x86_64.rpm -elfutils-libelf-devel-0.189-7.emt3.x86_64.rpm -elfutils-libelf-devel-static-0.189-7.emt3.x86_64.rpm -elfutils-libelf-lang-0.189-7.emt3.x86_64.rpm -expat-2.6.4-1.emt3.x86_64.rpm -expat-debuginfo-2.6.4-1.emt3.x86_64.rpm -expat-devel-2.6.4-1.emt3.x86_64.rpm -expat-libs-2.6.4-1.emt3.x86_64.rpm +elfutils-0.189-8.emt3.x86_64.rpm +elfutils-debuginfo-0.189-8.emt3.x86_64.rpm +elfutils-default-yama-scope-0.189-8.emt3.noarch.rpm +elfutils-devel-0.189-8.emt3.x86_64.rpm +elfutils-devel-static-0.189-8.emt3.x86_64.rpm +elfutils-libelf-0.189-8.emt3.x86_64.rpm +elfutils-libelf-devel-0.189-8.emt3.x86_64.rpm +elfutils-libelf-devel-static-0.189-8.emt3.x86_64.rpm +elfutils-libelf-lang-0.189-8.emt3.x86_64.rpm +expat-2.6.4-4.emt3.x86_64.rpm +expat-debuginfo-2.6.4-4.emt3.x86_64.rpm +expat-devel-2.6.4-4.emt3.x86_64.rpm +expat-libs-2.6.4-4.emt3.x86_64.rpm file-5.45-1.emt3.x86_64.rpm file-debuginfo-5.45-1.emt3.x86_64.rpm file-devel-5.45-1.emt3.x86_64.rpm @@ -114,27 +114,27 @@ gdbm-lang-1.23-1.emt3.x86_64.rpm gettext-0.22-1.emt3.x86_64.rpm gettext-debuginfo-0.22-1.emt3.x86_64.rpm gfortran-13.2.0-7.emt3.x86_64.rpm -glib-2.78.6-3.emt3.x86_64.rpm -glibc-2.38-12.emt3.x86_64.rpm -glibc-debuginfo-2.38-12.emt3.x86_64.rpm -glibc-devel-2.38-12.emt3.x86_64.rpm -glibc-i18n-2.38-12.emt3.x86_64.rpm -glibc-iconv-2.38-12.emt3.x86_64.rpm -glibc-lang-2.38-12.emt3.x86_64.rpm -glibc-locales-all-2.38-12.emt3.x86_64.rpm -glibc-nscd-2.38-12.emt3.x86_64.rpm -glibc-static-2.38-12.emt3.x86_64.rpm -glibc-tools-2.38-12.emt3.x86_64.rpm -glib-debuginfo-2.78.6-3.emt3.x86_64.rpm -glib-devel-2.78.6-3.emt3.x86_64.rpm -glib-doc-2.78.6-3.emt3.noarch.rpm -glib-schemas-2.78.6-3.emt3.x86_64.rpm +glib-2.78.6-8.emt3.x86_64.rpm +glib-debuginfo-2.78.6-8.emt3.x86_64.rpm +glib-devel-2.78.6-8.emt3.x86_64.rpm +glib-doc-2.78.6-8.emt3.noarch.rpm +glib-schemas-2.78.6-8.emt3.x86_64.rpm +glibc-2.38-18.emt3.x86_64.rpm +glibc-debuginfo-2.38-18.emt3.x86_64.rpm +glibc-devel-2.38-18.emt3.x86_64.rpm +glibc-i18n-2.38-18.emt3.x86_64.rpm +glibc-iconv-2.38-18.emt3.x86_64.rpm +glibc-lang-2.38-18.emt3.x86_64.rpm +glibc-locales-all-2.38-18.emt3.x86_64.rpm +glibc-nscd-2.38-18.emt3.x86_64.rpm +glibc-static-2.38-18.emt3.x86_64.rpm +glibc-tools-2.38-18.emt3.x86_64.rpm gmp-6.3.0-1.emt3.x86_64.rpm gmp-debuginfo-6.3.0-1.emt3.x86_64.rpm gmp-devel-6.3.0-1.emt3.x86_64.rpm -gnupg2-2.4.7-1.emt3.x86_64.rpm -gnupg2-debuginfo-2.4.7-1.emt3.x86_64.rpm -gnupg2-lang-2.4.7-1.emt3.x86_64.rpm +gnupg2-2.4.9-2.emt3.x86_64.rpm +gnupg2-debuginfo-2.4.9-2.emt3.x86_64.rpm +gnupg2-lang-2.4.9-2.emt3.x86_64.rpm gperf-3.1-5.emt3.x86_64.rpm gperf-debuginfo-3.1-5.emt3.x86_64.rpm gpgme-1.23.2-2.emt3.x86_64.rpm @@ -155,24 +155,24 @@ kernel-headers-6.18.15-1.emt3.noarch.rpm kmod-30-1.emt3.x86_64.rpm kmod-debuginfo-30-1.emt3.x86_64.rpm kmod-devel-30-1.emt3.x86_64.rpm -krb5-1.21.3-2.emt3.x86_64.rpm -krb5-debuginfo-1.21.3-2.emt3.x86_64.rpm -krb5-devel-1.21.3-2.emt3.x86_64.rpm -krb5-lang-1.21.3-2.emt3.x86_64.rpm +krb5-1.21.3-3.emt3.x86_64.rpm +krb5-debuginfo-1.21.3-3.emt3.x86_64.rpm +krb5-devel-1.21.3-3.emt3.x86_64.rpm +krb5-lang-1.21.3-3.emt3.x86_64.rpm libacl-2.3.1-2.emt3.x86_64.rpm libacl-devel-2.3.1-2.emt3.x86_64.rpm -libarchive-3.7.7-3.emt3.x86_64.rpm -libarchive-debuginfo-3.7.7-3.emt3.x86_64.rpm -libarchive-devel-3.7.7-3.emt3.x86_64.rpm +libarchive-3.7.7-4.emt3.x86_64.rpm +libarchive-debuginfo-3.7.7-4.emt3.x86_64.rpm +libarchive-devel-3.7.7-4.emt3.x86_64.rpm libassuan-2.5.6-1.emt3.x86_64.rpm libassuan-debuginfo-2.5.6-1.emt3.x86_64.rpm libassuan-devel-2.5.6-1.emt3.x86_64.rpm libattr-2.5.2-1.emt3.x86_64.rpm libattr-devel-2.5.2-1.emt3.x86_64.rpm libbacktrace-static-13.2.0-7.emt3.x86_64.rpm -libcap-2.69-6.emt3.x86_64.rpm -libcap-debuginfo-2.69-6.emt3.x86_64.rpm -libcap-devel-2.69-6.emt3.x86_64.rpm +libcap-2.69-12.emt3.x86_64.rpm +libcap-debuginfo-2.69-12.emt3.x86_64.rpm +libcap-devel-2.69-12.emt3.x86_64.rpm libcap-ng-0.8.4-1.emt3.x86_64.rpm libcap-ng-debuginfo-0.8.4-1.emt3.x86_64.rpm libcap-ng-devel-0.8.4-1.emt3.x86_64.rpm @@ -210,11 +210,11 @@ libpipeline-debuginfo-1.5.7-1.emt3.x86_64.rpm libpipeline-devel-1.5.7-1.emt3.x86_64.rpm libpkgconf-2.0.2-1.emt3.x86_64.rpm libpkgconf-devel-2.0.2-1.emt3.x86_64.rpm -libselinux-3.6-3.emt3.x86_64.rpm -libselinux-debuginfo-3.6-3.emt3.x86_64.rpm -libselinux-devel-3.6-3.emt3.x86_64.rpm -libselinux-python3-3.6-3.emt3.x86_64.rpm -libselinux-utils-3.6-3.emt3.x86_64.rpm +libselinux-3.6-4.emt3.x86_64.rpm +libselinux-debuginfo-3.6-4.emt3.x86_64.rpm +libselinux-devel-3.6-4.emt3.x86_64.rpm +libselinux-python3-3.6-4.emt3.x86_64.rpm +libselinux-utils-3.6-4.emt3.x86_64.rpm libsepol-3.6-2.emt3.x86_64.rpm libsepol-debuginfo-3.6-2.emt3.x86_64.rpm libsepol-devel-3.6-2.emt3.x86_64.rpm @@ -227,20 +227,20 @@ libssh2-debuginfo-1.11.1-1.emt3.x86_64.rpm libssh2-devel-1.11.1-1.emt3.x86_64.rpm libstdc++-13.2.0-7.emt3.x86_64.rpm libstdc++-devel-13.2.0-7.emt3.x86_64.rpm -libtasn1-4.19.0-2.emt3.x86_64.rpm -libtasn1-debuginfo-4.19.0-2.emt3.x86_64.rpm -libtasn1-devel-4.19.0-2.emt3.x86_64.rpm +libtasn1-4.19.0-3.emt3.x86_64.rpm +libtasn1-debuginfo-4.19.0-3.emt3.x86_64.rpm +libtasn1-devel-4.19.0-3.emt3.x86_64.rpm libtool-2.4.7-1.emt3.x86_64.rpm libtool-debuginfo-2.4.7-1.emt3.x86_64.rpm libxcrypt-4.4.36-2.emt3.x86_64.rpm libxcrypt-debuginfo-4.4.36-2.emt3.x86_64.rpm libxcrypt-devel-4.4.36-2.emt3.x86_64.rpm -libxml2-2.11.5-6.emt3.x86_64.rpm -libxml2-debuginfo-2.11.5-6.emt3.x86_64.rpm -libxml2-devel-2.11.5-6.emt3.x86_64.rpm -libxslt-1.1.43-1.emt3.x86_64.rpm -libxslt-debuginfo-1.1.43-1.emt3.x86_64.rpm -libxslt-devel-1.1.43-1.emt3.x86_64.rpm +libxml2-2.11.5-9.emt3.x86_64.rpm +libxml2-debuginfo-2.11.5-9.emt3.x86_64.rpm +libxml2-devel-2.11.5-9.emt3.x86_64.rpm +libxslt-1.1.43-3.emt3.x86_64.rpm +libxslt-debuginfo-1.1.43-3.emt3.x86_64.rpm +libxslt-devel-1.1.43-3.emt3.x86_64.rpm lua-5.4.6-1.emt3.x86_64.rpm lua-debuginfo-5.4.6-1.emt3.x86_64.rpm lua-devel-5.4.6-1.emt3.x86_64.rpm @@ -248,9 +248,9 @@ lua-libs-5.4.6-1.emt3.x86_64.rpm lua-rpm-macros-1-6.emt3.noarch.rpm lua-srpm-macros-1-6.emt3.noarch.rpm lua-static-5.4.6-1.emt3.x86_64.rpm -lz4-1.9.4-1.emt3.x86_64.rpm -lz4-debuginfo-1.9.4-1.emt3.x86_64.rpm -lz4-devel-1.9.4-1.emt3.x86_64.rpm +lz4-1.9.4-2.emt3.x86_64.rpm +lz4-debuginfo-1.9.4-2.emt3.x86_64.rpm +lz4-devel-1.9.4-2.emt3.x86_64.rpm m4-1.4.19-2.emt3.x86_64.rpm m4-debuginfo-1.4.19-2.emt3.x86_64.rpm make-4.4.1-2.emt3.x86_64.rpm @@ -280,12 +280,12 @@ npth-debuginfo-1.6-4.emt3.x86_64.rpm npth-devel-1.6-4.emt3.x86_64.rpm ntsysv-1.25-1.emt3.x86_64.rpm ocaml-srpm-macros-9-4.emt3.noarch.rpm -openssl-3.3.3-3.emt3.x86_64.rpm -openssl-debuginfo-3.3.3-3.emt3.x86_64.rpm -openssl-devel-3.3.3-3.emt3.x86_64.rpm -openssl-libs-3.3.3-3.emt3.x86_64.rpm -openssl-perl-3.3.3-3.emt3.x86_64.rpm -openssl-static-3.3.3-3.emt3.x86_64.rpm +openssl-3.3.5-4.emt3.x86_64.rpm +openssl-debuginfo-3.3.5-4.emt3.x86_64.rpm +openssl-devel-3.3.5-4.emt3.x86_64.rpm +openssl-libs-3.3.5-4.emt3.x86_64.rpm +openssl-perl-3.3.5-4.emt3.x86_64.rpm +openssl-static-3.3.5-4.emt3.x86_64.rpm p11-kit-0.25.0-1.emt3.x86_64.rpm p11-kit-debuginfo-0.25.0-1.emt3.x86_64.rpm p11-kit-devel-0.25.0-1.emt3.x86_64.rpm @@ -370,16 +370,16 @@ perl-Fcntl-1.15-509.emt3.x86_64.rpm perl-Fedora-VSP-0.001-20.emt3.noarch.rpm perl-fields-2.27-509.emt3.noarch.rpm perl-File-Basename-2.86-509.emt3.noarch.rpm -perl-FileCache-1.10-509.emt3.noarch.rpm perl-File-Compare-1.100.700-509.emt3.noarch.rpm perl-File-Copy-2.41-509.emt3.noarch.rpm perl-File-DosGlob-1.12-509.emt3.x86_64.rpm perl-File-Fetch-1.04-509.emt3.noarch.rpm perl-File-Find-1.43-509.emt3.noarch.rpm -perl-FileHandle-2.05-509.emt3.noarch.rpm perl-File-Path-2.18-509.emt3.noarch.rpm perl-File-stat-1.13-509.emt3.noarch.rpm perl-File-Temp-0.231.100-509.emt3.noarch.rpm +perl-FileCache-1.10-509.emt3.noarch.rpm +perl-FileHandle-2.05-509.emt3.noarch.rpm perl-filetest-1.03-509.emt3.noarch.rpm perl-Filter-1.64-509.emt3.x86_64.rpm perl-Filter-Simple-0.96-509.emt3.noarch.rpm @@ -521,31 +521,32 @@ procps-ng-devel-4.0.4-1.emt3.x86_64.rpm procps-ng-lang-4.0.4-1.emt3.x86_64.rpm pyproject-rpm-macros-1.12.0-2.emt3.noarch.rpm pyproject-srpm-macros-1.12.0-2.emt3.noarch.rpm -python3-3.12.9-4.emt3.x86_64.rpm +python3-3.12.9-9.emt3.x86_64.rpm python3-audit-3.1.2-1.emt3.x86_64.rpm python3-cracklib-2.9.11-1.emt3.x86_64.rpm -python3-curses-3.12.9-4.emt3.x86_64.rpm +python3-curses-3.12.9-9.emt3.x86_64.rpm python3-Cython-3.0.5-2.emt3.x86_64.rpm -python3-debuginfo-3.12.9-4.emt3.x86_64.rpm -python3-devel-3.12.9-4.emt3.x86_64.rpm +python3-debuginfo-3.12.9-9.emt3.x86_64.rpm +python3-devel-3.12.9-9.emt3.x86_64.rpm python3-flit-core-3.9.0-1.emt3.noarch.rpm python3-gpg-1.23.2-2.emt3.x86_64.rpm python3-jinja2-3.1.2-3.emt3.noarch.rpm python3-libcap-ng-0.8.4-1.emt3.x86_64.rpm -python3-libs-3.12.9-4.emt3.x86_64.rpm -python3-libxml2-2.11.5-6.emt3.x86_64.rpm +python3-libmount-2.40.2-3.emt3.x86_64.rpm +python3-libs-3.12.9-9.emt3.x86_64.rpm +python3-libxml2-2.11.5-9.emt3.x86_64.rpm python3-lxml-4.9.3-1.emt3.x86_64.rpm python3-magic-5.45-1.emt3.noarch.rpm python3-markupsafe-2.1.3-1.emt3.x86_64.rpm python3-newt-0.52.23-1.emt3.x86_64.rpm python3-packaging-23.2-3.emt3.noarch.rpm -python3-pip-24.2-3.emt3.noarch.rpm +python3-pip-24.2-6.emt3.noarch.rpm python3-pygments-2.7.4-2.emt3.noarch.rpm python3-rpm-4.18.2-1.emt3.x86_64.rpm python3-rpm-generators-14-11.emt3.noarch.rpm python3-setuptools-69.0.3-5.emt3.noarch.rpm -python3-test-3.12.9-4.emt3.x86_64.rpm -python3-tools-3.12.9-4.emt3.x86_64.rpm +python3-test-3.12.9-9.emt3.x86_64.rpm +python3-tools-3.12.9-9.emt3.x86_64.rpm python3-wheel-0.43.0-1.emt3.noarch.rpm python-markupsafe-debuginfo-2.1.3-1.emt3.x86_64.rpm python-wheel-wheel-0.43.0-1.emt3.noarch.rpm @@ -590,11 +591,11 @@ texinfo-7.0.3-1.emt3.x86_64.rpm texinfo-debuginfo-7.0.3-1.emt3.x86_64.rpm unzip-6.0-22.emt3.x86_64.rpm unzip-debuginfo-6.0-22.emt3.x86_64.rpm -util-linux-2.40.2-1.emt3.x86_64.rpm -util-linux-debuginfo-2.40.2-1.emt3.x86_64.rpm -util-linux-devel-2.40.2-1.emt3.x86_64.rpm -util-linux-lang-2.40.2-1.emt3.x86_64.rpm -util-linux-libs-2.40.2-1.emt3.x86_64.rpm +util-linux-2.40.2-3.emt3.x86_64.rpm +util-linux-debuginfo-2.40.2-3.emt3.x86_64.rpm +util-linux-devel-2.40.2-3.emt3.x86_64.rpm +util-linux-lang-2.40.2-3.emt3.x86_64.rpm +util-linux-libs-2.40.2-3.emt3.x86_64.rpm which-2.21-8.emt3.x86_64.rpm which-debuginfo-2.21-8.emt3.x86_64.rpm xz-5.4.4-2.emt3.x86_64.rpm @@ -604,9 +605,9 @@ xz-lang-5.4.4-2.emt3.x86_64.rpm xz-libs-5.4.4-2.emt3.x86_64.rpm zip-3.0-6.emt3.x86_64.rpm zip-debuginfo-3.0-6.emt3.x86_64.rpm -zlib-1.3.1-1.emt3.x86_64.rpm -zlib-debuginfo-1.3.1-1.emt3.x86_64.rpm -zlib-devel-1.3.1-1.emt3.x86_64.rpm +zlib-1.3.2-1.emt3.x86_64.rpm +zlib-debuginfo-1.3.2-1.emt3.x86_64.rpm +zlib-devel-1.3.2-1.emt3.x86_64.rpm zstd-1.5.5-2.emt3.x86_64.rpm zstd-debuginfo-1.5.5-2.emt3.x86_64.rpm zstd-devel-1.5.5-2.emt3.x86_64.rpm diff --git a/toolkit/scripts/check_entangled_specs.py b/toolkit/scripts/check_entangled_specs.py index 797951936d..b3a85d5295 100755 --- a/toolkit/scripts/check_entangled_specs.py +++ b/toolkit/scripts/check_entangled_specs.py @@ -64,10 +64,6 @@ "SPECS/shim-unsigned-x64/shim-unsigned-x64.spec", "SPECS/shim-unsigned-aarch64/shim-unsigned-aarch64.spec" ]), - frozenset([ - "SPECS-SIGNED/fwctl-signed/fwctl-signed.spec", - "SPECS/fwctl/fwctl.spec" - ]), frozenset([ "SPECS-SIGNED/iser-signed/iser-signed.spec", "SPECS/iser/iser.spec" diff --git a/toolkit/scripts/get_config_deps.sh b/toolkit/scripts/get_config_deps.sh index 1e724d03d0..564f9ae46f 100755 --- a/toolkit/scripts/get_config_deps.sh +++ b/toolkit/scripts/get_config_deps.sh @@ -44,6 +44,8 @@ do then echo "$filename" else - echo $(realpath "$config_base_dir/$filename") + # Use -m to canonicalize paths even if they don't exist + # This allows the Makefile to detect missing files and provide a helpful error + echo $(realpath -m "$config_base_dir/$filename") fi done diff --git a/toolkit/scripts/imggen.mk b/toolkit/scripts/imggen.mk index eb76531b77..d991475474 100644 --- a/toolkit/scripts/imggen.mk +++ b/toolkit/scripts/imggen.mk @@ -94,6 +94,20 @@ fetch-external-image-packages: $(image_external_package_cache_summary) # Validate the selected config file if any changes occur in the image config base directory. # Changes to files located outside the base directory will not be detected. validate-image-config: $(validate-config) + +# Validate that all config dependencies exist before Make tries to process them as prerequisites +# If we don't do this, Make will error out with a less-than-helpful message about having no rule to make +# the validation flag (since its a pattern match and if a dependency is missing, it can't match the pattern) +# Skip this check for printvar targets so users can still debug with the suggested command +ifneq ($(CONFIG_FILE),) + ifeq ($(filter printvar-%,$(MAKECMDGOALS)),) + config_missing_files = $(filter-out $(wildcard $(config_other_files)),$(config_other_files)) + ifneq ($(config_missing_files),) + $(error $(newline)$(newline)ERROR: Image configuration '$(CONFIG_FILE)' missing files:$(newline)$(newline)$(foreach file,$(config_missing_files), - $(file)$(newline))$(newline)Run this command to see all expected files:$(newline) make printvar-config_other_files CONFIG_FILE=$(CONFIG_FILE) --quiet$(newline)) + endif + endif +endif + $(STATUS_FLAGS_DIR)/validate-image-config%.flag: $(go-imageconfigvalidator) $(depend_CONFIG_FILE) $(CONFIG_FILE) $(config_other_files) $(if $(CONFIG_FILE),,$(error Must set CONFIG_FILE=)) $(go-imageconfigvalidator) \ @@ -126,7 +140,12 @@ ifneq ($(REPO_SNAPSHOT_TIME),) imagepkgfetcher_extra_flags += --repo-snapshot-time=$(REPO_SNAPSHOT_TIME) endif -$(image_package_cache_summary): $(go-imagepkgfetcher) $(chroot_worker) $(toolchain_rpms) $(imggen_local_repo) $(depend_REPO_LIST) $(REPO_LIST) $(depend_CONFIG_FILE) $(CONFIG_FILE) $(validate-config) $(RPMS_DIR) $(imggen_rpms) $(depend_REPO_SNAPSHOT_TIME) $(STATUS_FLAGS_DIR)/imagegen_cleanup.flag +ifeq ($(VALIDATE_IMAGE_GPG),y) +imagepkgfetcher_extra_flags += --enable-gpg-check +imagepkgfetcher_extra_flags += $(foreach key,$(IMAGE_GPG_VALIDATION_KEYS),--gpg-key=$(key)) +endif + +$(image_package_cache_summary): $(go-imagepkgfetcher) $(chroot_worker) $(toolchain_rpms) $(imggen_local_repo) $(depend_REPO_LIST) $(REPO_LIST) $(depend_CONFIG_FILE) $(CONFIG_FILE) $(validate-config) $(RPMS_DIR) $(imggen_rpms) $(depend_REPO_SNAPSHOT_TIME) $(depend_VALIDATE_IMAGE_GPG) $(depend_IMAGE_GPG_VALIDATION_KEYS) $(IMAGE_GPG_VALIDATION_KEYS) $(STATUS_FLAGS_DIR)/imagegen_cleanup.flag $(if $(CONFIG_FILE),,$(error Must set CONFIG_FILE=)) $(go-imagepkgfetcher) \ --input=$(CONFIG_FILE) \ diff --git a/toolkit/scripts/toolchain.mk b/toolkit/scripts/toolchain.mk index f28f96ac1d..d19db70c2d 100644 --- a/toolkit/scripts/toolchain.mk +++ b/toolkit/scripts/toolchain.mk @@ -19,6 +19,8 @@ rpmcache_build_dir = $(BUILD_DIR)/rpm_cache/cache toolchain_logs_dir = $(LOGS_DIR)/toolchain toolchain_downloads_logs_dir = $(toolchain_logs_dir)/downloads toolchain_rehydrate_logs_dir = $(toolchain_logs_dir)/rehydrate +toolchain_raw_logs_dir = $(toolchain_logs_dir)/raw +toolchain_official_logs_dir = $(toolchain_logs_dir)/official toolchain_downloads_manifest = $(toolchain_downloads_logs_dir)/download_manifest.txt toolchain_log_tail_length = 20 populated_toolchain_chroot = $(toolchain_build_dir)/populated_toolchain @@ -159,13 +161,18 @@ hydrate-toolchain: # out/toolchain/toolchain_from_container.tar.gz $(raw_toolchain): $(toolchain_files) @echo "Building raw toolchain" + rm -rf $(toolchain_raw_logs_dir) && mkdir -p $(toolchain_raw_logs_dir) cd $(SCRIPTS_DIR)/toolchain && \ ./create_toolchain_in_container.sh \ $(BUILD_DIR) \ $(SPECS_DIR) \ $(SOURCE_URL) \ $(INCREMENTAL_TOOLCHAIN) \ - $(ARCHIVE_TOOL) + $(ARCHIVE_TOOL) \ + $(toolchain_raw_logs_dir) 2>&1 | tee $(toolchain_raw_logs_dir)/create_toolchain_in_container_full.log; \ + if [ $${PIPESTATUS[0]} -ne 0 ]; then \ + $(call print_error, create_toolchain_in_container.sh failed); \ + fi # This target establishes a cache of toolchain RPMs for partially rehydrating the toolchain from package repos. # $(toolchain_from_repos) is a staging folder for these RPMs. We use the toolchain manifest to get a list of @@ -213,6 +220,7 @@ $(final_toolchain): $(no_repo_acl) $(raw_toolchain) $(toolchain_rpms_rehydrated) # Clean the existing chroot if not doing an incremental build $(if $(filter y,$(INCREMENTAL_TOOLCHAIN)),,$(SCRIPTS_DIR)/safeunmount.sh "$(populated_toolchain_chroot)" || $(call print_error,failed to clean mounts for toolchain build)) $(if $(filter y,$(INCREMENTAL_TOOLCHAIN)),,rm -rf $(populated_toolchain_chroot)) + rm -rf $(toolchain_official_logs_dir) && mkdir -p $(toolchain_official_logs_dir) cd $(SCRIPTS_DIR)/toolchain && \ ./build_mariner_toolchain.sh \ "$(DIST_TAG)" \ @@ -230,7 +238,10 @@ $(final_toolchain): $(no_repo_acl) $(raw_toolchain) $(toolchain_rpms_rehydrated) "$(toolchain_from_repos)" \ "$(TOOLCHAIN_MANIFEST)" \ "$(go-bldtracker)" \ - "$(TIMESTAMP_DIR)/build_mariner_toolchain.jsonl" && \ + "$(TIMESTAMP_DIR)/build_mariner_toolchain.jsonl" 2>&1 | tee $(toolchain_official_logs_dir)/build_official_rpms.log; \ + if [ $${PIPESTATUS[0]} -ne 0 ]; then \ + $(call print_error, build_mariner_toolchain.sh failed); \ + fi && \ $(if $(filter y,$(UPDATE_TOOLCHAIN_LIST)), ls -1 $(toolchain_build_dir)/built_rpms_all > $(MANIFESTS_DIR)/package/toolchain_$(build_arch).txt && ) \ touch $@ @@ -304,7 +315,7 @@ prepare_rpmcache: @echo "Preparing rpmcache copy toolchain RPMs to rpmcache $(rpmcache_build_dir)" @cp $(toolchain_build_rpms)/noarch/* $(rpmcache_build_dir) || true @cp $(toolchain_build_rpms)/x86_64/* $(rpmcache_build_dir) || true -$(toolchain_rpms): prepare_rpmcache $(TOOLCHAIN_MANIFEST) $(STATUS_FLAGS_DIR)/toolchain_auto_cleanup.flag $(depend_REBUILD_TOOLCHAIN) $(go-downloader) $(SCRIPTS_DIR)/toolchain/download_toolchain_rpm.sh $(TOOLCHAIN_GPG_VALIDATION_KEYS) +$(toolchain_rpms): prepare_rpmcache $(TOOLCHAIN_MANIFEST) $(STATUS_FLAGS_DIR)/toolchain_auto_cleanup.flag $(depend_REBUILD_TOOLCHAIN) $(go-downloader) $(SCRIPTS_DIR)/toolchain/download_toolchain_rpm.sh $(depend_TOOLCHAIN_GPG_VALIDATION_KEYS) $(TOOLCHAIN_GPG_VALIDATION_KEYS) @log_file="$(toolchain_downloads_logs_dir)/$(notdir $@).log" && \ rm -f "$$log_file" && \ $(SCRIPTS_DIR)/toolchain/download_toolchain_rpm.sh \ diff --git a/toolkit/scripts/toolchain/container/Dockerfile b/toolkit/scripts/toolchain/container/Dockerfile index d6e2917142..b6a73458a2 100644 --- a/toolkit/scripts/toolchain/container/Dockerfile +++ b/toolkit/scripts/toolchain/container/Dockerfile @@ -3,7 +3,7 @@ # # Dockerfile to build Azure Linux toolchain from scratch # -FROM mcr.microsoft.com/cbl-mariner/base/core:2.0.20240123 +FROM mcr.microsoft.com/azurelinux/base/core:3.0.20250910 # Tag the layers so we can clean up all the containers associated with a build directory ARG MARINER_BUILD_DIR diff --git a/toolkit/scripts/toolchain/toolchain_update_git_submodule.sh b/toolkit/scripts/toolchain/toolchain_update_git_submodule.sh index 2d0a486ac1..70298c9860 100755 --- a/toolkit/scripts/toolchain/toolchain_update_git_submodule.sh +++ b/toolkit/scripts/toolchain/toolchain_update_git_submodule.sh @@ -8,13 +8,67 @@ set -e REPO_ROOT="$(git rev-parse --show-toplevel)" +skip_list=( + "apparmor" + "azurelinux-release" + "azurelinux-repos" + "azurelinux-rpm-macros" + "cloud-provider-kubevirt" + "ceph" + "coredns" + "dcos-cli" + "fwctl" + "fwctl-hwe" + "iser" + "iser-hwe" + "isert" + "isert-hwe" + "kernel-hwe" + "kernel-hwe-headers" + "kernel-mshv" + "knem" + "knem-hwe" + "mft_kernel" + "mft_kernel-hwe" + "mlnx-ethtool" + "mlnx-iproute2" + "mlnx-nfsrdma" + "mlnx-nfsrdma-hwe" + "mlnx-ofa_kernel" + "mlnx-ofa_kernel-hwe" + "mlnx-tools" + "mlx-bootctl" + "mlx-steering-dump" + "nodejs24" + "patterns-ceph-containers" + "srp" + "srp-hwe" + "trident" + "vitess" + "xpmem" + "xpmem-hwe" + "xpmem-lib" +) + +extended_list=( + "bolt" + "libogg" + "libtheora" + "libutempter" + "libvorbis" + "lksctp-tools" + "pyserial" + "python-dmidecode" + "xterm" +) + + if [ -d "${REPO_ROOT}/azurelinux" ]; then cd ${REPO_ROOT}/azurelinux git clean -xfd &> /dev/null git reset --hard &> /dev/null git submodule update --init &> /dev/null cd ${REPO_ROOT} - skip_list=("cloud-provider-kubevirt" "perl-DBIx-Simple" "dcos-cli" "vitess" "fwctl" "mlx-bootctl" "kernel-mshv" "srp" "mft_kernel" "knem" "xpmem" "xpmem-lib" "iser" "isert" "mlnx-ethtool" "mlnx-iproute2" "mlnx-nfsrdma" "mlnx-ofa_kernel" "mlnx-tools" "azurelinux-release" "azurelinux-repos" "azurelinux-rpm-macros") for folder in azurelinux/SPECS/*; do fbasename=$(basename "$folder") skip=false @@ -30,4 +84,14 @@ if [ -d "${REPO_ROOT}/azurelinux" ]; then fi [ -d "$folder" ] && [ ! -d "SPECS/$fbasename" ] && cp -r "$folder" SPECS/ done + # Copy specific folders from azurelinux/SPECS-EXTENDED/ + for extended_spec in "${extended_list[@]}"; do + extended_folder="$REPO_ROOT/azurelinux/SPECS-EXTENDED/$extended_spec" + if [ -d "$extended_folder" ]; then + cp -r "$extended_folder" SPECS/ + else + echo "Error: Extended package $extended_spec not found in azurelinux/SPECS-EXTENDED/" + exit 1 + fi + done fi diff --git a/toolkit/scripts/utils.mk b/toolkit/scripts/utils.mk index e456511080..b00b75e129 100644 --- a/toolkit/scripts/utils.mk +++ b/toolkit/scripts/utils.mk @@ -15,6 +15,12 @@ build_arch := $(shell uname -m) no_repo_acl = $(STATUS_FLAGS_DIR)/no_repo_acl.flag +# Define newline for use in error messages and output formatting +define newline + + +endef + ######## MISC. MAKEFILE Functions ######## # Creates a folder if it doesn't exist. Also sets the timestamp to 0 if it is @@ -60,10 +66,11 @@ endef ######## VARIABLE DEPENDENCY TRACKING ######## # List of variables to watch for changes. -watch_vars=PACKAGE_BUILD_LIST PACKAGE_REBUILD_LIST PACKAGE_IGNORE_LIST REPO_LIST CONFIG_FILE STOP_ON_PKG_FAIL TOOLCHAIN_ARCHIVE REBUILD_TOOLCHAIN SRPM_PACK_LIST SPECS_DIR MAX_CASCADING_REBUILDS RUN_CHECK TEST_RUN_LIST TEST_RERUN_LIST TEST_IGNORE_LIST EXTRA_BUILD_LAYERS LICENSE_CHECK_MODE VALIDATE_TOOLCHAIN_GPG REPO_SNAPSHOT_TIME PACKAGE_CACHE_SUMMARY +watch_vars=PACKAGE_BUILD_LIST PACKAGE_REBUILD_LIST PACKAGE_IGNORE_LIST REPO_LIST CONFIG_FILE STOP_ON_PKG_FAIL TOOLCHAIN_ARCHIVE REBUILD_TOOLCHAIN SRPM_PACK_LIST SPECS_DIR MAX_CASCADING_REBUILDS RUN_CHECK TEST_RUN_LIST TEST_RERUN_LIST TEST_IGNORE_LIST EXTRA_BUILD_LAYERS LICENSE_CHECK_MODE VALIDATE_TOOLCHAIN_GPG TOOLCHAIN_GPG_VALIDATION_KEYS VALIDATE_IMAGE_GPG IMAGE_GPG_VALIDATION_KEYS REPO_SNAPSHOT_TIME PACKAGE_CACHE_SUMMARY # Current list: $(depend_PACKAGE_BUILD_LIST) $(depend_PACKAGE_REBUILD_LIST) $(depend_PACKAGE_IGNORE_LIST) $(depend_REPO_LIST) $(depend_CONFIG_FILE) $(depend_STOP_ON_PKG_FAIL) # $(depend_TOOLCHAIN_ARCHIVE) $(depend_REBUILD_TOOLCHAIN) $(depend_SRPM_PACK_LIST) $(depend_SPECS_DIR) $(depend_EXTRA_BUILD_LAYERS) $(depend_MAX_CASCADING_REBUILDS) $(depend_RUN_CHECK) $(depend_TEST_RUN_LIST) -# $(depend_TEST_RERUN_LIST) $(depend_TEST_IGNORE_LIST) $(depend_LICENSE_CHECK_MODE) $(depend_VALIDATE_TOOLCHAIN_GPG) $(depend_REPO_SNAPSHOT_TIME) $(depend_PACKAGE_CACHE_SUMMARY) +# $(depend_TEST_RERUN_LIST) $(depend_TEST_IGNORE_LIST) $(depend_LICENSE_CHECK_MODE) $(depend_VALIDATE_TOOLCHAIN_GPG) $(depend_TOOLCHAIN_GPG_VALIDATION_KEYS) $(depend_VALIDATE_IMAGE_GPG) +# $(depend_IMAGE_GPG_VALIDATION_KEYS) $(depend_REPO_SNAPSHOT_TIME) $(depend_PACKAGE_CACHE_SUMMARY) .PHONY: variable_depends_on_phony clean-variable_depends_on_phony setfacl_always_run_phony clean: clean-variable_depends_on_phony diff --git a/toolkit/tools/imagegen/installutils/installutils.go b/toolkit/tools/imagegen/installutils/installutils.go index db3a0cb8f2..79b83f68a6 100644 --- a/toolkit/tools/imagegen/installutils/installutils.go +++ b/toolkit/tools/imagegen/installutils/installutils.go @@ -774,7 +774,9 @@ func TdnfInstallWithProgress(packageName, installRoot string, currentPackagesIns return } - // TDNF 3.x uses repositories from installchroot instead of host. Passing setopt for repo files directory to use local repo for installroot installation + // TDNF 3.x uses repositories from installchroot instead of host. Passing setopt for repo files directory to use local repo for installroot installation. + // Note: --nogpgcheck is used here because GPG signature validation is performed earlier during package fetching (imagepkgfetcher) + // when VALIDATE_IMAGE_GPG=y is set. Packages in the local repo have already been verified. err = shell.NewExecBuilder("tdnf", "-v", "install", packageName, "--installroot", installRoot, "--nogpgcheck", "--assumeyes", "--setopt", "reposdir=/etc/yum.repos.d/", releaseverCliArg). StdoutCallback(onStdout). @@ -841,7 +843,9 @@ func calculateTotalPackages(packages []string, installRoot string, genEMTList bo stderr string ) - // Issue an install request but stop right before actually performing the install (assumeno) + // Issue an install request but stop right before actually performing the install (assumeno). + // Note: --nogpgcheck is safe here because this is a dry-run (--assumeno) and packages are validated + // during fetching when VALIDATE_IMAGE_GPG=y is set. stdout, stderr, err = shell.Execute("tdnf", "install", releaseverCliArg, "--assumeno", "--nogpgcheck", pkg, "--installroot", installRoot) if err != nil { // tdnf aborts the process when it detects an install with --assumeno. @@ -1963,11 +1967,8 @@ func ProvisionUserSSHCerts(installChroot safechroot.ChrootInterface, username st ) (err error) { var ( pubKeyData []string - exists bool ) const squashErrors = false - const authorizedKeysTempFilePerms = 0644 - const authorizedKeysTempFile = "/tmp/authorized_keys" const sshDirectoryPermission = "0700" // Skip user SSH directory generation when not provided with public keys @@ -1983,27 +1984,21 @@ func ProvisionUserSSHCerts(installChroot safechroot.ChrootInterface, username st authorizedKeysFile := filepath.Join(userSSHKeyDir, userutils.SSHAuthorizedKeysFileName) - exists, err = file.PathExists(authorizedKeysTempFile) + // Create a guaranteed unique temporary file for authorized_keys as a staging file which we will copy + // into the chroot. + tmpFile, err := os.CreateTemp("", "authorized_keys_*") if err != nil { - logger.Log.Warnf("Error accessing %s file : %v", authorizedKeysTempFile, err) + logger.Log.Warnf("Failed to create temporary authorized_keys file: %v", err) return } - if !exists { - logger.Log.Debugf("File %s does not exist. Creating file...", authorizedKeysTempFile) - err = file.Create(authorizedKeysTempFile, authorizedKeysTempFilePerms) - if err != nil { - logger.Log.Warnf("Failed to create %s file : %v", authorizedKeysTempFile, err) - return - } - } else { - err = os.Truncate(authorizedKeysTempFile, 0) - if err != nil { - logger.Log.Warnf("Failed to truncate %s file : %v", authorizedKeysTempFile, err) - return - } - } + authorizedKeysTempFile := tmpFile.Name() defer os.Remove(authorizedKeysTempFile) + if err = tmpFile.Close(); err != nil { + logger.Log.Warnf("Failed to close temporary authorized_keys file: %v", err) + return + } + allSSHKeys := []string(nil) if includeExistingKeys { diff --git a/toolkit/tools/imagepkgfetcher/imagepkgfetcher.go b/toolkit/tools/imagepkgfetcher/imagepkgfetcher.go index 3b70a6c9db..8ca24933ba 100644 --- a/toolkit/tools/imagepkgfetcher/imagepkgfetcher.go +++ b/toolkit/tools/imagepkgfetcher/imagepkgfetcher.go @@ -16,6 +16,7 @@ import ( "github.com/microsoft/azurelinux/toolkit/tools/internal/packagerepo/repoutils" "github.com/microsoft/azurelinux/toolkit/tools/internal/pkggraph" "github.com/microsoft/azurelinux/toolkit/tools/internal/pkgjson" + "github.com/microsoft/azurelinux/toolkit/tools/internal/rpm" "github.com/microsoft/azurelinux/toolkit/tools/internal/timestamp" "github.com/microsoft/azurelinux/toolkit/tools/pkg/profile" @@ -49,6 +50,9 @@ var ( inputSummaryFile = app.Flag("input-summary-file", "Path to a file with the summary of packages cloned to be restored").String() outputSummaryFile = app.Flag("output-summary-file", "Path to save the summary of packages cloned").String() + enableGpgCheck = app.Flag("enable-gpg-check", "Enable RPM GPG signature verification for all repositories during package fetching.").Bool() + gpgKeyPaths = app.Flag("gpg-key", "Path to a GPG key file for signature validation. May be specified multiple times. Required if enable-gpg-check is set.").ExistingFiles() + logFlags = exe.SetupLogFlags(app) profFlags = exe.SetupProfileFlags(app) timestampFile = app.Flag("timestamp-file", "File that stores timestamps for this program.").String() @@ -73,6 +77,10 @@ func main() { logger.Log.Fatal("input-graph must be provided if external-only is set.") } + if *enableGpgCheck && len(*gpgKeyPaths) == 0 { + logger.Log.Fatal("--enable-gpg-check requires at least one --gpg-key path") + } + timestamp.StartEvent("initialize and configure cloner", nil) cloner, err := rpmrepocloner.ConstructCloner(*outDir, *tmpDir, *workertar, *existingRpmDir, *existingToolchainRpmDir, *tlsClientCert, *tlsClientKey, *repoFiles, *repoSnapshotTime) @@ -110,6 +118,14 @@ func main() { logger.Log.Panicf("Failed to clone RPM repo. Error: %s", err) } + // Validate GPG signatures of downloaded packages if enabled + if *enableGpgCheck { + err = rpm.ValidateDirectoryRPMSignatures(cloner.CloneDirectory(), *gpgKeyPaths) + if err != nil { + logger.Log.Panicf("Failed to validate RPM signatures. Error: %s", err) + } + } + timestamp.StartEvent("finalize cloned packages", nil) err = cloner.ConvertDownloadedPackagesIntoRepo() diff --git a/toolkit/tools/internal/rpm/rpm.go b/toolkit/tools/internal/rpm/rpm.go index ebd3e8b56d..686cf13b73 100644 --- a/toolkit/tools/internal/rpm/rpm.go +++ b/toolkit/tools/internal/rpm/rpm.go @@ -7,6 +7,7 @@ import ( "bufio" "fmt" "os" + "os/exec" "path/filepath" "regexp" "runtime" @@ -503,6 +504,91 @@ func InstallRPM(rpmFile string) (err error) { return } +const rpmKeysProgram = "rpmkeys" + +// importGPGKeysToRPMDb imports GPG keys into an RPM database for signature verification. +// - rpmDbRoot: path to a directory to use as the RPM database root (will be created if it doesn't exist) +// - gpgKeyPaths: paths to GPG key files to import into the RPM database +// This should be called once before validating multiple RPMs with checkRPMSignature. +func importGPGKeysToRPMDb(rpmDbRoot string, gpgKeyPaths []string) (err error) { + if _, err := exec.LookPath(rpmKeysProgram); err != nil { + return fmt.Errorf("%s command not found - explicit GPG signature enforcement requires this tool:\n%w", rpmKeysProgram, err) + } + for _, keyPath := range gpgKeyPaths { + _, stderr, importErr := shell.Execute(rpmKeysProgram, "--root", rpmDbRoot, "--import", keyPath) + if importErr != nil { + return fmt.Errorf("failed to import GPG key (%s) into RPM database: %v:\n%w", keyPath, stderr, importErr) + } + } + return nil +} + +// checkRPMSignature validates the GPG signature of an RPM file. +// - rpmFile: path to the RPM file to validate +// - rpmDbRoot: path to a directory used as the RPM database root (must have GPG keys already imported via importGPGKeysToRpmDb) +// Returns an error if the RPM signature is missing or invalid. +func checkRPMSignature(rpmFile string, rpmDbRoot string) (err error) { + _, stderr, err := shell.Execute(rpmKeysProgram, "--root", rpmDbRoot, "--checksig", rpmFile, "-D", "%_pkgverify_level signature") + if err != nil { + return fmt.Errorf("RPM signature validation failed for (%s): %v\n%w", rpmFile, stderr, err) + } + return nil +} + +// ValidateDirectoryRPMSignatures validates the GPG signatures of all RPM files in a directory. +// It creates an isolated RPM database, imports the provided GPG keys, and validates each RPM. +// Returns an error if any RPM has a missing or invalid signature. +func ValidateDirectoryRPMSignatures(rpmDir string, gpgKeyPaths []string) (err error) { + logger.Log.Info("Validating GPG signatures of downloaded packages") + + // Create a temporary directory for the isolated RPM database + rpmDbRoot, err := os.MkdirTemp("", "rpm-gpg-check-*") + if err != nil { + return fmt.Errorf("failed to create temporary directory for RPM database:\n%w", err) + } + defer os.RemoveAll(rpmDbRoot) + + // Import GPG keys once before validating all RPMs + err = importGPGKeysToRPMDb(rpmDbRoot, gpgKeyPaths) + if err != nil { + return err + } + + // Find all RPM files in the directory (recursively) + var rpmFiles []string + err = filepath.WalkDir(rpmDir, func(path string, d os.DirEntry, walkErr error) error { + if walkErr != nil { + return walkErr + } + if !d.IsDir() && filepath.Ext(path) == ".rpm" { + rpmFiles = append(rpmFiles, path) + } + return nil + }) + if err != nil { + return fmt.Errorf("failed to find RPM files in (%s):\n%w", rpmDir, err) + } + + if len(rpmFiles) == 0 { + logger.Log.Debug("No RPM files found to validate") + return nil + } + + logger.Log.Infof("Validating %d RPM files", len(rpmFiles)) + + // Validate each RPM + for _, rpmFile := range rpmFiles { + logger.Log.Debugf("Validating signature of: %s", filepath.Base(rpmFile)) + err = checkRPMSignature(rpmFile, rpmDbRoot) + if err != nil { + return fmt.Errorf("GPG signature validation failed:\n%w", err) + } + } + + logger.Log.Info("All downloaded RPMs have valid GPG signatures") + return nil +} + // QueryRPMProvides returns what an RPM file provides. // This includes any provides made by a generator and files provided by the rpm. func QueryRPMProvides(rpmFile string) (provides []string, err error) { diff --git a/toolkit/tools/scheduler/schedulerutils/implicitprovides.go b/toolkit/tools/scheduler/schedulerutils/implicitprovides.go index 826c674615..87d7bee135 100644 --- a/toolkit/tools/scheduler/schedulerutils/implicitprovides.go +++ b/toolkit/tools/scheduler/schedulerutils/implicitprovides.go @@ -38,7 +38,7 @@ func InjectMissingImplicitProvides(res *BuildResult, pkgGraph *pkggraph.PkgGraph } for provide, nodes := range provideToNodes { - err = replaceNodesWithProvides(res, pkgGraph, provide, nodes, rpmFile) + err = replaceNodesWithProvides(pkgGraph, provide, nodes, rpmFile) if err != nil { return } @@ -47,13 +47,16 @@ func InjectMissingImplicitProvides(res *BuildResult, pkgGraph *pkggraph.PkgGraph } } - // Make sure the graph is still a directed acyclic graph (DAG) after manipulating it. - err = pkgGraph.MakeDAG() + if didInjectAny { + // Make sure the graph is still a directed acyclic graph (DAG) after manipulating it. + err = pkgGraph.MakeDAG() + } + return } // replaceNodesWithProvides will replace a slice of nodes with a new node with the given provides in the graph. -func replaceNodesWithProvides(res *BuildResult, pkgGraph *pkggraph.PkgGraph, provides *pkgjson.PackageVer, nodes []*pkggraph.PkgNode, rpmFileProviding string) (err error) { +func replaceNodesWithProvides(pkgGraph *pkggraph.PkgGraph, provides *pkgjson.PackageVer, nodes []*pkggraph.PkgNode, rpmFileProviding string) (err error) { var parentNode *pkggraph.PkgNode // Find a local run node that is backed by the same rpm as the one providing the implicit provide.