- Add support for ST_NOTRUNC to struct statvfs.

- Let tests that test for long file names check for that flag, so that they can
  verify the results properly.
This commit is contained in:
Thomas Veerman 2010-08-02 11:16:32 +00:00
parent 20eced94e7
commit 253b4b3fe5
13 changed files with 170 additions and 438 deletions

View file

@ -30,6 +30,10 @@ _PROTOTYPE( int fstatvfs, (int fd, struct statvfs *st) );
_PROTOTYPE( int statvfs, (const char *path, struct statvfs *st));
/* Possible values for statvfs->f_flag */
#define ST_RDONLY 0x1
#define ST_NOSUID 0x2
#define ST_RDONLY 0x001 /* Read-only file system */
#define ST_NOSUID 0x002 /* Does not support the semantics of the
* ST_ISUID and ST_ISGID file mode bits. */
#define ST_NOTRUNC 0x004 /* File system does not truncate file names
* longer than NAME_MAX */
#endif /* _STAVTFS_H */

View file

@ -77,6 +77,8 @@ The filesystem is mounted read-only;
Even the super-user may not write on it.
.It Dv ST_NOSUID
Setuid and setgid bits on files are not honored when they are executed.
.It Dv ST_NOTRUNC
File names longer than NAME_MAX are not truncated.
.El
.Sh SEE ALSO
.Xr statvfs 2

View file

@ -72,6 +72,7 @@ PUBLIC int do_statvfs()
statvfs.f_favail = 0;
statvfs.f_fsid = state.dev;
statvfs.f_flag = state.read_only ? ST_RDONLY : 0;
statvfs.f_flag |= ST_NOTRUNC;
statvfs.f_namemax = NAME_MAX;
return sys_safecopyto(m_in.m_source, m_in.REQ_GRANT, 0,

View file

@ -8,10 +8,12 @@
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/statvfs.h>
int common_test_nr = -1, errct = 0, subtest;
_PROTOTYPE(void cleanup, (void));
_PROTOTYPE(int does_fs_truncate, (void));
_PROTOTYPE(void e, (int n));
_PROTOTYPE(void quit, (void));
_PROTOTYPE(void rm_rf_dir, (int test_nr));
@ -40,6 +42,24 @@ int test_nr;
}
}
int does_fs_truncate(void)
{
struct statvfs stvfs;
int does_truncate = 0;
char cwd[PATH_MAX]; /* Storage for path to current working dir */
if (realpath(".", cwd) == NULL) e(7777); /* Get current working dir */
if (statvfs(cwd, &stvfs) != 0) e(7778); /* Get FS information */
/* Depending on how an FS handles too long file names, we have to adjust our
* error checking. If an FS does not truncate file names, it should generate
* an ENAMETOOLONG error when we provide too long a file name.
*/
if (!(stvfs.f_flag & ST_NOTRUNC)) does_truncate = 1;
return(does_truncate);
}
void rm_rf_dir(test_nr)
int test_nr;
{
@ -74,6 +94,8 @@ int test_nr;
void e(n)
int n;
{
int err_number;
err_number = errno; /* Store before printf can clobber it */
if (errct == 0) printf("\n"); /* finish header */
printf("Subtest %d, error %d, errno %d: %s\n",
subtest, n, errno, strerror(errno));
@ -82,7 +104,7 @@ int n;
cleanup();
exit(1);
}
errno = 0; /* don't leave it around to confuse next e() */
errno = err_number;
}
void cleanup()

View file

