#include #include #include #include #include #include #include using namespace std; void close_exec(int s) { int flags; flags = fcntl(s, F_GETFL); flags |= (FD_CLOEXEC); if (fcntl(s, F_SETFL, flags) < 0) { cerr << "ERROR: fcntl, executing close_exec: " << strerror(errno) << endl; } }//close_exec int main() { ofstream script("/tmp/cl_foo.bash"); script << "#!/bin/bash\nls -l /proc/self/fd > /tmp/cl_foo.output 2>&1\n"; script.close(); if (chmod("/tmp/cl_foo.bash", S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) < 0) { cerr << "ERROR: Failed to chmod /tmp/cl_foo.bash, error: " << strerror(errno) << endl; exit(7); } int fd = open("/etc/passwd", O_RDONLY); if (fd < 0) { cerr << "ERROR: Failed to open /etc/passwd: " << strerror(errno) << endl; } else { close_exec(fd); } int rv = fork(); if (rv < 0) { cerr << "ERROR from fork: " << strerror(errno) << endl; } else if (rv == 0) { // Child system("/tmp/cl_foo.bash"); exit(7); } else { // parent, done sleep(5); } return 0; }//main