Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: src/shared/Communication.cpp

Issue 5792731695677440: Fix named pipe security on Windows 7 (Closed)
Left Patch Set: Use custom free function. Make sure sure SACL is released correctly as well. Created July 15, 2014, 2:13 p.m.
Right Patch Set: Hide the spelling fail Created July 18, 2014, 12:47 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « no previous file | no next file » | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 #include <Windows.h> 1 #include <Windows.h>
2 #include <Lmcons.h> 2 #include <Lmcons.h>
3 #include <Sddl.h> 3 #include <Sddl.h>
4 #include <aclapi.h> 4 #include <aclapi.h>
5 #include <strsafe.h> 5 #include <strsafe.h>
6 6
7 #include "AutoHandle.h" 7 #include "AutoHandle.h"
8 #include "Communication.h" 8 #include "Communication.h"
9 #include "Utils.h" 9 #include "Utils.h"
10 10
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 PACL acl = 0; 101 PACL acl = 0;
102 if (SetEntriesInAcl(2, explicitAccess, 0, &acl) != ERROR_SUCCESS) 102 if (SetEntriesInAcl(2, explicitAccess, 0, &acl) != ERROR_SUCCESS)
103 return std::auto_ptr<SECURITY_DESCRIPTOR>(0); 103 return std::auto_ptr<SECURITY_DESCRIPTOR>(0);
104 104
105 // NOTE: This only references the acl, not copies it. 105 // NOTE: This only references the acl, not copies it.
106 // DO NOT release the ACL before it's actually used 106 // DO NOT release the ACL before it's actually used
107 if (!SetSecurityDescriptorDacl(securityDescriptor.get(), TRUE, acl, FALSE) ) 107 if (!SetSecurityDescriptorDacl(securityDescriptor.get(), TRUE, acl, FALSE) )
108 return std::auto_ptr<SECURITY_DESCRIPTOR>(0); 108 return std::auto_ptr<SECURITY_DESCRIPTOR>(0);
109 } 109 }
110 110
111 // Create a dummy security descriptor with low integrirty preset and reffere nce its SACL in ours 111 // Create a dummy security descriptor with low integrirty preset and referen ce its SACL in ours
Felix Dahlke 2014/07/16 14:40:03 s/refference/reference/
Oleksandr 2014/07/17 17:32:48 Um. Refference is meant to be a verb here. On 201
Felix Dahlke 2014/07/18 12:40:57 But it's still one f too many! :)
Oleksandr 2014/07/18 12:48:34 Oh. Totally missread your correction. On 2014/07/
112 LPCWSTR accessControlEntry = L"S:(ML;;NW;;;LW)"; 112 LPCWSTR accessControlEntry = L"S:(ML;;NW;;;LW)";
113 PSECURITY_DESCRIPTOR dummySecurityDescriptorLow; 113 PSECURITY_DESCRIPTOR dummySecurityDescriptorLow;
114 ConvertStringSecurityDescriptorToSecurityDescriptorW(accessControlEntry, SDD L_REVISION_1, &dummySecurityDescriptorLow, 0); 114 ConvertStringSecurityDescriptorToSecurityDescriptorW(accessControlEntry, SDD L_REVISION_1, &dummySecurityDescriptorLow, 0);
115 std::tr1::shared_ptr<SECURITY_DESCRIPTOR> sharedDummySecurityDescriptor(stat ic_cast<SECURITY_DESCRIPTOR*>(dummySecurityDescriptorLow), LocalFree); // Just t o simplify cleanup 115 std::tr1::shared_ptr<SECURITY_DESCRIPTOR> sharedDummySecurityDescriptor(stat ic_cast<SECURITY_DESCRIPTOR*>(dummySecurityDescriptorLow), LocalFree); // Just t o simplify cleanup
116 116
117 DWORD sdSize, saclSize, daclSize, ownerSize, primaryGroupSize; 117 DWORD sdSize(0), saclSize(0), daclSize(0), ownerSize(0), primaryGroupSize(0) ;
Felix Dahlke 2014/07/16 14:40:03 Shouldn't we initialise all the sizes to 0 here? S
118 MakeAbsoluteSD(dummySecurityDescriptorLow, 0, &sdSize, 0, &daclSize, 0, &sac lSize, 0, &ownerSize, 0, &primaryGroupSize); 118 MakeAbsoluteSD(dummySecurityDescriptorLow, 0, &sdSize, 0, &daclSize, 0, &sac lSize, 0, &ownerSize, 0, &primaryGroupSize);
119 if ((saclSize == 0) || (sdSize == 0)) 119 if (saclSize == 0 || sdSize == 0)
Felix Dahlke 2014/07/16 14:40:03 Redundant parentheses around both comparisons.
120 { 120 {
121 DWORD err = GetLastError();
Felix Dahlke 2014/07/16 14:40:03 Unused variable.
122 return std::auto_ptr<SECURITY_DESCRIPTOR>(0); 121 return std::auto_ptr<SECURITY_DESCRIPTOR>(0);
123 } 122 }
124 // Will be released later 123 // Will be released later
125 PACL sacl = (PACL) new byte[saclSize]; 124 PACL sacl = static_cast<PACL>(malloc(saclSize));
Felix Dahlke 2014/07/16 14:40:03 I'd actually find malloc more intuitive here. byte
126 std::auto_ptr<SECURITY_DESCRIPTOR> absoluteDummySecurityDescriptorLow((SECUR ITY_DESCRIPTOR*) new byte[sdSize]); 125 std::auto_ptr<SECURITY_DESCRIPTOR> absoluteDummySecurityDescriptorLow(static _cast<SECURITY_DESCRIPTOR*>(malloc(sdSize)));
127 daclSize = 0; 126 daclSize = 0;
128 ownerSize = 0; 127 ownerSize = 0;
129 primaryGroupSize = 0; 128 primaryGroupSize = 0;
130 BOOL res = MakeAbsoluteSD(dummySecurityDescriptorLow, absoluteDummySecurityD escriptorLow.get(), &sdSize, 0, &daclSize, sacl, &saclSize, 0, &ownerSize, 0, &p rimaryGroupSize); 129 BOOL res = MakeAbsoluteSD(dummySecurityDescriptorLow, absoluteDummySecurityD escriptorLow.get(), &sdSize, 0, &daclSize, sacl, &saclSize, 0, &ownerSize, 0, &p rimaryGroupSize);
131 if ((res == 0) || (absoluteDummySecurityDescriptorLow.get() == 0) || (saclSi ze == 0)) 130 if (res == 0 || absoluteDummySecurityDescriptorLow.get() == 0 || saclSize == 0)
Felix Dahlke 2014/07/16 14:40:03 Redundant parentheses here as well. Also, !res wo
132 { 131 {
133 DWORD err = GetLastError();
Felix Dahlke 2014/07/16 14:40:03 Also unused.
134 return std::auto_ptr<SECURITY_DESCRIPTOR>(0); 132 return std::auto_ptr<SECURITY_DESCRIPTOR>(0);
135 } 133 }
136 134
137 // NOTE: This only references the acl, not copies it. 135 // NOTE: This only references the acl, not copies it.
138 // DO NOT release the ACL before it's actually used 136 // DO NOT release the ACL before it's actually used
139 if (!SetSecurityDescriptorSacl(securityDescriptor.get(), TRUE, sacl, FALSE)) 137 if (!SetSecurityDescriptorSacl(securityDescriptor.get(), TRUE, sacl, FALSE))
140 { 138 {
141 DWORD err = GetLastError();
142 return std::auto_ptr<SECURITY_DESCRIPTOR>(0); 139 return std::auto_ptr<SECURITY_DESCRIPTOR>(0);
143 } 140 }
144 141
145 return securityDescriptor; 142 return securityDescriptor;
146 } 143 }
147 } 144 }
148 145
149 const std::wstring Communication::pipeName = L"\\\\.\\pipe\\adblockplusengine_" + GetUserName(); 146 const std::wstring Communication::pipeName = L"\\\\.\\pipe\\adblockplusengine_" + GetUserName();
150 147
151 void Communication::InputBuffer::CheckType(Communication::ValueType expectedType ) 148 void Communication::InputBuffer::CheckType(Communication::ValueType expectedType )
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 { 188 {
192 BOOL aclPresent = FALSE; 189 BOOL aclPresent = FALSE;
193 BOOL aclDefaulted = FALSE; 190 BOOL aclDefaulted = FALSE;
194 PACL acl = 0; 191 PACL acl = 0;
195 GetSecurityDescriptorDacl(securityDescriptor, &aclPresent, &acl, &aclDefaulted ); 192 GetSecurityDescriptorDacl(securityDescriptor, &aclPresent, &acl, &aclDefaulted );
196 if (aclPresent) 193 if (aclPresent)
197 { 194 {
198 LocalFree(acl); 195 LocalFree(acl);
199 } 196 }
200 aclPresent = FALSE; 197 aclPresent = FALSE;
201 aclDefaulted = false; 198 aclDefaulted = FALSE;
Felix Dahlke 2014/07/16 14:40:03 Should also be that Windows FALSE macro for consis
202 acl = 0; 199 acl = 0;
203 GetSecurityDescriptorSacl(securityDescriptor, &aclPresent, &acl, &aclDefaulted ); 200 GetSecurityDescriptorSacl(securityDescriptor, &aclPresent, &acl, &aclDefaulted );
204 if (aclPresent) 201 if (aclPresent)
205 { 202 {
206 delete acl; 203 free(acl);
Felix Dahlke 2014/07/16 14:40:03 You need to use delete[], since it was allocated u
207 } 204 }
208 delete securityDescriptor; 205 free(securityDescriptor);
209 } 206 }
210 207
211 Communication::Pipe::Pipe(const std::wstring& pipeName, Communication::Pipe::Mod e mode) 208 Communication::Pipe::Pipe(const std::wstring& pipeName, Communication::Pipe::Mod e mode)
212 { 209 {
213 pipe = INVALID_HANDLE_VALUE; 210 pipe = INVALID_HANDLE_VALUE;
214 if (mode == MODE_CREATE) 211 if (mode == MODE_CREATE)
215 { 212 {
216 SECURITY_ATTRIBUTES securityAttributes = {}; 213 SECURITY_ATTRIBUTES securityAttributes = {};
217 securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES); 214 securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
218 securityAttributes.bInheritHandle = TRUE; 215 securityAttributes.bInheritHandle = TRUE;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 return Communication::InputBuffer(stream.str()); 292 return Communication::InputBuffer(stream.str());
296 } 293 }
297 294
298 void Communication::Pipe::WriteMessage(Communication::OutputBuffer& message) 295 void Communication::Pipe::WriteMessage(Communication::OutputBuffer& message)
299 { 296 {
300 DWORD bytesWritten; 297 DWORD bytesWritten;
301 std::string data = message.Get(); 298 std::string data = message.Get();
302 if (!WriteFile(pipe, data.c_str(), static_cast<DWORD>(data.length()), &bytesWr itten, 0)) 299 if (!WriteFile(pipe, data.c_str(), static_cast<DWORD>(data.length()), &bytesWr itten, 0))
303 throw std::runtime_error("Failed to write to pipe"); 300 throw std::runtime_error("Failed to write to pipe");
304 } 301 }
LEFTRIGHT
« no previous file | no next file » | Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Toggle Comments ('s')

Powered by Google App Engine
This is Rietveld