1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (c) International Business Machines Corp., 2002 4 * Ported from SPIE, section2/iosuite/dup6.c, by Airong Zhang 5 */ 6 7/*\ 8 * [Description] 9 * 10 * Negative test for dup2() with max open file descriptors. 11 */ 12 13#include <stdlib.h> 14#include <stdio.h> 15#include <unistd.h> 16#include "tst_test.h" 17#include "tst_safe_macros.h" 18 19static int *fildes; 20static int min; 21static char pfilname[40]; 22 23static void setup(void) 24{ 25 min = getdtablesize(); /* get number of files allowed open */ 26 fildes = SAFE_MALLOC((min + 10) * sizeof(int)); 27 memset(fildes, -1, (min + 10) * sizeof(int)); 28 sprintf(pfilname, "./dup205.%d\n", getpid()); 29} 30 31static void cleanup(void) 32{ 33 if (fildes != NULL) 34 free(fildes); 35} 36 37static void run(void) 38{ 39 int ifile = -1, rc = 0; 40 41 fildes[0] = SAFE_CREAT(pfilname, 0666); 42 fildes[fildes[0]] = fildes[0]; 43 for (ifile = fildes[0] + 1; ifile < min + 10; ifile++) { 44 TEST(dup2(fildes[ifile - 1], ifile)); 45 fildes[ifile] = TST_RET; 46 if (fildes[ifile] == -1) 47 break; 48 if (fildes[ifile] != ifile) 49 tst_brk(TFAIL, 50 "got wrong descriptor number back (%d != %d)", 51 fildes[ifile], ifile); 52 } 53 54 if (ifile < min) { 55 tst_res(TFAIL, "Not enough files duped"); 56 rc++; 57 } else if (ifile > min) { 58 tst_res(TFAIL, "Too many files duped"); 59 rc++; 60 } 61 if (TST_ERR != EBADF && TST_ERR != EMFILE && TST_ERR != EINVAL) { 62 tst_res(TFAIL, "bad errno on dup2 failure"); 63 rc++; 64 } 65 66 if (rc) 67 tst_res(TFAIL, "Test failed"); 68 else 69 tst_res(TPASS, "Test passed"); 70 71 SAFE_UNLINK(pfilname); 72 for (ifile = fildes[0]; ifile < min + 10; ifile++) { 73 if (fildes[ifile] > 0) 74 SAFE_CLOSE(fildes[ifile]); 75 } 76} 77 78static struct tst_test test = { 79 .needs_tmpdir = 1, 80 .test_all = run, 81 .setup = setup, 82 .cleanup = cleanup, 83}; 84