From 6b15cd43cb55447b27e9cf3571bec12b4d02a853 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Tue, 24 Jun 2025 21:15:14 +0200 Subject: [PATCH] Merging upstream version 7.1.10-dfsg. Signed-off-by: Daniel Baumann --- CONTRIBUTING.md | 55 + Config.kmk | 33 +- LICENSE.txt | 674 ++++++ README.md | 91 + SECURITY.md | 39 + THIRD_PARTY_LICENSES.txt | 1 + Version.kmk | 4 +- configure | 33 - doc/manual/user_ChangeLogImpl.xml | 54 + include/VBox/com/array.h | 13 +- include/iprt/mangling.h | 2 + include/iprt/script.h | 68 +- .../common/VBoxGuest/win/VBoxGuest.inf | 2 +- src/VBox/Additions/linux/drm/vbox_drv.c | 13 +- src/VBox/Additions/linux/drm/vbox_drv.h | 2 + src/VBox/Additions/linux/drm/vbox_fb.c | 8 +- src/VBox/Additions/linux/drm/vbox_mode.c | 9 +- src/VBox/Additions/linux/drm/vbox_prime.c | 8 +- src/VBox/Additions/linux/installer/vboxadd.sh | 7 +- .../Additions/linux/sharedfolders/dirops.c | 24 +- .../Additions/linux/sharedfolders/regops.c | 18 +- src/VBox/Devices/Audio/DrvAudio.cpp | 4 +- src/VBox/Devices/Audio/DrvHostAudioWasApi.cpp | 169 +- src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd | Bin 4194304 -> 4194304 bytes src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd | Bin 4194304 -> 4194304 bytes .../Devices/EFI/FirmwareBin/VBoxEFIAArch32.fd | Bin 3145728 -> 3145728 bytes .../Devices/EFI/FirmwareBin/VBoxEFIAArch64.fd | Bin 3145728 -> 3145728 bytes .../BIOS/VBoxVgaBiosAlternative286.asm | 361 +-- .../BIOS/VBoxVgaBiosAlternative286.md5sum | 2 +- .../BIOS/VBoxVgaBiosAlternative386.asm | 361 +-- .../BIOS/VBoxVgaBiosAlternative386.md5sum | 2 +- .../BIOS/VBoxVgaBiosAlternative8086.asm | 361 +-- .../BIOS/VBoxVgaBiosAlternative8086.md5sum | 2 +- src/VBox/Devices/Network/DevVirtioNet.cpp | 139 +- .../PC/BIOS/VBoxBiosAlternative286.asm | 4 +- .../PC/BIOS/VBoxBiosAlternative286.md5sum | 2 +- .../PC/BIOS/VBoxBiosAlternative386.asm | 4 +- .../PC/BIOS/VBoxBiosAlternative386.md5sum | 2 +- .../PC/BIOS/VBoxBiosAlternative8086.asm | 4 +- .../PC/BIOS/VBoxBiosAlternative8086.md5sum | 2 +- src/VBox/Devices/VirtIO/VirtioCore.cpp | 218 +- src/VBox/Devices/VirtIO/VirtioCore.h | 26 + .../testcase/tstDisasmArmv8-1.cpp | 12 +- .../src/medium/viso/UIVisoContentBrowser.cpp | 88 +- .../src/medium/viso/UIVisoContentBrowser.h | 1 + .../src/medium/viso/UIVisoCreator.cpp | 15 +- .../src/medium/viso/UIVisoCreator.h | 1 + .../machine/UIMachineSettingsDisplay.cpp | 3 + .../HostDrivers/Support/linux/SUPDrv-linux.c | 18 +- src/VBox/HostDrivers/Support/win/VBoxSup.inf | 2 +- .../VBoxNetAdp/win/VBoxNetAdp6.inf | 1 + .../VBoxNetFlt/win/drv/VBoxNetLwf.inf | 1 + .../HostDrivers/VBoxUSB/win/dev/VBoxUSB.inf | 4 +- .../VBoxUSB/win/mon/VBoxUSBMon.inf | 2 +- .../ImageMounter/vboximg-mount/fuse-calls.h | 1 + src/VBox/ImageMounter/vboximg-mount/fuse.cpp | 3 +- src/VBox/ImageMounter/vboximg-mount/fuse.h | 5 +- .../vboximg-mount/vboximgCrypto.cpp | 1 - .../vboximg-mount/vboximgCrypto.h | 1 - .../ImageMounter/vboximg-mount/vboximgMedia.h | 1 - .../ImageMounter/vboximg-mount/vboximgOpts.h | 2 - src/VBox/Installer/linux/Makefile-footer.gmk | 1 + src/VBox/Installer/linux/distributions_rpm | 1 + .../Installer/linux/rpm/VirtualBox.tmpl.spec | 16 +- src/VBox/Installer/linux/rpm/rules | 6 +- src/VBox/Installer/linux/vboxdrv.sh | 3 +- src/VBox/Installer/solaris/checkinstall.sh | 11 +- src/VBox/Installer/solaris/vboxconfig.sh | 2 +- .../Installer/win/Scripts/VBoxExtPackPuel.inf | 1 + src/VBox/Installer/win/Scripts/VMMR0.inf | 1 + src/VBox/Installer/win/UserInterface.wxi | 6 +- src/VBox/Installer/win/VirtualBox.wxs | 4 +- .../Main/src-client/ConsoleVRDPServer.cpp | 8 - .../Main/src-client/GuestDirectoryImpl.cpp | 5 +- src/VBox/Main/src-client/RecordingCodec.cpp | 1 + src/VBox/Main/testcase/tstSafeArray.cpp | 65 +- src/VBox/Main/webservice/Makefile.kmk | 10 +- src/VBox/Runtime/common/script/scriptlex.cpp | 422 +++- .../Runtime/r0drv/linux/memobj-r0drv-linux.c | 20 +- .../Runtime/r0drv/linux/timer-r0drv-linux.c | 13 + src/VBox/Runtime/r3/posix/ldrNative-posix.cpp | 2 +- .../Runtime/r3/win/VBoxRT-openssl-3.0.def | 2 + src/VBox/Runtime/r3/xml.cpp | 4 +- src/VBox/VMM/VMMR3/VMMR3VTable.cpp | 10 + .../businessinfo/Business Information.xml | 7 + .../TestManagerDatabase/pm/Process Model.xml | 7 + src/libs/Makefile.kmk | 6 +- src/libs/xpcom18a4/Config.kmk | 9 +- src/libs/xpcom18a4/Makefile.kmk | 40 +- src/libs/xpcom18a4/java/Makefile.kmk | 44 +- .../xpcom/components/nsIClassInfo.idl | 16 +- .../xpcom/components/nsIComponentManager.idl | 2 +- .../nsIComponentManagerObsolete.idl | 2 +- src/libs/xpcom18a4/xpcom/components/xcDll.cpp | 6 +- src/libs/xpcom18a4/xpcom/typelib/xpidl/README | 16 - .../xpcom18a4/xpcom/typelib/xpidl/xpidl.c | 70 +- .../xpcom18a4/xpcom/typelib/xpidl/xpidl.h | 393 +++- .../xpcom18a4/xpcom/typelib/xpidl/xpidl_doc.c | 312 --- .../xpcom/typelib/xpidl/xpidl_header.c | 1835 +++++++-------- .../xpcom18a4/xpcom/typelib/xpidl/xpidl_idl.c | 2015 +++++++++++------ .../xpcom/typelib/xpidl/xpidl_java.c | 1053 --------- .../xpcom/typelib/xpidl/xpidl_typelib.c | 1549 ++++++------- .../xpcom/typelib/xpidl/xpidl_util.c | 837 +++---- .../xpcom/typelib/xpt/public/xpt_xdr.h | 2 +- .../xpcom/typelib/xpt/src/xpt_arena.c | 7 +- .../xpcom/typelib/xpt/src/xpt_struct.c | 5 + .../xpcom/typelib/xpt/tools/xpt_dump.c | 8 +- .../xpcom/typelib/xpt/tools/xpt_link.c | 6 +- 108 files changed, 6337 insertions(+), 5507 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 THIRD_PARTY_LICENSES.txt create mode 100644 src/VBox/ValidationKit/testmanager/db/TestManagerDatabase/businessinfo/Business Information.xml create mode 100644 src/VBox/ValidationKit/testmanager/db/TestManagerDatabase/pm/Process Model.xml delete mode 100644 src/libs/xpcom18a4/xpcom/typelib/xpidl/README delete mode 100644 src/libs/xpcom18a4/xpcom/typelib/xpidl/xpidl_doc.c delete mode 100644 src/libs/xpcom18a4/xpcom/typelib/xpidl/xpidl_java.c diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..637430b5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,55 @@ +# Contributing to this repository + +We welcome your contributions! There are multiple ways to contribute. + +## Opening issues + +For bugs or enhancement requests, please file a GitHub issue unless it's +security related. When filing a bug remember that the better written the bug is, +the more likely it is to be fixed. If you think you've found a security +vulnerability, do not raise a GitHub issue and follow the instructions in our +[security policy](./SECURITY.md). + +## Contributing code + +We welcome your code contributions. Before submitting code via a pull request, +you will need to have signed the [Oracle Contributor Agreement][OCA] (OCA) and +your commits need to include the following line using the name and e-mail +address you used to sign the OCA: + +```text +Signed-off-by: Your Name +``` + +This can be automatically added to pull requests by committing with `--sign-off` +or `-s`, e.g. + +```text +git commit --signoff +``` + +Only pull requests from committers that can be verified as having signed the OCA +can be accepted. + +## Pull request process + +1. Ensure there is an issue created to track and discuss the fix or enhancement + you intend to submit. +1. Fork this repository. +1. Create a branch in your fork to implement the changes. We recommend using + the issue number as part of your branch name, e.g. `1234-fixes`. +1. Ensure that any documentation is updated with the changes that are required + by your change. +1. Ensure that any samples are updated if the base image has been changed. +1. Submit the pull request. *Do not leave the pull request blank*. Explain exactly + what your changes are meant to do and provide simple steps on how to validate. + your changes. Ensure that you reference the issue you created as well. +1. We will assign the pull request to 2-3 people for review before it is merged. + +## Code of conduct + +Follow the [Golden Rule](https://en.wikipedia.org/wiki/Golden_Rule). If you'd +like more specific guidelines, see the [Contributor Covenant Code of Conduct][COC]. + +[OCA]: https://oca.opensource.oracle.com +[COC]: https://www.contributor-covenant.org/version/1/4/code-of-conduct/ diff --git a/Config.kmk b/Config.kmk index cc014204..1e30bd17 100644 --- a/Config.kmk +++ b/Config.kmk @@ -880,8 +880,6 @@ if1of ($(KBUILD_TARGET), darwin linux solaris) # Enable Java<->JAX-WS bridge VBOX_WITH_JWS ?= 1 endif -# Use XPIDL instead of XSLT stylesheet -VBOX_WITH_JAVA_SUPPORT_IN_XPIDL ?= # Build against multiple Python versions present in the system (only up to 3.2, # unless VBOX_WITH_ONLY_PYTHON_LIMITED_API is overridden). VBOX_WITH_MULTIVERSION_PYTHON ?= 1 @@ -2649,7 +2647,7 @@ else endif # Makeself for the linux installers. -VBOX_MAKESELF ?= $(KBUILD_DEVTOOLS)/common/makeself/v2.4.5-r2/makeself.sh +VBOX_MAKESELF ?= $(KBUILD_DEVTOOLS)/common/makeself/v2.5.0-r2/makeself.sh # Microsoft HTML Help Workshop. VBOX_PATH_HTML_HELP_WORKSHOP ?= $(KBUILD_DEVTOOLS)/win.x86/HTML_Help_Workshop/v1.3/ @@ -2772,15 +2770,6 @@ ifneq ($(KBUILD_TARGET),win) $(VBOX_PATH_SDK)/bindings/xpcom/include/xpcom \ $(VBOX_PATH_SDK)/bindings/xpcom/include/nsprpub \ $(VBOX_PATH_SDK)/bindings/xpcom/include/ipcd - ifneq ($(KBUILD_TARGET),os2) - # libIDL-config (for xpcom18a4) - ifeq ($(origin VBOX_LIBIDL_CONFIG),undefined) - ifeq ($(KBUILD_HOST),solaris) - VBOX_LIBIDL_CONFIG_FALLBACK = $(lastword $(wildcard $(KBUILD_DEVTOOLS)/solaris.amd64/libIDL/*/bin/libIDL-config-2)) - endif - export VBOX_LIBIDL_CONFIG := $(firstword $(which libIDL-config-2 libIDL-config) $(VBOX_LIBIDL_CONFIG_FALLBACK) libIDL-config-2-not-found) - endif - endif endif # The X11 LIBPATH. (The amd64 hack is for RHEL4.) @@ -4230,9 +4219,11 @@ ifdef VBOX_SIGNING_MODE VBOX_CCS_CLIENT_JAR := $(firstword $(rsort \ $(wildcard $(KBUILD_DEVTOOLS)/common/ccs/v*/Client.jar)) \ $(KBUILD_DEVTOOLS)/common/ccs/notfound/Client.jar ) - VBOX_CCS_USER ?= virtualbox_grp - VBOX_CCS_GLOBAL_UID ?= non-of-your-business - VBOX_CCS_SERVER ?= UK + VBOX_CCS_USER ?= virtualbox_grp + VBOX_CCS_GLOBAL_UID ?= non-of-your-business + VBOX_CCS_SERVER.solaris ?= SCA + VBOX_CCS_SERVER.win ?= PHX + VBOX_CCS_SERVER.darwin ?= SCA ## # Corp Code Signing command line. # @param $1 Signing method: solaris_elf, solaris_pkg, driver (microsoft), ... @@ -4241,7 +4232,7 @@ ifdef VBOX_SIGNING_MODE # @param $4 Additional options. VBOX_CCS_SIGN_CMD = $(VBOX_RETRY) $(VBOX_JAVA) -Xmx256m -jar "$(VBOX_CCS_CLIENT_JAR)" \ sign -user "$(VBOX_CCS_USER)" -global_uid "$(VBOX_CCS_GLOBAL_UID)" \ - -job_timeout 90 -server_timeout 75 -server "$(VBOX_CCS_SERVER)" \ + -job_timeout 90 -server_timeout 75 -server "$(VBOX_CCS_SERVER.$(KBUILD_TARGET))" \ -sign_method "$1" -file_to_sign "$2" -signed_location "$(if $3,$3,$(call VBOX_DIRX,$2))" $4 ifeq ($(KBUILD_HOST),win) @@ -4661,7 +4652,7 @@ ifdef VBOX_SIGNING_MODE # @param 3 The directory to put the notarized file in. Defaults to $(dir $1). VBOX_CCS_NOTARIZE_CMD = $(VBOX_RETRY) $(VBOX_JAVA) -jar "$(VBOX_CCS_CLIENT_JAR)" \ mac_notarize -user "$(VBOX_CCS_USER)" -global_uid "$(VBOX_CCS_GLOBAL_UID)" \ - -job_timeout 90 -server_timeout 75 -server "$(VBOX_CCS_SERVER)" \ + -job_timeout 90 -server_timeout 75 -server "$(VBOX_CCS_SERVER.$(KBUILD_TARGET))" \ -file_to_notarize "$1" -bundle_id "$2" -download_location "$(if $3,$3,$(call VBOX_DIRX,$1))" ## Sign an application bundle, framework or kernel extension. @@ -5162,7 +5153,7 @@ endif # openssl SDK_VBoxOpenSslStatic := OpenSSL - Only for VBoxRT and/or statically linked programs. -SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS := $(PATH_OUT)/obj/crypto-3.3.2-headers/include +SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS := $(PATH_OUT)/obj/crypto-3.4.1-headers/include SDK_VBoxOpenSslStatic_INCS ?= $(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS) SDK_VBoxOpenSslStatic_ORDERDEPS ?= $(crypto-headers_1_TARGET) if !defined(VBOX_ONLY_SDK) \ @@ -5176,7 +5167,7 @@ SDK_VBoxOpenSslStatic_LIBS ?= \ $(PATH_STAGE_LIB)/VBox-libcrypto$(VBOX_SUFF_LIB) SDK_VBoxOpenSslStatic-x86 := OpenSSL/x86 - Only for VBoxRT and/or statically linked programs. -SDK_VBoxOpenSslStatic-x86_VBOX_DEFAULT_INCS := $(PATH_OUT)/obj/crypto-3.3.2-headers/include +SDK_VBoxOpenSslStatic-x86_VBOX_DEFAULT_INCS := $(PATH_OUT)/obj/crypto-3.4.1-headers/include SDK_VBoxOpenSslStatic-x86_INCS ?= $(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS) SDK_VBoxOpenSslStatic-x86_ORDERDEPS ?= $(crypto-headers_1_TARGET) if ("$(SDK_VBoxOpenSslStatic_INCS)" == "$(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)") @@ -5280,7 +5271,7 @@ endif ifdef VBOX_WITH_LIBLZMA SDK_VBoxLibLzma := liblzma for dll linking. - SDK_VBoxLibLzma_DEFAULT_INCS := $(PATH_ROOT)/src/libs/liblzma-5.4.1/api + SDK_VBoxLibLzma_DEFAULT_INCS := $(PATH_ROOT)/src/libs/liblzma-5.8.1/api SDK_VBoxLibLzma_INCS ?= $(SDK_VBoxLibLzma_DEFAULT_INCS) SDK_VBoxLibLzma_LIBS ?= $(PATH_STAGE_LIB)/VBox-liblzma$(VBOX_SUFF_LIB) @@ -9287,7 +9278,7 @@ endif SVN ?= svn$(HOSTSUFF_EXE) VBOX_SVN_REV_KMK = $(PATH_OUT)/revision.kmk ifndef VBOX_SVN_REV - VBOX_SVN_REV_CONFIG_FALLBACK := $(patsubst %:,, $Rev: 168374 $ ) + VBOX_SVN_REV_CONFIG_FALLBACK := $(patsubst %:,, $Rev: 168816 $ ) VBOX_SVN_REV_FALLBACK := $(if-expr $(VBOX_SVN_REV_CONFIG_FALLBACK) > $(VBOX_SVN_REV_VERSION_FALLBACK),$(VBOX_SVN_REV_CONFIG_FALLBACK),$(VBOX_SVN_REV_VERSION_FALLBACK)) VBOX_SVN_DEP := $(firstword $(wildcard $(PATH_ROOT)/.svn/wc.db $(abspath $(PATH_ROOT)/../.svn/wc.db) $(abspath $(PATH_ROOT)/../../.svn/wc.db) $(PATH_ROOT)/.svn/entries)) ifeq ($(which $(SVN)),) diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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, either version 3 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 00000000..6db1aaae --- /dev/null +++ b/README.md @@ -0,0 +1,91 @@ +# Oracle VirtualBox + +VirtualBox is a general-purpose full virtualization software for x86_64 +hardware (with version 7.1 additionally for macOS/Arm), targeted at laptop, +desktop, server and embedded use. + +It features a very user friendly graphical user interface and is available for +many popular operating systems (Linux, Windows, macOS and Solaris). Flexible +networking setup and interactive performance are the strong points. + +Anyone with the need to run multiple operating systems simultaneously with some +basic knowledge about PCs and operating system installation can use it to +reduce effort with a large number of tasks including software testing. + +## Getting started + +VirtualBox is a complex product with multiple dependencies, some of them +specific to the operating system on which you want to run it. + +The basics for building VirtualBox are described on the [build +instructions](https://www.virtualbox.org/wiki/Build_instructions) page. + +## Documentation + +The [VirtualBox User +Guide](https://docs.oracle.com/en/virtualization/virtualbox/index.html) +contains all information relevant for users, including the product features and +their configuration. + +For developers it is recommended to start with the [technical +documentation](https://www.virtualbox.org/wiki/Technical_documentation) which +contains links to a broad collection of pages related to development, covering +many aspects of the project and its features. + +## Examples + +Tutorials on how to install and use Oracle VirtualBox are available at +[Learn to Install Oracle VirtualBox and Run Virtual Machines](https://blogs.oracle.com/linux/post/learn-to-install-oracle-virtualbox-and-run-virtual-machines) +and [Use Oracle VirtualBox on Oracle Linux](https://docs.oracle.com/en/learn/ol-vbox/index.html). + +## Help + +Oracle customers with a support contract covering Oracle VirtualBox should +reach out to [Oracle Support](https://www.oracle.com/support/). + +Everyone can use the [VirtualBox Forums](https://forums.virtualbox.org/) +for questions about the product or discussing its functionality. Open an [issue](https://github.com/VirtualBox/virtualbox/issues) +for bug reports or request for enhancements. Report a security vulnerability +according to the [Reporting Vulnerabilities Guide](https://www.oracle.com/corporate/security-practices/assurance/vulnerability/reporting.html). + +## Contributing + +This project welcomes contributions from the community. Before submitting a +pull request, please [review our contribution guide](./CONTRIBUTING.md) + +## Security + +Please consult the [security guide](./SECURITY.md) for our responsible security vulnerability disclosure process. + +## License + +The correct copyright notice format for both documentation and software is + + Copyright (C) [year-]year Oracle and/or its affiliates. + + This file is part of VirtualBox base platform packages, as + available from https://www.virtualbox.org. + + 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, in version 3 of the + License. + + 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 . + +You must include the year the content was first released (on any platform) and +the most recent year in which it was revised: + + Copyright (C) 2025 Oracle and/or its affiliates. + +Released under the GNU General Public License v3.0 as shown at +[COPYING](./COPYING) which contains clarifications regarding allowed licenses +for other code using parts of the project which are covered by multiple +licenses. + diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..bc08bf51 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,39 @@ +# Reporting security vulnerabilities + +Oracle values the independent security research community and believes that +responsible disclosure of security vulnerabilities helps us ensure the security +and privacy of all our users. + +Please do NOT raise a GitHub Issue to report a security vulnerability. If you +believe you have found a security vulnerability, please submit a report to +[secalert_us@oracle.com][1] preferably with a proof of concept. Please review +some additional information on [how to report security vulnerabilities to Oracle][2]. +We encourage people who contact Oracle Security to use email encryption using +[our encryption key][3]. + +We ask that you do not use other channels or contact the project maintainers +directly. + +Non-vulnerability related security issues including ideas for new or improved +security features are welcome on GitHub Issues. + +## Security updates, alerts and bulletins + +Security updates will be released on a regular cadence. Many of our projects +will typically release security fixes in conjunction with the +Oracle Critical Patch Update program. Additional +information, including past advisories, is available on our [security alerts][4] +page. + +## Security-related information + +We will provide security related information such as a threat model, considerations +for secure use, or any known security issues in our documentation. Please note +that labs and sample code are intended to demonstrate a concept and may not be +sufficiently hardened for production use. + +[1]: mailto:secalert_us@oracle.com +[2]: https://www.oracle.com/corporate/security-practices/assurance/vulnerability/reporting.html +[3]: https://www.oracle.com/security-alerts/encryptionkey.html +[4]: https://www.oracle.com/security-alerts/ + diff --git a/THIRD_PARTY_LICENSES.txt b/THIRD_PARTY_LICENSES.txt new file mode 100644 index 00000000..06a4b5fa --- /dev/null +++ b/THIRD_PARTY_LICENSES.txt @@ -0,0 +1 @@ +See doc/manual/en_US/dita/topics/licensing/vbox-base for all 3rd party licenses. diff --git a/Version.kmk b/Version.kmk index 3115378e..b0abd522 100644 --- a/Version.kmk +++ b/Version.kmk @@ -34,7 +34,7 @@ VBOX_VERSION_MINOR = 1 # This is the current build number. It should be increased every time we publish a # new build. The define is available in every source file. Only even build numbers # will be published, odd numbers are set during development. -VBOX_VERSION_BUILD = 8 +VBOX_VERSION_BUILD = 10 # This can be overridden in LocalConfig.kmk or elsewhere. # For the convention, see checks near the end of Config.kmk. VBOX_BUILD_PUBLISHER = @@ -45,4 +45,4 @@ VBOX_VERSION_PRERELEASE = VBOX_RELEASE_EXACT_MATCH = # Fallback revision when there is no other source. See Config.kmk. -VBOX_SVN_REV_VERSION_FALLBACK := $(patsubst %:,, $Rev: 168469 $ ) +VBOX_SVN_REV_VERSION_FALLBACK := $(patsubst %:,, $Rev: 169112 $ ) diff --git a/configure b/configure index 658c1740..e8459932 100755 --- a/configure +++ b/configure @@ -90,7 +90,6 @@ WITH_XPCOM=1 WITH_PYTHON=1 WITH_JAVA=1 WITH_VMMRAW=1 -WITH_LIBIDL=1 WITH_QT6=1 WITH_SDL=1 WITH_SDL_TTF=1 @@ -786,36 +785,6 @@ EOF } -# -# Check for libIDL, needed by xpcom -# -check_libidl() -{ - test_header libIDL - - if which_wrapper libIDL-config-2 > /dev/null; then - libidl_ver=`libIDL-config-2 --version` - if [ $? -ne 0 ]; then - log_failure "libIDL-config-2 not working" - fail - else - log_success "found version $libidl_ver" - cnf_append "VBOX_LIBIDL_CONFIG" \ - "PKG_CONFIG_PATH=`libIDL-config-2 --prefix`/$LIB/pkgconfig `which_wrapper libIDL-config-2`" - fi - elif check_avail "libIDL-config" libIDL-config; then - libidl_ver=`libIDL-config --version` - if [ $? -ne 0 ]; then - log_failure "libIDL-config not working" - fail - else - log_success "found version $libidl_ver" - cnf_append "VBOX_LIBIDL_CONFIG" "`which_wrapper libIDL-config`" - fi - fi -} - - # # Check for libdevmapper, needed by the VBoxVolInfo # @@ -2632,7 +2601,6 @@ elif [ "$OS" = "haiku" ]; then WITH_PULSE=0 WITH_DBUS=0 WITH_KMODS=0 - WITH_LIBIDL=0 WITH_XPCOM=0 BUILD_LIBXSLT=1 BUILD_LIBXML2=1 @@ -3024,7 +2992,6 @@ fi if [ $ONLY_ADDITIONS -eq 0 ]; then [ "$OS" != "darwin" ] && check_pthread check_libxml2 - [ $WITH_LIBIDL -eq 1 ] && check_libidl check_z check_lzf check_ssl diff --git a/doc/manual/user_ChangeLogImpl.xml b/doc/manual/user_ChangeLogImpl.xml index 247f2ee6..01a1f6e0 100644 --- a/doc/manual/user_ChangeLogImpl.xml +++ b/doc/manual/user_ChangeLogImpl.xml @@ -71,6 +71,60 @@ Rules for adding a changelog entry to make them look more uniform: + + + Version 7.1.10 (2025-06-03) + + This is a maintenance release. The following items were fixed and/or + added: + + + + + VBoxManage: Fixed a crash when running 'guestcontrol run' on Windows + hosts (bug #22175) + + + + Audio: Fixed device switching on Windows hosts (bug #22267) + + + + Windows host installer: Fixed multiple installation entries in the + 'Add or remove programs' dialog and upgrade issues + + + + Linux host: Fixed issue which caused VM Selector process crash + due to missing libdl.so and libpthread.so libraries (bug #22193) + + + + Linux host: Removed libIDL as a build time dependency when + building VirtualBox from source code (bug #21169) + + + + Linux guest and host: Added initial support for kernel 6.15 (bug #22420) + + + + Linux guest: Added initial support for kernel 6.16-RC0 + + + + Linux guest and host: Fixed issue with building modules + for UEK8 kernel on Oracle Linux 9 distribution + + + + RDP: Fixed issue when it was not possible to paste clipboard buffer + into a guest over RDP remote session + + + + + Version 7.1.8 (2025-04-15) diff --git a/include/VBox/com/array.h b/include/VBox/com/array.h index 7c07a624..b669516d 100644 --- a/include/VBox/com/array.h +++ b/include/VBox/com/array.h @@ -833,14 +833,21 @@ public: if (!ensureCapacity(size() + 1)) return false; - for (size_t i = size(); i > 0; --i) - { #ifdef VBOX_WITH_XPCOM + /* For XPCOM, size() is 0 and capacity() is 16 for the first time + * this function is being called on an empty array. + * See implementation of ensureCapacity(). */ + for (size_t i = size(); i > 0; --i) SafeArray::Copy(m.arr[i - 1], m.arr[i]); #else + /* For Windows (COM), size() always matches the array's capacity. + * + * So we here need to make sure we don't read beyond the array + * if this function is being called on an empty array + * (size is 1 and there is no element on index 1 yet). */ + for (size_t i = size() - 1; i > 0; --i) SafeArray::Copy(m.raw[i - 1], m.raw[i]); #endif - } #ifdef VBOX_WITH_XPCOM SafeArray::Copy(aElement, m.arr[0]); diff --git a/include/iprt/mangling.h b/include/iprt/mangling.h index 4527d6ce..29c28ae4 100644 --- a/include/iprt/mangling.h +++ b/include/iprt/mangling.h @@ -2015,6 +2015,8 @@ # define RTScriptLexPeekCh RT_MANGLER(RTScriptLexPeekCh) # define RTScriptLexPeekChEx RT_MANGLER(RTScriptLexPeekChEx) # define RTScriptLexPeekNextTokenType RT_MANGLER(RTScriptLexPeekNextTokenType) +# define RTScriptLexProduceTokError RT_MANGLER(RTScriptLexProduceTokError) +# define RTScriptLexProduceTokIde RT_MANGLER(RTScriptLexProduceTokIde) # define RTScriptLexQueryToken RT_MANGLER(RTScriptLexQueryToken) # define RTScriptLexScanIdentifier RT_MANGLER(RTScriptLexScanIdentifier) # define RTScriptLexScanNumber RT_MANGLER(RTScriptLexScanNumber) diff --git a/include/iprt/script.h b/include/iprt/script.h index 02996789..0a4af006 100644 --- a/include/iprt/script.h +++ b/include/iprt/script.h @@ -97,6 +97,10 @@ typedef enum RTSCRIPTLEXTOKTYPE RTSCRIPTLEXTOKTYPE_KEYWORD, /** Some punctuator. */ RTSCRIPTLEXTOKTYPE_PUNCTUATOR, + /** A single line comment. */ + RTSCRIPTLEXTOKTYPE_COMMENT_SINGLE_LINE, + /** A multi line comment. */ + RTSCRIPTLEXTOKTYPE_COMMENT_MULTI_LINE, /** Special error token, conveying an error message from the lexer. */ RTSCRIPTLEXTOKTYPE_ERROR, /** End of stream token. */ @@ -211,6 +215,14 @@ typedef struct RTSCRIPTLEXTOKEN /** Pointer to the matched punctuator descriptor. */ PCRTSCRIPTLEXTOKMATCH pPunctuator; } Punctuator; + /** Comment */ + struct + { + /** Pointer to the start of the comment (including the symbols starting the comment). */ + const char *pszComment; + /** Number of characters of the comment, including the null terminator. */ + size_t cchComment; + } Comment; /** Error. */ struct { @@ -308,10 +320,15 @@ typedef RTSCRIPTLEXCFG *PRTSCRIPTLEXCFG; typedef const RTSCRIPTLEXCFG *PCRTSCRIPTLEXCFG; /** Default lexer config flags. */ -#define RTSCRIPT_LEX_CFG_F_DEFAULT 0 +#define RTSCRIPT_LEX_CFG_F_DEFAULT 0 /** Case insensitive lexing, keywords and so on must be used lowercase to match * as the lexer will convert everything to lowercase internally. */ -#define RTSCRIPT_LEX_CFG_F_CASE_INSENSITIVE RT_BIT(0) +#define RTSCRIPT_LEX_CFG_F_CASE_INSENSITIVE_LOWER RT_BIT(0) +/** Case insensitive lexing, keywords and so on must be used uppercase to match + * as the lexer will convert everything to uppercase internally. */ +#define RTSCRIPT_LEX_CFG_F_CASE_INSENSITIVE_UPPER RT_BIT(1) +/** Comments are not skipped but passed back as tokens. */ +#define RTSCRIPT_LEX_CFG_F_COMMENTS_AS_TOKENS RT_BIT(2) /** Default character conversions (converting to lower case when the case insensitive flag is set). */ @@ -365,12 +382,17 @@ typedef FNRTSCRIPTLEXDTOR *PFNRTSCRIPTLEXDTOR; * scanned string literals on success, optional. * If not NULL the string cache must be freed by the caller when not used * anymore. + * @param phStrCacheComments Where to store the pointer to the string cache containing all + * comments on success when RTSCRIPT_LEX_CFG_F_COMMENTS_AS_TOKENS + * is given, optional. + * If not NULL the string cache must be freed by the caller when not used + * anymore. * @param pCfg The lexer config to use for identifying the different tokens. */ RTDECL(int) RTScriptLexCreateFromReader(PRTSCRIPTLEX phScriptLex, PFNRTSCRIPTLEXRDR pfnReader, PFNRTSCRIPTLEXDTOR pfnDtor, void *pvUser, size_t cchBuf, PRTSTRCACHE phStrCacheId, PRTSTRCACHE phStrCacheStringLit, - PCRTSCRIPTLEXCFG pCfg); + PRTSTRCACHE phStrCacheComments, PCRTSCRIPTLEXCFG pCfg); /** @@ -387,10 +409,16 @@ RTDECL(int) RTScriptLexCreateFromReader(PRTSCRIPTLEX phScriptLex, PFNRTSCRIPTLEX * scanned string literals on success, optional. * If not NULL the string cache must be freed by the caller when not used * anymore. + * @param phStrCacheComments Where to store the pointer to the string cache containing all + * comments on success when RTSCRIPT_LEX_CFG_F_COMMENTS_AS_TOKENS + * is given, optional. + * If not NULL the string cache must be freed by the caller when not used + * anymore. * @param pCfg The lexer config to use for identifying the different tokens. */ RTDECL(int) RTScriptLexCreateFromString(PRTSCRIPTLEX phScriptLex, const char *pszSrc, PRTSTRCACHE phStrCacheId, - PRTSTRCACHE phStrCacheStringLit, PCRTSCRIPTLEXCFG pCfg); + PRTSTRCACHE phStrCacheStringLit, PRTSTRCACHE phStrCacheComments, + PCRTSCRIPTLEXCFG pCfg); /** @@ -407,10 +435,16 @@ RTDECL(int) RTScriptLexCreateFromString(PRTSCRIPTLEX phScriptLex, const char *ps * scanned string literals on success, optional. * If not NULL the string cache must be freed by the caller when not used * anymore. + * @param phStrCacheComments Where to store the pointer to the string cache containing all + * comments on success when RTSCRIPT_LEX_CFG_F_COMMENTS_AS_TOKENS + * is given, optional. + * If not NULL the string cache must be freed by the caller when not used + * anymore. * @param pCfg The lexer config to use for identifying the different tokens. */ RTDECL(int) RTScriptLexCreateFromFile(PRTSCRIPTLEX phScriptLex, const char *pszFilename, PRTSTRCACHE phStrCacheId, - PRTSTRCACHE phStrCacheStringLit, PCRTSCRIPTLEXCFG pCfg); + PRTSTRCACHE phStrCacheStringLit, PRTSTRCACHE phStrCacheComments, + PCRTSCRIPTLEXCFG pCfg); /** @@ -601,6 +635,30 @@ RTDECL(int) RTScriptLexScanStringLiteralC(RTSCRIPTLEX hScriptLex, char ch, PRTSC */ RTDECL(int) RTScriptLexScanStringLiteralPascal(RTSCRIPTLEX hScriptLex, char ch, PRTSCRIPTLEXTOKEN pTok, void *pvUser); + +/** + * Produces an error token with the given message, used for custom lexer rule implementations. + * + * @returns IPRT status code. + * @param hScriptLex The lexer handle. + * @param pTok The token to fill. + * @param rc The status code to use in the message. + * @param pszMsg The format string for the error message. + * @param ... Arguments to the format string. + */ +RTDECL(int) RTScriptLexProduceTokError(RTSCRIPTLEX hScriptLex, PRTSCRIPTLEXTOKEN pTok, int rc, const char *pszMsg, ...); + + +/** + * Produces an identifier token with the given identifier, used for custom lexer rule implementations. + * + * @returns IPRT status code. + * @param hScriptLex The lexer handle. + * @param pTok The token to fill. + * @param pszIde The identifier to add. + * @param cchIde Number of characters in the identifier. + */ +RTDECL(int) RTScriptLexProduceTokIde(RTSCRIPTLEX hScriptLex, PRTSCRIPTLEXTOKEN pTok, const char *pszIde, size_t cchIde); /** @} */ /** @} */ diff --git a/src/VBox/Additions/common/VBoxGuest/win/VBoxGuest.inf b/src/VBox/Additions/common/VBoxGuest/win/VBoxGuest.inf index 2e5ede02..b7986712 100644 --- a/src/VBox/Additions/common/VBoxGuest/win/VBoxGuest.inf +++ b/src/VBox/Additions/common/VBoxGuest/win/VBoxGuest.inf @@ -42,7 +42,7 @@ Class=System DriverPackageType=PlugAndPlay ;edit-DriverVer=08/26/2008,2.00.0000 ;cat CatalogFile=VBoxGuest.cat -;PnpLockdown=1 +PnpLockdown=1 [SourceDisksNames] 1 = %VBoxGuest_MediaDesc%,,, diff --git a/src/VBox/Additions/linux/drm/vbox_drv.c b/src/VBox/Additions/linux/drm/vbox_drv.c index 4516da24..008a8b38 100644 --- a/src/VBox/Additions/linux/drm/vbox_drv.c +++ b/src/VBox/Additions/linux/drm/vbox_drv.c @@ -43,6 +43,10 @@ # include #endif +#if RTLNX_VER_MIN(6,13,0) && defined(CONFIG_APERTURE_HELPERS) +# include +#endif + #if RTLNX_VER_RANGE(5,14,0, 6,13,0) || RTLNX_RHEL_RANGE(8,6, 8,99) # include #endif @@ -94,7 +98,9 @@ static int vbox_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) } #endif -# if RTLNX_VER_RANGE(5,14,0, 6,13,0) || RTLNX_RHEL_RANGE(8,6, 8,99) +# if RTLNX_VER_MIN(6,13,0) && defined(CONFIG_APERTURE_HELPERS) + ret = aperture_remove_conflicting_pci_devices(pdev, driver.name); +# elif RTLNX_VER_RANGE(5,14,0, 6,13,0) || RTLNX_RHEL_RANGE(8,6, 8,99) # if RTLNX_VER_MIN(5,15,0) || RTLNX_RHEL_RANGE(8,7, 8,99) || RTLNX_RHEL_MIN(9,1) || RTLNX_SUSE_MAJ_PREREQ(15,4) ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &driver); # else @@ -391,6 +397,9 @@ static struct drm_driver driver = { .desc = DRIVER_DESC, #if RTLNX_VER_MAX(6,14,0) .date = DRIVER_DATE, +#endif +#if RTLNX_VER_MIN(6,15,0) + .fbdev_probe = vboxfb_create, #endif .major = DRIVER_MAJOR, .minor = DRIVER_MINOR, @@ -411,7 +420,9 @@ static struct drm_driver driver = { .prime_fd_to_handle = drm_gem_prime_fd_to_handle, #endif .gem_prime_import = drm_gem_prime_import, +#if RTLNX_VER_MAX(6,15,0) .gem_prime_import_sg_table = vbox_gem_prime_import_sg_table, +#endif #if RTLNX_VER_MAX(6,6,0) && !RTLNX_RHEL_RANGE(9,4, 9,99) && !RTLNX_SUSE_MAJ_PREREQ(15, 6) .gem_prime_mmap = vbox_gem_prime_mmap, #endif diff --git a/src/VBox/Additions/linux/drm/vbox_drv.h b/src/VBox/Additions/linux/drm/vbox_drv.h index ed38d1f3..c3651d21 100644 --- a/src/VBox/Additions/linux/drm/vbox_drv.h +++ b/src/VBox/Additions/linux/drm/vbox_drv.h @@ -433,6 +433,8 @@ int vbox_framebuffer_init(struct drm_device *dev, #endif struct drm_gem_object *obj); +int vboxfb_create(struct drm_fb_helper *helper, struct drm_fb_helper_surface_size *sizes); + int vbox_fbdev_init(struct drm_device *dev); void vbox_fbdev_fini(struct drm_device *dev); void vbox_fbdev_set_base(struct vbox_private *vbox, unsigned long gpu_addr); diff --git a/src/VBox/Additions/linux/drm/vbox_fb.c b/src/VBox/Additions/linux/drm/vbox_fb.c index 7154a529..66bf7438 100644 --- a/src/VBox/Additions/linux/drm/vbox_fb.c +++ b/src/VBox/Additions/linux/drm/vbox_fb.c @@ -265,7 +265,7 @@ static struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *helper) } #endif -static int vboxfb_create(struct drm_fb_helper *helper, +int vboxfb_create(struct drm_fb_helper *helper, struct drm_fb_helper_surface_size *sizes) { struct vbox_fbdev *fbdev = @@ -413,9 +413,11 @@ static int vboxfb_create(struct drm_fb_helper *helper, return 0; } +#if RTLNX_VER_MAX(6,15,0) static struct drm_fb_helper_funcs vbox_fb_helper_funcs = { .fb_probe = vboxfb_create, }; +#endif #if RTLNX_VER_MAX(4,3,0) && !RTLNX_RHEL_MAJ_PREREQ(7,3) static void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper) @@ -484,7 +486,9 @@ int vbox_fbdev_init(struct drm_device *dev) vbox->fbdev = fbdev; spin_lock_init(&fbdev->dirty_lock); -#if RTLNX_VER_MIN(6,3,0) || RTLNX_RHEL_RANGE(8,9, 8,99) || RTLNX_RHEL_RANGE(9,3, 9,99) +#if RTLNX_VER_MIN(6,15,0) + drm_fb_helper_prepare(dev, &fbdev->helper, 32, NULL); +#elif RTLNX_VER_MIN(6,3,0) || RTLNX_RHEL_RANGE(8,9, 8,99) || RTLNX_RHEL_RANGE(9,3, 9,99) drm_fb_helper_prepare(dev, &fbdev->helper, 32, &vbox_fb_helper_funcs); #elif RTLNX_VER_MIN(3,17,0) || RTLNX_RHEL_MIN(7,2) drm_fb_helper_prepare(dev, &fbdev->helper, &vbox_fb_helper_funcs); diff --git a/src/VBox/Additions/linux/drm/vbox_mode.c b/src/VBox/Additions/linux/drm/vbox_mode.c index 9d6add67..6284fa88 100644 --- a/src/VBox/Additions/linux/drm/vbox_mode.c +++ b/src/VBox/Additions/linux/drm/vbox_mode.c @@ -660,12 +660,13 @@ static int vbox_get_modes(struct drm_connector *connector) return num_modes; } -#if RTLNX_VER_MAX(3,14,0) && !RTLNX_RHEL_MAJ_PREREQ(7,1) -static int vbox_mode_valid(struct drm_connector *connector, +#if RTLNX_VER_MIN(6,15,0) +static enum drm_mode_status vbox_mode_valid(struct drm_connector *connector, const struct drm_display_mode *mode) +#elif RTLNX_VER_MIN(3,14,0) || RTLNX_RHEL_MAJ_PREREQ(7,1) +static enum drm_mode_status vbox_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) #else -static enum drm_mode_status vbox_mode_valid(struct drm_connector *connector, +static int vbox_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) #endif - struct drm_display_mode *mode) { return MODE_OK; } diff --git a/src/VBox/Additions/linux/drm/vbox_prime.c b/src/VBox/Additions/linux/drm/vbox_prime.c index a2a7467c..4567033d 100644 --- a/src/VBox/Additions/linux/drm/vbox_prime.c +++ b/src/VBox/Additions/linux/drm/vbox_prime.c @@ -49,18 +49,20 @@ struct sg_table *vbox_gem_prime_get_sg_table(struct drm_gem_object *obj) return ERR_PTR(-ENOSYS); } -#if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2) +#if RTLNX_VER_MAX(6,15,0) +# if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2) struct drm_gem_object *vbox_gem_prime_import_sg_table( struct drm_device *dev, size_t size, struct sg_table *table) -#else +# else struct drm_gem_object *vbox_gem_prime_import_sg_table( struct drm_device *dev, struct dma_buf_attachment *attach, struct sg_table *table) -#endif +# endif { WARN_ONCE(1, "not implemented"); return ERR_PTR(-ENOSYS); } +#endif void *vbox_gem_prime_vmap(struct drm_gem_object *obj) { diff --git a/src/VBox/Additions/linux/installer/vboxadd.sh b/src/VBox/Additions/linux/installer/vboxadd.sh index 6be49f50..3c203ecb 100755 --- a/src/VBox/Additions/linux/installer/vboxadd.sh +++ b/src/VBox/Additions/linux/installer/vboxadd.sh @@ -1,7 +1,7 @@ #! /bin/sh # $Id: vboxadd.sh $ ## @file -# Linux Additions kernel module init script ($Revision: 168394 $) +# Linux Additions kernel module init script ($Revision: 168899 $) # # @@ -536,9 +536,10 @@ setup_modules() export KERN_VER info "Building the modules for kernel $KERN_VER." - # Prepend PATH for building UEK7 on OL8 distribution. + # Prepend PATH for building UEK on OL8/9 distributions. case "$KERN_VER" in 5.15.0-*.el8uek*) PATH="/opt/rh/gcc-toolset-11/root/usr/bin:$PATH";; + 6.12.0-*.el9uek*)PATH="/opt/rh/gcc-toolset-14/root/usr/bin:$PATH";; esac # Detect if kernel was built with clang. @@ -1041,6 +1042,8 @@ check_status_kernel() # Do not spoil $?. true fi + else + false fi # Module vboxvideo is optional and expected to be loaded only when VM is diff --git a/src/VBox/Additions/linux/sharedfolders/dirops.c b/src/VBox/Additions/linux/sharedfolders/dirops.c index c56c0d19..40fa4391 100644 --- a/src/VBox/Additions/linux/sharedfolders/dirops.c +++ b/src/VBox/Additions/linux/sharedfolders/dirops.c @@ -1088,7 +1088,9 @@ static int vbsf_inode_create(struct inode *parent, struct dentry *dentry, int mo * @param mode file mode * @returns 0 on success, Linux error code otherwise */ -#if RTLNX_VER_MIN(6,3,0) || RTLNX_RHEL_RANGE(9,6, 9,99) || defined(DOXYGEN_RUNNING) +#if RTLNX_VER_MIN(6,15,0) +static struct dentry *vbsf_inode_mkdir(struct mnt_idmap *idmap, struct inode *parent, struct dentry *dentry, umode_t mode) +#elif RTLNX_VER_MIN(6,3,0) || RTLNX_RHEL_RANGE(9,6, 9,99) || defined(DOXYGEN_RUNNING) static int vbsf_inode_mkdir(struct mnt_idmap *idmap, struct inode *parent, struct dentry *dentry, umode_t mode) #elif RTLNX_VER_MIN(5,12,0) static int vbsf_inode_mkdir(struct user_namespace *ns, struct inode *parent, struct dentry *dentry, umode_t mode) @@ -1098,14 +1100,22 @@ static int vbsf_inode_mkdir(struct inode *parent, struct dentry *dentry, umode_t static int vbsf_inode_mkdir(struct inode *parent, struct dentry *dentry, int mode) #endif { + int rc; + TRACE(); AssertMsg(!(mode & S_IFMT) || (mode & S_IFMT) == S_IFDIR, ("0%o\n", mode)); - return vbsf_create_worker(parent, dentry, (mode & ~S_IFMT) | S_IFDIR, - SHFL_CF_ACT_CREATE_IF_NEW - | SHFL_CF_ACT_FAIL_IF_EXISTS - | SHFL_CF_ACCESS_READWRITE - | SHFL_CF_DIRECTORY, - false /*fStashHandle*/, false /*fDoLookup*/, NULL /*phHandle*/, NULL /*fCreated*/); + + rc = vbsf_create_worker(parent, dentry, (mode & ~S_IFMT) | S_IFDIR, + SHFL_CF_ACT_CREATE_IF_NEW + | SHFL_CF_ACT_FAIL_IF_EXISTS + | SHFL_CF_ACCESS_READWRITE + | SHFL_CF_DIRECTORY, + false /*fStashHandle*/, false /*fDoLookup*/, NULL /*phHandle*/, NULL /*fCreated*/); +#if RTLNX_VER_MIN(6,15,0) + return ERR_PTR(rc); +#else + return rc; +#endif } diff --git a/src/VBox/Additions/linux/sharedfolders/regops.c b/src/VBox/Additions/linux/sharedfolders/regops.c index a72d0370..f252ee33 100644 --- a/src/VBox/Additions/linux/sharedfolders/regops.c +++ b/src/VBox/Additions/linux/sharedfolders/regops.c @@ -3695,11 +3695,12 @@ static int vbsf_readpage(struct file *file, struct page *page) * Needed for mmap and writes when the file is mmapped in a shared+writeable * fashion. */ -#if RTLNX_VER_MIN(2,5,52) +#if RTLNX_VER_MAX(6,16,0) +# if RTLNX_VER_MIN(2,5,52) static int vbsf_writepage(struct page *page, struct writeback_control *wbc) -#else +# else static int vbsf_writepage(struct page *page) -#endif +# endif { struct address_space *mapping = page->mapping; struct inode *inode = mapping->host; @@ -3742,11 +3743,11 @@ static int vbsf_writepage(struct page *page) && offEndOfWrite > i_size_read(inode)) i_size_write(inode, offEndOfWrite); -#if RTLNX_VER_MAX(6,12,0) +# if RTLNX_VER_MAX(6,12,0) /* Update and unlock the page. */ if (PageError(page)) ClearPageError(page); -#endif +# endif SetPageUptodate(page); unlock_page(page); @@ -3768,12 +3769,13 @@ static int vbsf_writepage(struct page *page) printk("vbsf_writepage: no writable handle for %s..\n", sf_i->path->String.ach); err = -EIO; } -#if RTLNX_VER_MAX(6,12,0) +# if RTLNX_VER_MAX(6,12,0) SetPageError(page); -#endif +# endif unlock_page(page); return err; } +#endif /* < 6.16.0 */ #if RTLNX_VER_MIN(2,6,24) @@ -3905,7 +3907,9 @@ struct address_space_operations vbsf_reg_aops = { #else .readpage = vbsf_readpage, #endif +#if RTLNX_VER_MAX(6,16,0) .writepage = vbsf_writepage, +#endif /** @todo Need .writepages if we want msync performance... */ #if RTLNX_VER_MIN(5,18,0) || RTLNX_RHEL_RANGE(9,2, 9,99) .dirty_folio = filemap_dirty_folio, diff --git a/src/VBox/Devices/Audio/DrvAudio.cpp b/src/VBox/Devices/Audio/DrvAudio.cpp index 874d9ace..8f4b17d3 100644 --- a/src/VBox/Devices/Audio/DrvAudio.cpp +++ b/src/VBox/Devices/Audio/DrvAudio.cpp @@ -3168,8 +3168,8 @@ static int drvAudioStreamPreBufComitting(PDRVAUDIO pThis, PDRVAUDIOSTREAM pStrea uint32_t cbPreBufWritten = 0; rc = pThis->pHostDrvAudio->pfnStreamPlay(pThis->pHostDrvAudio, pStreamEx->pBackend, &pStreamEx->Out.pbPreBuf[off], cbToWrite, &cbPreBufWritten); - AssertRCBreak(rc); - if (!cbPreBufWritten) + if ( RT_FAILURE(rc) + || !cbPreBufWritten) break; AssertStmt(cbPreBufWritten <= cbToWrite, cbPreBufWritten = cbToWrite); off = (off + cbPreBufWritten) % cbAlloc; diff --git a/src/VBox/Devices/Audio/DrvHostAudioWasApi.cpp b/src/VBox/Devices/Audio/DrvHostAudioWasApi.cpp index 6917f320..ab8cfd89 100644 --- a/src/VBox/Devices/Audio/DrvHostAudioWasApi.cpp +++ b/src/VBox/Devices/Audio/DrvHostAudioWasApi.cpp @@ -154,6 +154,10 @@ typedef struct DRVHOSTAUDIOWASCACHEDEV /** Support for AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY: -1=unknown, 0=no, 1=yes. */ int8_t fSupportsSrcDefaultQuality; #endif + /** Flag indicating whether this device is considered as being 'stale' + * (non-working / outdated interface / whatever) and can be removed + * from the cache (if enabled). */ + bool fStale; /** List of cached configurations (DRVHOSTAUDIOWASCACHEDEVCFG). */ RTLISTANCHOR ConfigList; /** The device ID length in RTUTF16 units. */ @@ -276,10 +280,10 @@ typedef struct DRVHOSTAUDIOWAS /** Semaphore for signalling that cache purge is done and that the destructor * can do cleanups. */ RTSEMEVENTMULTI hEvtCachePurge; - /** Total number of device config entire for capturing. + /** Total number of device config entries for capturing. * This includes in-use ones. */ uint32_t volatile cCacheEntriesIn; - /** Total number of device config entire for playback. + /** Total number of device config entries for playback. * This includes in-use ones. */ uint32_t volatile cCacheEntriesOut; @@ -577,7 +581,7 @@ public: * of a device role, so we try avoiding that by only caring about eMultimedia. * * See @bugref{10844} */ - && (enmRole == eMultimedia) + && enmRole == eMultimedia ) { pIEnumerator = m_pDrvWas->pIEnumerator; @@ -1158,6 +1162,7 @@ static int drvHostAudioWasCacheLookupOrCreateConfig(PDRVHOSTAUDIOWAS pThis, PDRV PCPDMAUDIOSTREAMCFG pCfgReq, bool fUseCache, bool fOnWorker, PDRVHOSTAUDIOWASCACHEDEVCFG *ppDevCfg) { + Assert(!pDevEntry->fStale); PDRVHOSTAUDIOWASCACHEDEVCFG pDevCfg; /* @@ -1234,6 +1239,40 @@ static int drvHostAudioWasCacheLookupOrCreateConfig(PDRVHOSTAUDIOWAS pThis, PDRV } +/** + * Invalidates device cache entry configurations. + * + * @param pThis The WASAPI host audio driver instance data. + * @param pDevEntry The device entry to invalidate. + */ +static void drvHostAudioWasCacheInvalidateDevEntryConfig(PDRVHOSTAUDIOWAS pThis, PDRVHOSTAUDIOWASCACHEDEV pDevEntry) +{ + RT_NOREF(pThis); + + LogRelFunc(("Invalidating cache entry configurations: %p - '%ls'\n", pDevEntry, pDevEntry->wszDevId)); + + PDRVHOSTAUDIOWASCACHEDEVCFG pDevCfg, pDevCfgNext; + RTListForEachSafe(&pDevEntry->ConfigList, pDevCfg, pDevCfgNext, DRVHOSTAUDIOWASCACHEDEVCFG, ListEntry) + { + if (pDevCfg->pIAudioClient) + { + pDevCfg->pIAudioClient->Reset(); + pDevCfg->pIAudioClient->Release(); + pDevCfg->pIAudioClient = NULL; + + } + + if (pDevCfg->pIAudioRenderClient) + { + pDevCfg->pIAudioRenderClient->Release(); + pDevCfg->pIAudioRenderClient = NULL; + } + + pDevCfg->rcSetup = VERR_AUDIO_STREAM_INIT_IN_PROGRESS; + } +} + + /** * Looks up the given device + config combo in the cache, creating a new entry * if missing. @@ -1256,13 +1295,12 @@ static int drvHostAudioWasCacheLookupOrCreate(PDRVHOSTAUDIOWAS pThis, IMMDevice { *ppDevCfg = NULL; - LogRel2(("WasAPI: Looking up or creating cache entry (caching is set to %s, iface %p)\n", - pThis->fCacheEnabled ? "enabled" : "disabled", pIDevice)); + LogRel(("WasAPI: Looking up or creating cache entry (caching is set to %s, iface %p, %s init)\n", + pThis->fCacheEnabled ? "enabled" : "disabled", pIDevice, fOnWorker ? "on worker" : "async")); /* * Get the device ID so we can perform the lookup. */ - int rc = VERR_AUDIO_STREAM_COULD_NOT_CREATE; LPWSTR pwszDevId = NULL; HRESULT hrc = pIDevice->GetId(&pwszDevId); if (SUCCEEDED(hrc)) @@ -1295,13 +1333,12 @@ static int drvHostAudioWasCacheLookupOrCreate(PDRVHOSTAUDIOWAS pThis, IMMDevice { LogRel2(("WasAPI: Checking for cached device '%ls' ...\n", pwszDevId)); -#define DEVICE_STALE_OR_INVALID_BREAK(a_LogRel2What) \ - { \ +#define DEVICE_STALE_OR_INVALID(a_LogRel2What) \ + do { \ LogRel2(a_LogRel2What); \ LogRel(("WasAPI: Stale or invalid audio interface '%ls' detected!\n", pDevEntry->wszDevId)); \ - rc = VERR_AUDIO_STREAM_NOT_READY; \ - break; \ - } + pDevEntry->fStale = true; \ + } while (0) /* * The cache has two levels, so first the device entry. */ @@ -1311,43 +1348,55 @@ static int drvHostAudioWasCacheLookupOrCreate(PDRVHOSTAUDIOWAS pThis, IMMDevice { if ( pDevEntry->cwcDevId == cwcDevId && pDevEntry->enmDir == pCfgReq->enmDir - && RTUtf16Cmp(pDevEntry->wszDevId, pwszDevId) == 0) + && !pDevEntry->fStale + && memcmp(pDevEntry->wszDevId, pwszDevId, cwcDevId * sizeof(RTUTF16)) == 0) { /* * Cache hit. - * First we need to check if the cached device interface is in a working (active) shape. - */ - AssertPtrBreakStmt(pDevEntry->pIDevice, rc = VERR_AUDIO_STREAM_NOT_READY); /* Paranoia. */ - hrc = pDevEntry->pIDevice->GetState(&dwState); - if (SUCCEEDED(hrc)) - { - if (dwState != DEVICE_STATE_ACTIVE) - DEVICE_STALE_OR_INVALID_BREAK(("WasAPI: Cache hit for device '%ls': Is in non-active state (state is %s)\n", - pDevEntry->wszDevId, drvHostAudioWasMMDeviceStateToString(dwState))); - } - else - DEVICE_STALE_OR_INVALID_BREAK(("WasAPI: Cache hit for device '%ls': Unable to retrieve state (hr=%#x)\n", - pDevEntry->wszDevId, hrc)); - /* - * Next we now need to also check if the device interface we want to look up - * actually matches the one we have in the cache entry. * - * If it doesn't, bail out and add a new device entry to the cache with the new interface below then. + * First we need to check if the device interface we want to look up + * actually matches the one we have in the cache entry. If it doesn't, + * mark it as stale and continue looking. (We'll probably end up adding a + * new device entry to the cache with the new interface below.) * - * This is needed when switching audio interfaces and the device interface becomes invalid via - * AUDCLNT_E_DEVICE_INVALIDATED. See @bugref{10503} + * This is needed when switching audio interfaces and the device interface + * becomes invalid via AUDCLNT_E_DEVICE_INVALIDATED. See @bugref{10503}. */ if (pDevEntry->pIDevice != pIDevice) - DEVICE_STALE_OR_INVALID_BREAK(("WasAPI: Cache hit for device '%ls': Stale interface detected (new: %p, old: %p)\n", - pDevEntry->wszDevId, pIDevice, pDevEntry->pIDevice)); + DEVICE_STALE_OR_INVALID(("WasAPI: Cache hit for device '%ls': Stale interface detected (new: %p, old: %p)\n", + pDevEntry->wszDevId, pIDevice, pDevEntry->pIDevice)); + else + { + /* + * Second, we need to check if the cached device interface is in a + * working (active) shape. + */ +#if 0 /* However we've already checked this above, outside the loop and the pDevEntry->pIDevice == pIDevice! */ + hrc = pDevEntry->pIDevice->GetState(&dwState); + if (SUCCEEDED(hrc)) + { + if (dwState != DEVICE_STATE_ACTIVE) + DEVICE_STALE_OR_INVALID(("WasAPI: Cache hit for device '%ls': Is in non-active state (state is %s)\n", + pDevEntry->wszDevId, drvHostAudioWasMMDeviceStateToString(dwState))); + } + else + DEVICE_STALE_OR_INVALID(("WasAPI: Cache hit for device '%ls': Unable to retrieve state (hr=%#x)\n", + pDevEntry->wszDevId, hrc)); +#endif + } - LogRel2(("WasAPI: Cache hit for device '%ls' (iface %p)\n", pwszDevId, pIDevice)); + LogRelFunc(("WasAPI: fOnWorker=%RTbool, fStaleDevice=%RTbool\n", fOnWorker, pDevEntry->fStale)); - CoTaskMemFree(pwszDevId); - pwszDevId = NULL; + if (!pDevEntry->fStale) + { + LogRel2(("WasAPI: Cache hit for device '%ls' (iface %p)\n", pwszDevId, pIDevice)); - return drvHostAudioWasCacheLookupOrCreateConfig(pThis, pDevEntry, pCfgReq, - true /* fUseCache */, fOnWorker, ppDevCfg); + CoTaskMemFree(pwszDevId); + pwszDevId = NULL; + + return drvHostAudioWasCacheLookupOrCreateConfig(pThis, pDevEntry, pCfgReq, + true /* fUseCache */, fOnWorker, ppDevCfg); + } } } RTCritSectLeave(&pThis->CritSectCache); @@ -1355,27 +1404,11 @@ static int drvHostAudioWasCacheLookupOrCreate(PDRVHOSTAUDIOWAS pThis, IMMDevice if (!pDevEntry) LogRel2(("WasAPI: Cache miss for device '%ls' (iface %p)\n", pwszDevId, pIDevice)); -#undef DEVICE_STALE_OR_INVALID_BREAK +#undef DEVICE_STALE_OR_INVALID } - /* - * If we got a stale or somehow other invalid cache entry, remove it first. - */ - if ( pThis->fCacheEnabled - && pDevEntry /* Cache hit? */ - && rc == VERR_AUDIO_STREAM_NOT_READY) - { - LogRel2(("WasAPI: Removing stale device '%ls' from cache (iface %p)\n", pDevEntry->wszDevId, pDevEntry->pIDevice)); - - RTCritSectEnter(&pThis->CritSectCache); - RTListNodeRemove(&pDevEntry->ListEntry); - RTCritSectLeave(&pThis->CritSectCache); - - drvHostAudioWasCacheDestroyDevEntry(pThis, pDevEntry); - pDevEntry = NULL; - - rc = VINF_SUCCESS; - } + /* Note: An active device marked as being stale will be removed from the cache + after the device switch has been completed. */ /* * Device not in the cache (anymore), (re-)add it. @@ -1411,11 +1444,13 @@ static int drvHostAudioWasCacheLookupOrCreate(PDRVHOSTAUDIOWAS pThis, IMMDevice RTListForEach(&pThis->CacheHead, pDevEntry2, DRVHOSTAUDIOWASCACHEDEV, ListEntry) { if ( pDevEntry2->cwcDevId == cwcDevId + && !pDevEntry->fStale /* Note: We have to compare the device interface here as well, as a cached device entry might - * have a stale audio interface for the same device. In such a case a new device entry will be created below. */ + have a stale audio interface for the same device. In such a case a new device entry will be created below. + Update: This predates the fStale flag and is just kept for safety. */ && pDevEntry2->pIDevice == pIDevice && pDevEntry2->enmDir == pCfgReq->enmDir - && RTUtf16Cmp(pDevEntry2->wszDevId, pDevEntry->wszDevId) == 0) + && memcmp(pDevEntry2->wszDevId, pDevEntry->wszDevId, cwcDevId * sizeof(RTUTF16)) == 0) { pIDevice->Release(); RTMemFree(pDevEntry); @@ -1440,7 +1475,7 @@ static int drvHostAudioWasCacheLookupOrCreate(PDRVHOSTAUDIOWAS pThis, IMMDevice } else LogRelMax(64, ("WasAPI: GetId failed (lookup): %Rhrc\n", hrc)); - return rc; + return VERR_AUDIO_STREAM_COULD_NOT_CREATE; } @@ -2000,6 +2035,17 @@ static void drvHostAudioWasCompleteStreamDevSwitch(PDRVHOSTAUDIOWAS pThis, PDRVH /* Put the old config back into the cache. */ drvHostAudioWasCachePutBack(pThis, pDevCfgOld); + AssertPtr(pDevCfgOld->pDevEntry); + if (pDevCfgOld->pDevEntry->fStale) + { + LogRelFunc(("Removing stale device from cache\n")); + RTListNodeRemove(&pDevCfgOld->pDevEntry->ListEntry); + + drvHostAudioWasCacheInvalidateDevEntryConfig(pThis, pDevCfgOld->pDevEntry); + drvHostAudioWasCacheDestroyDevEntry(pThis, pDevCfgOld->pDevEntry); + pDevCfgOld = NULL; /* Got invalid due to drvHostAudioWasCacheDestroyDevEntry() above. */ + } + LogFlowFunc(("returns with '%s' state: %s\n", pStreamWas->Cfg.szName, drvHostWasStreamStatusString(pStreamWas) )); } @@ -2041,6 +2087,7 @@ static DECLCALLBACK(void) drvHostAudioWasHA_DoOnWorkerThread(PPDMIHOSTAUDIO pInt switch (uUser) { case DRVHOSTAUDIOWAS_DO_PURGE_CACHE: + LogFlowFunc(("DRVHOSTAUDIOWAS_DO_PURGE_CACHE\n")); Assert(pStream == NULL); Assert(pvUser == NULL); Assert(pThis->fCacheEnabled); @@ -2048,6 +2095,7 @@ static DECLCALLBACK(void) drvHostAudioWasHA_DoOnWorkerThread(PPDMIHOSTAUDIO pInt break; case DRVHOSTAUDIOWAS_DO_PRUNE_CACHE: + LogFlowFunc(("DRVHOSTAUDIOWAS_DO_PRUNE_CACHE\n")); Assert(pStream == NULL); Assert(pvUser == NULL); Assert(pThis->fCacheEnabled); @@ -2055,6 +2103,7 @@ static DECLCALLBACK(void) drvHostAudioWasHA_DoOnWorkerThread(PPDMIHOSTAUDIO pInt break; case DRVHOSTAUDIOWAS_DO_STREAM_DEV_SWITCH: + LogFlowFunc(("DRVHOSTAUDIOWAS_DO_STREAM_DEV_SWITCH\n")); AssertPtr(pStream); AssertPtr(pvUser); drvHostAudioWasDoStreamDevSwitch(pThis, (PDRVHOSTAUDIOWASSTREAM)pStream, (PDRVHOSTAUDIOWASCACHEDEVCFG)pvUser); diff --git a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd index 7344240144e0b25bb20dae816c4d2b34db1cebf9..144b376c1feff60bedb1169f07aa881ea151a0a0 100644 GIT binary patch delta 1199231 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