diff mbox series

iwinfo: add buffer_size argument to scan method

Message ID 20210507113856.28810-1-wojciech.jowsa@gmail.com
State New
Headers show
Series iwinfo: add buffer_size argument to scan method | expand

Commit Message

Wojciech Jowsa May 7, 2021, 11:38 a.m. UTC
From: Wojciech Jowsa <w.jowsa@celerway.com>

iwinfo crashes when scan is perforemed in the area where
there are more then 500 wifi networks available. It is because
a buffer with the fixed size is used. Increasing the size of
the buffer fixes this problem. The size can be passed by
the argument to the iwinfo scan call.

Signed-off-by: Wojciech Jowsa <wojciech.jowsa@gmail.com>
---
 iwinfo.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/iwinfo.c b/iwinfo.c
index ba4fc1e..ce48725 100644
--- a/iwinfo.c
+++ b/iwinfo.c
@@ -29,6 +29,7 @@ 
 
 #include <rpcd/plugin.h>
 
+#define IWINFO_BUFSIZE_MAX 1024 * 1024
 
 static struct blob_buf buf;
 static const struct iwinfo_ops *iw;
@@ -63,6 +64,17 @@  static const struct blobmsg_policy rpc_uci_policy[__RPC_U_MAX] = {
 	[RPC_U_SECTION] = { .name = "section", .type = BLOBMSG_TYPE_STRING },
 };
 
+enum {
+	RPC_S_DEVICE,
+	RPC_S_BUFFSIZE,
+	__RPC_S_MAX,
+};
+
+static const struct blobmsg_policy rpc_scan_policy[__RPC_S_MAX] = {
+	[RPC_S_DEVICE] = { .name = "device", .type = BLOBMSG_TYPE_STRING },
+	[RPC_S_BUFFSIZE] = { .name = "buffer_size", .type = BLOBMSG_TYPE_INT32 }
+};
+
 static int
 __rpc_iwinfo_open(struct blob_attr *device)
 {
@@ -454,12 +466,24 @@  rpc_iwinfo_scan(struct ubus_context *ctx, struct ubus_object *obj,
                 struct ubus_request_data *req, const char *method,
                 struct blob_attr *msg)
 {
-	int i, rv, len;
+	int i, rv, len, buffer_size = IWINFO_BUFSIZE;
 	void *c, *d, *t;
 	char mac[18];
-	char res[IWINFO_BUFSIZE];
+	struct blob_attr *tb[__RPC_S_MAX];
 	struct iwinfo_scanlist_entry *e;
 
+	blobmsg_parse(rpc_scan_policy, __RPC_S_MAX, tb,
+	              blob_data(msg), blob_len(msg));
+
+	if(tb[RPC_S_BUFFSIZE]) {
+		buffer_size = blobmsg_get_u32(tb[RPC_S_BUFFSIZE]);
+		if (buffer_size > IWINFO_BUFSIZE_MAX) {
+			buffer_size = IWINFO_BUFSIZE_MAX;
+		}
+	}
+
+	char res[buffer_size];
+
 	rv = rpc_iwinfo_open(msg);
 
 	if (rv)
@@ -965,7 +989,7 @@  rpc_iwinfo_api_init(const struct rpc_daemon_ops *o, struct ubus_context *ctx)
 	static const struct ubus_method iwinfo_methods[] = {
 		UBUS_METHOD_NOARG("devices", rpc_iwinfo_devices),
 		UBUS_METHOD("info",        rpc_iwinfo_info,        rpc_device_policy),
-		UBUS_METHOD("scan",        rpc_iwinfo_scan,        rpc_device_policy),
+		UBUS_METHOD("scan",        rpc_iwinfo_scan,        rpc_scan_policy),
 		UBUS_METHOD("assoclist",   rpc_iwinfo_assoclist,   rpc_assoclist_policy),
 		UBUS_METHOD("freqlist",    rpc_iwinfo_freqlist,    rpc_device_policy),
 		UBUS_METHOD("txpowerlist", rpc_iwinfo_txpowerlist, rpc_device_policy),