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

Side by Side Diff: remoting/protocol/jingle_session.cc

Issue 2967213002: Fix ASSERT in JingleMessage::OrderedMessageQueue. (Closed)
Patch Set: Reviewer's feedback Created 3 years, 5 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
« no previous file with comments | « remoting/protocol/jingle_session.h ('k') | remoting/protocol/jingle_session_manager.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "remoting/protocol/jingle_session.h" 5 #include "remoting/protocol/jingle_session.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <limits> 9 #include <limits>
10 #include <memory> 10 #include <memory>
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 class JingleSession::OrderedMessageQueue { 108 class JingleSession::OrderedMessageQueue {
109 public: 109 public:
110 OrderedMessageQueue() {} 110 OrderedMessageQueue() {}
111 ~OrderedMessageQueue() {} 111 ~OrderedMessageQueue() {}
112 112
113 // Returns the list of messages ordered by their sequential IDs. 113 // Returns the list of messages ordered by their sequential IDs.
114 std::vector<PendingMessage> OnIncomingMessage( 114 std::vector<PendingMessage> OnIncomingMessage(
115 const std::string& id, 115 const std::string& id,
116 PendingMessage&& pending_message); 116 PendingMessage&& pending_message);
117 117
118 // Sets the initial ID of the session initiate message.
119 void SetInitialId(const std::string& id);
120
118 private: 121 private:
119 // Implements an ordered list by using map with the |sequence_id| as the key, 122 // Implements an ordered list by using map with the |sequence_id| as the key,
120 // so that |queue_| is always sorted by |sequence_id|. 123 // so that |queue_| is always sorted by |sequence_id|.
121 std::map<int, PendingMessage> queue_; 124 std::map<int, PendingMessage> queue_;
122 125
123 int next_incoming_ = kAny; 126 int next_incoming_ = kAny;
124 127
125 DISALLOW_COPY_AND_ASSIGN(OrderedMessageQueue); 128 DISALLOW_COPY_AND_ASSIGN(OrderedMessageQueue);
126 }; 129 };
127 130
(...skipping 27 matching lines...) Expand all
155 next_incoming_++; 158 next_incoming_++;
156 } 159 }
157 160
158 if (current - next_incoming_ >= 3) { 161 if (current - next_incoming_ >= 3) {
159 LOG(WARNING) << "Multiple messages are missing: expected= " 162 LOG(WARNING) << "Multiple messages are missing: expected= "
160 << next_incoming_ << " current= " << current; 163 << next_incoming_ << " current= " << current;
161 } 164 }
162 return result; 165 return result;
163 }; 166 };
164 167
168 void JingleSession::OrderedMessageQueue::SetInitialId(const std::string& id) {
169 int current = GetSequentialId(id);
170 if (current != kInvalid)
171 next_incoming_ = current + 1;
172 }
173
165 JingleSession::PendingMessage::PendingMessage() = default; 174 JingleSession::PendingMessage::PendingMessage() = default;
166 JingleSession::PendingMessage::PendingMessage(PendingMessage&& moved) = default; 175 JingleSession::PendingMessage::PendingMessage(PendingMessage&& moved) = default;
167 JingleSession::PendingMessage::PendingMessage( 176 JingleSession::PendingMessage::PendingMessage(
168 std::unique_ptr<JingleMessage> message, 177 std::unique_ptr<JingleMessage> message,
169 const ReplyCallback& reply_callback) 178 const ReplyCallback& reply_callback)
170 : message(std::move(message)), reply_callback(reply_callback) {} 179 : message(std::move(message)), reply_callback(reply_callback) {}
171 JingleSession::PendingMessage::~PendingMessage() = default; 180 JingleSession::PendingMessage::~PendingMessage() = default;
172 181
173 JingleSession::PendingMessage& JingleSession::PendingMessage::operator=( 182 JingleSession::PendingMessage& JingleSession::PendingMessage::operator=(
174 PendingMessage&& moved) = default; 183 PendingMessage&& moved) = default;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 // Delay sending session-initiate message to ensure SessionPlugin can be 226 // Delay sending session-initiate message to ensure SessionPlugin can be
218 // attached before the message. 227 // attached before the message.
219 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, 228 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
220 base::Bind(&JingleSession::SendSessionInitiateMessage, 229 base::Bind(&JingleSession::SendSessionInitiateMessage,
221 weak_factory_.GetWeakPtr())); 230 weak_factory_.GetWeakPtr()));
222 231
223 SetState(CONNECTING); 232 SetState(CONNECTING);
224 } 233 }
225 234
226 void JingleSession::InitializeIncomingConnection( 235 void JingleSession::InitializeIncomingConnection(
236 const std::string& message_id,
227 const JingleMessage& initiate_message, 237 const JingleMessage& initiate_message,
228 std::unique_ptr<Authenticator> authenticator) { 238 std::unique_ptr<Authenticator> authenticator) {
229 DCHECK(thread_checker_.CalledOnValidThread()); 239 DCHECK(thread_checker_.CalledOnValidThread());
230 DCHECK(initiate_message.description.get()); 240 DCHECK(initiate_message.description.get());
231 DCHECK(authenticator.get()); 241 DCHECK(authenticator.get());
232 DCHECK_EQ(authenticator->state(), Authenticator::WAITING_MESSAGE); 242 DCHECK_EQ(authenticator->state(), Authenticator::WAITING_MESSAGE);
233 243
234 peer_address_ = initiate_message.from; 244 peer_address_ = initiate_message.from;
235 authenticator_ = std::move(authenticator); 245 authenticator_ = std::move(authenticator);
236 session_id_ = initiate_message.sid; 246 session_id_ = initiate_message.sid;
247 message_queue_->SetInitialId(message_id);
237 248
238 SetState(ACCEPTING); 249 SetState(ACCEPTING);
239 250
240 config_ = 251 config_ =
241 SessionConfig::SelectCommon(initiate_message.description->config(), 252 SessionConfig::SelectCommon(initiate_message.description->config(),
242 session_manager_->protocol_config_.get()); 253 session_manager_->protocol_config_.get());
243 if (!config_) { 254 if (!config_) {
244 LOG(WARNING) << "Rejecting connection from " << peer_address_.id() 255 LOG(WARNING) << "Rejecting connection from " << peer_address_.id()
245 << " because no compatible configuration has been found."; 256 << " because no compatible configuration has been found.";
246 Close(INCOMPATIBLE_PROTOCOL); 257 Close(INCOMPATIBLE_PROTOCOL);
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 authenticator_->GetNextMessage())); 811 authenticator_->GetNextMessage()));
801 SendMessage(std::move(message)); 812 SendMessage(std::move(message));
802 } 813 }
803 814
804 std::string JingleSession::GetNextOutgoingId() { 815 std::string JingleSession::GetNextOutgoingId() {
805 return outgoing_id_prefix_ + "_" + base::IntToString(++next_outgoing_id_); 816 return outgoing_id_prefix_ + "_" + base::IntToString(++next_outgoing_id_);
806 } 817 }
807 818
808 } // namespace protocol 819 } // namespace protocol
809 } // namespace remoting 820 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/protocol/jingle_session.h ('k') | remoting/protocol/jingle_session_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698