sd_bus_message *m,
size_t *ri,
uint32_t array_size,
- const char **signature) {
+ const char **signature,
+ unsigned depth) {
size_t original_index;
int r;
assert(ri);
assert(signature);
+ if (depth >= BUS_CONTAINER_DEPTH)
+ return log_debug_errno(SYNTHETIC_ERRNO(EBADMSG), "Maximum container nesting depth reached, refusing.");
+
original_index = *ri;
for (;;) {
if (r < 0)
return r;
- r = message_skip_fields(m, ri, nas, (const char**) &s);
+ r = message_skip_fields(m, ri, nas, (const char**) &s, depth + 1);
if (r < 0)
return r;
}
if (r < 0)
return r;
- r = message_skip_fields(m, ri, UINT32_MAX, &s);
+ r = message_skip_fields(m, ri, UINT32_MAX, &s, depth + 1);
if (r < 0)
return r;
strncpy(sig, *signature + 1, l);
sig[l] = '\0';
- r = message_skip_fields(m, ri, UINT32_MAX, (const char**) &s);
+ r = message_skip_fields(m, ri, UINT32_MAX, (const char**) &s, depth + 1);
if (r < 0)
return r;
}
break;
default:
- r = message_skip_fields(m, &ri, UINT32_MAX, &signature);
+ r = message_skip_fields(m, &ri, UINT32_MAX, &signature, 0);
}
if (r < 0)
return r;