else {
struct sockaddr_storage *ss2;
- ss2 = str2sa_range(str, &port, &end);
+ ss2 = str2sa_range(str, &port, &end, NULL);
if (!ss2) {
memprintf(err, "invalid listening address: '%s'\n", str);
goto fail;
struct sockaddr_storage *sk;
int port1, port2;
- sk = str2sa_range(args[1], &port1, &port2);
+ sk = str2sa_range(args[1], &port1, &port2, NULL);
if (!sk) {
Alert("parsing [%s:%d] : '%s' : unknown host in '%s'\n", file, linenum, args[0], args[1]);
err_code |= ERR_ALERT | ERR_FATAL;
newpeer->last_change = now.tv_sec;
newpeer->id = strdup(args[1]);
- sk = str2sa_range(args[2], &port1, &port2);
+ sk = str2sa_range(args[2], &port1, &port2, NULL);
if (!sk) {
Alert("parsing [%s:%d] : '%s %s' : unknown host in '%s'\n", file, linenum, args[0], args[1], args[2]);
err_code |= ERR_ALERT | ERR_FATAL;
else if (warnifnotcap(curproxy, PR_CAP_BE, file, linenum, args[0], NULL))
err_code |= ERR_WARN;
- sk = str2sa_range(args[1], &port1, &port2);
+ sk = str2sa_range(args[1], &port1, &port2, NULL);
if (!sk) {
Alert("parsing [%s:%d] : '%s' : unknown host in '%s'\n", file, linenum, args[0], args[1]);
err_code |= ERR_ALERT | ERR_FATAL;
* - IP:+N => port=+N, relative
* - IP:-N => port=-N, relative
*/
- sk = str2sa_range(args[2], &port1, &port2);
+ sk = str2sa_range(args[2], &port1, &port2, NULL);
if (!sk) {
Alert("parsing [%s:%d] : Unknown host in '%s'\n", file, linenum, args[2]);
err_code |= ERR_ALERT | ERR_FATAL;
struct sockaddr_storage *sk;
int port1, port2;
- sk = str2sa_range(args[cur_arg + 1], &port1, &port2);
+ sk = str2sa_range(args[cur_arg + 1], &port1, &port2, NULL);
if (!sk) {
Alert("parsing [%s:%d] : '%s' : unknown host in '%s'\n",
file, linenum, args[cur_arg], args[cur_arg + 1]);
goto out;
}
newsrv->conn_src.opts |= CO_SRC_BIND;
- sk = str2sa_range(args[cur_arg + 1], &port_low, &port_high);
+ sk = str2sa_range(args[cur_arg + 1], &port_low, &port_high, NULL);
if (!sk) {
Alert("parsing [%s:%d] : Unknown host in '%s'\n", file, linenum, args[cur_arg + 1]);
err_code |= ERR_ALERT | ERR_FATAL;
struct sockaddr_storage *sk;
int port1, port2;
- sk = str2sa_range(args[cur_arg + 1], &port1, &port2);
+ sk = str2sa_range(args[cur_arg + 1], &port1, &port2, NULL);
if (!sk) {
Alert("parsing [%s:%d] : '%s' : unknown host in '%s'\n",
file, linenum, args[cur_arg], args[cur_arg + 1]);
struct sockaddr_storage *sk;
int port1, port2;
- sk = str2sa_range(args[1], &port1, &port2);
+ sk = str2sa_range(args[1], &port1, &port2, NULL);
if (!sk) {
Alert("parsing [%s:%d] : '%s' : unknown host in '%s'\n",
file, linenum, args[0], args[1]);
curproxy->conn_src.iface_name = NULL;
curproxy->conn_src.iface_len = 0;
- sk = str2sa_range(args[1], &port1, &port2);
+ sk = str2sa_range(args[1], &port1, &port2, NULL);
if (!sk) {
Alert("parsing [%s:%d] : '%s' : unknown host in '%s'\n",
file, linenum, args[0], args[1]);
goto out;
}
} else {
- struct sockaddr_storage *sk = str2sa_range(args[cur_arg + 1], &port1, &port2);
+ struct sockaddr_storage *sk = str2sa_range(args[cur_arg + 1], &port1, &port2, NULL);
if (!sk) {
Alert("parsing [%s:%d] : '%s' : unknown host in '%s'\n",
* returned if the address cannot be parsed. The <low> and <high> ports are
* always initialized if non-null.
*/
-struct sockaddr_storage *str2sa_range(const char *str, int *low, int *high)
+struct sockaddr_storage *str2sa_range(const char *str, int *low, int *high, char **err)
{
struct sockaddr_storage *ret = NULL;
char *str2;
portl = porth = porta = 0;
str2 = strdup(str);
- if (str2 == NULL)
+ if (str2 == NULL) {
+ memprintf(err, "out of memory in '%s'\n", __FUNCTION__);
goto out;
+ }
port1 = strrchr(str2, ':');
if (port1)
port1 = "";
ret = str2ip(str2);
- if (!ret)
+ if (!ret) {
+ memprintf(err, "invalid address: '%s' in '%s'\n", str2, str);
goto out;
+ }
if (isdigit(*port1)) { /* single port or range */
port2 = strchr(port1, '-');
porta = porth;
}
else if (*port1) { /* other any unexpected char */
+ memprintf(err, "invalid character '%c' in port number '%s'\n", *port1, port1);
ret = NULL;
goto out;
}