OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "net/http/http_auth_gssapi_posix.h" | 5 #include "net/http/http_auth_gssapi_posix.h" |
6 | 6 |
| 7 #include <limits> |
| 8 |
7 #include "base/base64.h" | 9 #include "base/base64.h" |
8 #include "base/file_path.h" | 10 #include "base/file_path.h" |
9 #include "base/logging.h" | 11 #include "base/logging.h" |
10 #include "base/singleton.h" | 12 #include "base/singleton.h" |
11 #include "base/string_util.h" | 13 #include "base/string_util.h" |
12 #include "net/base/net_errors.h" | 14 #include "net/base/net_errors.h" |
13 #include "net/base/net_util.h" | 15 #include "net/base/net_util.h" |
14 | 16 |
15 namespace { | 17 namespace { |
16 | 18 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 gssapi::OM_uint32 minor_status) { | 203 gssapi::OM_uint32 minor_status) { |
202 if (major_status == GSS_S_COMPLETE) | 204 if (major_status == GSS_S_COMPLETE) |
203 return "OK"; | 205 return "OK"; |
204 return StringPrintf("0x%08x 0x%08x", major_status, minor_status); | 206 return StringPrintf("0x%08x 0x%08x", major_status, minor_status); |
205 } | 207 } |
206 | 208 |
207 std::string DisplayCode(GSSAPILibrary* gssapi_lib, | 209 std::string DisplayCode(GSSAPILibrary* gssapi_lib, |
208 gssapi::OM_uint32 status, | 210 gssapi::OM_uint32 status, |
209 gssapi::OM_uint32 status_code_type) { | 211 gssapi::OM_uint32 status_code_type) { |
210 const int kMaxDisplayIterations = 8; | 212 const int kMaxDisplayIterations = 8; |
| 213 const size_t kMaxMsgLength = 4096; |
211 // msg_ctx needs to be outside the loop because it is invoked multiple times. | 214 // msg_ctx needs to be outside the loop because it is invoked multiple times. |
212 gssapi::OM_uint32 msg_ctx = 0; | 215 gssapi::OM_uint32 msg_ctx = 0; |
213 std::string rv = StringPrintf("(0x%08X)", status); | 216 std::string rv = StringPrintf("(0x%08X)", status); |
214 | 217 |
215 // This loop should continue iterating until msg_ctx is 0 after the first | 218 // This loop should continue iterating until msg_ctx is 0 after the first |
216 // iteration. To be cautious and prevent an infinite loop, it stops after | 219 // iteration. To be cautious and prevent an infinite loop, it stops after |
217 // a finite number of iterations as well. | 220 // a finite number of iterations as well. As an added sanity check, no |
218 for (int i = 0; i < kMaxDisplayIterations; ++i) { | 221 // individual message may exceed |kMaxMsgLength|, and the final result |
| 222 // will not exceed |kMaxMsgLength|*2-1. |
| 223 for (int i = 0; i < kMaxDisplayIterations && rv.size() < kMaxMsgLength; |
| 224 ++i) { |
219 gssapi::OM_uint32 min_stat; | 225 gssapi::OM_uint32 min_stat; |
220 gssapi::gss_buffer_desc_struct msg = GSS_C_EMPTY_BUFFER; | 226 gssapi::gss_buffer_desc_struct msg = GSS_C_EMPTY_BUFFER; |
221 gssapi_lib->display_status(&min_stat, status, status_code_type, | 227 gssapi::OM_uint32 maj_stat = |
222 GSS_C_NULL_OID, | 228 gssapi_lib->display_status(&min_stat, status, status_code_type, |
223 &msg_ctx, &msg); | 229 GSS_C_NULL_OID, &msg_ctx, &msg); |
224 rv += StringPrintf(" %s", static_cast<char *>(msg.value)); | 230 if (maj_stat == GSS_S_COMPLETE) { |
| 231 int msg_len = (msg.length > kMaxMsgLength) ? |
| 232 static_cast<int>(kMaxMsgLength) : |
| 233 static_cast<int>(msg.length); |
| 234 if (msg_len > 0 && msg.value != NULL) { |
| 235 rv += StringPrintf(" %.*s", msg_len, |
| 236 static_cast<char *>(msg.value)); |
| 237 } |
| 238 } |
225 gssapi_lib->release_buffer(&min_stat, &msg); | 239 gssapi_lib->release_buffer(&min_stat, &msg); |
226 if (!msg_ctx) | 240 if (!msg_ctx) |
227 break; | 241 break; |
228 } | 242 } |
229 return rv; | 243 return rv; |
230 } | 244 } |
231 | 245 |
232 std::string DisplayExtendedStatus(GSSAPILibrary* gssapi_lib, | 246 std::string DisplayExtendedStatus(GSSAPILibrary* gssapi_lib, |
233 gssapi::OM_uint32 major_status, | 247 gssapi::OM_uint32 major_status, |
234 gssapi::OM_uint32 minor_status) { | 248 gssapi::OM_uint32 minor_status) { |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 major_status, | 459 major_status, |
446 minor_status); | 460 minor_status); |
447 return ERR_UNEXPECTED; | 461 return ERR_UNEXPECTED; |
448 } | 462 } |
449 | 463 |
450 return (major_status != GSS_S_COMPLETE) ? ERR_IO_PENDING : OK; | 464 return (major_status != GSS_S_COMPLETE) ? ERR_IO_PENDING : OK; |
451 } | 465 } |
452 | 466 |
453 } // namespace net | 467 } // namespace net |
454 | 468 |
OLD | NEW |