The following patch fixes two different bugs in dropsbr.c.

In the map_write routine, a call is made to map_open and this
call is supposed to set the "clear" variable to 0 or 1, depending
on whether the map file is empty or not.  In mh6.8.3, this worked
because map_open would set "clear" by calling the mbx_Xopen routine.
In nmh, the code for mbx_Xopen was merged into mbx_open, but the
interface for mbx_open doesn't support the clear variable, so that
functionality was lost.  The map_open interface still contains
"int *clear" in the prototype, but never sets it.

My patch eliminates "clear" from the map_open interface (I checked to
make sure that map_write is the only client of map_open).
Furthermore, my patch also sets the "clear" variable properly
at the beginning of map_write by calling fstat().  This eliminates
the bug in that the value of "clear" being used later in the routine
was just stack garbage.

Having a bad value of clear causes this next bug to be triggered:
The fp file pointer was being opened with fdopen, but in two of
the three switch cases it wasn't being closed.  In certain cases,
this was causing packf to run out of file descriptors if you
attempted to pack a large folder.

-Alec


Here is the patch:

--- ./dropsbr.c.orig    Sat May  6 16:52:59 2000
+++ ./dropsbr.c Fri May 26 20:38:12 2000
@@ -38,7 +38,7 @@
  */
 static int mbx_chk_mbox (int);
 static int mbx_chk_mmdf (int);
-static int map_open (char *, int *, int);
+static int map_open (char *, int);
 
 
 /*
@@ -565,14 +565,20 @@
     register struct drop *dp;
     struct drop d1, d2, *rp;
     register FILE *fp;
+    struct stat st;
 
-    if ((fd = map_open (file = map_name (mailbox), &clear, md)) == NOTOK)
+    if ((fd = map_open (file = map_name (mailbox), md)) == NOTOK)
        return NOTOK;
 
+    if ((fstat (fd, &st) == OK) && (st.st_size > 0))
+       clear = 0;
+    else
+       clear = 1;
+
     if (!clear && map_chk (file, fd, &d1, pos, noisy)) {
        unlink (file);
        mbx_close (file, fd);
-       if ((fd = map_open (file, &clear, md)) == NOTOK)
+       if ((fd = map_open (file, md)) == NOTOK)
            return NOTOK;
        clear++;
     }
@@ -594,6 +600,7 @@
                return NOTOK;
 
            case OK:
+               fclose (fp);
                break;
 
            default:
@@ -611,6 +618,7 @@
                    }
                }
                free ((char *) rp);
+               fclose (fp);
                break;
        }
     }
@@ -651,7 +659,7 @@
 
 
 static int
-map_open (char *file, int *clear, int md)
+map_open (char *file, int md)
 {
     mode_t mode;
     struct stat st;

Reply via email to