* cannot be resolved, or resolve later!
*/
p = NULL;
- cs = value;
-
{
fr_ipaddr_t ipaddr;
+ char ipv4[16];
/*
* Convert things which are obviously integers to IP addresses
break;
}
+ /*
+ * Certain applications/databases print IPv4 addresses with a
+ * /32 suffix. Strip it off if the mask is 32, else error out.
+ */
+ p = strchr(value, '/');
+ if (p) {
+ if ((p[1] != '3') || (p[2] != '2')) {
+ fr_strerror_printf("Invalid IP address suffix \"%s\". Only '/32' permitted "
+ "for non-prefix types", p);
+ return false;
+ }
+
+ strlcpy(ipv4, value, sizeof(ipv4));
+ ipv4[p - value] = '\0';
+ cs = ipv4;
+ } else {
+ cs = value;
+ }
+
if (ip_hton(cs, AF_INET, &ipaddr) < 0) {
fr_strerror_printf("Failed to find IP address for %s", cs);
return false;
}
} else {
if (!pairparsevalue(vp, value)) {
- ERROR("rlm_sql: Error parsing value");
+ ERROR("rlm_sql: Error parsing value: %s", fr_strerror());
talloc_free(vp);
return -1;
if (!row)
break;
if (sql_userparse(ctx, pair, row) != 0) {
- ERROR("rlm_sql (%s): Error getting data from database", inst->config->xlat_name);
+ ERROR("rlm_sql (%s): Error parsing user data from database result", inst->config->xlat_name);
(inst->module->sql_finish_select_query)(*handle, inst->config);