@ -14,10 +14,11 @@
#define MAX_ERROR 4
#define ITERATIONS 3
#include "common.c"
#define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd)
#define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir)
int errct;
int subtest;
int superuser; /* True if we are root. */
@ -35,8 +36,6 @@ _PROTOTYPE(void test23c, (void));
_PROTOTYPE(void makelongnames, (void)); /* Fill MaxName etc. */
_PROTOTYPE(char *last_index, (char *string, int ch));
_PROTOTYPE(char *my_getcwd, (char *buf, int size));
_PROTOTYPE(void e, (int number));
_PROTOTYPE(void quit, (void));
int main(int argc, char *argv[])
{
@ -44,10 +43,7 @@ int main(int argc, char *argv[])
sync();
if (argc == 2) m = atoi(argv[1]);
printf("Test 23 ");
fflush(stdout);
System("rm -rf DIR_23; mkdir DIR_23");
Chdir("DIR_23");
start(23);
makelongnames();
superuser = (geteuid() == 0);
@ -129,19 +125,12 @@ void test23a()
if (chdir(".//.//") != 0) e(39); /* .//.// == current dir */
if (getcwd(buf, PATH_MAX) != buf) e(40);
if (strcmp(buf, cwd) != 0) e(41); /* we might be at '/' */
#ifdef _MINIX
/* XXX - my_getcwd() is old rubbish. It reads the directory directly instead
* of through the directory library. It uses a fixed size buffer instead of
* a size related to PATH_MAX, NAME_MAX or the size required.
*/
if (my_getcwd(buf, PATH_MAX) != buf) e(42); /* get cwd my way */
if (strcmp(cwd, buf) != 0) e(43);
#endif
System("rm -rf foo");
}
void test23b()
{ /* Test critical values. */
int does_truncate;
subtest = 2;
System("rm -rf ../DIR_23/*");
@ -168,16 +157,13 @@ void test23b()
if (getcwd(buf, PATH_MAX) != buf) e(16);
if (strcmp(buf, cwd) != 0) e(17);
does_truncate = does_fs_truncate();
if (chdir(ToLongName) != -1) e(18);
#ifdef _POSIX_NO_TRUNC
# if _POSIX_NO_TRUNC - 0 != -1
if (errno != ENAMETOOLONG) e(20);
# else
if (errno != ENOENT) e(20);
# endif
#else
# include "error, this case requires dynamic checks and is not handled"
#endif
if (does_truncate) {
if (errno != ENOENT) e(19);
} else {
if (errno != ENAMETOOLONG) e(20);
}
if (getcwd(buf, PATH_MAX) != buf) e(21);
if (strcmp(buf, cwd) != 0) e(22);
@ -381,33 +367,3 @@ int size;
return buf;
}
void e(n)
int n;
{
int err_num = errno; /* Save in case printf clobbers it. */
printf("Subtest %d, error %d errno=%d: ", subtest, n, errno);
errno = err_num;
perror("");
if (errct++ > MAX_ERROR) {
printf("Too many errors; test aborted\n");
chdir("..");
system("rm -rf DIR*");
exit(1);
}
errno = 0;
}
void quit()
{
Chdir("..");
System("rm -rf DIR_23");
if (errct == 0) {
printf("ok\n");
exit(0);
} else {
printf("%d errors\n", errct);
exit(1);
}
}

View file

@ -18,18 +18,17 @@ _PROTOTYPE(void test24a, (void));
_PROTOTYPE(void test24b, (void));
_PROTOTYPE(void test24c, (void));
_PROTOTYPE(void makelongnames, (void));
_PROTOTYPE(void e, (int number));
_PROTOTYPE(void quit, (void));
#define OVERFLOW_DIR_NR (OPEN_MAX + 1)
#define MAX_ERROR 4
#define ITERATIONS 5
#include "common.c"
#define DIRENT0 ((struct dirent *) NULL)
#define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd)
#define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir)
int errct = 0;
int subtest = 1;
int superuser;
@ -245,6 +244,7 @@ void test24c()
/* Test whether wrong things go wrong right. */
DIR *dirp;
int does_truncate;
subtest = 3;
@ -273,20 +273,15 @@ void test24c()
if (rmdir(MaxName) != 0) e(12); /* then remove it */
if ((dirp = opendir(MaxPath)) == ((DIR *) NULL)) e(13); /* open '.' */
if (closedir(dirp) != 0) e(14); /* close it */
#if 0 /* XXX - anything could happen with the bad pointer */
if (closedir(dirp) != -1) e(15); /* close it again */
if (closedir(dirp) != -1) e(16); /* and again */
#endif /* 0 */
does_truncate = does_fs_truncate();
if (opendir(ToLongName) != ((DIR *) NULL)) e(17); /* is too long */
#ifdef _POSIX_NO_TRUNC
# if _POSIX_NO_TRUNC - 0 != -1
if (errno != ENAMETOOLONG) e(18);
# else
if (errno != ENOENT) e(19);
# endif
#else
# include "error, this case requires dynamic checks and is not handled"
#endif
if (does_truncate) {
if (errno != ENOENT) e(18);
} else {
if (errno != ENAMETOOLONG) e(19);
}
if (opendir(ToLongPath) != ((DIR *) NULL)) e(20); /* path is too long */
if (errno != ENAMETOOLONG) e(21);
System("touch foo/abc"); /* make a file */
@ -364,33 +359,3 @@ void makelongnames()
ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */
}
void e(n)
int n;
{
int err_num = errno; /* Save in case printf clobbers it. */
printf("Subtest %d, error %d errno=%d: ", subtest, n, errno);
errno = err_num;
perror("");
if (errct++ > MAX_ERROR) {
printf("Too many errors; test aborted\n");
chdir("..");
system("rm -rf DIR*");
exit(1);
}
errno = 0;
}
void quit()
{
Chdir("..");
System("rm -rf DIR_24");
if (errct == 0) {
printf("ok\n");
exit(0);
} else {
printf("%d errors\n", errct);
exit(1);
}
}

