mirror of https://github.com/proot-me/proot.git
147 lines
3.4 KiB
C
147 lines
3.4 KiB
C
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
#include <errno.h>
|
|
|
|
void cleanup(void)
|
|
{
|
|
chmod("top-bug-138", 0777);
|
|
rmdir("top-bug-138/a/b");
|
|
rmdir("top-bug-138/a");
|
|
rmdir("top-bug-138");
|
|
}
|
|
|
|
int main()
|
|
{
|
|
struct stat statbuf;
|
|
int i = atexit(cleanup);
|
|
if (i != 0) {
|
|
fprintf(stderr, "cannot set atexit cleanup\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int mydirtop=mkdir("top-bug-138", 0777);
|
|
if (mydirtop != 0) {
|
|
perror("mkdir top-bug-138");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int mydira=mkdir("top-bug-138/a", 0777);
|
|
if (mydira != 0) {
|
|
perror("mkdir top-bug-138/a");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int mydirb=mkdir("top-bug-138/a/b", 0777);
|
|
if (mydirb != 0) {
|
|
perror("mkdir top-bug-138/a/b");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int myunlinka1=unlink("top-bug-138/a");
|
|
if (myunlinka1 == 0) {
|
|
perror("unlink top-bug-138/a should have failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (errno != EISDIR) {
|
|
perror("unlink top-bug-138/a should have failed with EISDIR");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int myrmdira=rmdir("top-bug-138/a");
|
|
if (myrmdira == 0) {
|
|
perror("rmdir top-bug-138/a should have failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (errno != ENOTEMPTY) {
|
|
perror("rmdir top-bug-138/a should have failed with ENOTEMPTY");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int mychmod1=chmod("top-bug-138", 0);
|
|
if (mychmod1 != 0) {
|
|
perror("chmod top-bug-138");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int myunlinkab=unlink("top-bug-138/a/b");
|
|
if (myunlinkab == 0) {
|
|
perror("unlink top-bug-138/a/b should have failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (errno != EACCES) {
|
|
perror("unlink top-bug-138/a/b should have failed with EACCES");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int myrmdirab=rmdir("top-bug-138/a/b");
|
|
if (myrmdirab == 0) {
|
|
perror("rmdir top-bug-138/a/b should have failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (errno != EACCES) {
|
|
perror("rmdir top-bug-138/a/b should have failed with EACCES");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int mystat=stat("top-bug-138/a/b", &statbuf);
|
|
if (mystat == 0) {
|
|
perror("stat top-bug-138/a/b should have failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (errno != EACCES) {
|
|
perror("stat top-bug-138/a/b should have failed with EACCES");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int mychmod2=chmod("top-bug-138", 0700);
|
|
if (mychmod2 != 0) {
|
|
perror("chmod top-bug-138");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int myunlinka=unlink("top-bug-138/a");
|
|
if (myunlinka == 0) {
|
|
perror("unlink top-bug-138/a should have failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (errno != EISDIR) {
|
|
perror("unlink top-bug-138/a should have failed with EISDIR");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
myrmdira=rmdir("top-bug-138/a");
|
|
if (myrmdira == 0) {
|
|
perror("rmdir top-bug-138/a should have failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (errno != ENOTEMPTY) {
|
|
perror("unlink top-bug-138/a should have failed with ENOTEMPTY");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int myunlinktop=unlink("top-bug-138");
|
|
if (myunlinktop == 0) {
|
|
perror("unlink top-bug-138 should have failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (errno != EISDIR) {
|
|
perror("unlink top-bug-138 should have failed with EISDIR");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int myrmdirtop=rmdir("top-bug-138");
|
|
if (myrmdirtop == 0) {
|
|
perror("rmdir top-bug-138 should have failed");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (errno != ENOTEMPTY) {
|
|
perror("rmdir top-bug-138 should have failed with ENOTEMPTY");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
exit(EXIT_SUCCESS);
|
|
}
|