From patchwork Mon Mar 25 23:20:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sandeep Patil X-Patchwork-Id: 1064923 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=lists.linux.it (client-ip=213.254.12.146; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=android.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=android.com header.i=@android.com header.b="Yo3Rsp+d"; dkim-atps=neutral Received: from picard.linux.it (picard.linux.it [213.254.12.146]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 44Sqxn6L9cz9sSY for ; Tue, 26 Mar 2019 10:20:45 +1100 (AEDT) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id 6E02C294AFD for ; Tue, 26 Mar 2019 00:20:43 +0100 (CET) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-7.smtp.seeweb.it (in-7.smtp.seeweb.it [IPv6:2001:4b78:1:20::7]) by picard.linux.it (Postfix) with ESMTP id 0B593294AB3 for ; Tue, 26 Mar 2019 00:20:38 +0100 (CET) Received: from mail-pg1-x543.google.com (mail-pg1-x543.google.com [IPv6:2607:f8b0:4864:20::543]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by in-7.smtp.seeweb.it (Postfix) with ESMTPS id DDFBA2001A2 for ; Tue, 26 Mar 2019 00:20:36 +0100 (CET) Received: by mail-pg1-x543.google.com with SMTP id f6so3179247pgs.8 for ; Mon, 25 Mar 2019 16:20:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=android.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3gvkBOmEuwfdTKmIXZb/PKJ5+0fZ4hbOpZFH+eu4I90=; b=Yo3Rsp+ddty+RHjKICTEQOSbech19SKySGN7YndksyvlYbmHGdA7nczShQNOE5c0xt NbdChzsRANxQbMsXZVrzGCjmlk3sC0AhmdXee5ETr2UjJhjrJuuL3Kdk9QE4ObteyjDh mGpfoAXB2pqy10FV/y3f3j42J+M0ZKQRLY/vyPs4SPkxR3moVgwJYSG+pdGQrbDE+uYd Nneike82hnDmVDdIT9rZJV5wfaPNIZmMfwrkjKh1zLlkie18Ig7sqW5Iic2mx91iebHD N6DUz4Srl2k8UTNsTc1KQMCfpZNfjT7GlU+AHfa7fdCxJedjEPIDLHRZpce7xOFDo0Q9 tbPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3gvkBOmEuwfdTKmIXZb/PKJ5+0fZ4hbOpZFH+eu4I90=; b=lfWg62eP1n+EQFcVACxPXuW1mqufgetuHhJUMASPjEm30lec2yVS49qojaOAL8BCQM H2lMpwmHxdlFGNDSBujN2KzO+KWp5hR+qZtK4ecadygOEA8cTJBTMHjhdE9SAB1qw/TN 4kZ/vjMYE2i3R6T6dvfmlrPJseVtK3M+bLVZ03ov8h1zzziGLL6Fo1GI/Y5UGVlX6MRK +tCSHhNJbys0jrOj1Bnag6LXxHphdu8tHGzc3lvafRkQMecw1S0DvATio+XNpq0cRSPE t+f3rnyd+t4O3llpMqEHQw9ejLh1M3aJC2/LnSyouC5BelwNa1y67Hu1f0PsDE+akFYd 54rw== X-Gm-Message-State: APjAAAWRUQ1m9dU3w7439Uv7KvHtfYIhTBTUk0eznTYBepKbyegGILHr qJ85P3ZfyCWfIwaW4/lG0HXa9nTu2GzBMA== X-Google-Smtp-Source: APXvYqzUpD2cQhWErB7sY1HFgOg8kq4okW6JvSeg8BEAGiBq8H7pNfjR6Mduxt1Pn0M/tbBKHdSLRA== X-Received: by 2002:a62:ee03:: with SMTP id e3mr27006131pfi.241.1553556035078; Mon, 25 Mar 2019 16:20:35 -0700 (PDT) Received: from sspatil-glaptop2.roam.corp.google.com ([175.223.31.125]) by smtp.gmail.com with ESMTPSA id 17sm24671432pgz.52.2019.03.25.16.20.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Mar 2019 16:20:34 -0700 (PDT) From: Sandeep Patil To: ltp@lists.linux.it Date: Mon, 25 Mar 2019 16:20:10 -0700 Message-Id: <20190325232012.67123-3-sspatil@android.com> X-Mailer: git-send-email 2.21.0.392.gf8f6787159e-goog In-Reply-To: <20190325232012.67123-1-sspatil@android.com> References: <20190325232012.67123-1-sspatil@android.com> MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.99.2 at in-7.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.1 required=7.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,SPF_PASS autolearn=disabled version=3.4.0 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on in-7.smtp.seeweb.it Cc: chrubis@suze.cz, kernel-team@android.com Subject: [LTP] [PATCH 2/4] syscalls/accept01: convert to new library. X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.18 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" ...and drop the duplicate "invalid addrlen" test case. Signed-off-by: Sandeep Patil --- testcases/kernel/syscalls/accept/accept01.c | 236 +++++++++----------- 1 file changed, 103 insertions(+), 133 deletions(-) diff --git a/testcases/kernel/syscalls/accept/accept01.c b/testcases/kernel/syscalls/accept/accept01.c index b50056520..5982c09f8 100644 --- a/testcases/kernel/syscalls/accept/accept01.c +++ b/testcases/kernel/syscalls/accept/accept01.c @@ -1,26 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + /* - * * Copyright (c) International Business Machines Corp., 2001 * 07/2001 Ported by Wayne Boyer * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* - * Description: - * Verify that accept() returns the proper errno for various failure cases + * Description: + * Verify that accept() returns the proper errno for various failure cases */ #include @@ -34,150 +19,135 @@ #include -#include "test.h" -#include "safe_macros.h" - -char *TCID = "accept01"; -int testno; +#include "tst_test.h" -int s; /* socket descriptor */ struct sockaddr_in sin0, fsin1; -socklen_t sinlen; - -static void setup(void); -static void cleanup(void); -static void setup0(void); -static void cleanup0(void); -static void setup1(void); -static void cleanup1(void); -static void setup2(void); -static void setup3(void); - -struct test_case_t { /* test case structure */ + +struct test_case; +static void setup_invalid_fd(struct test_case *tcase); +static void setup_nonsocket_fd(struct test_case *tcase); +static void setup_socket(struct test_case *tcase); +static void setup_fionbio(struct test_case *tcase); +static void cleanup_tcase(struct test_case *tcase); + +/* test cases */ +static struct test_case { int domain; /* PF_INET, PF_UNIX, ... */ int type; /* SOCK_STREAM, SOCK_DGRAM ... */ int proto; /* protocol number (usually 0 = default) */ + int socketfd; /* socketfd for the test case */ struct sockaddr *sockaddr; /* socket address buffer */ - socklen_t *salen; /* accept's 3rd argument */ + socklen_t salen; /* accept's 3rd argument */ int retval; /* syscall return value */ int experrno; /* expected errno */ - void (*setup) (void); - void (*cleanup) (void); + void (*setup) (struct test_case *); + void (*cleanup) (struct test_case *); char *desc; -} tdat[] = { +} tcases[] = { { - PF_INET, SOCK_STREAM, 0, (struct sockaddr *)&fsin1, - &sinlen, -1, EBADF, setup0, cleanup0, - "bad file descriptor"}, { - PF_INET, SOCK_STREAM, 0, (struct sockaddr *)&fsin1, - &sinlen, -1, ENOTSOCK, setup0, cleanup0, - "bad file descriptor"}, { - PF_INET, SOCK_STREAM, 0, (struct sockaddr *)3, - &sinlen, -1, EINVAL, setup1, cleanup1, - "invalid socket buffer"}, { - PF_INET, SOCK_STREAM, 0, (struct sockaddr *)&fsin1, - (socklen_t *) 1, -1, EINVAL, setup1, cleanup1, - "invalid salen"}, { - PF_INET, SOCK_STREAM, 0, (struct sockaddr *)&fsin1, - &sinlen, -1, EINVAL, setup2, cleanup1, - "invalid salen"}, { - PF_INET, SOCK_STREAM, 0, (struct sockaddr *)&fsin1, - &sinlen, -1, EINVAL, setup3, cleanup1, - "no queued connections"}, { - PF_INET, SOCK_DGRAM, 0, (struct sockaddr *)&fsin1, - &sinlen, -1, EOPNOTSUPP, setup1, cleanup1, - "UDP accept"},}; - -int TST_TOTAL = sizeof(tdat) / sizeof(tdat[0]); - -int main(int ac, char *av[]) -{ - int lc; - - tst_parse_opts(ac, av, NULL, NULL); - - setup(); - - for (lc = 0; TEST_LOOPING(lc); ++lc) { - tst_count = 0; - for (testno = 0; testno < TST_TOTAL; ++testno) { - tdat[testno].setup(); - - TEST(accept(s, tdat[testno].sockaddr, - tdat[testno].salen)); - if (TEST_RETURN > 0) - TEST_RETURN = 0; - if (TEST_RETURN != tdat[testno].retval || - (TEST_RETURN < 0 && - TEST_ERRNO != tdat[testno].experrno)) { - tst_resm(TFAIL, "%s ; returned" - " %ld (expected %d), errno %d (expected" - " %d)", tdat[testno].desc, - TEST_RETURN, tdat[testno].retval, - TEST_ERRNO, tdat[testno].experrno); - } else { - tst_resm(TPASS, "%s successful", - tdat[testno].desc); - } - tdat[testno].cleanup(); - } - } - - cleanup(); - tst_exit(); -} + PF_INET, SOCK_STREAM, 0, -1, (struct sockaddr *)&fsin1, + sizeof(fsin1), -1, EBADF, setup_invalid_fd, NULL, + "bad file descriptor" + }, + { + PF_INET, SOCK_STREAM, 0, -1, (struct sockaddr *)&fsin1, + sizeof(fsin1), -1, ENOTSOCK, setup_nonsocket_fd, + cleanup_tcase, "bad file descriptor" + }, + { + PF_INET, SOCK_STREAM, 0, -1, (struct sockaddr *)3, + sizeof(fsin1), -1, EINVAL, setup_socket, cleanup_tcase, + "invalid socket buffer" + }, + { + PF_INET, SOCK_STREAM, 0, -1, (struct sockaddr *)&fsin1, + 1, -1, EINVAL, setup_socket, cleanup_tcase, + "invalid salen" + }, + { + PF_INET, SOCK_STREAM, 0, -1, (struct sockaddr *)&fsin1, + sizeof(fsin1), -1, EINVAL, setup_fionbio, cleanup_tcase, + "no queued connections" + }, + { + PF_INET, SOCK_DGRAM, 0, -1, (struct sockaddr *)&fsin1, + sizeof(fsin1), -1, EOPNOTSUPP, setup_socket, cleanup_tcase, + "UDP accept" + }, +}; -static void setup(void) -{ - TEST_PAUSE; - /* initialize local sockaddr */ - sin0.sin_family = AF_INET; - sin0.sin_port = 0; - sin0.sin_addr.s_addr = INADDR_ANY; -} -static void cleanup(void) +static void setup_invalid_fd(struct test_case *tcase) { + tcase->socketfd = 400; /* anything that is not an open file */ } -static void setup0(void) +static void setup_nonsocket_fd(struct test_case *tcase) { - if (tdat[testno].experrno == EBADF) - s = 400; /* anything not an open file */ - else if ((s = open("/dev/null", O_WRONLY)) == -1) - tst_brkm(TBROK | TERRNO, cleanup, "error opening /dev/null"); + tcase->socketfd = SAFE_OPEN("/dev/null", O_WRONLY); } -static void cleanup0(void) +static void setup_socket(struct test_case *tcase) { - s = -1; + tcase->socketfd = SAFE_SOCKET(tcase->domain, tcase->type, tcase->proto); + SAFE_BIND(tcase->socketfd, (struct sockaddr *)&sin0, sizeof(sin0)); + tcase->salen = sizeof(fsin1); } -static void setup1(void) +static void setup_fionbio(struct test_case *tcase) { - s = SAFE_SOCKET(cleanup, tdat[testno].domain, tdat[testno].type, - tdat[testno].proto); - SAFE_BIND(cleanup, s, (struct sockaddr *)&sin0, sizeof(sin0)); - sinlen = sizeof(fsin1); + int one = 1; + setup_socket(tcase); + SAFE_IOCTL(tcase->socketfd, FIONBIO, &one); } -static void cleanup1(void) +static void cleanup_tcase(struct test_case *tcase) { - (void)close(s); - s = -1; + if (tcase->socketfd >= 0) + SAFE_CLOSE(tcase->socketfd); + + tcase->socketfd = -1; } -static void setup2(void) +void verify_accept(unsigned int nr) { - setup1(); /* get a socket in s */ - sinlen = 1; /* invalid s */ + struct test_case *tcase = &tcases[nr]; + + if (tcase->setup) + tcase->setup(tcase); + + TEST(accept(tcase->socketfd, tcase->sockaddr, &tcase->salen)); + if (TST_RET > 0) { + /* don't leak accepted socket, close them first */ + SAFE_CLOSE(TST_RET); + TST_RET = 0; + } + + if (TST_RET != tcase->retval || + (TST_RET < 0 && TST_ERR != tcase->experrno)) { + tst_res(TFAIL, "%s ; returned" + " %ld (expected %d), errno %d (expected" + " %d)", tcase->desc, TST_RET, tcase->retval, + TST_ERR, tcase->experrno); + } else { + tst_res(TPASS, "%s successful", tcase->desc); + } + + if (tcase->cleanup) + tcase->cleanup(tcase); } -static void setup3(void) +static void test_setup(void) { - int one = 1; - - setup1(); - SAFE_IOCTL(cleanup, s, FIONBIO, &one); + /* initialize local sockaddr */ + sin0.sin_family = AF_INET; + sin0.sin_port = 0; + sin0.sin_addr.s_addr = INADDR_ANY; } + +static struct tst_test test = { + .tcnt = ARRAY_SIZE(tcases), + .setup = test_setup, + .test = verify_accept, +};