View file

@ -19,13 +19,14 @@
#define MAX_ERROR 4
#define ITERATIONS 2
#include "common.c"
#define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd)
#define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir)
#define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a)
#define Creat(f) if (close(creat(f,0777))!=0) printf("Can't creat %s\n",f)
#define Report(s,n) printf("Subtest %d" s,subtest,(n))
int errct = 0;
int subtest = 1;
int superuser;
char MaxName[NAME_MAX + 1]; /* Name of maximum length */
@ -56,10 +57,7 @@ int main(int argc, char *argv[])
}
if (argc == 2) m = atoi(argv[1]);
printf("Test 25 ");
fflush(stdout);
System("rm -rf DIR_25; mkdir DIR_25");
Chdir("DIR_25");
start(25);
makelongnames();
superuser = (geteuid() == 0);
@ -570,7 +568,7 @@ void test25d()
void test25e()
{
int fd;
int fd, does_truncate;
char *noread = "noread"; /* Name for unreadable file. */
char *nowrite = "nowrite"; /* Same for unwritable. */
int stat_loc;
@ -675,13 +673,21 @@ void test25e()
/* Test ToLongName and ToLongPath */
if ((fd = open(ToLongName, O_RDWR | O_CREAT, 0777)) != 3) e(47);
if (close(fd) != 0) e(48);
does_truncate = does_fs_truncate();
fd = open(ToLongName, O_RDWR | O_CREAT, 0777);
if (does_truncate) {
if (fd == -1) e(47);
if (close(fd) != 0) e(48);
} else {
if (fd != -1) e(49);
(void) close(fd); /* Just in case */
}
ToLongPath[PATH_MAX - 2] = '/';
ToLongPath[PATH_MAX - 1] = 'a';
if ((fd = open(ToLongPath, O_RDWR | O_CREAT, 0777)) != -1) e(49);
if (errno != ENAMETOOLONG) e(50);
if (close(fd) != -1) e(51);
if ((fd = open(ToLongPath, O_RDWR | O_CREAT, 0777)) != -1) e(50);
if (errno != ENAMETOOLONG) e(51);
if (close(fd) != -1) e(52);
ToLongPath[PATH_MAX - 1] = '/';
}
@ -706,33 +712,3 @@ void makelongnames()
ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */
}
void e(n)
int n;
{
int err_num = errno; /* Save in case printf clobbers it. */
printf("Subtest %d, error %d errno=%d: ", subtest, n, errno);
errno = err_num;
perror("");
if (errct++ > MAX_ERROR) {
printf("Too many errors; test aborted\n");
chdir("..");
system("rm -rf DIR*");
exit(1);
}
errno = 0;
}
void quit()
{
Chdir("..");
System("rm -rf DIR_25");
if (errct == 0) {
printf("ok\n");
exit(0);
} else {
printf("%d errors\n", errct);
exit(1);
}
}

