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

Side by Side Diff: net/base/backoff_entry_unittest.cc

Issue 1039263003: Prevent integer overflow when (de)serializing BackoffEntry Base URL: https://chromium.googlesource.com/chromium/src.git@backoff
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
« no previous file with comments | « net/base/backoff_entry.cc ('k') | no next file » | 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 "net/base/backoff_entry.h" 5 #include "net/base/backoff_entry.h"
6 6
7 #include "base/values.h" 7 #include "base/values.h"
8 #include "testing/gtest/include/gtest/gtest.h" 8 #include "testing/gtest/include/gtest/gtest.h"
9 9
10 namespace { 10 namespace {
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 for (int i = 0; i < 129; ++i) { 320 for (int i = 0; i < 129; ++i) {
321 custom.set_now(custom.ImplGetTimeNow() + custom.GetTimeUntilRelease()); 321 custom.set_now(custom.ImplGetTimeNow() + custom.GetTimeUntilRelease());
322 custom.InformOfRequest(false); 322 custom.InformOfRequest(false);
323 ASSERT_TRUE(custom.ShouldRejectRequest()); 323 ASSERT_TRUE(custom.ShouldRejectRequest());
324 } 324 }
325 325
326 // Max delay should still be respected. 326 // Max delay should still be respected.
327 EXPECT_EQ(20000, custom.GetTimeUntilRelease().InMilliseconds()); 327 EXPECT_EQ(20000, custom.GetTimeUntilRelease().InMilliseconds());
328 } 328 }
329 329
330 TEST(BackoffEntryTest, SerializeTimeOffsets) { 330 TEST(BackoffEntryTest, SerializationTimeOffsets) {
331 TestBackoffEntry original(&base_policy); 331 TestBackoffEntry original(&base_policy);
332 // 2 errors. 332 // 2 errors.
333 original.InformOfRequest(false); 333 original.InformOfRequest(false);
334 original.InformOfRequest(false); 334 original.InformOfRequest(false);
335 scoped_ptr<base::ListValue> serialized = original.Serialize(); 335 scoped_ptr<base::ListValue> serialized = original.Serialize();
336 336
337 { 337 {
338 // Test that immediate deserializeation round-trips. 338 // Test that immediate deserialization round-trips.
339 TestBackoffEntry deserialized(&base_policy); 339 TestBackoffEntry deserialized(&base_policy);
340 EXPECT_TRUE(deserialized.Deserialize(*serialized)); 340 EXPECT_TRUE(deserialized.Deserialize(*serialized));
341 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); 341 EXPECT_EQ(original.failure_count(), deserialized.failure_count());
342 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime()); 342 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime());
343 } 343 }
344 344
345 { 345 {
346 // Test deserialization when wall clock has advanced but TimeTicks haven't 346 // Test deserialization when wall clock has advanced but TimeTicks haven't
347 // (e.g. device was rebooted). 347 // (e.g. device was rebooted).
348 TestBackoffEntry deserialized(&base_policy); 348 TestBackoffEntry deserialized(&base_policy);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 deserialized.set_wall_clock_now( 398 deserialized.set_wall_clock_now(
399 original.ImplGetWallClockTimeNow() - TimeDelta::FromDays(1)); 399 original.ImplGetWallClockTimeNow() - TimeDelta::FromDays(1));
400 EXPECT_TRUE(deserialized.Deserialize(*serialized)); 400 EXPECT_TRUE(deserialized.Deserialize(*serialized));
401 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); 401 EXPECT_EQ(original.failure_count(), deserialized.failure_count());
402 // Deserialization should respect maximum_backoff_ms in such a situation. 402 // Deserialization should respect maximum_backoff_ms in such a situation.
403 EXPECT_EQ(TimeDelta::FromMilliseconds(base_policy.maximum_backoff_ms), 403 EXPECT_EQ(TimeDelta::FromMilliseconds(base_policy.maximum_backoff_ms),
404 deserialized.GetTimeUntilRelease()); 404 deserialized.GetTimeUntilRelease());
405 } 405 }
406 } 406 }
407 407
408 TEST(BackoffEntryTest, SerializeNoFailures) { 408 TEST(BackoffEntryTest, SerializationNoFailures) {
409 TestBackoffEntry original(&base_policy); 409 TestBackoffEntry original(&base_policy);
410 scoped_ptr<base::ListValue> serialized = original.Serialize(); 410 scoped_ptr<base::ListValue> serialized = original.Serialize();
411 411
412 TestBackoffEntry deserialized(&base_policy); 412 TestBackoffEntry deserialized(&base_policy);
413 // 1 error, so that we can tell when Deserialize restores the values. 413 // 1 error, so that we can tell when Deserialize restores the values.
414 deserialized.InformOfRequest(false); 414 deserialized.InformOfRequest(false);
415 EXPECT_NE(original.failure_count(), deserialized.failure_count()); 415 EXPECT_NE(original.failure_count(), deserialized.failure_count());
416 EXPECT_NE(original.GetReleaseTime(), deserialized.GetReleaseTime()); 416 EXPECT_NE(original.GetReleaseTime(), deserialized.GetReleaseTime());
417 417
418 EXPECT_TRUE(deserialized.Deserialize(*serialized)); 418 EXPECT_TRUE(deserialized.Deserialize(*serialized));
419 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); 419 EXPECT_EQ(original.failure_count(), deserialized.failure_count());
420 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime()); 420 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime());
421 } 421 }
422 422
423 TEST(BackoffEntryTest, SerializationOverflowProtection) {
424 // Test that deserialization round-trips with extremely large positive and
425 // negative release times.
426 BackoffEntry::Policy no_maximum_policy = base_policy;
427 no_maximum_policy.maximum_backoff_ms = -1;
428
429 // Test that deserialization round-trips if ImplGetTimeNow and
430 // ImplGetWallClockTimeNow are zero throughout.
431 {
432 TestBackoffEntry original(&no_maximum_policy);
433 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1));
434 scoped_ptr<base::ListValue> serialized = original.Serialize();
435 TestBackoffEntry deserialized(&no_maximum_policy);
436 EXPECT_TRUE(deserialized.Deserialize(*serialized));
437 EXPECT_EQ(original.failure_count(), deserialized.failure_count());
438 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime());
439 }
440 {
441 TestBackoffEntry original(&no_maximum_policy);
442 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1));
443 scoped_ptr<base::ListValue> serialized = original.Serialize();
444 TestBackoffEntry deserialized(&no_maximum_policy);
445 EXPECT_TRUE(deserialized.Deserialize(*serialized));
446 EXPECT_EQ(original.failure_count(), deserialized.failure_count());
447 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime());
448 }
449
450
451 // These were the actual values when I wrote this test.
452 const TimeTicks realistic_time_ticks_now =
453 TimeTicks::FromInternalValue(304519400134);
454 const Time realistic_wall_clock_time_now =
455 Time::FromInternalValue(13071957275919685);
456
457 // Test overflow behavior, when ImplGetTimeNow and ImplGetWallClockTimeNow
458 // initially have realistic values but then decrease.
459 {
460 TestBackoffEntry original(&no_maximum_policy);
461 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1));
462 original.set_now(realistic_time_ticks_now);
463 original.set_wall_clock_now(realistic_wall_clock_time_now);
464 scoped_ptr<base::ListValue> serialized = original.Serialize();
465 TestBackoffEntry deserialized(&no_maximum_policy);
466 EXPECT_TRUE(deserialized.Deserialize(*serialized));
467 EXPECT_EQ(original.failure_count(), deserialized.failure_count());
468 EXPECT_EQ(TimeTicks::FromInternalValue(kint64max),
469 deserialized.GetReleaseTime());
470 }
471 {
472 TestBackoffEntry original(&no_maximum_policy);
473 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1));
474 original.set_now(realistic_time_ticks_now);
475 original.set_wall_clock_now(realistic_wall_clock_time_now);
476 scoped_ptr<base::ListValue> serialized = original.Serialize();
477 TestBackoffEntry deserialized(&no_maximum_policy);
478 EXPECT_TRUE(deserialized.Deserialize(*serialized));
479 EXPECT_EQ(original.failure_count(), deserialized.failure_count());
480 EXPECT_EQ(TimeTicks::FromInternalValue(kint64min)
481 + (realistic_wall_clock_time_now - Time()),
482 deserialized.GetReleaseTime());
483 }
484
485 // Test overflow behavior, when ImplGetTimeNow and ImplGetWallClockTimeNow
486 // are initially zero, but then have realistic values.
487 {
488 TestBackoffEntry original(&no_maximum_policy);
489 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1));
490 scoped_ptr<base::ListValue> serialized = original.Serialize();
491 TestBackoffEntry deserialized(&no_maximum_policy);
492 deserialized.set_now(realistic_time_ticks_now);
493 deserialized.set_wall_clock_now(realistic_wall_clock_time_now);
494 EXPECT_TRUE(deserialized.Deserialize(*serialized));
495 EXPECT_EQ(original.failure_count(), deserialized.failure_count());
496 EXPECT_EQ(original.GetReleaseTime()
497 - (realistic_wall_clock_time_now - Time())
498 + (realistic_time_ticks_now - TimeTicks()),
499 deserialized.GetReleaseTime());
500 }
501 {
502 TestBackoffEntry original(&no_maximum_policy);
503 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1));
504 scoped_ptr<base::ListValue> serialized = original.Serialize();
505 TestBackoffEntry deserialized(&no_maximum_policy);
506 deserialized.set_now(realistic_time_ticks_now);
507 deserialized.set_wall_clock_now(realistic_wall_clock_time_now);
508 EXPECT_TRUE(deserialized.Deserialize(*serialized));
509 EXPECT_EQ(original.failure_count(), deserialized.failure_count());
510 EXPECT_EQ(TimeTicks::FromInternalValue(kint64min)
511 + (realistic_time_ticks_now - TimeTicks()),
512 deserialized.GetReleaseTime());
513 }
514
515 // Test overflow behavior, when ImplGetTimeNow and ImplGetWallClockTimeNow
516 // have the same realistic values both before and after.
517 {
518 TestBackoffEntry original(&no_maximum_policy);
519 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1));
520 original.set_now(realistic_time_ticks_now);
521 original.set_wall_clock_now(realistic_wall_clock_time_now);
522 scoped_ptr<base::ListValue> serialized = original.Serialize();
523 TestBackoffEntry deserialized(&no_maximum_policy);
524 deserialized.set_now(realistic_time_ticks_now);
525 deserialized.set_wall_clock_now(realistic_wall_clock_time_now);
526 EXPECT_TRUE(deserialized.Deserialize(*serialized));
527 EXPECT_EQ(original.failure_count(), deserialized.failure_count());
528 EXPECT_EQ(TimeTicks::FromInternalValue(kint64max)
529 - (realistic_wall_clock_time_now - Time())
530 + (realistic_time_ticks_now - TimeTicks()),
531 deserialized.GetReleaseTime());
532 }
533 {
534 TestBackoffEntry original(&no_maximum_policy);
535 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1));
536 original.set_now(realistic_time_ticks_now);
537 original.set_wall_clock_now(realistic_wall_clock_time_now);
538 scoped_ptr<base::ListValue> serialized = original.Serialize();
539 TestBackoffEntry deserialized(&no_maximum_policy);
540 deserialized.set_now(realistic_time_ticks_now);
541 deserialized.set_wall_clock_now(realistic_wall_clock_time_now);
542 EXPECT_TRUE(deserialized.Deserialize(*serialized));
543 EXPECT_EQ(original.failure_count(), deserialized.failure_count());
544 EXPECT_EQ(TimeTicks::FromInternalValue(kint64min)
545 + (realistic_time_ticks_now - TimeTicks()),
546 deserialized.GetReleaseTime());
547 }
548 }
549
423 } // namespace 550 } // namespace
OLDNEW
« no previous file with comments | « net/base/backoff_entry.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698