ubus: increase message size limit and make it configurable at build-time
authorAlexandru Ardelean <ardeleanalex@gmail.com>
Fri, 27 Jun 2014 16:11:40 +0000 (19:11 +0300)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 3 Jul 2014 10:44:19 +0000 (12:44 +0200)
CMakeLists.txt
libubus-io.c
libubus.c
libubus.h
ubusmsg.h

index e3b150b7310eef35a022a02a742b9e8459e1a902..cb2f42035d61bbeee99b221470f2a045b2e13a56 100644 (file)
@@ -9,8 +9,10 @@ OPTION(ENABLE_SYSTEMD "systemd support" ON)
 
 SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
 SET(UBUS_UNIX_SOCKET "/var/run/ubus.sock")
+SET(UBUS_MAX_MSGLEN 1048576)
 
 ADD_DEFINITIONS( -DUBUS_UNIX_SOCKET="${UBUS_UNIX_SOCKET}")
+ADD_DEFINITIONS( -DUBUS_MAX_MSGLEN=${UBUS_MAX_MSGLEN})
 
 IF(APPLE)
   INCLUDE_DIRECTORIES(/opt/local/include)
index c63a9201cd713256ed6616b75427ff4f9087034e..48bb72db1963b7aef1b32e8018d207e0736cab10 100644 (file)
@@ -233,6 +233,7 @@ static bool get_next_msg(struct ubus_context *ctx, int *recv_fd)
                struct blob_attr data;
        } hdrbuf;
        struct iovec iov = STATIC_IOV(hdrbuf);
+       int len;
        int r;
 
        /* receive header + start attribute */
@@ -247,6 +248,15 @@ static bool get_next_msg(struct ubus_context *ctx, int *recv_fd)
        if (!ubus_validate_hdr(&hdrbuf.hdr))
                return false;
 
+       len = blob_raw_len(&hdrbuf.data);
+       if (len > ctx->msgbuf_data_len) {
+               ctx->msgbuf.data = realloc(ctx->msgbuf.data, len * sizeof(char));
+               if (ctx->msgbuf.data)
+                       ctx->msgbuf_data_len = len;
+       }
+       if (!ctx->msgbuf.data)
+               return false;
+
        memcpy(&ctx->msgbuf.hdr, &hdrbuf.hdr, sizeof(hdrbuf.hdr));
        memcpy(ctx->msgbuf.data, &hdrbuf.data, sizeof(hdrbuf.data));
 
index 83a2c43540c828f5e36c7e868f4b1799c627a72b..be4e6acdd797480225631b45d70e27909bbe0bcb 100644 (file)
--- a/libubus.c
+++ b/libubus.c
@@ -280,9 +280,10 @@ static int _ubus_connect(struct ubus_context *ctx, const char *path)
        ctx->connection_lost = ubus_default_connection_lost;
        ctx->pending_timer.cb = ubus_process_pending_msg;
 
-       ctx->msgbuf.data = calloc(UBUS_MAX_MSGLEN, sizeof(char));
+       ctx->msgbuf.data = calloc(UBUS_MSG_CHUNK_SIZE, sizeof(char));
        if (!ctx->msgbuf.data)
                return -1;
+       ctx->msgbuf_data_len = UBUS_MSG_CHUNK_SIZE;
 
        INIT_LIST_HEAD(&ctx->requests);
        INIT_LIST_HEAD(&ctx->pending);
index 33a99aafd317c8d4680324a62e6566c5630412b2..78ffa38e7e3a4197fc5aedbc4a6c7c9ba09593c6 100644 (file)
--- a/libubus.h
+++ b/libubus.h
@@ -155,6 +155,7 @@ struct ubus_context {
        void (*connection_lost)(struct ubus_context *ctx);
 
        struct ubus_msghdr_buf msgbuf;
+       uint32_t msgbuf_data_len;
 };
 
 struct ubus_object_data {
index c9b92e7132edb039618a21921bc695396a722b0e..0a27b42a5c141c209798c0f245543c121ffba597 100644 (file)
--- a/ubusmsg.h
+++ b/ubusmsg.h
@@ -19,7 +19,7 @@
 
 #define __packetdata __attribute__((packed)) __attribute__((__aligned__(4)))
 
-#define UBUS_MAX_MSGLEN        65536
+#define UBUS_MSG_CHUNK_SIZE    65536
 
 #define UBUS_SYSTEM_OBJECT_EVENT       1
 #define UBUS_SYSTEM_OBJECT_MAX         1024