From 0a8d0d20b4f3fc62eb768a40301d3046de09dd7a Mon Sep 17 00:00:00 2001 From: Kapil Chouhan Date: Thu, 2 May 2019 17:02:25 +0530 Subject: Fix for Chef::Exceptions::Win32APIError: The operation completed successfully Signed-off-by: Kapil Chouhan --- lib/chef/win32/security.rb | 2 +- spec/unit/win32/security_spec.rb | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/chef/win32/security.rb b/lib/chef/win32/security.rb index 879aba7f2b..a633721839 100644 --- a/lib/chef/win32/security.rb +++ b/lib/chef/win32/security.rb @@ -404,7 +404,7 @@ class Chef system_name = system_name.to_wstring if system_name if LookupAccountNameW(system_name, name.to_wstring, nil, sid_size, nil, referenced_domain_name_size, nil) raise "Expected ERROR_INSUFFICIENT_BUFFER from LookupAccountName, and got no error!" - elsif FFI::LastError.error != ERROR_INSUFFICIENT_BUFFER + elsif !([NO_ERROR, ERROR_INSUFFICIENT_BUFFER].include?(FFI::LastError.error)) Chef::ReservedNames::Win32::Error.raise! end diff --git a/spec/unit/win32/security_spec.rb b/spec/unit/win32/security_spec.rb index b5e441f2a0..3c612aef10 100644 --- a/spec/unit/win32/security_spec.rb +++ b/spec/unit/win32/security_spec.rb @@ -106,4 +106,29 @@ describe "Chef::Win32::Security", :windows_only do expect { Chef::ReservedNames::Win32::Security.get_token_information_elevation_type(token) }.to raise_error(Chef::Exceptions::Win32APIError) end end + + describe "self.lookup_account_name" do + let(:security_class) { Chef::ReservedNames::Win32::Security } + + context "when FFI::LastError.error result is ERROR_INSUFFICIENT_BUFFER" do + it "does not raise the exception" do + expect(FFI::LastError).to receive(:error).and_return(122) + expect { security_class.lookup_account_name "system" }.to_not raise_error + end + end + + context "when operation completed successfully and FFI::LastError.error result is NO_ERROR" do + it "does not raise the exception" do + expect(FFI::LastError).to receive(:error).and_return(0) + expect { security_class.lookup_account_name "system" }.to_not raise_error + end + end + + context "when FFI::LastError.error result is not ERROR_INSUFFICIENT_BUFFER and not NO_ERROR" do + it "raises Chef::ReservedNames::Win32::Error.raise! exception" do + expect(FFI::LastError).to receive(:error).and_return(123).at_least(:once) + expect { security_class.lookup_account_name "system" }.to raise_error + end + end + end end -- cgit v1.2.1