157718be8SEnji Cooper /* $NetBSD: t_dir.c,v 1.6 2013/10/19 17:45:00 christos Exp $ */ 257718be8SEnji Cooper 357718be8SEnji Cooper /*- 457718be8SEnji Cooper * Copyright (c) 2010 The NetBSD Foundation, Inc. 557718be8SEnji Cooper * All rights reserved. 657718be8SEnji Cooper * 757718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 857718be8SEnji Cooper * modification, are permitted provided that the following conditions 957718be8SEnji Cooper * are met: 1057718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 1157718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 1257718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 1357718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 1457718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 1557718be8SEnji Cooper * 1657718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 1757718be8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 1857718be8SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1957718be8SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2057718be8SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2157718be8SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2257718be8SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2357718be8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2457718be8SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2557718be8SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2657718be8SEnji Cooper * POSSIBILITY OF SUCH DAMAGE. 2757718be8SEnji Cooper */ 2857718be8SEnji Cooper 2957718be8SEnji Cooper #include <atf-c.h> 3057718be8SEnji Cooper 3157718be8SEnji Cooper #include <assert.h> 3257718be8SEnji Cooper #include <dirent.h> 3357718be8SEnji Cooper #include <err.h> 3457718be8SEnji Cooper #include <fcntl.h> 3557718be8SEnji Cooper #include <stdio.h> 3657718be8SEnji Cooper #include <stdlib.h> 3757718be8SEnji Cooper #include <string.h> 3857718be8SEnji Cooper #include <unistd.h> 3957718be8SEnji Cooper 4057718be8SEnji Cooper #include <sys/stat.h> 4157718be8SEnji Cooper 4257718be8SEnji Cooper ATF_TC(seekdir_basic); 4357718be8SEnji Cooper ATF_TC_HEAD(seekdir_basic, tc) 4457718be8SEnji Cooper { 4557718be8SEnji Cooper 4657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Check telldir(3) and seekdir(3) " 4757718be8SEnji Cooper "for correct behavior (PR lib/24324)"); 4857718be8SEnji Cooper } 4957718be8SEnji Cooper 5057718be8SEnji Cooper ATF_TC_BODY(seekdir_basic, tc) 5157718be8SEnji Cooper { 5257718be8SEnji Cooper DIR *dp; 5357718be8SEnji Cooper char *wasname; 5457718be8SEnji Cooper struct dirent *entry; 5557718be8SEnji Cooper long here; 5657718be8SEnji Cooper 5757718be8SEnji Cooper mkdir("t", 0755); 5857718be8SEnji Cooper creat("t/a", 0600); 5957718be8SEnji Cooper creat("t/b", 0600); 6057718be8SEnji Cooper creat("t/c", 0600); 6157718be8SEnji Cooper 6257718be8SEnji Cooper dp = opendir("t"); 6357718be8SEnji Cooper if ( dp == NULL) 6457718be8SEnji Cooper atf_tc_fail("Could not open temp directory."); 6557718be8SEnji Cooper 6657718be8SEnji Cooper /* skip two for . and .. */ 6757718be8SEnji Cooper entry = readdir(dp); 6857718be8SEnji Cooper entry = readdir(dp); 6957718be8SEnji Cooper 7057718be8SEnji Cooper /* get first entry */ 7157718be8SEnji Cooper entry = readdir(dp); 7257718be8SEnji Cooper here = telldir(dp); 7357718be8SEnji Cooper 7457718be8SEnji Cooper /* get second entry */ 7557718be8SEnji Cooper entry = readdir(dp); 7657718be8SEnji Cooper wasname = strdup(entry->d_name); 7757718be8SEnji Cooper if (wasname == NULL) 7857718be8SEnji Cooper atf_tc_fail("cannot allocate memory"); 7957718be8SEnji Cooper 8057718be8SEnji Cooper /* get third entry */ 8157718be8SEnji Cooper entry = readdir(dp); 8257718be8SEnji Cooper 8357718be8SEnji Cooper /* try to return to the position after the first entry */ 8457718be8SEnji Cooper seekdir(dp, here); 8557718be8SEnji Cooper entry = readdir(dp); 8657718be8SEnji Cooper 8757718be8SEnji Cooper if (entry == NULL) 8857718be8SEnji Cooper atf_tc_fail("entry 1 not found"); 8957718be8SEnji Cooper if (strcmp(entry->d_name, wasname) != 0) 9057718be8SEnji Cooper atf_tc_fail("1st seekdir found wrong name"); 9157718be8SEnji Cooper 9257718be8SEnji Cooper /* try again, and throw in a telldir() for good measure */ 9357718be8SEnji Cooper seekdir(dp, here); 9457718be8SEnji Cooper here = telldir(dp); 9557718be8SEnji Cooper entry = readdir(dp); 9657718be8SEnji Cooper 9757718be8SEnji Cooper if (entry == NULL) 9857718be8SEnji Cooper atf_tc_fail("entry 2 not found"); 9957718be8SEnji Cooper if (strcmp(entry->d_name, wasname) != 0) 10057718be8SEnji Cooper atf_tc_fail("2nd seekdir found wrong name"); 10157718be8SEnji Cooper 10257718be8SEnji Cooper /* One more time, to make sure that telldir() doesn't affect result */ 10357718be8SEnji Cooper seekdir(dp, here); 10457718be8SEnji Cooper entry = readdir(dp); 10557718be8SEnji Cooper 10657718be8SEnji Cooper if (entry == NULL) 10757718be8SEnji Cooper atf_tc_fail("entry 3 not found"); 10857718be8SEnji Cooper if (strcmp(entry->d_name, wasname) != 0) 10957718be8SEnji Cooper atf_tc_fail("3rd seekdir found wrong name"); 11057718be8SEnji Cooper 11157718be8SEnji Cooper closedir(dp); 11257718be8SEnji Cooper } 11357718be8SEnji Cooper 114*b7b46892SRuslan Bukin /* There is no sbrk on AArch64 and RISC-V */ 115*b7b46892SRuslan Bukin #if !defined(__aarch64__) && !defined(__riscv__) 11657718be8SEnji Cooper ATF_TC(telldir_leak); 11757718be8SEnji Cooper ATF_TC_HEAD(telldir_leak, tc) 11857718be8SEnji Cooper { 11957718be8SEnji Cooper 12057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 12157718be8SEnji Cooper "Check telldir(3) for memory leakage (PR lib/24324)"); 12257718be8SEnji Cooper } 12357718be8SEnji Cooper 12457718be8SEnji Cooper ATF_TC_BODY(telldir_leak, tc) 12557718be8SEnji Cooper { 12657718be8SEnji Cooper DIR *dp; 12757718be8SEnji Cooper char *memused; 12857718be8SEnji Cooper int i; 12957718be8SEnji Cooper int oktouse = 4096; 13057718be8SEnji Cooper 13157718be8SEnji Cooper dp = opendir("."); 13257718be8SEnji Cooper if (dp == NULL) 13357718be8SEnji Cooper atf_tc_fail("Could not open current directory"); 13457718be8SEnji Cooper 13557718be8SEnji Cooper (void)telldir(dp); 13657718be8SEnji Cooper memused = sbrk(0); 13757718be8SEnji Cooper closedir(dp); 13857718be8SEnji Cooper 13957718be8SEnji Cooper for (i = 0; i < 1000; i++) { 14057718be8SEnji Cooper dp = opendir("."); 14157718be8SEnji Cooper if (dp == NULL) 14257718be8SEnji Cooper atf_tc_fail("Could not open current directory"); 14357718be8SEnji Cooper 14457718be8SEnji Cooper (void)telldir(dp); 14557718be8SEnji Cooper closedir(dp); 14657718be8SEnji Cooper 14757718be8SEnji Cooper if ((char *)sbrk(0) - memused > oktouse) { 14857718be8SEnji Cooper (void)printf("Used %td extra bytes for %d telldir " 14957718be8SEnji Cooper "calls", ((char *)sbrk(0) - memused), i); 15057718be8SEnji Cooper oktouse = (char *)sbrk(0) - memused; 15157718be8SEnji Cooper } 15257718be8SEnji Cooper } 15357718be8SEnji Cooper if (oktouse > 4096) { 15457718be8SEnji Cooper atf_tc_fail("Failure: leaked %d bytes", oktouse); 15557718be8SEnji Cooper } else { 15657718be8SEnji Cooper (void)printf("OK: used %td bytes\n", (char *)(sbrk(0))-memused); 15757718be8SEnji Cooper } 15857718be8SEnji Cooper } 15994098ab7SAndrew Turner #endif 16057718be8SEnji Cooper 16157718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 16257718be8SEnji Cooper { 16357718be8SEnji Cooper 16457718be8SEnji Cooper ATF_TP_ADD_TC(tp, seekdir_basic); 165*b7b46892SRuslan Bukin #if !defined(__aarch64__) && !defined(__riscv__) 16657718be8SEnji Cooper ATF_TP_ADD_TC(tp, telldir_leak); 16794098ab7SAndrew Turner #endif 16857718be8SEnji Cooper 16957718be8SEnji Cooper return atf_no_error(); 17057718be8SEnji Cooper } 171