From patchwork Tue Jan 4 09:11:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sven Eckelmann X-Patchwork-Id: 18446 X-Patchwork-Delegate: sw@simonwunderlich.de Return-Path: X-Original-To: patchwork@open-mesh.org Delivered-To: patchwork@open-mesh.org Received: from diktynna.open-mesh.org (localhost [IPv6:::1]) by diktynna.open-mesh.org (Postfix) with ESMTP id D1FC183F1E; Tue, 4 Jan 2022 10:11:37 +0100 (CET) Received: from dvalin.narfation.org (dvalin.narfation.org [IPv6:2a00:17d8:100::8b1]) by diktynna.open-mesh.org (Postfix) with ESMTPS id B5966804DC for ; Tue, 4 Jan 2022 10:11:34 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=narfation.org; s=20121; t=1641287494; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=x4ZuxcQKn5Kd6na7ZtlXyyNr+dE1DE2xOyqNWjhcXyw=; b=qcHb/Po4d7aCLX9PMnGOlLcr/kvUkG7iw0bXCJ84FdW6243R67PFqSqb5DtUsCAVkLr9K7 +q67Te5gADAc660pFt8CExLdrCZZOTKDJ0M/m6p4x+DBK+y9AG57/kXZ6Wga2gfoGOpt/V NhyKVu6PqedANNQcrEHicKDduCQeTiQ= From: Sven Eckelmann To: b.a.t.m.a.n@lists.open-mesh.org Cc: Sven Eckelmann Subject: [PATCH 1/2] alfred: Avoid large send buffer for fixed size IPC commands Date: Tue, 4 Jan 2022 10:11:02 +0100 Message-Id: <20220104091103.162365-1-sven@narfation.org> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 ARC-Authentication-Results: i=1; diktynna.open-mesh.org; dkim=pass header.d=narfation.org header.s=20121 header.b="qcHb/Po4"; dmarc=pass (policy=none) header.from=narfation.org; spf=pass (diktynna.open-mesh.org: domain of sven@narfation.org designates 2a00:17d8:100::8b1 as permitted sender) smtp.mailfrom=sven@narfation.org ARC-Seal: i=1; s=20121; d=open-mesh.org; t=1641287494; a=rsa-sha256; cv=none; b=DitUNkU1wa5nQPx8PhKe05M52kXxcelNFbWYB29PmZF8UG9bbHzmfqVWrtbkUWo9/15YXx eqZqENPldEbkrQpLCAw5QwRFZwcZquH6J++Rg79dv7orcccd3mCeVE4sXrOJ8CVs9fta8m w7wKWUoLQo1XjtHLZlvIt2rOBFgdjJA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=open-mesh.org; s=20121; t=1641287494; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding:dkim-signature; bh=x4ZuxcQKn5Kd6na7ZtlXyyNr+dE1DE2xOyqNWjhcXyw=; b=G6MGhrKv++v723eGJg6qFcxbsL+6utH+i4hOM3TQhea1LHPdrd/JiF6vdqJdAjD2yUNVi/ uIQ1JLKfH4miW62Fwuy18TR9LZUzQWfQf5C2giFPa4I/Al3muZJpzByIdOE9PXTBfVi1Ys T5SByShgKQ2EXnnoso+VwK4C8n445gE= Message-ID-Hash: MA5NJ2ME6INLETW2IFM7QCWTHYIZXH7G X-Message-ID-Hash: MA5NJ2ME6INLETW2IFM7QCWTHYIZXH7G X-MailFrom: sven@narfation.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-b.a.t.m.a.n.lists.open-mesh.org-0; header-match-b.a.t.m.a.n.lists.open-mesh.org-1; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.1 Precedence: list Reply-To: The list for a Better Approach To Mobile Ad-hoc Networking List-Id: The list for a Better Approach To Mobile Ad-hoc Networking Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: For data related IPC commands, a buffer of 65527 bytes is necessary to send or receive a complete command. But for non-data related IPC commands usually have a fixed size. It is therefore enough to allocate exactly the minimum required amount of bytes on the stack for non-data related IPC commands. Signed-off-by: Sven Eckelmann Acked-by: Marek Lindner --- client.c | 83 ++++++++++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 45 deletions(-) diff --git a/client.c b/client.c index e1107bf..b5faf3b 100644 --- a/client.c +++ b/client.c @@ -23,7 +23,7 @@ int alfred_client_request_data(struct globals *globals) { unsigned char buf[MAX_PAYLOAD], *pos; - struct alfred_request_v0 *request; + struct alfred_request_v0 request; struct alfred_push_data_v0 *push; struct alfred_status_v0 *status; struct alfred_tlv *tlv; @@ -34,17 +34,16 @@ int alfred_client_request_data(struct globals *globals) if (unix_sock_open_client(globals)) return -1; - request = (struct alfred_request_v0 *)buf; - len = sizeof(*request); + len = sizeof(request); - request->header.type = ALFRED_REQUEST; - request->header.version = ALFRED_VERSION; - request->header.length = sizeof(*request) - sizeof(request->header); - request->header.length = htons(request->header.length); - request->requested_type = globals->clientmode_arg; - request->tx_id = get_random_id(); + request.header.type = ALFRED_REQUEST; + request.header.version = ALFRED_VERSION; + request.header.length = sizeof(request) - sizeof(request.header); + request.header.length = htons(request.header.length); + request.requested_type = globals->clientmode_arg; + request.tx_id = get_random_id(); - ret = write(globals->unix_sock, buf, len); + ret = write(globals->unix_sock, &request, len); if (ret != len) fprintf(stderr, "%s: only wrote %d of %d bytes: %s\n", __func__, ret, len, strerror(errno)); @@ -179,26 +178,24 @@ int alfred_client_set_data(struct globals *globals) int alfred_client_modeswitch(struct globals *globals) { - unsigned char buf[MAX_PAYLOAD]; - struct alfred_modeswitch_v0 *modeswitch; + struct alfred_modeswitch_v0 modeswitch; int ret, len; if (unix_sock_open_client(globals)) return -1; - modeswitch = (struct alfred_modeswitch_v0 *)buf; - len = sizeof(*modeswitch); + len = sizeof(modeswitch); - modeswitch->header.type = ALFRED_MODESWITCH; - modeswitch->header.version = ALFRED_VERSION; - modeswitch->header.length = htons(len - sizeof(modeswitch->header)); + modeswitch.header.type = ALFRED_MODESWITCH; + modeswitch.header.version = ALFRED_VERSION; + modeswitch.header.length = htons(len - sizeof(modeswitch.header)); switch (globals->opmode) { case OPMODE_SECONDARY: - modeswitch->mode = ALFRED_MODESWITCH_SECONDARY; + modeswitch.mode = ALFRED_MODESWITCH_SECONDARY; break; case OPMODE_PRIMARY: - modeswitch->mode = ALFRED_MODESWITCH_PRIMARY; + modeswitch.mode = ALFRED_MODESWITCH_PRIMARY; break; default: fprintf(stderr, "%s: unknown opmode %u in modeswitch\n", @@ -206,7 +203,7 @@ int alfred_client_modeswitch(struct globals *globals) return -1; } - ret = write(globals->unix_sock, buf, len); + ret = write(globals->unix_sock, &modeswitch, len); if (ret != len) fprintf(stderr, "%s: only wrote %d of %d bytes: %s\n", __func__, ret, len, strerror(errno)); @@ -248,8 +245,7 @@ static int check_interface(const char *iface) int alfred_client_change_interface(struct globals *globals) { - unsigned char buf[MAX_PAYLOAD]; - struct alfred_change_interface_v0 *change_interface; + struct alfred_change_interface_v0 change_interface; int ret, len; char *input, *token, *saveptr; size_t interface_len; @@ -258,24 +254,23 @@ int alfred_client_change_interface(struct globals *globals) return -1; interface_len = strlen(globals->change_interface); - if (interface_len > sizeof(change_interface->ifaces)) { + if (interface_len > sizeof(change_interface.ifaces)) { fprintf(stderr, "%s: interface name list too long, not changing\n", __func__); return 0; } - change_interface = (struct alfred_change_interface_v0 *)buf; - len = sizeof(*change_interface); + len = sizeof(change_interface); - change_interface->header.type = ALFRED_CHANGE_INTERFACE; - change_interface->header.version = ALFRED_VERSION; - change_interface->header.length = htons(len - sizeof(change_interface->header)); - strncpy(change_interface->ifaces, globals->change_interface, - sizeof(change_interface->ifaces)); - change_interface->ifaces[sizeof(change_interface->ifaces) - 1] = '\0'; + change_interface.header.type = ALFRED_CHANGE_INTERFACE; + change_interface.header.version = ALFRED_VERSION; + change_interface.header.length = htons(len - sizeof(change_interface.header)); + strncpy(change_interface.ifaces, globals->change_interface, + sizeof(change_interface.ifaces)); + change_interface.ifaces[sizeof(change_interface.ifaces) - 1] = '\0'; /* test it before sending - * globals->change_interface is now saved in change_interface->ifaces + * globals->change_interface is now saved in change_interface.ifaces * and can be modified by strtok_r */ input = globals->change_interface; @@ -287,7 +282,7 @@ int alfred_client_change_interface(struct globals *globals) return 0; } - ret = write(globals->unix_sock, buf, len); + ret = write(globals->unix_sock, &change_interface, len); if (ret != len) fprintf(stderr, "%s: only wrote %d of %d bytes: %s\n", __func__, ret, len, strerror(errno)); @@ -299,8 +294,7 @@ int alfred_client_change_interface(struct globals *globals) int alfred_client_change_bat_iface(struct globals *globals) { - unsigned char buf[MAX_PAYLOAD]; - struct alfred_change_bat_iface_v0 *change_bat_iface; + struct alfred_change_bat_iface_v0 change_bat_iface; int ret, len; size_t interface_len; @@ -308,23 +302,22 @@ int alfred_client_change_bat_iface(struct globals *globals) return -1; interface_len = strlen(globals->mesh_iface); - if (interface_len > sizeof(change_bat_iface->bat_iface)) { + if (interface_len > sizeof(change_bat_iface.bat_iface)) { fprintf(stderr, "%s: batman-adv interface name list too long, not changing\n", __func__); return 0; } - change_bat_iface = (struct alfred_change_bat_iface_v0 *)buf; - len = sizeof(*change_bat_iface); + len = sizeof(change_bat_iface); - change_bat_iface->header.type = ALFRED_CHANGE_BAT_IFACE; - change_bat_iface->header.version = ALFRED_VERSION; - change_bat_iface->header.length = htons(len - sizeof(change_bat_iface->header)); - strncpy(change_bat_iface->bat_iface, globals->mesh_iface, - sizeof(change_bat_iface->bat_iface)); - change_bat_iface->bat_iface[sizeof(change_bat_iface->bat_iface) - 1] = '\0'; + change_bat_iface.header.type = ALFRED_CHANGE_BAT_IFACE; + change_bat_iface.header.version = ALFRED_VERSION; + change_bat_iface.header.length = htons(len - sizeof(change_bat_iface.header)); + strncpy(change_bat_iface.bat_iface, globals->mesh_iface, + sizeof(change_bat_iface.bat_iface)); + change_bat_iface.bat_iface[sizeof(change_bat_iface.bat_iface) - 1] = '\0'; - ret = write(globals->unix_sock, buf, len); + ret = write(globals->unix_sock, &change_bat_iface, len); if (ret != len) fprintf(stderr, "%s: only wrote %d of %d bytes: %s\n", __func__, ret, len, strerror(errno));