On Tue, Oct 13, 2015 at 08:10:03PM +0200, Mildis wrote:
> 
> Le 2015-10-10 15:49, Willy Tarreau a écrit :
> >Hi,
> 
> >@@ -856,11 +883,28 @@ struct sockaddr_storage *str2sa_range(const char
> >*str, int *low, int *high, char
> >     else { /* IPv4 and IPv6 */
> >             int use_fqdn = 0;
> >
> >-            port1 = strrchr(str2, ':');
> >-            if (port1)
> >-                    *port1++ = '\0';
> >-            else
> >+            /* IPv6 wildcard */
> >+            if (!strcmp(str2, "::")) {
> >+                    port1 = "";
> >+            }
> >
> >You're changing the parser here, because it now accepts "::" in a place
> >where a port was expected.
> 
> May I ask : isn???t the parser just a parser ? Making the caller???s 
> responsibility to use or not the ports returned either in the 
> sockaddr_storage or the 2 int depending on the context ? (???bind??? 
> requires a port but ???server??????s port is optional)
> Is str2sa_range aware of the context it???s called ?

str2sa_range() parses ports, it relies on str2ip2() which only takes
addresses. So according to this it *is* the caller. Your change above
broke this because you're making the former ignore its own responsibility
to properly consider the port which is mandatory if the address contains
a colon. And that's precisely because str2sa_range() doesn't have to be
aware of the context it's called that we want it to behave consistently.

Regards,
Willy


Reply via email to