*
* @param[in] buf buffer holding one or more DNS labels
* @param[in] buf_len total length of the buffer
+ * @param[in] start where to start looking
* @return
* - <=0 on error, where in the buffer the invalid label is located.
* - > 0 total size of the encoded label(s). Will be <= buf_len
*/
-ssize_t fr_dns_labels_network_verify(uint8_t const *buf, size_t buf_len)
+ssize_t fr_dns_labels_network_verify(uint8_t const *buf, size_t buf_len, uint8_t const *start)
{
ssize_t slen;
- uint8_t const *label;
+ uint8_t const *label = start;
uint8_t const *end = buf + buf_len;
- for (label = buf; label < end; /* nothing */) {
+ while (label < end) {
if (*label == 0x00) {
label++;
break;
*
* The output type is always FR_TYPE_STRING
*
- * Note that the caller MUST call fr_dns_labels_network_verify(src, len)
+ * Note that the caller MUST call fr_dns_labels_network_verify(src, len, start)
* before calling this function. Otherwise bad things will happen.
*
* @param[in] ctx Where to allocate any talloc buffers required.
ssize_t fr_dns_label_network_length(uint8_t const *buf, size_t buf_len);
-ssize_t fr_dns_labels_network_verify(uint8_t const *buf, size_t buf_len);
+ssize_t fr_dns_labels_network_verify(uint8_t const *buf, size_t buf_len, uint8_t const *start) CC_HINT(nonnull);
ssize_t fr_dns_label_to_value_box(TALLOC_CTX *ctx, fr_value_box_t *dst,
uint8_t const *src, size_t len, uint8_t const *label,
* If any of the labels point outside of this
* area, OR they are otherwise invalid, then that's an error.
*/
- slen = fr_dns_labels_network_verify(data, data_len);
+ slen = fr_dns_labels_network_verify(data, data_len, data);
if (slen < 0) {
raw:
return decode_raw(ctx, cursor, dict, parent, data, data_len, decode_ctx);