>Number:         4139
>Category:       mod_proxy
>Synopsis:       Garbage collection fails
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    apache
>State:          open
>Class:          sw-bug
>Submitter-Id:   apache
>Arrival-Date:   Thu Mar 25 22:20:01 PST 1999
>Last-Modified:
>Originator:     [EMAIL PROTECTED]
>Organization:
apache
>Release:        1.3.6
>Environment:
WIN32/NT4.0 SP4
>Description:
Garbage collection fails becaus on the WIN32 platform the open() function does 
not work with directories.
>How-To-Repeat:
Turn on garbage collection
>Fix:
The solution is to use stat instead of open/fstat to differentiate between 
files/directories.

Here is the patch:

--- ..\..\..\org\proxy_cache.c  Sun Feb 07 12:48:32 1999
+++ proxy_cache.c       Thu Mar 25 22:21:42 1999
@@ -56,7 +56,6 @@
  */
 
 /* Cache and garbage collection routines for Apache proxy */
-
 #include "mod_proxy.h"
 #include "http_conf_globals.h"
 #include "http_log.h"
@@ -448,6 +447,16 @@
 #endif
 
 /* read the file */
+#if defined(WIN32)
+    /* On WIN32 open does not work for directories, so we us stat instead
+       of fstat to determine if the file is a directory */
+       if (stat(filename, &buf) == -1) {
+           ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+                        "proxy gc: stat(%s)", filename);
+           continue;
+       }
+       fd = -1;
+#else
        fd = open(filename, O_RDONLY | O_BINARY);
        if (fd == -1) {
            if (errno != ENOENT)
@@ -461,12 +470,15 @@
            close(fd);
            continue;
        }
+#endif
 
 /* In OS/2 this has already been done above */
 #ifndef OS2
        if (S_ISDIR(buf.st_mode)) {
            char newcachedir[HUGE_STRING_LEN];
+#if !defined(WIN32)
            close(fd);
+#endif
            ap_snprintf(newcachedir, sizeof(newcachedir),
                        "%s%s/", cachesubdir, ent->d_name);
            if (!sub_garbage_coll(r, files, cachebasedir, newcachedir)) {
@@ -484,6 +496,21 @@
            }
            continue;
        }
+#endif
+
+#if defined(WIN32)
+       /* 
+          Since we have determined that the file is not a directory,
+          we shouldbe able to open it now 
+       */
+       fd = open(filename, O_RDONLY | O_BINARY);
+       if (fd == -1) {
+           if (errno != ENOENT)
+               ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+                            "proxy gc: open(%s) = %d", filename, errno);
+           continue;
+       }
+
 #endif
 
        i = read(fd, line, 26);

>Audit-Trail:
>Unformatted:
[In order for any reply to be added to the PR database, ]
[you need to include <[EMAIL PROTECTED]> in the Cc line ]
[and leave the subject line UNCHANGED.  This is not done]
[automatically because of the potential for mail loops. ]
[If you do not include this Cc, your reply may be ig-   ]
[nored unless you are responding to an explicit request ]
[from a developer.                                      ]
[Reply only with text; DO NOT SEND ATTACHMENTS!         ]



Reply via email to