- char *buf = field_buffer(field, 0);
- unsigned int ip[4];
- int n, len;
-
- while (*buf != '\0') {
- n = sscanf(buf, "%u.%u.%u.%u%n",
- &ip[0], &ip[1], &ip[2], &ip[3], &len);
- if (n != 4)
- return false;
-
- if (ip[0] > 255 || ip[1] > 255 || ip[2] > 255 || ip[3] > 255)
- return false;
-
- for (buf += len; *buf != '\0'; buf++) {
- if (isspace(*buf))
- continue;
- else if (isdigit(*buf))
- break;
- else
- return false;
- }
+ char *buf, *tok, *saveptr;
+ bool result;
+ int type;
+
+ /* Use strdup directly since we can't easily reach a talloc parent */
+ buf = strdup(strip_string(field_buffer(field, 0)));
+ if (!buf)
+ /* We tried */
+ return true;
+
+ result = false;
+ tok = strtok_r(buf, " ", &saveptr);
+ if (!tok || *tok == '\0')
+ goto err;
+
+ while (tok) {
+ type = addr_scheme(tok);
+ if (!(type == AF_INET || type == AF_INET6))
+ goto err;
+
+ tok = strtok_r(NULL, " ", &saveptr);