Skip to content

Commit 1f6c79b

Browse files
committed
IPv6 is colons, not dots
1 parent 79cda86 commit 1f6c79b

File tree

1 file changed

+18
-18
lines changed

1 file changed

+18
-18
lines changed

Diff for: api/IPAddress.cpp

+18-18
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ bool IPAddress::fromString4(const char *address)
150150

151151
bool IPAddress::fromString6(const char *address) {
152152
uint32_t acc = 0; // Accumulator
153-
int dots = 0, doubledots = -1;
153+
int colons = 0, double_colons = -1;
154154

155155
while (*address)
156156
{
@@ -165,7 +165,7 @@ bool IPAddress::fromString6(const char *address) {
165165
}
166166
else if (c == ':') {
167167
if (*address == ':') {
168-
if (doubledots >= 0) {
168+
if (double_colons >= 0) {
169169
// :: allowed once
170170
return false;
171171
}
@@ -174,41 +174,41 @@ bool IPAddress::fromString6(const char *address) {
174174
return false;
175175
}
176176
// remember location
177-
doubledots = dots + !!acc;
177+
double_colons = colons + !!acc;
178178
address++;
179179
} else if (*address == '\0') {
180180
// can't end with a single colon
181181
return false;
182182
}
183-
if (dots == 7)
183+
if (colons == 7)
184184
// too many separators
185185
return false;
186-
_address.bytes[dots * 2] = acc >> 8;
187-
_address.bytes[dots * 2 + 1] = acc & 0xff;
188-
dots++;
186+
_address.bytes[colons * 2] = acc >> 8;
187+
_address.bytes[colons * 2 + 1] = acc & 0xff;
188+
colons++;
189189
acc = 0;
190190
}
191191
else
192192
// Invalid char
193193
return false;
194194
}
195195

196-
if (doubledots == -1 && dots != 7) {
196+
if (double_colons == -1 && colons != 7) {
197197
// Too few separators
198198
return false;
199199
}
200-
if (doubledots > -1 && dots > 6) {
201-
// Too many segments
200+
if (double_colons > -1 && colons > 6) {
201+
// Too many segments (double colon must be at least one zero field)
202202
return false;
203203
}
204-
_address.bytes[dots * 2] = acc >> 8;
205-
_address.bytes[dots * 2 + 1] = acc & 0xff;
206-
dots++;
207-
208-
if (doubledots != -1) {
209-
for (int i = dots * 2 - doubledots * 2 - 1; i >= 0; i--)
210-
_address.bytes[16 - dots * 2 + doubledots * 2 + i] = _address.bytes[doubledots * 2 + i];
211-
for (int i = doubledots * 2; i < 16 - dots * 2 + doubledots * 2; i++)
204+
_address.bytes[colons * 2] = acc >> 8;
205+
_address.bytes[colons * 2 + 1] = acc & 0xff;
206+
colons++;
207+
208+
if (double_colons != -1) {
209+
for (int i = colons * 2 - double_colons * 2 - 1; i >= 0; i--)
210+
_address.bytes[16 - colons * 2 + double_colons * 2 + i] = _address.bytes[double_colons * 2 + i];
211+
for (int i = double_colons * 2; i < 16 - colons * 2 + double_colons * 2; i++)
212212
_address.bytes[i] = 0;
213213
}
214214

0 commit comments

Comments
 (0)