View file

@ -23,12 +23,13 @@
#define MAX_ERROR 4
#define ITERATIONS 2
#include "common.c"
#define DIRENT0 ((struct dirent *) NULL)
#define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd)
#define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir)
int errct = 0;
int subtest = 1;
int superuser;
char MaxName[NAME_MAX + 1]; /* Name of maximum length */
@ -40,8 +41,6 @@ _PROTOTYPE(void test28a, (void));
_PROTOTYPE(void test28c, (void));
_PROTOTYPE(void test28b, (void));
_PROTOTYPE(void makelongnames, (void));
_PROTOTYPE(void e, (int n));
_PROTOTYPE(void quit, (void));
int main(int argc, char *argv[])
{
@ -49,13 +48,9 @@ int main(int argc, char *argv[])
sync();
if (argc == 2) m = atoi(argv[1]);
printf("Test 28 ");
fflush(stdout);
start(28);
superuser = (getuid() == 0);
makelongnames();
system("chmod 777 DIR_28/* DIR_28/*/* > /dev/null 2>&1");
System("rm -rf DIR_28; mkdir DIR_28");
Chdir("DIR_28");
umask(0000); /* no umask */
for (i = 0; i < ITERATIONS; i++) {
@ -168,10 +163,11 @@ void test28b()
struct dirent *dep;
int fd; /* file descriptor */
int other = 0, dot = 0, dotdot = 0; /* dirent counters */
int r; /* Intermediate result */
int rmdir_result; /* tmp var */
nlink_t nlink;
static char bar[20];
int stat_loc;
int stat_loc, does_truncate;
subtest = 2;
@ -195,16 +191,25 @@ void test28b()
if (rmdir(MaxPath) != 0) e(12); /* ok */
/* Test too long path ed. */
if (mkdir(ToLongName, 0777) != 0) e(17); /* Try ToLongName */
if (rmdir(ToLongName) != 0) e(18); /* and remove it */
does_truncate = does_fs_truncate();
r = mkdir(ToLongName, 0777);
if (does_truncate ) {
/* FS truncates names, mkdir should've worked */
if (r != 0) e(13); /* Try ToLongName */
if (rmdir(ToLongName) != 0) e(14); /* and remove it */
} else {
/* Too long, should've failed with ENAMETOOLONG */
if (r == 0) e(15);
if (errno != ENAMETOOLONG) e(16);
}
ToLongPath[strlen(ToLongPath) - 2] = '/'; /* make ToLongPath */
ToLongPath[strlen(ToLongPath) - 1] = 'a'; /* contain ././.../a */
if (mkdir(ToLongPath, 0777) != -1) e(19); /* it should */
if (errno != ENAMETOOLONG) e(20); /* not be ok */
if (rmdir(ToLongPath) != -1) e(21);
if (errno != ENAMETOOLONG) e(22);
if (mkdir(ToLongPath, 0777) != -1) e(17); /* it should */
if (errno != ENAMETOOLONG) e(18); /* not be ok */
if (rmdir(ToLongPath) != -1) e(19);
if (errno != ENAMETOOLONG) e(20);
if (mkdir("foo", 0777) != 0) e(23);
if (mkdir("foo", 0777) != 0) e(21);
System("touch foo/xyzzy");
#if 0
/* Test what happens if the parent link count > LINK_MAX. */
@ -406,33 +411,3 @@ void makelongnames()
ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */
}
void e(n)
int n;
{
int err_num = errno; /* Save in case printf clobbers it. */
printf("Subtest %d, error %d errno=%d: ", subtest, n, errno);
errno = err_num;
perror("");
if (errct++ > MAX_ERROR) {
printf("Too many errors; test aborted\n");
chdir("..");
system("rm -rf DIR*");
exit(1);
}
errno = 0;
}
void quit()
{
Chdir("..");
System("rm -rf DIR_28");
if (errct == 0) {
printf("ok\n");
exit(0);
} else {
printf("%d errors\n", errct);
exit(1);
}
}

View file

@ -22,11 +22,12 @@
#define MAX_ERROR 4
#define ITERATIONS 10
#include "common.c"
#define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd)
#define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir)
#define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a)
int errct = 0;
int subtest = 1;
int superuser;
char MaxName[NAME_MAX + 1]; /* Name of maximum length */
@ -47,14 +48,11 @@ int main(int argc, char *argv[])
sync();
if (argc == 2) m = atoi(argv[1]);
printf("Test 30 ");
fflush(stdout);
System("rm -rf DIR_30; mkdir DIR_30");
Chdir("DIR_30");
umask(0000);
start(30);
makelongnames();
superuser = (geteuid() == 0);
umask(0000);
for (i = 0; i < ITERATIONS; i++) {
if (m & 0001) test30a();
@ -231,7 +229,7 @@ void test30b()
void test30c()
{
int fd;
int fd, does_truncate;
subtest = 3;
@ -266,18 +264,17 @@ void test30c()
System("rm -rf bar");
/* Test ToLongName and ToLongPath */
#ifdef _POSIX_NO_TRUNC
# if _POSIX_NO_TRUNC - 0 != -1
if ((fd = creat(ToLongName, 0777)) != -1) e(11);
if (errno != ENAMETOOLONG) e(12);
close(fd); /* Just in case. */
# else
if ((fd = creat(ToLongName, 0777)) != 3) e(13);
if (close(fd) != 0) e(14);
# endif
#else
# include "error, this case requires dynamic checks and is not handled"
#endif
does_truncate = does_fs_truncate();
fd = creat(ToLongName, 0777);
if (does_truncate) {
if (fd == -1) e(11);
if (close(fd) != 0) e(12);
} else {
if (fd != -1) e(13);
if (errno != ENAMETOOLONG) e(14);
(void) close(fd); /* Just in case. */
}
ToLongPath[PATH_MAX - 2] = '/';
ToLongPath[PATH_MAX - 1] = 'a';
if ((fd = creat(ToLongPath, 0777)) != -1) e(15);
@ -307,33 +304,3 @@ void makelongnames()
ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */
}
void e(n)
int n;
{
int err_num = errno; /* Save in case printf clobbers it. */
printf("Subtest %d, error %d errno=%d: ", subtest, n, errno);
errno = err_num;
perror("");
if (errct++ > MAX_ERROR) {
printf("Too many errors; test aborted\n");
chdir("..");
system("rm -rf DIR*");
exit(1);
}
errno = 0;
}
void quit()
{
Chdir("..");
System("rm -rf DIR_30");
if (errct == 0) {
printf("ok\n");
exit(0);
} else {
printf("%d errors\n", errct);
exit(1);
}
}

View file

@ -15,11 +15,12 @@
#define MAX_ERROR 4
#define ITERATIONS 10
#include "common.c"
#define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd)
#define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir)
#define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a)
int errct = 0;
int subtest = 1;
int superuser;
char MaxName[NAME_MAX + 1]; /* Name of maximum length */
@ -31,8 +32,6 @@ _PROTOTYPE(void test31a, (void));
_PROTOTYPE(void test31b, (void));
_PROTOTYPE(void test31c, (void));
_PROTOTYPE(void makelongnames, (void));
_PROTOTYPE(void e, (int number));
_PROTOTYPE(void quit, (void));
int main(int argc, char *argv[])
{
@ -40,14 +39,11 @@ int main(int argc, char *argv[])
sync();
if (argc == 2) m = atoi(argv[1]);
printf("Test 31 ");
fflush(stdout);
System("rm -rf DIR_31; mkdir DIR_31");
Chdir("DIR_31");
umask(0000);
start(31);
makelongnames();
superuser = (geteuid() == 0);
umask(0000);
for (i = 0; i < ITERATIONS; i++) {
if (m & 0001) test31a();
@ -152,6 +148,7 @@ void test31b()
void test31c()
{
int does_truncate;
subtest = 3;
System("rm -rf ../DIR_31/*");
@ -199,16 +196,14 @@ void test31c()
System("rm -rf bar");
/* Test ToLongName and ToLongPath */
#ifdef _POSIX_NO_TRUNC
# if _POSIX_NO_TRUNC - 0 != -1
if (mkfifo(ToLongName, 0777) != -1) e(19);
if (errno != ENAMETOOLONG) e(20);
# else
if (mkfifo(ToLongName, 0777) != 0) e(21);
# endif
#else
# include "error, this case requires dynamic checks and is not handled"
#endif
does_truncate = does_fs_truncate();
if (does_truncate) {
if (mkfifo(ToLongName, 0777) != 0) e(19);
} else {
if (mkfifo(ToLongName, 0777) != -1) e(20);
if (errno != ENAMETOOLONG) e(21);
}
ToLongPath[PATH_MAX - 2] = '/';
ToLongPath[PATH_MAX - 1] = 'a';
if (mkfifo(ToLongPath, 0777) != -1) e(22);
@ -237,33 +232,3 @@ void makelongnames()
ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */
}
void e(n)
int n;
{
int err_num = errno; /* Save in case printf clobbers it. */
printf("Subtest %d, error %d errno=%d: ", subtest, n, errno);
errno = err_num;
perror("");
if (errct++ > MAX_ERROR) {
printf("Too many errors; test aborted\n");
chdir("..");
system("rm -rf DIR*");
exit(1);
}
errno = 0;
}
void quit()
{
Chdir("..");
System("rm -rf DIR_31");
if (errct == 0) {
printf("ok\n");
exit(0);
} else {
printf("%d errors\n", errct);
exit(1);
}
}

View file

@ -15,13 +15,14 @@
#define MAX_ERROR 1
#define ITERATIONS 2
#include "common.c"
#define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd)
#define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir)
#define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a)
#define Chmod(a,b) if (chmod(a,b) != 0) printf("Can't chmod %s\n", a)
#define Mkfifo(f) if (mkfifo(f,0777)!=0) printf("Can't make fifo %s\n", f)
int errct = 0;
int subtest = 1;
int superuser; /* nonzero if uid == euid (euid == 0 always) */
char MaxName[NAME_MAX + 1]; /* Name of maximum length */
@ -35,8 +36,6 @@ _PROTOTYPE(void test33c, (void));
_PROTOTYPE(void test33d, (void));
_PROTOTYPE(void test_access, (void));
_PROTOTYPE(void makelongnames, (void));
_PROTOTYPE(void e, (int number));
_PROTOTYPE(void quit, (void));
int main(int argc, char *argv[])
{
@ -44,21 +43,20 @@ int main(int argc, char *argv[])
sync();
if (argc == 2) m = atoi(argv[1]);
printf("Test 33 ");
fflush(stdout);
umask(0000);
start(33);
if (geteuid() != 0) {
printf("must be setuid root; test aborted\n");
cleanup();
exit(1);
}
if (getuid() == 0) {
printf("must be setuid root logged in as someone else; test aborted\n");
cleanup();
exit(1);
}
umask(0000);
System("rm -rf DIR_33; mkdir DIR_33");
Chdir("DIR_33");
makelongnames();
superuser = (getuid() == 0);
@ -324,7 +322,7 @@ void test33b()
void test33c()
{ /* Test errors returned. */
int i;
int i, fd, does_truncate;
subtest = 3;
System("rm -rf ../DIR_33/*");
@ -360,17 +358,19 @@ void test33c()
if (access("nosearch/file", F_OK) != 0) e(17);
/* Test ToLongName and ToLongPath */
#ifdef _POSIX_NO_TRUNC
# if _POSIX_NO_TRUNC - 0 != -1
if (access(ToLongName, F_OK) != -1) e(23);
if (errno != ENAMETOOLONG) e(24);
# else
if (close(creat(ToLongName, 0777)) != 0) e(25);
if (access(ToLongName, F_OK) != 0) e(26);
# endif
#else
# include "error, this case requires dynamic checks and is not handled"
#endif
does_truncate = does_fs_truncate();
if (does_truncate) {
if ((fd = creat(ToLongName, 0777)) != 0) e(18);
if (close(fd) != 0) e(19);
if (access(ToLongName, F_OK) != 0) e(20);
} else {
if ((fd = creat(ToLongName, 0777)) != -1) e(21);
if (errno != ENAMETOOLONG) e(22);
(void) close(fd); /* Just in case */
if (access(ToLongName, F_OK) != -1) e(23);
if (errno != ENAMETOOLONG) e(24);
}
ToLongPath[PATH_MAX - 2] = '/';
ToLongPath[PATH_MAX - 1] = 'a';
if (access(ToLongPath, F_OK) != -1) e(27);
@ -618,33 +618,3 @@ void makelongnames()
ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */
}
void e(n)
int n;
{
int err_num = errno; /* Save in case printf clobbers it. */
printf("Subtest %d, error %d errno=%d: ", subtest, n, errno);
errno = err_num;
perror("");
if (errct++ > MAX_ERROR) {
printf("Too many errors; test aborted\n");
chdir("..");
system("rm -rf DIR*");
exit(1);
}
errno = 0;
}
void quit()
{
Chdir("..");
System("rm -rf DIR_33");
if (errct == 0) {
printf("ok\n");
exit(0);
} else {
printf("%d errors\n", errct);
exit(1);
}
}

View file

@ -23,6 +23,8 @@
#define ITERATIONS 4
#define N 100
#include "common.c"
#define ALL_RWXB (S_IRWXU | S_IRWXG | S_IRWXO)
#define ALL_SETB (S_ISUID | S_ISGID)
#define ALL_BITS (ALL_RWXB | ALL_SETB)
@ -37,7 +39,6 @@
/* This program uses /etc/passwd and assumes things about it's contents. */
#define PASSWD_FILE "/etc/passwd"
int errct = 0;
int subtest = 1;
int superuser;
int I_can_chown;
@ -51,8 +52,6 @@ _PROTOTYPE(void test34b, (void));
_PROTOTYPE(void test34c, (void));
_PROTOTYPE(mode_t mode, (char *file_name));
_PROTOTYPE(void makelongnames, (void));
_PROTOTYPE(void e, (int number));
_PROTOTYPE(void quit, (void));
_PROTOTYPE(void getids, (uid_t * uid, gid_t * gid));
int main(int argc, char *argv[])
@ -61,15 +60,8 @@ int main(int argc, char *argv[])
sync();
if (argc == 2) m = atoi(argv[1]);
printf("Test 34 ");
fflush(stdout);
(void) system("chmod 777 DIR_34/* > /dev/null 2> /dev/null");
System("rm -rf DIR_34; mkdir DIR_34");
if (chdir("DIR_34") != 0) {
fprintf(stderr, "Can't go to DIR_34\n");
system("rm -rf DIR_34");
exit(1);
}
umask(0000);
start(34);
makelongnames();
superuser = (geteuid() == (uid_t) 0);
@ -79,7 +71,6 @@ int main(int argc, char *argv[])
I_can_chown = 1;
#endif
umask(0000);
for (i = 1; i < ITERATIONS; i++) {
if (m & 0001) test34a();
@ -395,7 +386,7 @@ void test34c()
struct stat st;
uid_t uid, uid2;
gid_t gid, gid2;
int stat_loc;
int fd, does_truncate, stat_loc;
subtest = 3;
@ -521,9 +512,18 @@ void test34c()
}
/* Check too long path ed. */
Creat(NameTooLong);
if (chmod(NameTooLong, 0777) != 0) e(57);
if (chown(NameTooLong, geteuid(), getegid()) != 0) e(58);
does_truncate = does_fs_truncate();
fd = creat(NameTooLong, 0777);
if (does_truncate) {
if (fd == -1) e(53);
if (close(fd) != 0) e(54);
if (chmod(NameTooLong, 0777) != 0) e(55);
if (chown(NameTooLong, geteuid(), getegid()) != 0) e(56);
} else {
if (fd != -1) e(57);
if (errno != ENAMETOOLONG) e(58);
(void) close(fd); /* Just in case */
}
/* Make PathTooLong contain ././.../a */
PathTooLong[strlen(PathTooLong) - 2] = '/';
@ -559,39 +559,6 @@ void makelongnames()
PathTooLong[PATH_MAX] = '\0'; /* inc PathTooLong by one */
}
void e(n)
int n;
{
int err_num = errno; /* Save in case printf clobbers it. */
printf("Subtest %d, error %d errno=%d: ", subtest, n, errno);
errno = err_num;
perror("");
if (errct++ > MAX_ERROR) {
printf("Too many errors; test aborted\n");
chdir("..");
system("rm -rf DIR*");
system("rm -rf DIR_34");
exit(1);
}
errno = 0;
}
void quit()
{
Chdir("..");
(void) system("chmod 777 DIR_34/* > /dev/null 2> /dev/null");
System("rm -rf DIR_34");
if (errct == 0) {
printf("ok\n");
exit(0);
} else {
printf("%d errors\n", errct);
exit(1);
}
}
/* Getids returns a valid uid and gid. Is used PASSWD FILE.
* It assumes the following format for a passwd file line:
* <user_name>:<passwd>:<uid>:<gid>:<other_stuff>

View file

@ -18,6 +18,8 @@
#define ITERATIONS 10
#define N 100
#include "common.c"
#define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd)
#define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir)
#define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a)
@ -30,7 +32,6 @@
#define PASSWD_FILE "/etc/passwd"
int errct = 0;
int subtest = 1;
int I_can_chown;
int superuser;
@ -43,8 +44,6 @@ _PROTOTYPE(void test35a, (void));
_PROTOTYPE(void test35b, (void));
_PROTOTYPE(void test35c, (void));
_PROTOTYPE(void makelongnames, (void));
_PROTOTYPE(void e, (int number));
_PROTOTYPE(void quit, (void));
_PROTOTYPE(void getids, (uid_t * uid, gid_t * gid));
int main(int argc, char *argv[])
@ -53,10 +52,7 @@ int main(int argc, char *argv[])
sync();
if (argc == 2) m = atoi(argv[1]);
printf("Test 35 ");
fflush(stdout);
System("rm -rf DIR_35; mkdir DIR_35");
Chdir("DIR_35");
start(35);
makelongnames();
superuser = (geteuid() == 0);
@ -176,7 +172,7 @@ void test35c()
gid_t gid, gid2;
uid_t uid, uid2;
struct utimbuf ub;
int stat_loc;
int fd, does_truncate, stat_loc;
subtest = 3;
@ -256,18 +252,15 @@ void test35c()
}
/* Test names that are too long. */
#ifdef _POSIX_NO_TRUNC
# if _POSIX_NO_TRUNC - 0 != -1
/* Not exist might also be a propper response? */
if (utime(NameTooLong, NULL) != -1) e(18);
if (errno != ENAMETOOLONG) e(19);
# else
Creat(NameTooLong);
if (utime(NameTooLong, NULL) != 0) e(20);
# endif
#else
# include "error, this case requires dynamic checks and is not handled"
#endif
does_truncate = does_fs_truncate();
fd = creat(NameTooLong, 0777);
if (does_truncate) {
if (utime(NameTooLong, NULL) != 0) e(18);
} else {
if (utime(NameTooLong, NULL) != -1) e(19);
if (errno != ENAMETOOLONG) e(20);
}
(void) close(fd);
/* Make PathTooLong contain ././.../a */
PathTooLong[strlen(PathTooLong) - 2] = '/';
@ -308,37 +301,6 @@ void makelongnames()
PathTooLong[PATH_MAX] = '\0'; /* inc PathTooLong by one */
}
void e(n)
int n;
{
int err_num = errno; /* Save in case printf clobbers it. */
printf("Subtest %d, error %d errno=%d: ", subtest, n, errno);
errno = err_num;
perror("");
if (errct++ > MAX_ERROR) {
printf("Too many errors; test aborted\n");
chdir("..");
system("rm -rf DIR* > /dev/null 2>/dev/null");
exit(1);
}
errno = 0;
}
void quit()
{
Chdir("..");
System("rm -rf DIR_35");
if (errct == 0) {
printf("ok\n");
exit(0);
} else {
printf("%d errors\n", errct);
exit(1);
}
}
/* Getids returns a valid uid and gid. Is used PASSWD FILE.
** It assumes the following format for a passwd file line:
** <user_name>:<passwd>:<uid>:<gid>:<other_stuff>