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

Side by Side Diff: src/url_canon_ip.cc

Issue 2027007: Fix a crash in IP address checking because the boundary case for an empty or ... (Closed) Base URL: http://google-url.googlecode.com/svn/trunk/
Patch Set: Created 10 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/url_canon_unittest.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 2009, Google Inc. 1 // Copyright 2009, Google Inc.
2 // All rights reserved. 2 // All rights reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // * Redistributions of source code must retain the above copyright 8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer. 9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above 10 // * Redistributions in binary form must reproduce the above
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 return 8; 51 return 8;
52 default: 52 default:
53 return 0; 53 return 0;
54 } 54 }
55 } 55 }
56 56
57 template<typename CHAR, typename UCHAR> 57 template<typename CHAR, typename UCHAR>
58 bool DoFindIPv4Components(const CHAR* spec, 58 bool DoFindIPv4Components(const CHAR* spec,
59 const url_parse::Component& host, 59 const url_parse::Component& host,
60 url_parse::Component components[4]) { 60 url_parse::Component components[4]) {
61 if (!host.is_nonempty())
62 return false;
63
61 int cur_component = 0; // Index of the component we're working on. 64 int cur_component = 0; // Index of the component we're working on.
62 int cur_component_begin = host.begin; // Start of the current component. 65 int cur_component_begin = host.begin; // Start of the current component.
63 int end = host.end(); 66 int end = host.end();
64 for (int i = host.begin; /* nothing */; i++) { 67 for (int i = host.begin; /* nothing */; i++) {
65 if (i == end || spec[i] == '.') { 68 if (i >= end || spec[i] == '.') {
66 // Found the end of the current component. 69 // Found the end of the current component.
67 int component_len = i - cur_component_begin; 70 int component_len = i - cur_component_begin;
68 components[cur_component] = 71 components[cur_component] =
69 url_parse::Component(cur_component_begin, component_len); 72 url_parse::Component(cur_component_begin, component_len);
70 73
71 // The next component starts after the dot. 74 // The next component starts after the dot.
72 cur_component_begin = i + 1; 75 cur_component_begin = i + 1;
73 cur_component++; 76 cur_component++;
74 77
75 // Don't allow empty components (two dots in a row), except we may 78 // Don't allow empty components (two dots in a row), except we may
76 // allow an empty component at the end (this would indicate that the 79 // allow an empty component at the end (this would indicate that the
77 // input ends in a dot). We also want to error if the component is 80 // input ends in a dot). We also want to error if the component is
78 // empty and it's the only component (cur_component == 1). 81 // empty and it's the only component (cur_component == 1).
79 if (component_len == 0 && (i != end || cur_component == 1)) 82 if (component_len == 0 && (i != end || cur_component == 1))
Peter Kasting 2010/05/11 18:34:33 You should change "i != end" to "i < end" here.
80 return false; 83 return false;
81 84
82 if (i == end) 85 if (i >= end)
83 break; // End of the input. 86 break; // End of the input.
84 87
85 if (cur_component == 4) { 88 if (cur_component == 4) {
86 // Anything else after the 4th component is an error unless it is a 89 // Anything else after the 4th component is an error unless it is a
87 // dot that would otherwise be treated as the end of input. 90 // dot that would otherwise be treated as the end of input.
88 if (spec[i] == '.' && i + 1 == end) 91 if (spec[i] == '.' && i + 1 == end)
89 break; 92 break;
90 return false; 93 return false;
91 } 94 }
92 } else if (static_cast<UCHAR>(spec[i]) >= 0x80 || 95 } else if (static_cast<UCHAR>(spec[i]) >= 0x80 ||
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 } 728 }
726 729
727 bool IPv6AddressToNumber(const char16* spec, 730 bool IPv6AddressToNumber(const char16* spec,
728 const url_parse::Component& host, 731 const url_parse::Component& host,
729 unsigned char address[16]) { 732 unsigned char address[16]) {
730 return DoIPv6AddressToNumber<char16, char16>(spec, host, address); 733 return DoIPv6AddressToNumber<char16, char16>(spec, host, address);
731 } 734 }
732 735
733 736
734 } // namespace url_canon 737 } // namespace url_canon
OLDNEW
« no previous file with comments | « no previous file | src/url_canon_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698