2
0
Эх сурвалжийг харах

fix excessive stack usage

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Felix Fietkau 10 жил өмнө
parent
commit
cef25024bc
5 өөрчлөгдсөн 20 нэмэгдсэн , 20 устгасан
  1. 1 1
      cache.c
  2. 8 15
      service.c
  3. 5 4
      ubus.c
  4. 1 0
      util.c
  5. 5 0
      util.h

+ 1 - 1
cache.c

@@ -343,7 +343,7 @@ cache_dump_records(struct blob_buf *buf, const char *name)
 {
 	struct cache_record *r, *q = avl_find_element(&records, name, r, avl);
 	const char *txt;
-	char buffer[MAX_NAME_LEN];
+	char buffer[INET6_ADDRSTRLEN];
 
 	if (!q)
 		return;

+ 8 - 15
service.c

@@ -85,35 +85,28 @@ service_name(const char *domain)
 static void
 service_add_ptr(const char *host)
 {
-	unsigned char buffer[MAX_NAME_LEN];
-	int len = dn_comp(host, buffer, MAX_NAME_LEN, NULL, NULL);
+	int len = dn_comp(host, mdns_buf, sizeof(mdns_buf), NULL, NULL);
 
 	if (len < 1)
 		return;
 
-	dns_add_answer(TYPE_PTR, buffer, len);
+	dns_add_answer(TYPE_PTR, mdns_buf, len);
 }
 
 static void
 service_add_srv(struct service *s)
 {
-	unsigned char buffer[MAX_NAME_LEN];
-	struct dns_srv_data *sd;
+	struct dns_srv_data *sd = (struct dns_srv_data *) mdns_buf;
 	char *host = service_name("local");
-	int len = dn_comp(host, buffer, MAX_NAME_LEN, NULL, NULL);
+	int len = sizeof(*sd);
 
-	if (len < 1)
-		return;
-
-	sd = calloc(1, len + sizeof(struct dns_srv_data));
-	if (!sd)
+	len += dn_comp(host, mdns_buf + len, sizeof(mdns_buf) - len, NULL, NULL);
+	if (len <= sizeof(*sd))
 		return;
 
 	sd->port = cpu_to_be16(s->port);
-	memcpy(&sd[1], buffer, len);
-	host = service_name(s->service);
-	dns_add_answer(TYPE_SRV, (uint8_t *) sd, len + sizeof(struct dns_srv_data));
-	free(sd);
+	dns_add_answer(TYPE_SRV, mdns_buf, len);
+	service_name(s->service);
 }
 
 #define TOUT_LOOKUP	60

+ 5 - 4
ubus.c

@@ -20,6 +20,7 @@
 #include <libubox/avl.h>
 #include <libubox/uloop.h>
 
+#include "util.h"
 #include "ubus.h"
 #include "cache.h"
 #include "service.h"
@@ -51,10 +52,10 @@ mdns_browse(struct ubus_context *ctx, struct ubus_object *obj,
 		struct blob_attr *msg)
 {
 	struct cache_entry *s, *q;
-	char buffer[MAX_NAME_LEN];
+	char *buffer = (char *) mdns_buf;
 	void *c1 = NULL, *c2;
 
-        blob_buf_init(&b, 0);
+	blob_buf_init(&b, 0);
 	avl_for_each_element(&entries, s, avl) {
 		char *local;
 		if (*((char *) s->avl.key) != '_')
@@ -95,10 +96,10 @@ mdns_hosts(struct ubus_context *ctx, struct ubus_object *obj,
 		struct blob_attr *msg)
 {
 	struct cache_entry *s;
-	char buffer[MAX_NAME_LEN];
+	char *buffer = (char *) mdns_buf;
 	void *c;
 
-        blob_buf_init(&b, 0);
+	blob_buf_init(&b, 0);
 	avl_for_each_element(&entries, s, avl) {
 		char *local;
 		if (*((char *) s->avl.key) == '_')

+ 1 - 0
util.c

@@ -33,6 +33,7 @@
 #include "dns.h"
 #include "util.h"
 
+uint8_t mdns_buf[MDNS_BUF_LEN];
 int debug = 0;
 
 static void

+ 5 - 0
util.h

@@ -14,12 +14,17 @@
 #ifndef _UTIL_H__
 #define _UTIL_H__
 
+#include <stdint.h>
+
 #define DBG(level, fmt, ...) do { \
 	if (debug >= level) \
 		fprintf(stderr, "mdnsd: %s (%d): " fmt, __func__, __LINE__, ## __VA_ARGS__); \
 	} while (0)
 
+#define MDNS_BUF_LEN	(8 * 1024)
+
 extern int debug;
+extern uint8_t mdns_buf[MDNS_BUF_LEN];
 
 void *memdup(const void *d, int l);