OLD | NEW |
1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2008 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 "chrome/common/ipc_channel_posix.h" | 5 #include "chrome/common/ipc_channel_posix.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <fcntl.h> | 8 #include <fcntl.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 #include <sys/types.h> | 10 #include <sys/types.h> |
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 memcpy(&input_overflow_fds_[prev_size], wire_fds, | 476 memcpy(&input_overflow_fds_[prev_size], wire_fds, |
477 num_wire_fds * sizeof(int)); | 477 num_wire_fds * sizeof(int)); |
478 fds = &input_overflow_fds_[0]; | 478 fds = &input_overflow_fds_[0]; |
479 num_fds = input_overflow_fds_.size(); | 479 num_fds = input_overflow_fds_.size(); |
480 } | 480 } |
481 | 481 |
482 while (p < end) { | 482 while (p < end) { |
483 const char* message_tail = Message::FindNext(p, end); | 483 const char* message_tail = Message::FindNext(p, end); |
484 if (message_tail) { | 484 if (message_tail) { |
485 int len = static_cast<int>(message_tail - p); | 485 int len = static_cast<int>(message_tail - p); |
486 const Message m(p, len); | 486 Message m(p, len); |
487 if (m.header()->num_fds) { | 487 if (m.header()->num_fds) { |
488 // the message has file descriptors | 488 // the message has file descriptors |
| 489 const char* error = NULL; |
489 if (m.header()->num_fds > num_fds - fds_i) { | 490 if (m.header()->num_fds > num_fds - fds_i) { |
490 // the message has been completely received, but we didn't get | 491 // the message has been completely received, but we didn't get |
491 // enough file descriptors. | 492 // enough file descriptors. |
492 LOG(WARNING) << "Message needs unreceived descriptors" | 493 error = "Message needs unreceived descriptors"; |
| 494 } |
| 495 |
| 496 if (m.header()->num_fds > |
| 497 DescriptorSet::MAX_DESCRIPTORS_PER_MESSAGE) { |
| 498 // There are too many descriptors in this message |
| 499 error = "Message requires an excessive number of descriptors"; |
| 500 } |
| 501 |
| 502 if (error) { |
| 503 LOG(WARNING) << error |
493 << " channel:" << this | 504 << " channel:" << this |
494 << " message-type:" << m.type() | 505 << " message-type:" << m.type() |
495 << " header()->num_fds:" << m.header()->num_fds | 506 << " header()->num_fds:" << m.header()->num_fds |
496 << " num_fds:" << num_fds | 507 << " num_fds:" << num_fds |
497 << " fds_i:" << fds_i; | 508 << " fds_i:" << fds_i; |
498 // close the existing file descriptors so that we don't leak them | 509 // close the existing file descriptors so that we don't leak them |
499 for (unsigned i = fds_i; i < num_fds; ++i) | 510 for (unsigned i = fds_i; i < num_fds; ++i) |
500 close(fds[i]); | 511 close(fds[i]); |
501 input_overflow_fds_.clear(); | 512 input_overflow_fds_.clear(); |
| 513 // abort the connection |
502 return false; | 514 return false; |
503 } | 515 } |
504 | 516 |
505 m.descriptor_set()->SetDescriptors(&fds[fds_i], m.header()->num_fds); | 517 m.descriptor_set()->SetDescriptors(&fds[fds_i], m.header()->num_fds); |
506 fds_i += m.header()->num_fds; | 518 fds_i += m.header()->num_fds; |
507 } | 519 } |
508 #ifdef IPC_MESSAGE_DEBUG_EXTRA | 520 #ifdef IPC_MESSAGE_DEBUG_EXTRA |
509 DLOG(INFO) << "received message on channel @" << this << | 521 DLOG(INFO) << "received message on channel @" << this << |
510 " with type " << m.type(); | 522 " with type " << m.type(); |
511 #endif | 523 #endif |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 void Channel::GetClientFileDescriptorMapping(int *src_fd, int *dest_fd) { | 803 void Channel::GetClientFileDescriptorMapping(int *src_fd, int *dest_fd) { |
792 return channel_impl_->GetClientFileDescriptorMapping(src_fd, dest_fd); | 804 return channel_impl_->GetClientFileDescriptorMapping(src_fd, dest_fd); |
793 } | 805 } |
794 | 806 |
795 void Channel::OnClientConnected() { | 807 void Channel::OnClientConnected() { |
796 return channel_impl_->OnClientConnected(); | 808 return channel_impl_->OnClientConnected(); |
797 } | 809 } |
798 | 810 |
799 | 811 |
800 } // namespace IPC | 812 } // namespace IPC |
OLD | NEW |