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

Side by Side Diff: native_client_sdk/src/libraries/nacl_io/jsfs/js_fs.cc

Issue 1062463004: [NaCl SDK] nacl_io: Fix use-after-free bug in html5fs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "nacl_io/jsfs/js_fs.h" 5 #include "nacl_io/jsfs/js_fs.h"
6 6
7 #include <assert.h> 7 #include <assert.h>
8 #include <errno.h> 8 #include <errno.h>
9 #include <fcntl.h> 9 #include <fcntl.h>
10 #include <limits.h> 10 #include <limits.h>
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 } 404 }
405 405
406 pthread_cond_wait(&response_cond_, lock_.mutex()); 406 pthread_cond_wait(&response_cond_, lock_.mutex());
407 } 407 }
408 } 408 }
409 409
410 Error JsFs::OpenWithMode(const Path& path, int open_flags, mode_t t, 410 Error JsFs::OpenWithMode(const Path& path, int open_flags, mode_t t,
411 ScopedNode* out_node) { 411 ScopedNode* out_node) {
412 out_node->reset(NULL); 412 out_node->reset(NULL);
413 ScopedVar response(ppapi_); 413 ScopedVar response(ppapi_);
414 if (!SendRequestAndWait(&response, "%s%s%d", 414 std::string path_str = path.Join();
415 "cmd", "open", 415 if (!SendRequestAndWait(&response, "%s%s%d", "cmd", "open", "path",
416 "path", path.Join().c_str(), 416 path_str.c_str(), "oflag", open_flags)) {
417 "oflag", open_flags)) {
418 LOG_ERROR("Failed to send request."); 417 LOG_ERROR("Failed to send request.");
419 return EINVAL; 418 return EINVAL;
420 } 419 }
421 420
422 int32_t error; 421 int32_t error;
423 int32_t fd; 422 int32_t fd;
424 int result = ScanVar(response.pp_var(), "%d%d", "error", &error, "fd", &fd); 423 int result = ScanVar(response.pp_var(), "%d%d", "error", &error, "fd", &fd);
425 if (result >= 1 && error) 424 if (result >= 1 && error)
426 return error; 425 return error;
427 426
428 if (result != 2) { 427 if (result != 2) {
429 LOG_ERROR("Expected \"error\" and \"fd\" fields in response."); 428 LOG_ERROR("Expected \"error\" and \"fd\" fields in response.");
430 return EINVAL; 429 return EINVAL;
431 } 430 }
432 431
433 out_node->reset(new JsFsNode(this, fd)); 432 out_node->reset(new JsFsNode(this, fd));
434 return 0; 433 return 0;
435 } 434 }
436 435
437 Error JsFs::Unlink(const Path& path) { 436 Error JsFs::Unlink(const Path& path) {
438 ScopedVar response(ppapi_); 437 ScopedVar response(ppapi_);
439 if (!SendRequestAndWait( 438 std::string path_str = path.Join();
440 &response, "%s%s", "cmd", "unlink", "path", path.Join().c_str())) { 439 if (!SendRequestAndWait(&response, "%s%s", "cmd", "unlink", "path",
440 path_str.c_str())) {
441 LOG_ERROR("Failed to send request."); 441 LOG_ERROR("Failed to send request.");
442 return EINVAL; 442 return EINVAL;
443 } 443 }
444 444
445 return ErrorFromResponse(response); 445 return ErrorFromResponse(response);
446 } 446 }
447 447
448 Error JsFs::Mkdir(const Path& path, int perm) { 448 Error JsFs::Mkdir(const Path& path, int perm) {
449 ScopedVar response(ppapi_); 449 ScopedVar response(ppapi_);
450 if (!SendRequestAndWait(&response, "%s%s%d", 450 std::string path_str = path.Join();
451 "cmd", "mkdir", 451 if (!SendRequestAndWait(&response, "%s%s%d", "cmd", "mkdir", "path",
452 "path", path.Join().c_str(), 452 path_str.c_str(), "mode", perm)) {
453 "mode", perm)) {
454 LOG_ERROR("Failed to send request."); 453 LOG_ERROR("Failed to send request.");
455 return EINVAL; 454 return EINVAL;
456 } 455 }
457 456
458 return ErrorFromResponse(response); 457 return ErrorFromResponse(response);
459 } 458 }
460 459
461 Error JsFs::Rmdir(const Path& path) { 460 Error JsFs::Rmdir(const Path& path) {
462 ScopedVar response(ppapi_); 461 ScopedVar response(ppapi_);
463 if (!SendRequestAndWait( 462 std::string path_str = path.Join();
464 &response, "%s%s", "cmd", "rmdir", "path", path.Join().c_str())) { 463 if (!SendRequestAndWait(&response, "%s%s", "cmd", "rmdir", "path",
464 path_str.c_str())) {
465 LOG_ERROR("Failed to send request."); 465 LOG_ERROR("Failed to send request.");
466 return EINVAL; 466 return EINVAL;
467 } 467 }
468 468
469 return ErrorFromResponse(response); 469 return ErrorFromResponse(response);
470 } 470 }
471 471
472 Error JsFs::Remove(const Path& path) { 472 Error JsFs::Remove(const Path& path) {
473 ScopedVar response(ppapi_); 473 ScopedVar response(ppapi_);
474 if (!SendRequestAndWait( 474 std::string path_str = path.Join();
475 &response, "%s%s", "cmd", "remove", "path", path.Join().c_str())) { 475 if (!SendRequestAndWait(&response, "%s%s", "cmd", "remove", "path",
476 path_str.c_str())) {
476 LOG_ERROR("Failed to send request."); 477 LOG_ERROR("Failed to send request.");
477 return EINVAL; 478 return EINVAL;
478 } 479 }
479 480
480 return ErrorFromResponse(response); 481 return ErrorFromResponse(response);
481 } 482 }
482 483
483 Error JsFs::Rename(const Path& path, const Path& newpath) { 484 Error JsFs::Rename(const Path& path, const Path& newpath) {
484 ScopedVar response(ppapi_); 485 ScopedVar response(ppapi_);
485 if (!SendRequestAndWait(&response, "%s%s%s", 486 std::string path_str = path.Join();
486 "cmd", "rename", 487 std::string newpath_str = newpath.Join();
487 "old", path.Join().c_str(), 488 if (!SendRequestAndWait(&response, "%s%s%s", "cmd", "rename", "old",
488 "new", newpath.Join().c_str())) { 489 path_str.c_str(), "new", newpath_str.c_str())) {
489 LOG_ERROR("Failed to send request."); 490 LOG_ERROR("Failed to send request.");
490 return EINVAL; 491 return EINVAL;
491 } 492 }
492 493
493 return ErrorFromResponse(response); 494 return ErrorFromResponse(response);
494 } 495 }
495 496
496 Error JsFs::Filesystem_VIoctl(int request, va_list args) { 497 Error JsFs::Filesystem_VIoctl(int request, va_list args) {
497 if (request != NACL_IOC_HANDLEMESSAGE) { 498 if (request != NACL_IOC_HANDLEMESSAGE) {
498 LOG_ERROR("Unknown ioctl: %#x", request); 499 LOG_ERROR("Unknown ioctl: %#x", request);
499 return EINVAL; 500 return EINVAL;
500 } 501 }
501 502
502 PP_Var response = *va_arg(args, PP_Var*); 503 PP_Var response = *va_arg(args, PP_Var*);
503 504
504 AUTO_LOCK(lock_); 505 AUTO_LOCK(lock_);
505 506
506 RequestId response_id; 507 RequestId response_id;
507 if (ScanVar(response, "%d", "id", &response_id) != 1) { 508 if (ScanVar(response, "%d", "id", &response_id) != 1) {
508 LOG_TRACE("ioctl with no \"id\", ignoring.\n"); 509 LOG_TRACE("ioctl with no \"id\", ignoring.\n");
509 return EINVAL; 510 return EINVAL;
510 } 511 }
511 512
512 responses_.insert(ResponseMap_t::value_type(response_id, response)); 513 responses_.insert(ResponseMap_t::value_type(response_id, response));
513 pthread_cond_broadcast(&response_cond_); 514 pthread_cond_broadcast(&response_cond_);
514 return 0; 515 return 0;
515 } 516 }
516 517
517 } // namespace nacl_io 518 } // namespace nacl_io
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698