Local mode Windows stacktrace: node file DACL write fails
Description
chef-zero's local-mode node store unconditionally attempts to set an owner/DACL on every node file it writes whenever ChefUtils.windows? is true, with no config flag to disable it. On filesystems that don't support Windows security-descriptor operations, notably VirtualBox shared folders (VBoxSF) used for host/guest sync, this call fails outright with Chef::Exceptions::Win32APIError ("Incorrect function"), aborting the run before any recipes converge. This makes local-mode testing against Windows guests using standard VirtualBox synced folders effectively broken.
Chef Version
- Chef Client 18.11.11
Platform Version
Windows guest VM (any recent Windows 10/11 or Server release should reproduce), running under VirtualBox via Vagrant, using a default VBoxSF synced folder for the Chef repo/node path.
Replication Case
- Create the two files below in a new directory
- Cookbook
mkdir cookbooks nodes pushd cookbooks chef generate cookbook repro cat <<EOF > ./repro/recipes/default.rb log "hello from chef-zero local mode" do level :info end EOF popd- Vagrantfile
cat <<EOF > Vagrantfile Vagrant.configure("2") do |config| config.vm.box = "gusztavvargadr/windows-11" config.vm.provision "chef_zero" do |chef| chef.cookbooks_path = "cookbooks" chef.nodes_path = "nodes" chef.add_recipe "repro" chef.log_level = :debug chef.formatter = "doc" chef.arguments = "--chef-license accept-silent" end end EOF - Download and run the Run vagrant up against a Windows guest box using the default synced folder for the Chef repo path:
vagrant up --no-provision - Provision the guest system using
chef-zerolocal modevagrant provision 2>&1 | tee vagrant_run.log chef_zeroprovisioning attempts to write node data viachef-zero's local-mode repository store, which fails
The files created
# ./Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "gusztavvargadr/windows-11"
config.vm.provision "chef_zero" do |chef|
chef.cookbooks_path = "cookbooks"
chef.nodes_path = "nodes"
chef.add_recipe "repro"
chef.log_level = :debug
chef.formatter = "doc"
chef.arguments = "--chef-license accept-silent"
end
end# ./cookbooks/repro/recipes/default.rb
log "hello from chef-zero local mode" do
level :info
endClient Output
[2026-08-19T14:50:15-07:00] ERROR: #<Chef::Exceptions::Win32APIError: Incorrect function.
---- Begin Win32 API output ----
System Error Code: 1
System Error Message: Incorrect function.
---- End Win32 API output ----
>
[2026-08-19T14:50:15-07:00] INFO: HTTP Request Returned 500 Internal Server Error: error
================================================================================
Chef Infra Client encountered an error attempting to load the node data for "vagrant-25c89fa5"
================================================================================
Unknown Server Error:
---------------------
The server had a fatal error attempting to load the node data.
Server Response:
----------------
Exception raised! #<Chef::Exceptions::Win32APIError: Incorrect function.
---- Begin Win32 API output ----
System Error Code: 1
System Error Message: Incorrect function.
---- End Win32 API output ----
>
System Info:
------------
chef_version=18.11.11
ruby=ruby 3.1.7p261 (2025-03-26 revision 0a3704f218) [x64-mingw-ucrt]
program_name=C:/opscode/chef/bin/chef-client
executable=C:/opscode/chef/bin/chef-client
Running handlers:
[2026-08-19T14:50:15-07:00] ERROR: Running exception handlers
Running handlers complete
[2026-08-19T14:50:15-07:00] ERROR: Exception handlers complete
Infra Phase failed. 0 resources updated in 15 seconds
[2026-08-19T14:50:15-07:00] FATAL: Stacktrace dumped to C:/chef/cache/chef-stacktrace.out
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.Stacktrace
Generated at 2026-08-19 14:50:15 -0700
Net::HTTPFatalError: 500 "Internal Server Error"
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/net-http-0.9.1/lib/net/http/response.rb:278:in `error!'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/http.rb:159:in `request'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/http.rb:138:in `post'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/node.rb:683:in `create'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/node.rb:641:in `rescue in find_or_create'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/node.rb:635:in `find_or_create'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/policy_builder/dynamic.rb:74:in `load_node'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/client.rb:450:in `load_node'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/client.rb:281:in `run'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/application.rb:305:in `run_with_graceful_exit_option'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/application.rb:281:in `block in run_chef_client'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/local_mode.rb:42:in `with_server_connectivity'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/application.rb:264:in `run_chef_client'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/application/base.rb:354:in `run_application'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/application.rb:67:in `run'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-bin-18.11.11/bin/chef-client:25:in `<top (required)>'
C:/opscode/chef/bin/chef-client:208:in `load'
C:/opscode/chef/bin/chef-client:208:in `<main>'
>>>> Caused by Net::HTTPClientException: 404 "Not Found"
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/net-http-0.9.1/lib/net/http/response.rb:278:in `error!'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/http.rb:159:in `request'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/http.rb:122:in `get'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/node.rb:653:in `load'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/node.rb:636:in `find_or_create'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/policy_builder/dynamic.rb:74:in `load_node'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/client.rb:450:in `load_node'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/client.rb:281:in `run'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/application.rb:305:in `run_with_graceful_exit_option'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/application.rb:281:in `block in run_chef_client'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/local_mode.rb:42:in `with_server_connectivity'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/application.rb:264:in `run_chef_client'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/application/base.rb:354:in `run_application'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.11.11-universal-mingw-ucrt/lib/chef/application.rb:67:in `run'
C:/opscode/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-bin-18.11.11/bin/chef-client:25:in `<top (required)>'
C:/opscode/chef/bin/chef-client:208:in `load'
C:/opscode/chef/bin/chef-client:208:in `<main>'Source: chef/chef