From facfa19cdd4d00944c53cc051020023256811928 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 8 Nov 2004 19:41:28 +0000 Subject: weirdo hack to fix debian bug report 278691: 'curl -v writes debugging to its network socket if stderr is closed' --- CHANGES | 9 +++++++++ configure.ac | 1 + src/config.h.in | 6 ++++++ src/main.c | 23 +++++++++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/CHANGES b/CHANGES index e9ea6a32d..15c3ceb10 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,15 @@ Changelog +Daniel (8 November 2004) +- Ian Gulliver reported in debian bug report #278691: if curl is invoked in an + environment where stderr is closed the -v output will still be sent to file + descriptor 2 which then might be the network socket handle! Now we have a + weird hack instead that attempts to make sure that file descriptor 2 is + opened (with a call to pipe()) before libcurl is called to do the transfer. + configure now checks for pipe() and systems without pipe don't get the weird + hack done. + Daniel (5 November 2004) - Tim Sneddon made libcurl send no more than 64K in a single first chunk when doing a huge POST on VMS, as this is a system limitation. Default on general diff --git a/configure.ac b/configure.ac index 091c869b8..621549582 100644 --- a/configure.ac +++ b/configure.ac @@ -1227,6 +1227,7 @@ AC_CHECK_FUNCS( strtoll \ basename \ setlocale \ ftruncate \ + pipe \ poll, dnl if found [], diff --git a/src/config.h.in b/src/config.h.in index 45eab3694..5636cbeeb 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -109,3 +109,9 @@ /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `ftruncate' function. */ +#undef HAVE_FTRUNCATE + +/* Define to 1 if you have the `pipe' function. */ +#undef HAVE_PIPE diff --git a/src/main.c b/src/main.c index 2fdb1eb24..4f6c62a61 100644 --- a/src/main.c +++ b/src/main.c @@ -3771,12 +3771,35 @@ operate(struct Configurable *config, int argc, char *argv[]) return res; } +static void checkfds(void); + +static void checkfds(void) +{ +#ifdef HAVE_PIPE + int fd[2] = { STDIN_FILENO, STDIN_FILENO }; + while( fd[0] == STDIN_FILENO || + fd[0] == STDOUT_FILENO || + fd[0] == STDERR_FILENO || + fd[1] == STDIN_FILENO || + fd[1] == STDOUT_FILENO || + fd[1] == STDERR_FILENO ) + pipe(fd); + + close(fd[0]); + close(fd[1]); +#endif +} + + + int main(int argc, char *argv[]) { int res; struct Configurable config; memset(&config, 0, sizeof(struct Configurable)); + checkfds(); + res = operate(&config, argc, argv); free_config_fields(&config); -- cgit v1.2.3