From patchwork Fri Jan 15 16:41:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sava Jakovljev X-Patchwork-Id: 1427141 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=googlegroups.com (client-ip=2a00:1450:4864:20::340; helo=mail-wm1-x340.google.com; envelope-from=swupdate+bncbaabbselq6aamgqekla2g4y@googlegroups.com; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=teufel.de Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.a=rsa-sha256 header.s=20161025 header.b=QKVffscy; dkim-atps=neutral Received: from mail-wm1-x340.google.com (mail-wm1-x340.google.com [IPv6:2a00:1450:4864:20::340]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DHRm028vvz9sVs for ; Sat, 16 Jan 2021 03:41:49 +1100 (AEDT) Received: by mail-wm1-x340.google.com with SMTP id g82sf3193533wmg.6 for ; Fri, 15 Jan 2021 08:41:49 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1610728904; cv=pass; d=google.com; s=arc-20160816; b=0su4c8+6MbRRAN5tqdg0vC2f3aT+L9AQtvIumy7PWFD2kqJHRgZoklXrobiQa2ZLvv G94+QbwNJVTIWg+yI75DgkXUocmxc9wxnRdu9DhIz5J/Z//VqjWIfN6GSFDaIp7XU9gh PzkNDTmaqg/53AT5lcTny8tmMWq3EAkDqecpaXAuGwy1RDWzIJtFfQ1emmMd8AOr80MC 9U1Y6dkexKY7ftLj3yVcWrpMASvRddL+sjiite80NlWBoYGCFRKOBO6jXT2gZhavcaHt CNdIZRMtS/9J0BGQOfkAk2Ci9OtZv2zzwLo0X38yj5KBc2WEXZzh64MOAeE1ME1HvxNM xAVA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:mime-version:message-id:date :subject:cc:to:from:sender:dkim-signature; bh=6vREn22CqndWA4Zvv0FSXXCkFMR6Ppfr144uNoDfn5w=; b=v6yJRFTwxS4MxRtHvKUj3rVtj9k4Gc5S5HpK0p1MvzSLeqwD5zZtFOfKp82XoK4tYR 9hk8nVtYfXxYChu+TaAk3eBx2UD7vO0LlxrGPmufz7x2FvBWN3FRoJKOiCL3Du9H9n2v de4MXsG+Ief4tuPhZ7xCbb3gFfzu9r4v2l2dzSBFZYQ8uJVhJ6emED0BW+uxYRf8Hvh0 tSHm5XPsYZ9z/3aiY+VoDMTPMRIzmKJ7CxrRHqw3OshAsDhU5d/hkJ8KoA1idBntSAa8 /3dpc4vB5ke/VPGvQtLbg0nsVsHJt1deOTcES7sNqlzZf8ENzhHZQnzV6lNJS9CUIiZz nuvg== ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@teufel.de header.s=hse1 header.b=pHNyISj5; spf=pass (google.com: domain of sava.jakovljev@teufel.de designates 83.246.65.198 as permitted sender) smtp.mailfrom=sava.jakovljev@teufel.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:mime-version :x-original-sender:x-original-authentication-results:precedence :mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=6vREn22CqndWA4Zvv0FSXXCkFMR6Ppfr144uNoDfn5w=; b=QKVffscyw4+ZPuIk8YcliYvD33u7DfuujKVduP+kmE5EGlAprg8e2izj2d+hufyKh6 bXlgxP+cy4kaYzPzmvdKTGFDIUVgB01NqLPsvNtSESvYHyIkMm4PCGZV2UjhUq6rmOCa tqcQp5dwYMsulLd2ByLhOblNdE8h4BtLJOkqp7oJrCtLW5yTr0xPHsCnVAMOs7cXvGzn Ut/Ei3YX6t1rY/7d91gig4tRGPsI/OfvCih7qqD7kgNhTNeSf/XTnd2a+dz/TKrPIPbu OvpBpSgHCV/dWaZAhlOQiNmy3xc6S+wZFogGoarjf6GCOpfyY3eB1k6ac8Q1kZr/in1c +trA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=sender:x-gm-message-state:from:to:cc:subject:date:message-id :mime-version:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:x-spam-checked-in-group:list-post :list-help:list-archive:list-subscribe:list-unsubscribe; bh=6vREn22CqndWA4Zvv0FSXXCkFMR6Ppfr144uNoDfn5w=; b=BjiXJDmXYk4Qf3UTYaiube+JYi5ufTkefO/Vu5EQD+W14CtRBG9vw+jK6J0oJxvAo5 vJ7RqjAHLjYOSRcHdSX41dUR03u04UBy1LmUerhs53ryo71oWLvJ4J8xcRk8YQyLOXy4 7J0Ea2EL1yJH00Os6QDkQJ5eJOeZMNZwh7Y/dXeqdJsXYrBTVA7MaUfNnQjys9Bk6RgE hm4/kTBCp1hbshausKylO+hUyhCt5LaSTSxKn1ni/rNa5l7QsfsInDesug21hF1B2SZO 5QdsSdholFFoawS1syfsiTMNPrcEg/UQ/Pl7TvPgw+4fML/Tl0MvAg1wONDuzjgWxyaj X++w== Sender: swupdate@googlegroups.com X-Gm-Message-State: AOAM532I984Jh1e0kLzI/V3AVY/2D3vMV+g0UGec1COpBsDfJKDNaGio XOFld+Nmxjokmjft6pZcWM0= X-Google-Smtp-Source: ABdhPJxyBGHSLAKp3uR7zh2HBBYjC1tnhnBHkengnZhMCPhFitfDo0GtncwEue0C32joHKJdPZVKVw== X-Received: by 2002:a1c:e4c5:: with SMTP id b188mr9669560wmh.78.1610728904487; Fri, 15 Jan 2021 08:41:44 -0800 (PST) X-BeenThere: swupdate@googlegroups.com Received: by 2002:a1c:385:: with SMTP id 127ls2829776wmd.0.canary-gmail; Fri, 15 Jan 2021 08:41:43 -0800 (PST) X-Received: by 2002:a7b:cb04:: with SMTP id u4mr9397793wmj.117.1610728903722; Fri, 15 Jan 2021 08:41:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610728903; cv=none; d=google.com; s=arc-20160816; b=dGcZp9gw3YNGjpruwXWTMsUow6E36yMLTFqwJ/S78JY9dAv0p+Ys/F/UYp8iy9cuCv q8byvCXEasQrFJRHdJborpmVvOaDudFeXorOgp9YDvDYL+dXzPKflubuY/kMill81mWl 5uJC+WKD+ZBk8iHale/xJCvsd2w5nbdv+yGPKTJjhfpfEicZO7XKQP8qky40xdEqxyZ3 IWLAy8WGBoaGwgXrRa8RKGL+h/yBgiaaOFsEqhcA1auKZg+1NNWme+r2EQbXJanWrV5V U/m1XhxfU7T6/UdRkLWpofmZkmqNjr4jUnKNI9OKzIatkfi3uht7UVeO7pvz2Yv/QULs IEAQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=dkim-signature:content-transfer-encoding:mime-version:message-id :date:subject:cc:to:from; bh=523SepD1scyS/N2ugdqDq4Q7dUfvqLwAKh9bbvw1ZyM=; b=YHa7wT0PaIDfvhNc+HRjxSBoWccbBTX5cTeQQpAoa00l6rbSu58elKOWFgJce61lTS 9xo+pyY5Hr8xDGYQUO1t8A+NFp2Hrbzj1OVSQVeI7h3t3Km2iorHj0d4bFr6CIZcEnuP UpCW5m2CL2SCgxNZGCH5qQgeqsJ0yBzXFqGSCsgODil+psYhwDk45/aSvv68j113/fTl 8qrEctIFPcO7OiNztWOSdz3ltmhLxtFtE8nOP8uwpuDrxWT+01DzHs4VdJN1IvA7MVOq ii4GPts8V5fzmULclaRgiSKNPT5W6ZQdssiXt+Gpy9y9rN0VEFN7qKsOnzMYuZYrGBuG RzVA== ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@teufel.de header.s=hse1 header.b=pHNyISj5; spf=pass (google.com: domain of sava.jakovljev@teufel.de designates 83.246.65.198 as permitted sender) smtp.mailfrom=sava.jakovljev@teufel.de Received: from mx-relay24-hz2.antispameurope.com (mx-relay24-hz2.antispameurope.com. [83.246.65.198]) by gmr-mx.google.com with ESMTPS id e16si539750wrn.1.2021.01.15.08.41.43 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Jan 2021 08:41:43 -0800 (PST) Received-SPF: pass (google.com: domain of sava.jakovljev@teufel.de designates 83.246.65.198 as permitted sender) client-ip=83.246.65.198; Received: from unknown ([212.91.255.190]) by mx-relay24-hz2.antispameurope.com; Fri, 15 Jan 2021 17:41:43 +0100 From: Sava Jakovljev To: CC: Sava Jakovljev Subject: [swupdate] [PATCH] Make IPC more robust Date: Fri, 15 Jan 2021 17:41:17 +0100 Message-ID: <20210115164117.188573-1-sava.jakovljev@teufel.de> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 X-Originating-IP: [10.10.25.44] X-ClientProxiedBy: DNS-EX-02.teufel.local (10.10.0.81) To DNS-EX-02.teufel.local (10.10.0.81) X-C2ProcessedOrg: b93e13a0-e8da-4ba4-97b8-f14375b21c41 X-cloud-security-sender: sava.jakovljev@teufel.de X-cloud-security-recipient: swupdate@googlegroups.com X-cloud-security-Virusscan: CLEAN X-cloud-security-disclaimer: This E-Mail was scanned by E-Mailservice on mx-relay24-hz2.antispameurope.com with 079D74A3D38 X-cloud-security-connect: unknown[212.91.255.190], TLS=1, IP=212.91.255.190 X-cloud-security-Digest: 698ba30a78be7fa69e2e15c51dee71a4 X-cloud-security: scantime:1.389 X-Original-Sender: sava.jakovljev@teufel.de X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@teufel.de header.s=hse1 header.b=pHNyISj5; spf=pass (google.com: domain of sava.jakovljev@teufel.de designates 83.246.65.198 as permitted sender) smtp.mailfrom=sava.jakovljev@teufel.de Precedence: list Mailing-list: list swupdate@googlegroups.com; contact swupdate+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: swupdate@googlegroups.com X-Google-Group-Id: 605343134186 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , * Check number of bytes actually tranfsered for both read and write calls. * Do minor clean-ups. Signed-off-by: Sava Jakovljev Reviewed-by: Stefano Babic --- ipc/network_ipc.c | 133 +++++++++++++++++++----------------------------------- 1 file changed, 47 insertions(+), 86 deletions(-) diff --git a/ipc/network_ipc.c b/ipc/network_ipc.c index f3097ca..1132c84 100644 --- a/ipc/network_ipc.c +++ b/ipc/network_ipc.c @@ -40,25 +40,21 @@ char *get_ctrl_socket(void) { } static int prepare_ipc(void) { - int connfd; - int ret; - struct sockaddr_un servaddr; connfd = socket(AF_LOCAL, SOCK_STREAM, 0); - if (connfd < 0) { - return connfd; - } + if (connfd < 0) + return -1; + bzero(&servaddr, sizeof(servaddr)); servaddr.sun_family = AF_LOCAL; strncpy(servaddr.sun_path, get_ctrl_socket(), sizeof(servaddr.sun_path) - 1); - ret = connect(connfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); - if (ret < 0) { + if (connect(connfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) { close(connfd); - return ret; + return -1; } return connfd; @@ -66,11 +62,9 @@ static int prepare_ipc(void) { int ipc_postupdate(ipc_message *msg) { int connfd = prepare_ipc(); - if (connfd < 0) { + if (connfd < 0) return -1; - } - ssize_t ret; char* tmpbuf = NULL; if (msg->data.procmsg.len > 0) { if ((tmpbuf = strndupa(msg->data.procmsg.buf, @@ -81,6 +75,7 @@ int ipc_postupdate(ipc_message *msg) { return -1; } } + memset(msg, 0, sizeof(*msg)); if (tmpbuf != NULL) { msg->data.procmsg.buf[sizeof(msg->data.procmsg.buf) - 1] = '\0'; @@ -89,37 +84,27 @@ int ipc_postupdate(ipc_message *msg) { } msg->magic = IPC_MAGIC; msg->type = POST_UPDATE; - ret = write(connfd, msg, sizeof(*msg)); - if (ret != sizeof(*msg)) { - close(connfd); - return -1; - } - ret = read(connfd, msg, sizeof(*msg)); - if (ret <= 0) { - close(connfd); - return -1; - } + + int result = write(connfd, msg, sizeof(*msg)) != sizeof(*msg) || + read(connfd, msg, sizeof(*msg)) != sizeof(*msg); close(connfd); - return 0; + return -result; } static int __ipc_get_status(int connfd, ipc_message *msg, unsigned int timeout_ms) { - ssize_t ret; fd_set fds; struct timeval tv; memset(msg, 0, sizeof(*msg)); msg->magic = IPC_MAGIC; msg->type = GET_STATUS; - ret = write(connfd, msg, sizeof(*msg)); - if (ret != sizeof(*msg)) + + if (write(connfd, msg, sizeof(*msg)) != sizeof(*msg)) return -1; - if (!timeout_ms) { - ret = read(connfd, msg, sizeof(*msg)); - } else { + if (timeout_ms) { FD_ZERO(&fds); FD_SET(connfd, &fds); @@ -131,12 +116,12 @@ static int __ipc_get_status(int connfd, ipc_message *msg, unsigned int timeout_m tv.tv_sec = 0; tv.tv_usec = timeout_ms * 1000; - ret = select(connfd + 1, &fds, NULL, NULL, &tv); - if (ret <= 0 || !FD_ISSET(connfd, &fds)) - return 0; - ret = read(connfd, msg, sizeof(*msg)); + if ((select(connfd + 1, &fds, NULL, NULL, &tv) <= 0) || + !FD_ISSET(connfd, &fds)) + return -ETIMEDOUT; } - return ret; + + return -(read(connfd, msg, sizeof(*msg)) != sizeof(*msg)); } int ipc_get_status(ipc_message *msg) @@ -145,19 +130,17 @@ int ipc_get_status(ipc_message *msg) int connfd; connfd = prepare_ipc(); - if (connfd < 0) { + if (connfd < 0) return -1; - } + ret = __ipc_get_status(connfd, msg, 0); close(connfd); - if (ret > 0) - return 0; - return -1; + return ret; } /* - * @return : 0 = TIMEOUT + * @return : 0 : TIMEOUT * -1 : error * else data read */ @@ -167,24 +150,26 @@ int ipc_get_status_timeout(ipc_message *msg, unsigned int timeout_ms) int connfd; connfd = prepare_ipc(); - if (connfd < 0) { + if (connfd < 0) return -1; - } + ret = __ipc_get_status(connfd, msg, timeout_ms); close(connfd); - return ret; + /* Not very nice, but necessary in order to keep the API consistent. */ + if (timeout_ms && ret == -ETIMEDOUT) + return 0; + + return ret == 0 ? sizeof(*msg) : -1; } int ipc_inst_start_ext(void *priv, ssize_t size) { int connfd; ipc_message msg; - ssize_t ret; struct swupdate_request *req; struct swupdate_request localreq; - if (priv) { /* * To be expanded: in future if more API will @@ -217,24 +202,16 @@ int ipc_inst_start_ext(void *priv, ssize_t size) msg.type = REQ_INSTALL; msg.data.instmsg.req = *req; - ret = write(connfd, &msg, sizeof(msg)); - if (ret != sizeof(msg)) { - close(connfd); - return -1; - } - - ret = read(connfd, &msg, sizeof(msg)); - if (ret <= 0) { - close(connfd); - return -1; - } - - if (msg.type != ACK) { - close(connfd); - return -1; - } + if (write(connfd, &msg, sizeof(msg)) != sizeof(msg) || + read(connfd, &msg, sizeof(msg)) != sizeof(msg) || + msg.type != ACK) + goto cleanup; return connfd; + +cleanup: + close(connfd); + return -1; } /* @@ -252,14 +229,8 @@ int ipc_inst_start(void) */ int ipc_send_data(int connfd, char *buf, int size) { - ssize_t ret; - - ret = write(connfd, buf, (size_t)size); - if (ret != size) { - return -1; - } - - return (int)ret; + ssize_t ret = write(connfd, buf, (size_t)size); + return ret != size ? -1 : (int)ret; } void ipc_end(int connfd) @@ -279,10 +250,9 @@ int ipc_wait_for_complete(getstatus callback) if (fd < 0) break; ret = __ipc_get_status(fd, &message, 0); - ipc_end(fd); + close(fd); if (ret < 0) { - printf("__ipc_get_status returned %d\n", ret); message.data.status.last_result = FAILURE; break; } @@ -303,25 +273,16 @@ int ipc_wait_for_complete(getstatus callback) int ipc_send_cmd(ipc_message *msg) { int connfd = prepare_ipc(); - int ret; - - if (connfd < 0) { + if (connfd < 0) return -1; - } /* TODO: Check source type */ msg->magic = IPC_MAGIC; - ret = write(connfd, msg, sizeof(*msg)); - if (ret != sizeof(*msg)) { - close(connfd); - return -1; - } - ret = read(connfd, msg, sizeof(*msg)); - if (ret <= 0) { - close(connfd); - return -1; - } + + int ret = write(connfd, msg, sizeof(*msg)) != sizeof(*msg) || + read(connfd, msg, sizeof(*msg)) != sizeof(*msg); + close(connfd); - return 0; + return -ret; }