OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include "native_client/src/include/portability.h" | 9 #include "native_client/src/include/portability.h" |
10 #include "native_client/src/include/portability_string.h" | 10 #include "native_client/src/include/portability_string.h" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
121 int NaClNameServiceCreateDescEntry( | 121 int NaClNameServiceCreateDescEntry( |
122 struct NaClNameService *nnsp, | 122 struct NaClNameService *nnsp, |
123 char const *name, | 123 char const *name, |
124 int mode, | 124 int mode, |
125 struct NaClDesc *new_desc) { | 125 struct NaClDesc *new_desc) { |
126 int retval = NACL_NAME_SERVICE_INSUFFICIENT_RESOURCES; | 126 int retval = NACL_NAME_SERVICE_INSUFFICIENT_RESOURCES; |
127 struct NaClNameServiceEntry *name_entry = NULL; | 127 struct NaClNameServiceEntry *name_entry = NULL; |
128 struct NaClNameServiceEntry *found = NULL; | 128 struct NaClNameServiceEntry *found = NULL; |
129 char *dup_name = STRDUP(name); | 129 char *dup_name = STRDUP(name); |
130 | 130 |
131 NaClLog(3, | |
132 "NaClNameServiceCreateDescEntry: entering %s, %d (0x%x)\n", | |
133 name, | |
134 mode, mode); | |
131 /* | 135 /* |
132 * common case is insertion success, so we pre-allocate memory | 136 * common case is insertion success, so we pre-allocate memory |
133 * (strdup, malloc) to avoid doing memory allocations while holding | 137 * (strdup, malloc) to avoid doing memory allocations while holding |
134 * the name service lock. | 138 * the name service lock. |
135 */ | 139 */ |
136 if (NULL == dup_name) { | 140 if (NULL == dup_name) { |
137 goto dup_failed; | 141 goto dup_failed; |
138 } | 142 } |
139 name_entry = (struct NaClNameServiceEntry *) malloc(sizeof *name_entry); | 143 name_entry = (struct NaClNameServiceEntry *) malloc(sizeof *name_entry); |
140 if (NULL == name_entry) { | 144 if (NULL == name_entry) { |
141 goto entry_alloc_failed; | 145 goto entry_alloc_failed; |
142 } | 146 } |
143 | 147 |
144 NaClXMutexLock(&nnsp->mu); | 148 NaClXMutexLock(&nnsp->mu); |
145 found = *NameServiceSearch(&nnsp->head, name); | 149 found = *NameServiceSearch(&nnsp->head, name); |
146 if (NULL != found) { | 150 if (NULL != found) { |
147 retval = NACL_NAME_SERVICE_DUPLICATE_NAME; | 151 retval = NACL_NAME_SERVICE_DUPLICATE_NAME; |
148 goto unlock_and_cleanup; | 152 goto unlock_and_cleanup; |
149 } | 153 } |
150 name_entry->next = nnsp->head; | 154 name_entry->next = nnsp->head; |
151 name_entry->name = dup_name; | 155 name_entry->name = dup_name; |
152 dup_name = (char *) NULL; | 156 dup_name = (char *) NULL; |
153 name_entry->mode = mode; | 157 name_entry->mode = mode; |
154 name_entry->entry = NaClDescRef(new_desc); | 158 name_entry->entry = new_desc; |
155 name_entry->factory = (NaClNameServiceFactoryFn_t) NULL; | 159 name_entry->factory = (NaClNameServiceFactoryFn_t) NULL; |
156 name_entry->state = (void *) NULL; | 160 name_entry->state = (void *) NULL; |
157 nnsp->head = name_entry; | 161 nnsp->head = name_entry; |
158 name_entry = NULL; | 162 name_entry = NULL; |
159 retval = NACL_NAME_SERVICE_SUCCESS; | 163 retval = NACL_NAME_SERVICE_SUCCESS; |
160 | 164 |
161 unlock_and_cleanup: | 165 unlock_and_cleanup: |
162 NaClXMutexUnlock(&nnsp->mu); | 166 NaClXMutexUnlock(&nnsp->mu); |
163 free(name_entry); | 167 free(name_entry); |
164 entry_alloc_failed: | 168 entry_alloc_failed: |
165 free(dup_name); | 169 free(dup_name); |
166 dup_failed: | 170 dup_failed: |
167 return retval; | 171 return retval; |
168 } | 172 } |
169 | 173 |
170 int NaClNameServiceCreateFactoryEntry( | 174 int NaClNameServiceCreateFactoryEntry( |
171 struct NaClNameService *nnsp, | 175 struct NaClNameService *nnsp, |
172 char const *name, | 176 char const *name, |
173 NaClNameServiceFactoryFn_t factory_fn, | 177 NaClNameServiceFactoryFn_t factory_fn, |
174 void *factory_state) { | 178 void *factory_state) { |
175 int retval = NACL_NAME_SERVICE_INSUFFICIENT_RESOURCES; | 179 int retval = NACL_NAME_SERVICE_INSUFFICIENT_RESOURCES; |
176 struct NaClNameServiceEntry *name_entry = NULL; | 180 struct NaClNameServiceEntry *name_entry = NULL; |
177 struct NaClNameServiceEntry *found = NULL; | 181 struct NaClNameServiceEntry *found = NULL; |
178 char *dup_name = STRDUP(name); | 182 char *dup_name = STRDUP(name); |
179 | 183 |
184 NaClLog(3, | |
185 ("NaClNameServiceCreateFactoryEntry: entering %s," | |
186 " 0x%"NACL_PRIxPTR", 0x%"NACL_PRIxPTR"\n"), | |
187 name, | |
188 (uintptr_t) factory_fn, | |
189 (uintptr_t) factory_state); | |
180 /* | 190 /* |
181 * common case is insertion success, so we pre-allocate memory | 191 * common case is insertion success, so we pre-allocate memory |
182 * (strdup, malloc) to avoid doing memory allocation while holding | 192 * (strdup, malloc) to avoid doing memory allocation while holding |
183 * the name service lock. | 193 * the name service lock. |
184 */ | 194 */ |
185 if (NULL == dup_name) { | 195 if (NULL == dup_name) { |
186 goto dup_failed; | 196 goto dup_failed; |
187 } | 197 } |
188 name_entry = (struct NaClNameServiceEntry *) malloc(sizeof *name_entry); | 198 name_entry = (struct NaClNameServiceEntry *) malloc(sizeof *name_entry); |
189 if (NULL == name_entry) { | 199 if (NULL == name_entry) { |
(...skipping 25 matching lines...) Expand all Loading... | |
215 return retval; | 225 return retval; |
216 } | 226 } |
217 | 227 |
218 int NaClNameServiceResolveName(struct NaClNameService *nnsp, | 228 int NaClNameServiceResolveName(struct NaClNameService *nnsp, |
219 char const *name, | 229 char const *name, |
220 int flags, | 230 int flags, |
221 struct NaClDesc **out) { | 231 struct NaClDesc **out) { |
222 struct NaClNameServiceEntry *nnsep; | 232 struct NaClNameServiceEntry *nnsep; |
223 int status = NACL_NAME_SERVICE_NAME_NOT_FOUND; | 233 int status = NACL_NAME_SERVICE_NAME_NOT_FOUND; |
224 | 234 |
225 if (0 != (flags & NACL_ABI_O_ACCMODE)) { | 235 NaClLog(3, |
236 "NaClNameServiceResolveName: looking up %s, flags %d (0x%x)\n", | |
237 name, | |
238 flags, flags); | |
239 if (0 != (flags & ~NACL_ABI_O_ACCMODE)) { | |
240 NaClLog(2, "NaClNameServiceResolveName: bad flags!\n"); | |
226 status = NACL_NAME_SERVICE_PERMISSION_DENIED; | 241 status = NACL_NAME_SERVICE_PERMISSION_DENIED; |
227 goto quit; | 242 goto quit; |
228 } | 243 } |
229 | 244 |
230 NaClXMutexLock(&nnsp->mu); | 245 NaClXMutexLock(&nnsp->mu); |
231 nnsep = *NameServiceSearch(&nnsp->head, name); | 246 nnsep = *NameServiceSearch(&nnsp->head, name); |
232 if (NULL != nnsep) { | 247 if (NULL != nnsep) { |
233 if (NULL != nnsep->entry) { | 248 if (NULL != nnsep->entry) { |
249 NaClLog(3, | |
250 "NaClNameServiceResolveName: found %s, mode %d (0x%x)\n", | |
251 name, | |
252 nnsep->mode, nnsep->mode); | |
234 /* check flags against nnsep->mode */ | 253 /* check flags against nnsep->mode */ |
254 NaClLog(4, | |
255 ("NaClNameServiceResolveName: checking mode/flags" | |
256 " compatibility\n")); | |
235 switch (flags) { | 257 switch (flags) { |
236 case NACL_ABI_O_RDONLY: | 258 case NACL_ABI_O_RDONLY: |
237 if (NACL_ABI_O_WRONLY == nnsep->mode) { | 259 if (NACL_ABI_O_WRONLY == nnsep->mode) { |
238 status = NACL_NAME_SERVICE_PERMISSION_DENIED; | 260 status = NACL_NAME_SERVICE_PERMISSION_DENIED; |
261 NaClLog(4, | |
262 "NaClNameServiceResolveName: incompatible," | |
263 " not readable\n"); | |
239 goto unlock_and_quit; | 264 goto unlock_and_quit; |
240 } | 265 } |
241 break; | 266 break; |
242 case NACL_ABI_O_WRONLY: | 267 case NACL_ABI_O_WRONLY: |
243 if (NACL_ABI_O_RDONLY == nnsep->mode) { | 268 if (NACL_ABI_O_RDONLY == nnsep->mode) { |
244 status = NACL_NAME_SERVICE_PERMISSION_DENIED; | 269 status = NACL_NAME_SERVICE_PERMISSION_DENIED; |
270 NaClLog(4, | |
271 "NaClNameServiceResolveName: incompatible," | |
272 " not writeable\n"); | |
245 goto unlock_and_quit; | 273 goto unlock_and_quit; |
246 } | 274 } |
247 break; | 275 break; |
248 case NACL_ABI_O_RDWR: | 276 case NACL_ABI_O_RDWR: |
249 if (NACL_ABI_O_RDWR != nnsep->mode) { | 277 if (NACL_ABI_O_RDWR != nnsep->mode) { |
250 status = NACL_NAME_SERVICE_PERMISSION_DENIED; | 278 status = NACL_NAME_SERVICE_PERMISSION_DENIED; |
279 NaClLog(4, "NaClNameServiceResolveName: incompatible," | |
280 " not for both read and write\n"); | |
251 goto unlock_and_quit; | 281 goto unlock_and_quit; |
252 } | 282 } |
253 break; | 283 break; |
254 default: | 284 default: |
255 status = NACL_NAME_SERVICE_INVALID_ARGUMENT; | 285 status = NACL_NAME_SERVICE_INVALID_ARGUMENT; |
286 NaClLog(4, "NaClNameServiceResolveName: invalid flag\n"); | |
256 goto unlock_and_quit; | 287 goto unlock_and_quit; |
257 } | 288 } |
289 NaClLog(4, "NaClNameServiceResolveName: mode and flags are compatible\n"); | |
258 *out = NaClDescRef(nnsep->entry); | 290 *out = NaClDescRef(nnsep->entry); |
259 status = NACL_NAME_SERVICE_SUCCESS; | 291 status = NACL_NAME_SERVICE_SUCCESS; |
260 } else { | 292 } else { |
261 status = (*nnsep->factory)(nnsep->state, name, flags, out); | 293 status = (*nnsep->factory)(nnsep->state, name, flags, out); |
262 } | 294 } |
263 } | 295 } |
264 unlock_and_quit: | 296 unlock_and_quit: |
265 nnsep = NULL; | 297 nnsep = NULL; |
noelallen_use_chromium
2011/06/14 02:25:45
We are clearing this pointer to prevent it's use a
bsy
2011/06/14 20:30:03
defensive programming. compilers will get rid of
| |
266 NaClXMutexUnlock(&nnsp->mu); | 298 NaClXMutexUnlock(&nnsp->mu); |
267 quit: | 299 quit: |
268 return status; | 300 return status; |
269 } | 301 } |
270 | 302 |
271 int NaClNameServiceDeleteName(struct NaClNameService *nnsp, | 303 int NaClNameServiceDeleteName(struct NaClNameService *nnsp, |
272 char const *name) { | 304 char const *name) { |
273 struct NaClNameServiceEntry **nnsepp; | 305 struct NaClNameServiceEntry **nnsepp; |
274 struct NaClNameServiceEntry *to_free = NULL; | 306 struct NaClNameServiceEntry *to_free = NULL; |
275 int status = NACL_NAME_SERVICE_NAME_NOT_FOUND; | 307 int status = NACL_NAME_SERVICE_NAME_NOT_FOUND; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
327 struct NaClSrpcRpc *rpc, | 359 struct NaClSrpcRpc *rpc, |
328 struct NaClSrpcArg **in_args, | 360 struct NaClSrpcArg **in_args, |
329 struct NaClSrpcArg **out_args, | 361 struct NaClSrpcArg **out_args, |
330 struct NaClSrpcClosure *done_cls) { | 362 struct NaClSrpcClosure *done_cls) { |
331 struct NaClNameService *nnsp = | 363 struct NaClNameService *nnsp = |
332 (struct NaClNameService *) rpc->channel->server_instance_data; | 364 (struct NaClNameService *) rpc->channel->server_instance_data; |
333 char *name = in_args[0]->arrays.str; | 365 char *name = in_args[0]->arrays.str; |
334 int mode = in_args[1]->u.ival; | 366 int mode = in_args[1]->u.ival; |
335 struct NaClDesc *desc = in_args[2]->u.hval; | 367 struct NaClDesc *desc = in_args[2]->u.hval; |
336 | 368 |
369 NaClLog(3, | |
370 "NaClNameServiceNameInsertRpc: inserting %s, %d (0x%x)\n", | |
371 name, | |
372 mode, mode); | |
337 out_args[0]->u.ival = (*NACL_VTBL(NaClNameService, nnsp)->CreateDescEntry)( | 373 out_args[0]->u.ival = (*NACL_VTBL(NaClNameService, nnsp)->CreateDescEntry)( |
338 nnsp, name, mode, desc); | 374 nnsp, name, mode, desc); |
339 rpc->result = NACL_SRPC_RESULT_OK; | 375 rpc->result = NACL_SRPC_RESULT_OK; |
340 (*done_cls->Run)(done_cls); | 376 (*done_cls->Run)(done_cls); |
341 } | 377 } |
342 | 378 |
343 static void NaClNameServiceNameLookupOldRpc( | 379 static void NaClNameServiceNameLookupOldRpc( |
344 struct NaClSrpcRpc *rpc, | 380 struct NaClSrpcRpc *rpc, |
345 struct NaClSrpcArg **in_args, | 381 struct NaClSrpcArg **in_args, |
346 struct NaClSrpcArg **out_args, | 382 struct NaClSrpcArg **out_args, |
347 struct NaClSrpcClosure *done_cls) { | 383 struct NaClSrpcClosure *done_cls) { |
348 struct NaClNameService *nnsp = | 384 struct NaClNameService *nnsp = |
349 (struct NaClNameService *) rpc->channel->server_instance_data; | 385 (struct NaClNameService *) rpc->channel->server_instance_data; |
350 char *name = in_args[0]->arrays.str; | 386 char *name = in_args[0]->arrays.str; |
351 int status; | 387 int status; |
352 struct NaClDesc *desc; | 388 struct NaClDesc *desc; |
353 | 389 |
354 NaClLog(LOG_WARNING, | 390 NaClLog(LOG_WARNING, |
355 "NaClNameServiceNameLookupOldRpc: DEPRECATED interface used.\n"); | 391 "NaClNameServiceNameLookupOldRpc: DEPRECATED interface used.\n"); |
392 NaClLog(3, "NaClNameServiceNameLookupOldRpc: looking up %s\n", name); | |
356 status = (*NACL_VTBL(NaClNameService, nnsp)->ResolveName)( | 393 status = (*NACL_VTBL(NaClNameService, nnsp)->ResolveName)( |
357 nnsp, name, NACL_ABI_O_RDONLY, &desc); | 394 nnsp, name, NACL_ABI_O_RDONLY, &desc); |
358 out_args[0]->u.ival = status; | 395 out_args[0]->u.ival = status; |
359 out_args[1]->u.hval = (NACL_NAME_SERVICE_SUCCESS == status) | 396 out_args[1]->u.hval = (NACL_NAME_SERVICE_SUCCESS == status) |
360 ? desc | 397 ? desc |
361 : (struct NaClDesc *) NaClDescInvalidMake(); | 398 : (struct NaClDesc *) NaClDescInvalidMake(); |
362 rpc->result = NACL_SRPC_RESULT_OK; | 399 rpc->result = NACL_SRPC_RESULT_OK; |
363 (*done_cls->Run)(done_cls); | 400 (*done_cls->Run)(done_cls); |
364 } | 401 } |
365 | 402 |
366 static void NaClNameServiceNameLookupRpc( | 403 static void NaClNameServiceNameLookupRpc( |
367 struct NaClSrpcRpc *rpc, | 404 struct NaClSrpcRpc *rpc, |
368 struct NaClSrpcArg **in_args, | 405 struct NaClSrpcArg **in_args, |
369 struct NaClSrpcArg **out_args, | 406 struct NaClSrpcArg **out_args, |
370 struct NaClSrpcClosure *done_cls) { | 407 struct NaClSrpcClosure *done_cls) { |
371 struct NaClNameService *nnsp = | 408 struct NaClNameService *nnsp = |
372 (struct NaClNameService *) rpc->channel->server_instance_data; | 409 (struct NaClNameService *) rpc->channel->server_instance_data; |
373 char *name = in_args[0]->arrays.str; | 410 char *name = in_args[0]->arrays.str; |
374 int flags = in_args[1]->u.ival; | 411 int flags = in_args[1]->u.ival; |
375 int status; | 412 int status; |
376 struct NaClDesc *desc; | 413 struct NaClDesc *desc; |
377 | 414 |
415 NaClLog(3, "NaClNameServiceNameLookupRpc: looking up %s\n", name); | |
416 NaClLog(3, "NaClNameServiceNameLookupRpc: flags %d (0x%x)\n", flags, flags); | |
378 status = (*NACL_VTBL(NaClNameService, nnsp)->ResolveName)( | 417 status = (*NACL_VTBL(NaClNameService, nnsp)->ResolveName)( |
379 nnsp, name, flags, &desc); | 418 nnsp, name, flags, &desc); |
380 out_args[0]->u.ival = status; | 419 out_args[0]->u.ival = status; |
381 out_args[1]->u.hval = (NACL_NAME_SERVICE_SUCCESS == status) | 420 out_args[1]->u.hval = (NACL_NAME_SERVICE_SUCCESS == status) |
382 ? desc | 421 ? desc |
383 : (struct NaClDesc *) NaClDescInvalidMake(); | 422 : (struct NaClDesc *) NaClDescInvalidMake(); |
423 NaClLog(3, "NaClNameServiceNameLookupRpc: status %d\n", status); | |
424 NaClLog(3, "NaClNameServiceNameLookupRpc: desc 0x%"NACL_PRIxPTR"\n", | |
425 (uintptr_t) desc); | |
384 rpc->result = NACL_SRPC_RESULT_OK; | 426 rpc->result = NACL_SRPC_RESULT_OK; |
385 (*done_cls->Run)(done_cls); | 427 (*done_cls->Run)(done_cls); |
386 } | 428 } |
387 | 429 |
388 static void NaClNameServiceNameDeleteRpc( | 430 static void NaClNameServiceNameDeleteRpc( |
389 struct NaClSrpcRpc *rpc, | 431 struct NaClSrpcRpc *rpc, |
390 struct NaClSrpcArg **in_args, | 432 struct NaClSrpcArg **in_args, |
391 struct NaClSrpcArg **out_args, | 433 struct NaClSrpcArg **out_args, |
392 struct NaClSrpcClosure *done_cls) { | 434 struct NaClSrpcClosure *done_cls) { |
393 struct NaClNameService *nnsp = | 435 struct NaClNameService *nnsp = |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
450 NaClSimpleLtdServiceAcceptConnection, | 492 NaClSimpleLtdServiceAcceptConnection, |
451 NaClSimpleServiceAcceptAndSpawnHandler, | 493 NaClSimpleServiceAcceptAndSpawnHandler, |
452 NaClSimpleLtdServiceRpcHandler, | 494 NaClSimpleLtdServiceRpcHandler, |
453 }, | 495 }, |
454 NaClNameServiceCreateDescEntry, | 496 NaClNameServiceCreateDescEntry, |
455 NaClNameServiceCreateFactoryEntry, | 497 NaClNameServiceCreateFactoryEntry, |
456 NaClNameServiceResolveName, | 498 NaClNameServiceResolveName, |
457 NaClNameServiceDeleteName, | 499 NaClNameServiceDeleteName, |
458 NaClNameServiceEnumerate, | 500 NaClNameServiceEnumerate, |
459 }; | 501 }; |
OLD | NEW |