=== modified file 'plugins.d/mandos-client.c' --- plugins.d/mandos-client.c 2014-06-07 22:37:22 +0000 +++ plugins.d/mandos-client.c 2014-06-08 00:13:06 +0000 @@ -40,7 +40,7 @@ #define _GNU_SOURCE /* TEMP_FAILURE_RETRY(), asprintf() */ #include /* fprintf(), stderr, fwrite(), - stdout, ferror(), remove() */ + stdout, ferror() */ #include /* uint16_t, uint32_t, intptr_t */ #include /* NULL, size_t, ssize_t */ #include /* free(), EXIT_SUCCESS, srand(), @@ -57,7 +57,7 @@ #include /* socket(), struct sockaddr_in6, inet_pton(), connect(), getnameinfo() */ -#include /* open() */ +#include /* open(), unlinkat() */ #include /* opendir(), struct dirent, readdir() */ #include /* PRIu16, PRIdMAX, intmax_t, @@ -73,7 +73,8 @@ */ #include /* close(), SEEK_SET, off_t, write(), getuid(), getgid(), seteuid(), - setgid(), pause(), _exit() */ + setgid(), pause(), _exit(), + unlinkat() */ #include /* inet_pton(), htons() */ #include /* not, or, and */ #include /* struct argp_option, error_t, struct @@ -2617,36 +2618,33 @@ /* Removes the GPGME temp directory and all files inside */ if(tempdir != NULL){ struct dirent **direntries = NULL; - struct dirent *direntry = NULL; - int numentries = scandir(tempdir, &direntries, notdotentries, - alphasort); - if(numentries > 0){ - for(int i = 0; i < numentries; i++){ - direntry = direntries[i]; - char *fullname = NULL; - ret = asprintf(&fullname, "%s/%s", tempdir, - direntry->d_name); - if(ret < 0){ - perror_plus("asprintf"); - continue; - } - ret = remove(fullname); - if(ret == -1){ - fprintf_plus(stderr, "remove(\"%s\"): %s\n", fullname, - strerror(errno)); - } - free(fullname); + int tempdir_fd = (int)TEMP_FAILURE_RETRY(open(tempdir, O_RDONLY)); + if(tempdir_fd == -1){ + perror_plus("open"); + } else { + int numentries = scandir(tempdir, &direntries, notdotentries, + alphasort); + if(numentries > 0){ + for(int i = 0; i < numentries; i++){ + ret = unlinkat(tempdir_fd, direntries[i]->d_name, 0); + if(ret == -1){ + fprintf_plus(stderr, "unlinkat(open(\"%s\", O_RDONLY)," + " \"%s\", 0): %s\n", tempdir, + direntries[i]->d_name, strerror(errno)); + } + } + + /* need to clean even if 0 because man page doesn't specify */ + free(direntries); + if(numentries == -1){ + perror_plus("scandir"); + } + ret = rmdir(tempdir); + if(ret == -1 and errno != ENOENT){ + perror_plus("rmdir"); + } } - } - - /* need to clean even if 0 because man page doesn't specify */ - free(direntries); - if(numentries == -1){ - perror_plus("scandir"); - } - ret = rmdir(tempdir); - if(ret == -1 and errno != ENOENT){ - perror_plus("rmdir"); + TEMP_FAILURE_RETRY(close(tempdir_fd)); } }