[PATCH] iwinfo: add buffer_size argument to scan method

Wojciech Jowsa wojciech.jowsa at gmail.com
Fri May 7 12:38:56 BST 2021


From: Wojciech Jowsa <w.jowsa at 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 at gmail.com>
---
 iwinfo.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

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),
-- 
2.25.1




More information about the openwrt-devel mailing list