Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Side by Side Diff: src/trusted/service_runtime/name_service/name_service.c

Issue 7108031: this patch adds the manifest proxy server to sel_ldr and the manifest (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: '' Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698