+static bool alloc_msg_buf(struct ubus_context *ctx, int len)
+{
+ void *ptr;
+ int buf_len = ctx->msgbuf_data_len;
+ int rem;
+
+ if (!ctx->msgbuf.data)
+ buf_len = 0;
+
+ rem = (len % UBUS_MSG_CHUNK_SIZE);
+ if (rem > 0)
+ len += UBUS_MSG_CHUNK_SIZE - rem;
+
+ if (len < buf_len &&
+ ++ctx->msgbuf_reduction_counter > UBUS_MSGBUF_REDUCTION_INTERVAL) {
+ ctx->msgbuf_reduction_counter = 0;
+ buf_len = 0;
+ }
+
+ if (len <= buf_len)
+ return true;
+
+ ptr = realloc(ctx->msgbuf.data, len);
+ if (!ptr)
+ return false;
+
+ ctx->msgbuf.data = ptr;
+ return true;
+}
+