mirror of
https://github.com/rofl0r/proxychains-ng.git
synced 2024-12-22 04:08:47 +00:00
remove unnecessary workaround for fclose() on OpenBSD
proxychains-ng didn't call fclose() in a particular FILE on OpenBSD if a test in the Makefile noticed that OpenBSD's fclose() called close() on the underlying fd of the FILE. The test hasn't worked for 8 years because an OpenBSD commit prevented the test from overriding the libc close(): https://cvsweb.openbsd.org/src/lib/libc/stdio/fclose.c?rev=1.10&content-type=text/x-cvsweb-markup >let internal calls resolve directly and not be overridable For all this time, the workaround wasn't doing anything. Additionally, behavior equivalent to calling close() on a fd is mandatory in POSIX: https://pubs.opengroup.org/onlinepubs/9699919799.2008edition/ >The fclose() function shall perform the equivalent of a close() >on the file descriptor And finally, at least NetBSD 9.3 also uses the close() function to do the same, but there's no workaround, and no reported misbehavior when running on NetBSD to work around. Even if the test did work, all the workaround appears to do is leak a FILE.
This commit is contained in:
parent
d5cc80ae16
commit
9d6e4c27b7
3
configure
vendored
3
configure
vendored
@ -220,9 +220,6 @@ check_define __FreeBSD__ && bsd_detected=true
|
|||||||
check_define __OpenBSD__ && {
|
check_define __OpenBSD__ && {
|
||||||
bsd_detected=true
|
bsd_detected=true
|
||||||
echo "CFLAGS+=-DIS_OPENBSD">>config.mak
|
echo "CFLAGS+=-DIS_OPENBSD">>config.mak
|
||||||
check_compile_run 'whether OpenBSDs fclose() (illegally) calls close()' \
|
|
||||||
'#include <stdio.h>\n#include<stdlib.h>\nint close(int x){exit(0);}int main(){fclose(stdin);return 1;}' && \
|
|
||||||
OUR_CPPFLAGS="$OUR_CPPFLAGS -DBROKEN_FCLOSE"
|
|
||||||
}
|
}
|
||||||
check_define __sun && check_define __SVR4 && solaris_detected=true
|
check_define __sun && check_define __SVR4 && solaris_detected=true
|
||||||
check_define __HAIKU__ && haiku_detected=true
|
check_define __HAIKU__ && haiku_detected=true
|
||||||
|
@ -115,7 +115,7 @@ typedef struct {
|
|||||||
unsigned int first, last, flags;
|
unsigned int first, last, flags;
|
||||||
} close_range_args_t;
|
} close_range_args_t;
|
||||||
|
|
||||||
/* If there is some `close` or `close_range` system call before do_init,
|
/* If there is some `close` or `close_range` system call before do_init,
|
||||||
we buffer it, and actually execute them in do_init. */
|
we buffer it, and actually execute them in do_init. */
|
||||||
static int close_fds[16];
|
static int close_fds[16];
|
||||||
static int close_fds_cnt = 0;
|
static int close_fds_cnt = 0;
|
||||||
@ -560,9 +560,7 @@ inv_host:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifndef BROKEN_FCLOSE
|
|
||||||
fclose(file);
|
fclose(file);
|
||||||
#endif
|
|
||||||
if(!count) {
|
if(!count) {
|
||||||
fprintf(stderr, "error: no valid proxy found in config\n");
|
fprintf(stderr, "error: no valid proxy found in config\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -639,7 +637,7 @@ HOOKFUNC(int, close_range, unsigned first, unsigned last, int flags) {
|
|||||||
int protected_fds[] = {req_pipefd[0], req_pipefd[1], resp_pipefd[0], resp_pipefd[1]};
|
int protected_fds[] = {req_pipefd[0], req_pipefd[1], resp_pipefd[0], resp_pipefd[1]};
|
||||||
intsort(protected_fds, 4);
|
intsort(protected_fds, 4);
|
||||||
/* We are skipping protected_fds while calling true_close_range()
|
/* We are skipping protected_fds while calling true_close_range()
|
||||||
* If protected_fds cut the range into some sub-ranges, we close sub-ranges BEFORE cut point in the loop.
|
* If protected_fds cut the range into some sub-ranges, we close sub-ranges BEFORE cut point in the loop.
|
||||||
* [first, cut1-1] , [cut1+1, cut2-1] , [cut2+1, cut3-1]
|
* [first, cut1-1] , [cut1+1, cut2-1] , [cut2+1, cut3-1]
|
||||||
* Finally, we delete the remaining sub-range, outside the loop. [cut3+1, tail]
|
* Finally, we delete the remaining sub-range, outside the loop. [cut3+1, tail]
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user