| 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; |
| 266 NaClXMutexUnlock(&nnsp->mu); | 298 NaClXMutexUnlock(&nnsp->mu); |
| 267 quit: | 299 quit: |
| (...skipping 59 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 |