cvs-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Cvs-cvs] ccvs/src ChangeLog add.c admin.c checkin.c chec...


From: Mark D. Baushke
Subject: [Cvs-cvs] ccvs/src ChangeLog add.c admin.c checkin.c chec...
Date: Wed, 30 May 2007 23:20:45 +0000

CVSROOT:        /cvsroot/cvs
Module name:    ccvs
Changes by:     Mark D. Baushke <mdb>   07/05/30 23:20:45

Modified files:
        src            : ChangeLog add.c admin.c checkin.c checkout.c 
                         commit.c diff.c edit.c find_names.c hash.c 
                         history.c import.c ls.c main.c parseinfo.c 
                         rcs.c root.c root.h sanity.sh server.c sign.c 
                         subr.c tag.c update.c 

Log message:
        * sanity.sh: Add --valgrind command-line option for running the
        valgrind command to do memory checks during normal santity check
        processing.
        (valgrind_check_opts): New shell function.
        (valgrind_set_opts): Ditto.
        (valgrind_tewst_pgp): Ditto.
        (date_s_emulate): Ditto.
        (valgrind_cvs): Ditto.
        (logfiles): Update sleep times to allow for valgrind processing.
        (pserver-3b, pserver-3c): Quote $regexp to work around problems
        with Solaris 10 /bin/sh processing of the interpolated command
        argument.
        (multiroot2-9a): Update trace matching.
        (trace-1): Ditto.
        
        * root.c (root_configs_read): New global list.
        (root_configs_read_add): Add a new parse_config table to
        root_configs_read.
        (root_configs_read_free): New function to free the
        root_configs_read list.
        (get_root_allow_config): Change name to get_root_config and
        use in main.c keep track of parsed configuration files using
        the new root_configs_read list.
        (get_root_config): A missing root config is now parsed and
        put into the root_configs_read list.
        * root.h (root_configs_free): New function prototype.
        s/get_root_allow_config/get_root_config/
        * main.c (main): Call get_root_config instead of parse_config.
        Fix memory leak of some global variables.
        * tag.c (del_tag_info): New function to free struct tag_info
        contents.
        (check_fileproc): Use it.
        
        * admin.c (admin): Fix memory leak.
        * checkin.c (Checkin): Ditto.
        * rcs.c (RCS_gettag): Ditto.
        * sign.c (gen_signature): Ditto.
        
        [bug #5911]
        * history.c (free_hrecs): New function to free hrec_head records.
        (history): Use it.
        (read_hrecs_file, read_hrecs): Initialize newly added hrec_head
        records.
        
        * add.c (add): Fix memory leak.
        * checkout.c (checkout): Ditto.
        * commit.c (check_fileproc, update_delproc): Ditto.
        * diff.c (diff): Ditto.
        * edit.c (find_editors_and_output, edit_fileproc): Ditto.
        * find_names.c (find_files): Ditto.
        * hash.c (mergelists): Ditto.
        * history.c (history_write): Ditto.
        * import.c (add_rcs_file): Ditto.
        * ls.c (ls_direntproc): Ditto.
        * main.c (main): Ditto.
        * parseinfo.c (free_config): Ditto.
        * rcs.c (free_keywords, expand_keywords): Ditto.
        * subr.c (previous_rev): Ditto.
        * tag.c (check_fileproc): Ditto.
        * update.c (update): Ditto.
        (bug report from address@hidden)

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/ChangeLog?cvsroot=cvs&r1=1.3510&r2=1.3511
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/add.c?cvsroot=cvs&r1=1.128&r2=1.129
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/admin.c?cvsroot=cvs&r1=1.117&r2=1.118
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/checkin.c?cvsroot=cvs&r1=1.58&r2=1.59
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/checkout.c?cvsroot=cvs&r1=1.147&r2=1.148
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/commit.c?cvsroot=cvs&r1=1.270&r2=1.271
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/diff.c?cvsroot=cvs&r1=1.118&r2=1.119
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/edit.c?cvsroot=cvs&r1=1.94&r2=1.95
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/find_names.c?cvsroot=cvs&r1=1.44&r2=1.45
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/hash.c?cvsroot=cvs&r1=1.49&r2=1.50
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/history.c?cvsroot=cvs&r1=1.98&r2=1.99
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/import.c?cvsroot=cvs&r1=1.179&r2=1.180
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/ls.c?cvsroot=cvs&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/main.c?cvsroot=cvs&r1=1.269&r2=1.270
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/parseinfo.c?cvsroot=cvs&r1=1.86&r2=1.87
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/rcs.c?cvsroot=cvs&r1=1.386&r2=1.387
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/root.c?cvsroot=cvs&r1=1.126&r2=1.127
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/root.h?cvsroot=cvs&r1=1.25&r2=1.26
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/sanity.sh?cvsroot=cvs&r1=1.1176&r2=1.1177
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/server.c?cvsroot=cvs&r1=1.473&r2=1.474
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/sign.c?cvsroot=cvs&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/subr.c?cvsroot=cvs&r1=1.155&r2=1.156
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/tag.c?cvsroot=cvs&r1=1.149&r2=1.150
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/update.c?cvsroot=cvs&r1=1.267&r2=1.268

Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/ChangeLog,v
retrieving revision 1.3510
retrieving revision 1.3511
diff -u -b -r1.3510 -r1.3511
--- ChangeLog   23 May 2007 18:57:24 -0000      1.3510
+++ ChangeLog   30 May 2007 23:20:42 -0000      1.3511
@@ -1,3 +1,67 @@
+2007-05-30  Mark D. Baushke  <address@hidden>
+
+       * sanity.sh: Add --valgrind command-line option for running the
+       valgrind command to do memory checks during normal santity check
+       processing.
+       (valgrind_check_opts): New shell function.
+       (valgrind_set_opts): Ditto.
+       (valgrind_tewst_pgp): Ditto.
+       (date_s_emulate): Ditto.
+       (valgrind_cvs): Ditto.
+       (logfiles): Update sleep times to allow for valgrind processing.
+       (pserver-3b, pserver-3c): Quote $regexp to work around problems
+       with Solaris 10 /bin/sh processing of the interpolated command
+       argument.
+       (multiroot2-9a): Update trace matching.
+       (trace-1): Ditto.
+
+       * root.c (root_configs_read): New global list.
+       (root_configs_read_add): Add a new parse_config table to
+       root_configs_read.
+       (root_configs_read_free): New function to free the
+       root_configs_read list.
+       (get_root_allow_config): Change name to get_root_config and
+       use in main.c keep track of parsed configuration files using
+       the new root_configs_read list.
+       (get_root_config): A missing root config is now parsed and
+       put into the root_configs_read list.
+       * root.h (root_configs_free): New function prototype.
+       s/get_root_allow_config/get_root_config/
+       * main.c (main): Call get_root_config instead of parse_config.
+       Fix memory leak of some global variables.
+       * tag.c (del_tag_info): New function to free struct tag_info
+       contents.
+       (check_fileproc): Use it.
+
+       * admin.c (admin): Fix memory leak.
+       * checkin.c (Checkin): Ditto.
+       * rcs.c (RCS_gettag): Ditto.
+       * sign.c (gen_signature): Ditto.
+
+       [bug #5911]
+       * history.c (free_hrecs): New function to free hrec_head records.
+       (history): Use it.
+       (read_hrecs_file, read_hrecs): Initialize newly added hrec_head
+       records.
+
+       * add.c (add): Fix memory leak.
+       * checkout.c (checkout): Ditto.
+       * commit.c (check_fileproc, update_delproc): Ditto.
+       * diff.c (diff): Ditto.
+       * edit.c (find_editors_and_output, edit_fileproc): Ditto.
+       * find_names.c (find_files): Ditto.
+       * hash.c (mergelists): Ditto.
+       * history.c (history_write): Ditto.
+       * import.c (add_rcs_file): Ditto.
+       * ls.c (ls_direntproc): Ditto.
+       * main.c (main): Ditto.
+       * parseinfo.c (free_config): Ditto.
+       * rcs.c (free_keywords, expand_keywords): Ditto.
+       * subr.c (previous_rev): Ditto.
+       * tag.c (check_fileproc): Ditto.
+       * update.c (update): Ditto.
+       (bug report from address@hidden)
+
 2007-05-22  Larry Jones  <address@hidden>
 
        * rcs.c (RCS_fully_parse): Include revision in error message.

Index: add.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/add.c,v
retrieving revision 1.128
retrieving revision 1.129
diff -u -b -r1.128 -r1.129
--- add.c       12 Aug 2006 17:16:01 -0000      1.128
+++ add.c       30 May 2007 23:20:42 -0000      1.129
@@ -516,6 +516,7 @@
 "File `%s' has no previous revision to resurrect.",
                                           finfo.fullname);
                                free (prev);
+                               freevers_ts (&vers);
                                goto skip_this_file;
                            }
                            if (!quiet)

Index: admin.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/admin.c,v
retrieving revision 1.117
retrieving revision 1.118
diff -u -b -r1.117 -r1.118
--- admin.c     13 Jun 2006 22:29:48 -0000      1.117
+++ admin.c     30 May 2007 23:20:42 -0000      1.118
@@ -761,6 +761,12 @@
 
     Lock_Cleanup ();
 
+    if (admin_data.cmdline)
+    {
+       free (admin_data.cmdline);
+       admin_data.cmdline = NULL;
+    }
+
 /* This just suppresses a warning from -Wall.  */
 #ifdef CLIENT_SUPPORT
  return_it:

Index: checkin.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/checkin.c,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -b -r1.58 -r1.59
--- checkin.c   31 May 2006 16:03:02 -0000      1.58
+++ checkin.c   30 May 2007 23:20:42 -0000      1.59
@@ -128,6 +128,7 @@
            }
            /* Remove the previous base file, in local mode.  */
            base_remove (finfo->file, pvers->vn_user);
+           freevers_ts (&pvers);
 
            wrap_fromcvs_process_file (finfo->file);
 

Index: checkout.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/checkout.c,v
retrieving revision 1.147
retrieving revision 1.148
diff -u -b -r1.147 -r1.148
--- checkout.c  6 Jul 2006 02:14:08 -0000       1.147
+++ checkout.c  30 May 2007 23:20:43 -0000      1.148
@@ -406,6 +406,10 @@
     }
     if (history_name != tag && history_name != date && history_name != NULL)
        free (history_name);
+
+    if (join_orig1) free (join_orig1);
+    if (join_orig2) free (join_orig2);
+
     return err;
 }
 

Index: commit.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/commit.c,v
retrieving revision 1.270
retrieving revision 1.271
diff -u -b -r1.270 -r1.271
--- commit.c    22 Sep 2006 00:32:48 -0000      1.270
+++ commit.c    30 May 2007 23:20:43 -0000      1.271
@@ -1086,6 +1086,8 @@
             {
                 error (0, 0, "Valid edit does not exist for %s",
                        finfo->fullname);
+               if (li) free (li);
+               if (p) freenode (p);
                 freevers_ts (&vers);
                 return 1;
             }
@@ -2510,6 +2512,8 @@
 {
     struct logfile_info *li = p->data;
 
+    if (!li)
+       return;
     if (li->tag)
        free (li->tag);
     if (li->rev_old)

Index: diff.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/diff.c,v
retrieving revision 1.118
retrieving revision 1.119
diff -u -b -r1.118 -r1.119
--- diff.c      23 Jun 2006 20:46:39 -0000      1.118
+++ diff.c      30 May 2007 23:20:43 -0000      1.119
@@ -484,6 +484,14 @@
        free (diff_date1);
     if (diff_date2 != NULL)
        free (diff_date2);
+    if (diff_orig1)
+       free (diff_orig1);
+    if (diff_orig1)
+       free (diff_orig2);
+    if (diff_rev1)
+       free (diff_rev1);
+    if (diff_rev2)
+       free (diff_rev2);
 
     return err;
 }

Index: edit.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/edit.c,v
retrieving revision 1.94
retrieving revision 1.95
diff -u -b -r1.94 -r1.95
--- edit.c      26 May 2006 19:25:57 -0000      1.94
+++ edit.c      30 May 2007 23:20:43 -0000      1.95
@@ -329,6 +329,7 @@
 
     editors_output (finfo->fullname, them);
 
+    free (them);
     return 0;
 }
 
@@ -411,6 +412,7 @@
     if (!vers->vn_user)
     {
        error (0, 0, "no such file %s; ignored", finfo->fullname);
+       freevers_ts (&vers);
        return 1;
     }
 

Index: find_names.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/find_names.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -b -r1.44 -r1.45
--- find_names.c        24 Apr 2006 18:50:26 -0000      1.44
+++ find_names.c        30 May 2007 23:20:43 -0000      1.45
@@ -335,8 +335,11 @@
     if (err && err != GLOB_NOMATCH)
     {
        if (err == GLOB_ABORTED)
+       {
            /* Let our caller handle the problem.  */
+           if (catpat) free (catpat);
            return NULL;
+       }
        if (err == GLOB_NOSPACE) errno = ENOMEM;
        if (!really_quiet)
            error (0, errno, "glob failed");

Index: hash.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/hash.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -b -r1.49 -r1.50
--- hash.c      24 Apr 2006 18:50:26 -0000      1.49
+++ hash.c      30 May 2007 23:20:43 -0000      1.50
@@ -178,7 +178,11 @@
     {
        n = p->next;
        removenode (p);
-       addnode (dest, p);
+
+       /* If the node is already in the list, then free
+          the duplicate which was not inserted. */ 
+       if (addnode (dest, p) == -1)
+           freenode (p);
     }
     dellist (src);
 }

Index: history.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/history.c,v
retrieving revision 1.98
retrieving revision 1.99
diff -u -b -r1.98 -r1.99
--- history.c   9 Jun 2006 21:28:17 -0000       1.98
+++ history.c   30 May 2007 23:20:43 -0000      1.99
@@ -429,6 +429,30 @@
 
 
 
+/* go over all history records in array pointed by hrec_head,
+ * and free the allocated memory.
+ */
+static void
+free_hrecs (void)
+{
+    struct hrec *hr;
+
+    if (!hrec_head)
+       return;
+
+    /* hrec_head points to array of hrec */
+    /* hrline string is parsed into hrec fields, starting at type,
+     * (this is done in fill_hrec)
+     * so freeing type alone is sufficient
+     */
+    for (hr = hrec_head; (hr < hrec_head + hrec_max) && hr->type; hr++)
+       free (hr->type);
+    free (hrec_head);
+    hrec_head = NULL;
+}
+
+
+
 int
 history (int argc, char **argv)
 {
@@ -761,6 +785,8 @@
     if (hrec_count > 0)
        qsort (hrec_head, hrec_count, sizeof (struct hrec), sort_order);
     report_hrecs ();
+    free_hrecs ();
+    dellist (&flist);
     if (since_date != NULL)
        free (since_date);
     free (since_rev);
@@ -779,7 +805,7 @@
 history_write (int type, const char *update_dir, const char *revs,
                const char *name, const char *repository)
 {
-    const char *fname;
+    char *fname;
     char *workdir;
     char *username = getcaller ();
     int fd;
@@ -918,7 +944,7 @@
     line = Xasprintf ("%c%08lx|%s|%s|%s|%s|%s\n", type, (long) now,
                      username, workdir, repos, revs, name);
 
-    fname = get_history_log_name (now);
+    fname = (char *) get_history_log_name (now);
 
     if (!history_lock (current_parsed_root->directory))
        /* history_lock() will already have printed an error on failure.  */
@@ -953,6 +979,7 @@
        error (1, errno, "cannot close history file: %s", fname);
     free (workdir);
  out:
+    free (fname);
     clear_history_lock ();
 }
 
@@ -1199,6 +1226,9 @@
                error (1, 0, "Too many history records in history file.");
 
            hrec_head = xnrealloc (hrec_head, hrec_max, sizeof (struct hrec));
+           /* initialize newly added records */
+           memset (&hrec_head[hrec_count], 0,
+                   HREC_INCREMENT * sizeof (struct hrec));
            if (last_since_tag)
                last_since_tag = hrec_head + (last_since_tag - old_head);
            if (last_backto)
@@ -1216,7 +1246,10 @@
        if (select_hrec (&hrec_head[hrec_count]))
            hrec_count++;
        else 
+       {
            free (hrline);
+           hrec_head[hrec_count].type = NULL;
+       }
 
        cp = nl + 1;
     }
@@ -1238,6 +1271,7 @@
      */
     hrec_max = HREC_INCREMENT;
     hrec_head = xmalloc (hrec_max * sizeof (struct hrec));
+    memset (hrec_head, 0, hrec_max * sizeof (struct hrec));
     hrec_idx = 0;
 
     files_read = walklist (flist, read_hrecs_file, NULL);

Index: import.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/import.c,v
retrieving revision 1.179
retrieving revision 1.180
diff -u -b -r1.179 -r1.180
--- import.c    4 Mar 2007 00:27:56 -0000       1.179
+++ import.c    30 May 2007 23:20:43 -0000      1.180
@@ -1356,7 +1356,10 @@
 
            if (fprintf (fprcs, "openpgp-signatures        %s;\012",
                         b64sig) < 0)
+           {
+               free (b64sig);
                goto write_error;
+           }
            free (b64sig);
        }
        else
@@ -1545,8 +1548,10 @@
     if (tocvsPath)
        if (unlink_file_dir (tocvsPath) < 0)
                error (0, errno, "cannot remove %s", tocvsPath);
-    if (free_opt != NULL)
+    if (free_opt)
        free (free_opt);
+    if (dead_revision)
+       free (dead_revision);
     return err;
 
 write_error:
@@ -1572,8 +1577,10 @@
        if (unlink_file_dir (tocvsPath) < 0)
            error (0, errno, "cannot remove %s", tocvsPath);
 
-    if (free_opt != NULL)
+    if (free_opt)
        free (free_opt);
+    if (dead_revision)
+       free (dead_revision);
 
     return err + 1;
 }

Index: ls.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/ls.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- ls.c        24 Apr 2006 18:50:26 -0000      1.19
+++ ls.c        30 May 2007 23:20:43 -0000      1.20
@@ -474,6 +474,7 @@
         parent[strlen (update_dir) - strlen (dir)] = '\0';
         strip_trailing_slashes (parent);
         p = findnode (callerdat, parent);
+        free (parent);
     }
     else
         p = NULL;

Index: main.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/main.c,v
retrieving revision 1.269
retrieving revision 1.270
diff -u -b -r1.269 -r1.270
--- main.c      9 May 2007 23:54:33 -0000       1.269
+++ main.c      30 May 2007 23:20:43 -0000      1.270
@@ -1324,8 +1324,8 @@
                   already printed an error.  We keep going.  Why?  Because
                   if we didn't, then there would be no way to check in a new
                   CVSROOT/config file to fix the broken one!  */
-               if (config) free_config (config);
-               config = parse_config (current_parsed_root->directory, NULL);
+               config = get_root_config (current_parsed_root->directory,
+                                         NULL);
 
                /* Can set TMPDIR in the environment if necessary now, since
                 * if it was set in config, we now know it.
@@ -1392,6 +1392,14 @@
     } /* end of stuff that gets done if the user DOESN'T ask for help */
 
     root_allow_free ();
+    root_configs_read_free ();
+
+    /* free up some memory */
+    if (CurDir) free (CurDir);
+    if (global_session_id) free (global_session_id);
+    if (program_path) free (program_path);
+    if (hostname) free (hostname);
+    CurDir = global_session_id = program_path = hostname = NULL;
 
     /* This is exit rather than return because apparently that keeps
        some tools which check for memory leaks happier.  */

Index: parseinfo.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/parseinfo.c,v
retrieving revision 1.86
retrieving revision 1.87
diff -u -b -r1.86 -r1.87
--- parseinfo.c 24 Apr 2006 18:50:27 -0000      1.86
+++ parseinfo.c 30 May 2007 23:20:43 -0000      1.87
@@ -343,6 +343,16 @@
 free_config (struct config *data)
 {
     if (data->keywords) free_keywords (data->keywords);
+    if (data->lock_dir) free(data->lock_dir);
+    if (data->logHistory) free (data->logHistory);
+    if (data->HistoryLogPath) free (data->HistoryLogPath);
+    if (data->HistorySearchPath) free (data->HistorySearchPath);
+    if (data->TmpDir) free(data->TmpDir);
+    if (data->UserAdminOptions) free (data->UserAdminOptions);
+    if (data->PrimaryServer) free (data->PrimaryServer);
+    if (data->VerifyTemplate) free (data->VerifyTemplate);
+    if (data->OpenPGPTextmode) free (data->OpenPGPTextmode);
+    if (data->VerifyArgs) dellist (&data->VerifyArgs);
     free (data);
 }
 

Index: rcs.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/rcs.c,v
retrieving revision 1.386
retrieving revision 1.387
diff -u -b -r1.386 -r1.387
--- rcs.c       23 May 2007 18:57:24 -0000      1.386
+++ rcs.c       30 May 2007 23:20:43 -0000      1.387
@@ -3563,6 +3563,10 @@
 void
 free_keywords (void *keywords)
 {
+    struct rcs_keyword *k;
+    k = (struct rcs_keyword *) keywords + KEYWORD_LOCALID;
+    if (k->string)
+       free ((char *) k->string);
     free (keywords);
 }
 
@@ -4002,6 +4006,8 @@
                {
                    error (0, 0,
 "Skipping `$" "Log$' keyword due to excessive comment leader.");
+                   free (sub);
+                   sub = NULL;
                    continue;
                }
            }

Index: root.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/root.c,v
retrieving revision 1.126
retrieving revision 1.127
diff -u -b -r1.126 -r1.127
--- root.c      9 May 2007 23:54:33 -0000       1.126
+++ root.c      30 May 2007 23:20:44 -0000      1.127
@@ -287,6 +287,10 @@
 static List *root_allow;
 static List *root_allow_regexp;
 
+/* The root_configs_read maintains a list of valid CVSROOT directories
+   read by parse_config(). */
+static List *root_configs_read;
+
 static void
 delconfig (Node *n)
 {
@@ -295,13 +299,38 @@
 
 
 
+static Node *
+root_configs_read_add (const char *arg, const char *configPath)
+{
+    Node *n;
+
+    if (!root_configs_read) root_configs_read = getlist ();
+    n = getnode ();
+    n->key = xstrdup (arg);
+    n->data = parse_config (arg, configPath);
+    n->delproc = delconfig;
+    addnode (root_configs_read, n);
+
+    return n;
+}
+
+
+
+void
+root_configs_read_free (void)
+{
+    dellist (&root_configs_read);
+}
+
+
+
 void
 root_allow_add (const char *arg, const char *configPath)
 {
     Node *n;
 
-    if (!root_allow) root_allow = getlist();
-    n = getnode();
+    if (!root_allow) root_allow = getlist ();
+    n = getnode ();
     n->key = xstrdup (arg);
     n->data = parse_config (arg, configPath);
     n->delproc = delconfig;
@@ -402,11 +431,11 @@
  *   The config associated with ARG.
  */
 struct config *
-get_root_allow_config (const char *arg, const char *configPath)
+get_root_config (const char *arg, const char *configPath)
 {
     Node *n;
 
-    TRACE (TRACE_FUNCTION, "get_root_allow_config (%s)", arg);
+    TRACE (TRACE_FUNCTION, "get_root_config (%s)", arg);
 
     if (root_allow)
        n = findnode (root_allow, arg);
@@ -414,7 +443,15 @@
        n = NULL;
 
     if (n) return n->data;
-    return parse_config (arg, configPath);
+
+    /* If it is not in root_allow, it might be in root_configs_read */
+    if (root_configs_read)
+       n = findnode (root_configs_read, arg);
+
+    if (n) return n->data;
+    n = root_configs_read_add (arg, configPath);
+
+    return n->data;
 }
 
 

Index: root.h
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/root.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -b -r1.25 -r1.26
--- root.h      9 May 2007 23:54:33 -0000       1.25
+++ root.h      30 May 2007 23:20:44 -0000      1.26
@@ -93,7 +93,8 @@
 void root_allow_free (void);
 bool root_allow_used (void);
 bool root_allow_ok (const char *);
-struct config *get_root_allow_config (const char *arg, const char *configPath);
+void root_configs_read_free (void);
+struct config *get_root_config (const char *arg, const char *configPath);
 const char *primary_root_translate (const char *root_in);
 const char *primary_root_inverse_translate (const char *root_in);
 

Index: sanity.sh
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/sanity.sh,v
retrieving revision 1.1176
retrieving revision 1.1177
diff -u -b -r1.1176 -r1.1177
--- sanity.sh   9 May 2007 23:54:33 -0000       1.1176
+++ sanity.sh   30 May 2007 23:20:44 -0000      1.1177
@@ -76,6 +76,7 @@
     echo "              implies --remote)."
     echo "-v|--verbose  List test names as they are executed."
     echo "-B|--no-bases Suppress use of Base files."
+    echo "-V|--valgrind Run valgrind on the cvs test"
     echo
     echo "CVS-TO-TEST   The path to the CVS executable to be tested; used as"
     echo "              the path to the CVS client when CVS-FOR-CVS-SERVER is"
@@ -132,6 +133,7 @@
 unset remotehost
 unset rootoptions
 bases=:
+valgrind=false
 keep=false
 linkroot=false
 noredirect=false
@@ -215,6 +217,10 @@
                option=e
                OPTARG=
                ;;
+            valgrind)
+                option=V
+                OPTARG=
+                ;;
            v|ve|ver|verb|verbo|verbos|verbose)
                option=v
                OPTARG=
@@ -228,6 +234,9 @@
        B)
            bases=false
            ;;
+       V)
+           valgrind=:
+           ;;
        c)
            configfile="$OPTARG"
            ;;
@@ -319,6 +328,9 @@
   exit 1
 fi
 
+# If $valgrind is set, then prefix it with a real $origtestcvs command.
+origtestcvs=$testcvs
+
 # If $remotehost is set, warn if $TESTDIR isn't since we are pretty sure
 # that its default value of `/tmp/cvs-sanity' will not resolve to the same
 # directory on two different machines.
@@ -347,7 +359,7 @@
 # If no config files are found, then this script will issue a warning and
 # attempt to assume the most portable configuration.
 foundaconfig=false
-for dir in `dirname $0` `dirname $testcvs`; do
+for dir in `dirname $0` `dirname $origtestcvs`; do
        if test -r "$dir/sanity.config.sh"; then
                . "$dir/sanity.config.sh"
                foundaconfig=:
@@ -401,7 +413,7 @@
   CVS_SERVER=$servercvs
 else
   # default $CVS_SERVER to ${testcvs}
-  : ${CVS_SERVER=$testcvs}
+  : ${CVS_SERVER=$origtestcvs}
   # With the previous command, effectively defaults $servercvs to $CVS_SERVER,
   # then $testcvs
   servercvs=$CVS_SERVER
@@ -532,7 +544,7 @@
 # FIXME: we don't properly quote this--if the name contains . we'll
 # just spuriously match a few things; if the name contains other regexp
 # special characters we are probably in big trouble.
-CPROG=`basename ${testcvs} |sed 's/\.exe$//'`
+CPROG=`basename ${origtestcvs} |sed 's/\.exe$//'`
 # And the regexp for the CVS server when we have one.  In local mode, this
 # defaults to $CPROG since $servercvs already did.
 # FIXCVS: There are a few places in error messages where CVS suggests a command
@@ -665,6 +677,7 @@
 CVS="${testcvs} -Q"
 
 LOGFILE=`pwd`/check.log
+VALGRINDLOG=`pwd`/valgrind.log
 
 # Save the previous log in case the person running the tests decides
 # they want to look at it.  The extension ".plog" is chosen for consistency
@@ -822,9 +835,11 @@
 # versions that do.
 : ${AWK=awk}
 : ${DIFF=diff}
+: ${BINDATE=date}
 : ${EXPR=expr}
 : ${ID=id}
 : ${TR=tr}
+: ${VALGRIND=valgrind}
 
 # Keep track of tools that are found, but do NOT work as we hope
 # in order to avoid them in future
@@ -1180,6 +1195,136 @@
   version_test expr_tooltest1 expr_tooltest2 expr_tooltest3 \
 expr_set_ENDANCHOR expr_set_DOTSTAR expr_tooltest_DOTSTAR`
 
+: ${VALGRIND_OPTS='--tool=memcheck'}
+# Does valgrind allow this additional argument?
+valgrind_check_opts ()
+{
+    if $VALGRIND $VALGRIND_OPTS ${1+"$@"} ; then
+       return 0
+    else
+       return 1
+    fi
+}
+
+valgrind_set_opts ()
+{
+    testout=valgrind_$$
+    for newopt in "$@"; do
+        # First, does the current set of VALGRIND_OPTS work?
+       if valgrind_check_opts date >/dev/null 2>$testout; then
+           if valgrind_check_opts $newopt date >/dev/null 2>$testout; then
+               VALGRIND_OPTS="$VALGRIND_OPTS $newopt"
+           fi
+           rm $testout
+       else
+           echo "WARNING: A problem was encountered trying to use valgrind."
+           echo "The command:"
+           echo "  $VALGRIND $VALGRIND_OPTS date"
+           if [ -s $testout ]; then
+               echo "failed with the following error output:"
+               cat $testout
+           else
+               echo "failed."
+           fi
+           rm $testout
+           echo "$VALGRIND does not appear to work properly." >&2
+           echo Disabling valgrind processing. 
+           valgrind=false
+           return 1
+       fi
+    done
+    return 0
+}
+
+valgrind_test_gpg ()
+{
+    if $gpg; then
+       testout=valgrind_$$
+       if valgrind_check_opts gpg --version >/dev/null 2>$testout; then
+           rm $testout;
+       else
+           valgrind=false
+           if grep 's[ug]id' $testout >/dev/null; then
+               echo WARNING: Valgrind does not work well with a
+               echo setuid/setgid gpg program. You may wish to
+               echo chmod your gpg program to remove those bits
+               echo until testing of CVS with valgrind is complete.
+               echo Disabling valgrind processing. 
+           else
+               echo WARNING: Valgrind does not seem to work properly with gpg.
+               echo This may be due to setuid/setgid bits on the
+               echo gpg executable. You may wish to remove those bits
+               echo until testing of CVS with valgrind is complete.
+               echo Disabling valgrind processing.
+           fi
+           echo "Problems with the command:" >>$LOGFILE
+           echo "$VALGRIND $VALGRIND_OPTS gpg --version" >>$LOGFILE
+           echo "which yeilds to this unexpected output:" >>$LOGFILE
+           cat $testout >> $LOGFILE
+           rm $testout
+       fi
+    fi
+    return 0
+}
+
+valgrind_log_file_exactly=false
+if $valgrind; then
+  VALGRIND=`find_tool valgrind valgrind version_test`
+  val_log=/tmp/valgrind$$
+  if valgrind_set_opts --num-callers=20 --trace-children=yes \
+      --leak-check=full; then
+      if valgrind_check_opts \
+         --log-file-exactly=$val_log date >/dev/null 2>&1; then
+         valgrind_log_file_exactly=:
+      fi
+      valgrind_test_gpg
+  fi
+fi
+
+
+# In the best of all possible worlds, date +%s prints the number
+# of seconds since the epoch.
+datenum=1
+date_s_emulate ()
+{
+    shift
+    datenum=`expr $datenum + 1`
+    echo $datenum
+}
+case `date +%s` in
+%s) echo "WARNING: date does not support +%s format properly."
+    BINDATE=date_s_emulate;;
+[0-9]+) BINDATE=date;;
+esac
+
+valgrind_lastlog=''
+valgrind_cvs () {
+    CUR=vg_`$BINDATE +%s`
+    if $valgrind_log_file_exactly; then
+       valgrind_lastlog=$CUR
+       valgrindcmd="$VALGRIND $VALGRIND_OPTS 
--log-file-exactly=$VALGRINDLOG/$CUR"
+    else
+       valgrind_lastlog=$CUR
+       valgrindcmd="$VALGRIND $VALGRIND_OPTS --log-file=$VALGRINDLOG/$CUR"
+    fi
+    echo $valgrindcmd $origtestcvs "$@" >> $VALGRINDLOG/$CUR
+    $valgrindcmd $origtestcvs "$@"
+}
+
+if $valgrind; then
+    [ -d $VALGRINDLOG ] || mkdir $VALGRINDLOG
+    testcvs=valgrind_cvs
+fi
+
+echo "Using EXPR=$EXPR" >>$LOGFILE
+echo "Using ENDANCHOR=$ENDANCHOR" >>$LOGFILE
+echo "Using DOTSTAR=$DOTSTAR" >>$LOGFILE
+echo "Using BINDATE=$BINDATE" >>$LOGFILE
+if $valgrind; then
+    echo "Using VALGRIND=$VALGRIND" >>$LOGFILE
+    echo "Using VALGRIND_OPTS=$VALGRIND_OPTS" >>$LOGFILE
+fi
+
 # Set the ENDANCHOR and DOTSTAR for the chosen expr version.
 expr_set_ENDANCHOR ${EXPR} >/dev/null
 expr_tooltest_DOTSTAR ${EXPR} >/dev/null
@@ -1189,10 +1334,6 @@
 expr_set_DASHDASH ${EXPR}
 $exprDASHDASH && EXPR="$EXPR --"
 
-echo "Using EXPR=$EXPR" >>$LOGFILE
-echo "Using ENDANCHOR=$ENDANCHOR" >>$LOGFILE
-echo "Using DOTSTAR=$DOTSTAR" >>$LOGFILE
-
 # Cleanup
 rm -f ${TESTDIR}/bar
 
@@ -1627,6 +1768,18 @@
     cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
     fail "$1"
   fi
+  if $valgrind; then
+      if $valgrind_log_file_exactly; then
+         lsf=`ls -1tr $VALGRINDLOG | tail -1`
+      else
+         lsf=`ls -1tr $VALGRINDLOG | grep ${valgrind_lastlog}`
+      fi
+      for f in $lsf; do
+         if echo $f | grep "\-" 2>&1 1>/dev/null; then :; else
+             mv $VALGRINDLOG/$f "$VALGRINDLOG/$f-$1"
+         fi
+      done
+  fi
 }
 
 dotest_all_in_one ()
@@ -24047,6 +24200,17 @@
            continue
          fi
 
+         # Running valgrind on these tests takes much longer than the
+         # normal 5 seconds of sleep. Bump to by 7 seconds and hope
+         # for the best.
+         if $valgrind; then
+           sleep5='sleep 12'
+           sleep8='sleep 15'
+         else
+           sleep5='sleep 5'
+           sleep8='sleep 8'
+         fi
+
          mkdir 1; cd 1
          mkdir sdir
          mkdir sdir/ssdir
@@ -24143,7 +24307,7 @@
 
          # 3. Don't read when write locks present...
          mkdir "$TESTDIR/locks/first-dir/#cvs.lock"
-         (sleep 8; rmdir "$TESTDIR/locks/first-dir/#cvs.lock")&
+         ($sleep8; rmdir "$TESTDIR/locks/first-dir/#cvs.lock")&
          dotest lockfiles-10 "$testcvs -q co -l first-dir" \
 "$SPROG checkout: \[[0-9:]*\] waiting for $username's lock in 
$CVSROOT_DIRNAME/first-dir
 $SPROG checkout: \[[0-9:]*\] obtained lock in $CVSROOT_DIRNAME/first-dir"
@@ -24164,7 +24328,7 @@
          # 7. Don't write when read locks are present...
          echo I always have trouble coming up with witty text for the test 
files >>first-dir/sdir/ssdir/file1
          touch "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.rfl.test.lock"
-         (sleep 5; rm 
"$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.rfl.test.lock")&
+         ($sleep5; rm 
"$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.rfl.test.lock")&
          dotest lockfiles-13 "$testcvs -q ci -mconflict first-dir" \
 "$SPROG commit: \[[0-9:]*\] waiting for $username's lock in 
$CVSROOT_DIRNAME/first-dir/sdir/ssdir
 $SPROG commit: \[[0-9:]*\] obtained lock in 
$CVSROOT_DIRNAME/first-dir/sdir/ssdir
@@ -24185,7 +24349,7 @@
          #    (fail to perform commit up-to-date check with promotable lock
          #     present).
          touch "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.pfl.test.lock"
-         (sleep 5; rm 
"$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.pfl.test.lock")&
+         ($sleep5; rm 
"$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.pfl.test.lock")&
          dotest_fail lockfiles-15 "$testcvs -q ci -mnot-up-to-date first-dir" \
 "$SPROG commit: \[[0-9:]*\] waiting for $username's lock in 
$CVSROOT_DIRNAME/first-dir/sdir/ssdir
 $SPROG commit: \[[0-9:]*\] obtained lock in 
$CVSROOT_DIRNAME/first-dir/sdir/ssdir
@@ -24196,7 +24360,7 @@
          #    (fail to perform commit up-to-date check with promotable lock
          #     present).
          mkdir "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.lock"
-         (sleep 5; rmdir "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.lock")&
+         ($sleep5; rmdir "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.lock")&
          dotest_fail lockfiles-16 "$testcvs -q ci -mnot-up-to-date first-dir" \
 "$SPROG commit: \[[0-9:]*\] waiting for $username's lock in 
$CVSROOT_DIRNAME/first-dir/sdir/ssdir
 $SPROG commit: \[[0-9:]*\] obtained lock in 
$CVSROOT_DIRNAME/first-dir/sdir/ssdir
@@ -24207,7 +24371,7 @@
          dotest lockfiles-17 "$testcvs -Q up -C first-dir/sdir/ssdir"
          echo the kinds of smiles that light faces for miles 
>>first-dir/sdir/ssdir/file1
          touch "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.pfl.test.lock"
-         (sleep 5; rm 
"$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.pfl.test.lock")&
+         ($sleep5; rm 
"$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.pfl.test.lock")&
          dotest lockfiles-18 "$testcvs -q ci -mnot-up-to-date first-dir" \
 "$SPROG commit: \[[0-9:]*\] waiting for $username's lock in 
$CVSROOT_DIRNAME/first-dir/sdir/ssdir
 $SPROG commit: \[[0-9:]*\] obtained lock in 
$CVSROOT_DIRNAME/first-dir/sdir/ssdir
@@ -24217,7 +24381,7 @@
          # 9. Don't write when write locks are present...
          echo yet this poem would probably only give longfellow bile 
>>first-dir/sdir/ssdir/file1
          mkdir "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.lock"
-         (sleep 5; rmdir "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.lock")&
+         ($sleep5; rmdir "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.lock")&
          dotest lockfiles-19 "$testcvs -q ci -mnot-up-to-date first-dir" \
 "$SPROG commit: \[[0-9:]*\] waiting for $username's lock in 
$CVSROOT_DIRNAME/first-dir/sdir/ssdir
 $SPROG commit: \[[0-9:]*\] obtained lock in 
$CVSROOT_DIRNAME/first-dir/sdir/ssdir
@@ -24227,7 +24391,7 @@
          # 10. Don't write when history locks are present...
          echo have you ever heard a poem quite so vile\? 
>>first-dir/sdir/ssdir/file1
          mkdir "$TESTDIR/locks/CVSROOT/#cvs.history.lock"
-         (sleep 8; rmdir "$TESTDIR/locks/CVSROOT/#cvs.history.lock")&
+         ($sleep8; rmdir "$TESTDIR/locks/CVSROOT/#cvs.history.lock")&
          dotest lockfiles-20 "$testcvs -q ci -mnot-up-to-date first-dir" \
 "$CVSROOT_DIRNAME/first-dir/sdir/ssdir/file1,v  <--  first-dir/sdir/ssdir/file1
 new revision: 1\.5; previous revision: 1\.4
@@ -24238,7 +24402,7 @@
 
          rm -f $CVSROOT_DIRNAME/CVSROOT/val-tags
          mkdir "$TESTDIR/locks/CVSROOT/#cvs.val-tags.lock"
-         (sleep 5; rmdir "$TESTDIR/locks/CVSROOT/#cvs.val-tags.lock")&
+         ($sleep5; rmdir "$TESTDIR/locks/CVSROOT/#cvs.val-tags.lock")&
          dotest lockfiles-22 "$testcvs -q up -r newtag first-dir" \
 "$SPROG update: \[[0-9:]*\] waiting for $username's lock in 
$CVSROOT_DIRNAME/CVSROOT
 $SPROG update: \[[0-9:]*\] obtained lock in $CVSROOT_DIRNAME/CVSROOT
@@ -31145,6 +31309,7 @@
            dotest multiroot2-9a "${testcvs} -t update" \
 " *-> main: Session ID is ${commitid}
  *-> main loop with CVSROOT=${TESTDIR}/root1
+ *-> get_root_config (${TESTDIR}/root1)
  *-> parse_config ($TESTDIR/root1)
  *-> do_update ((null), (null), (null), 1, 0, 0, 0, 0, 0, 3, (null), (null), 
(null), (null), (null), 1, (null))
  *-> Write_Template (\., ${TESTDIR}/root1)
@@ -31159,6 +31324,7 @@
  *-> Version_TS (dir1/file1, (null), (null), (null), 1, 0)
  *-> Simple_Lock_Cleanup()
  *-> main loop with CVSROOT=${TESTDIR}/root2
+ *-> get_root_config (${TESTDIR}/root2)
  *-> parse_config ($TESTDIR/root2)
  *-> do_update ((null), (null), (null), 1, 0, 0, 0, 0, 0, 3, (null), (null), 
(null), (null), (null), 1, (null))
  *-> Write_Template (dir1/sdir, ${TESTDIR}/root2/dir1/sdir)
@@ -31641,7 +31807,7 @@
 EOF
 
             regexp='^'`dirname ${CVSROOT_DIRNAME}`'/[^/]+$'
-           dotest pserver-3b "${testcvs} --allow-root-regexp=$regexp pserver" \
+           dotest pserver-3b "${testcvs} --allow-root-regexp='$regexp' 
pserver" \
 "I LOVE YOU" <<EOF
 BEGIN AUTH REQUEST
 ${CVSROOT_DIRNAME}
@@ -31651,7 +31817,7 @@
 EOF
 
             regexp='^'`dirname ${CVSROOT_DIRNAME}`'/[^/]+$'
-           dotest_fail pserver-3c "${testcvs} --allow-root-regexp=$regexp 
pserver" \
+           dotest_fail pserver-3c "${testcvs} --allow-root-regexp='$regexp' 
pserver" \
 "$CPROG pserver: ${CVSROOT_DIRNAME}/subdir: no such repository
 I HATE YOU" <<EOF
 BEGIN AUTH REQUEST
@@ -34094,7 +34260,21 @@
          touch file1
 
          dotest_sort trace-1 "${testcvs} -t -t -t init" \
-"  *-> Lock_Cleanup()
+"
+
+
+
+
+
+
+
+
+
+
+
+
+  *-> Lock_Cleanup()
+  *-> Name_Root ((null), (null))
   *-> RCS_checkout (checkoutlist,v, , , , \.#[0-9][0-9]*)
   *-> RCS_checkout (commitinfo,v, , , , \.#[0-9][0-9]*)
   *-> RCS_checkout (config,v, , , , \.#[0-9][0-9]*)
@@ -34110,9 +34290,31 @@
   *-> RCS_checkout (rcsinfo,v, , , , \.#[0-9][0-9]*)
   *-> RCS_checkout (taginfo,v, , , , \.#[0-9][0-9]*)
   *-> RCS_checkout (verifymsg,v, , , , \.#[0-9][0-9]*)
+  *-> Read 0 for UseNewInfoFmtStrings
   *-> Simple_Lock_Cleanup()
+  *-> get_root_config (${CVSROOT_DIRNAME})
   *-> main loop with CVSROOT=${CVSROOT_DIRNAME}
-  *-> parse_cvsroot ( ${CVSROOT_DIRNAME} )
+  *-> main: Session ID is ${commitid}
+  *-> new_config ()
+  *-> next_keyword: searching .# Set .SystemAuth. to .no. if pserver shouldn.t 
check system users/passwords.
+  *-> next_keyword: searching .# The .checkoutlist. file is used to support 
additional version controlled
+  *-> next_keyword: searching .# The .commitinfo. file is used to control 
pre-commit checks.
+  *-> next_keyword: searching .# The .loginfo. file controls where .cvs 
commit. log information is
+  *-> next_keyword: searching .# The .notify. file controls where 
notifications from watches set by
+  *-> next_keyword: searching .# The .postadmin. file is called after the 
.admin. command finishes
+  *-> next_keyword: searching .# The .postproxy. file is called from a 
secondary server as soon as
+  *-> next_keyword: searching .# The .posttag. file is called after the .tag. 
command finishes
+  *-> next_keyword: searching .# The .postwatch. file is called after any 
command finishes writing new
+  *-> next_keyword: searching .# The .preproxy. file is called form the 
secondary server as soon as
+  *-> next_keyword: searching .# The .rcsinfo. file is used to control 
templates with which the editor
+  *-> next_keyword: searching .# The .taginfo. file is used to control pre-tag 
checks.
+  *-> next_keyword: searching .# The .verifymsg. file is used to allow 
verification of logging
+  *-> next_keyword: searching .# This file affects handling of files based on 
their names.
+  *-> next_keyword: searching .# Three different line formats are valid:
+  *-> parse_config (${CVSROOT_DIRNAME})
+  *-> parse_cvsroot (${CVSROOT_DIRNAME})
+  *-> parse_info() examining line: \`UseNewInfoFmtStrings=yes.
+  *-> readBool (${CVSROOT_DIRNAME}/CVSROOT/config, UseNewInfoFmtStrings, yes)
   *-> remove_locks()
   *-> unlink_file(\.#[0-9][0-9]*)
   *-> unlink_file(\.#[0-9][0-9]*)
@@ -34127,6 +34329,11 @@
   *-> unlink_file(\.#[0-9][0-9]*)
   *-> unlink_file(\.#[0-9][0-9]*)
   *-> unlink_file(\.#[0-9][0-9]*)
+  *-> unlink_file(\.#[0-9][0-9]*)
+  *-> unlink_file(\.#[0-9][0-9]*)
+  *-> unlink_file(\.#[0-9][0-9]*)
+  *-> unlink_file(\.#[0-9][0-9]*)
+  *-> unlink_file(\.#[0-9][0-9]*)
   *-> unlink_file(\.#checkoutlist)
   *-> unlink_file(\.#commitinfo)
   *-> unlink_file(\.#config)
@@ -34143,7 +34350,444 @@
   *-> unlink_file(\.#taginfo)
   *-> unlink_file(\.#verifymsg)
   *-> walklist ( list=${PFMT}, proc=${PFMT}, closure=${PFMT} )
-  *-> walklist ( list=${PFMT}, proc=${PFMT}, closure=${PFMT} )" \
+  *-> walklist ( list=${PFMT}, proc=${PFMT}, closure=${PFMT} )
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#                     | .N. (not branch)
+#                     | .N. (not branch)
+#             from, new version tag will be added to (or deleted from, but
+#             from, new version tag will be added to (or deleted from, but
+#             this feature is deprecated.  When either old or new revision is
+#             this feature is deprecated.  When either old or new revision is
+#             unknown, doesn.t exist, or isn.t applicable, the string .NONE.
+#             unknown, doesn.t exist, or isn.t applicable, the string .NONE.
+#             will be placed on the command line.
+#             will be placed on the command line.
+#         (pre-checkin), new version number (post-checkin).  When
+#         command line instead.
+#         either old or new revision is unknown, doesn.t exist, or
+#         file name, file action, destination tag, old version number
+#         isn.t applicable, the string .NONE., will be placed on the
+#       checked in (using the bug-id number or a seperate review
+#       number to identify this particular code set.).
+#    %R = the name of the referrer, if any, otherwise the value NONE
+#    %R = the name of the referrer, if any, otherwise the value NONE
+#    %R = the name of the referrer, if any, otherwise the value NONE
+#    %R = the name of the referrer, if any, otherwise the value NONE
+#    %R = the name of the referrer, if any, otherwise the value NONE
+#    %R = the name of the referrer, if any, otherwise the value NONE
+#    %R = the name of the referrer, if any, otherwise the value NONE
+#    %R = the name of the referrer, if any, otherwise the value NONE
+#    %R = the name of the referrer, if any, otherwise the value NONE
+#    %R = the name of the referrer, if any, otherwise the value NONE
+#    %b = branch mode = .?. (delete ops - unknown) | .T. (branch)
+#    %b = branch mode = .?. (delete ops - unknown) | .T. (branch)
+#    %c = canonical name of the command being executed
+#    %c = canonical name of the command being executed
+#    %c = canonical name of the command being executed
+#    %c = canonical name of the command being executed
+#    %c = canonical name of the command being executed
+#    %c = canonical name of the command being executed
+#    %c = canonical name of the command being executed
+#    %c = canonical name of the command being executed
+#    %c = canonical name of the command being executed
+#    %c = canonical name of the command being executed
+#    %l = name of log file to be verified.
+#    %o = operation = .add. | .mov. | .del.
+#    %o = operation = .add. | .mov. | .del.
+#    %p = path relative to repository
+#    %p = path relative to repository
+#    %p = path relative to repository
+#    %p = path relative to repository
+#    %p = path relative to repository
+#    %p = path relative to repository
+#    %p = path relative to repository
+#    %p = path relative to repository
+#    %p = path relative to repository (currently always ...)
+#    %p = path relative to repository (currently always ...)
+#    %r = repository (path portion of \$CVSROOT)
+#    %r = repository (path portion of \$CVSROOT)
+#    %r = repository (path portion of \$CVSROOT)
+#    %r = repository (path portion of \$CVSROOT)
+#    %r = repository (path portion of \$CVSROOT)
+#    %r = repository (path portion of \$CVSROOT)
+#    %r = repository (path portion of \$CVSROOT)
+#    %r = repository (path portion of \$CVSROOT)
+#    %r = repository (path portion of \$CVSROOT)
+#    %r = repository (path portion of \$CVSROOT)
+#    %s = user to notify
+#    %t = tagname
+#    %t = tagname
+#    %{sVv} = attribute list = file name, old version tag will be deleted
+#    %{sVv} = attribute list = file name, old version tag will be deleted
+#    %{saTVv} = attribute list consisting of:
+#    %{s} = file name, file name, ...
+#   Making sure that the entered bug-id number is correct.
+#   MaxCommentLeaderLength=20
+#   MaxProxyBufferSize=1G
+#   PrimaryServer=:fork:localhost/cvsroot
+#   UseArchiveCommentLeader=no
+#   Validating that the code that was reviewed is indeed the code being
+#  -f  from cvs filter  value: path to filter
+#  -k  expansion mode  value: b, o, kkv, &c
+#  -m  update methodology value: MERGE or COPY
+#  -t  to cvs filter  value: path to filter
+#  and value is a single-quote delimited value.
+#  where option is one of
+#  wildcard .option value..option value....
+# . %r %s. will be appended to the filter string, but this usage is
+# .ALL. or .DEFAULT. can be used in place of the regular expression.
+# .cvs watch add. or .cvs edit. are sent.  The first entry on a line is
+# \$1 -- tagname
+# \$2 -- operation .add. for tag, .mov. for tag -F, and .del. for tag -d
+# \$3 -- tagtype .?. on delete, .T. for branch, .N. for static
+# \$4 -- repository
+# \$5->  file revision .file revision ....
+# \$CVSROOT.  For the first match that is found, then the remainder of the
+# \$CVSROOT.  If a match is found, then the remainder of the line is a
+# -d dir  Place module in directory .dir. instead of module name.
+# -e prog  Run .prog. on .cvs export. of module.
+# -l  Top-level directory only -- do not recurse.
+# -o prog  Run .prog. on .cvs checkout. of module.
+# -t prog  Run .prog. on .cvs rtag. of module.
+# -u prog  Run .prog. on .cvs update. of module.
+# A non-zero exit of the filter program will cause the tag to be aborted.
+# Actions such as mailing a copy of the report to each reviewer are
+# And .directory. is a path to a directory relative to \$CVSROOT.
+# Be warned that these strings could be disabled in any new version of CVS.
+# File format:
+# For example:
+# For example:
+# For example:
+# For example:
+# For example:
+# For example:
+# For example:
+# Format of wrapper file (\$CVSROOT/CVSROOT/cvswrappers or .cvswrappers)
+# Format strings present in the filter will be replaced as follows:
+# Format strings present in the filter will be replaced as follows:
+# High values for MaxProxyBufferSize may speed up a secondary server
+# If any format strings are present in the filter, they will be replaced
+# If any format strings are present in the filter, they will be replaced
+# If any format strings are present in the filter, they will be replaced
+# If any format strings are present in the filter, they will be replaced
+# If any format strings are present in the filter, they will be replaced
+# If any format strings are present in the filter, they will be replaced
+# If any format strings are present in the filter, they will be replaced
+# If any of the above test failed, then the commit would be aborted.
+# If no format strings are present in the filter string, a default of
+# If no format strings are present in the filter, a default . %l. will
+# If the name .ALL. appears as a regular expression it is always used
+# If the name .ALL. appears as a regular expression it is always used
+# If the name .ALL. appears as a regular expression it is always used
+# If the name .ALL. appears as a regular expression it is always used
+# If the name .ALL. appears as a regular expression it is always used
+# If the name .ALL. appears as a regular expression it is always used
+# If the name .ALL. appears as a regular expression it is always used
+# If the name .ALL. appears as a regular expression it is always used
+# If the name ALL appears as a regular expression it is always used
+# If the repository name does not match any of the regular expressions in this
+# If the repository name does not match any of the regular expressions in this
+# If the repository name does not match any of the regular expressions in this
+# If the repository name does not match any of the regular expressions in this
+# If the repository name does not match any of the regular expressions in this
+# If the repository name does not match any of the regular expressions in this
+# If the repository name does not match any of the regular expressions in this
+# If the repository name does not match any of the regular expressions in this
+# If the repository name does not match any of the regular expressions in this
+# It also generates multiple arguments for each file being operated upon.
+# NOTE:  If you change any of the .Run. options above, you.ll have to
+# Note that %{sVv} is a list operator and not all elements are necessary.
+# Note that %{sVv} is a list operator and not all elements are necessary.
+# Note that %{saTVv} is a list operator and not all elements are necessary.
+# One thing that should be noted is the the ALL keyword is not
+# Put CVS lock files in this directory rather than directly in the repository.
+# Set .ImportNewFilesToVendorBranchOnly. to .yes. if you wish to force
+# Set .KeywordExpand. to .i. followed by a list of keywords to expand or
+# Set .LocalKeyword. to specify a local alias for a standard keyword.
+# Set .LogHistory. to .all. or .TOEFWUPCGMARX. to log all transactions to the
+# Set .MaxCommentLeaderLength. to the maximum length permitted for the
+# Set .MaxProxyBufferSize. to the the maximum allowable secondary
+# Set .PrimaryServer. to the CVSROOT to the primary, or write, server when
+# Set .RereadLogAfterVerify. to .always. (the default) to allow the verifymsg
+# Set .TopLevelAdmin. to .yes. to create a CVS directory at the top
+# Set .UseArchiveCommentLeader. to .yes. to cause CVS to fall back on
+# Set .UseNewInfoFmtStrings. to .no. if you must support a legacy system by
+# Set .UserAdminOptions. to the list of .cvs admin. commands (options)
+# That is, if two files, file1 & file2, are being commited from 1.1 to
+# The .-a. option specifies an alias.  An alias is interpreted as if
+# The -k option specifies keyword expansion (e.g. -kb for binary).
+# The -m option specifies whether CVS attempts to merge files.
+# The filter on the right is invoked with the following arguments
+# The filter on the right is invoked with the repository and a list 
+# The first entry on a line is a filename which will be checked out from
+# The first entry on a line is a regular expression which is tested
+# The first entry on a line is a regular expression which is tested
+# The first entry on a line is a regular expression which is tested
+# The first entry on a line is a regular expression which is tested
+# The first entry on a line is a regular expression which is tested
+# The first entry on a line is a regular expression which is tested
+# The first entry on a line is a regular expression which is tested
+# The first entry on a line is a regular expression which is tested
+# The following string would enable all .cvs admin. commands for all
+# The remainder of the line is an error message to use if the file cannot
+# This script might, for example, be used to shut down a dial up
+# This value is ignored if the .cvsadmin. group does not exist.
+# Thus %{sV} is a legal format string, but will only be replaced with file
+# Thus %{sV} is a legal format string, but will only be replaced with file
+# Thus %{sv} is a legal format string, but will only be replaced with
+# Where .options. are composed of:
+# You can encode a module within a module by using the special .&.
+# .<whitespace>.<filename>.<whitespace><error message>.<end-of-line>
+# .UseArchiveCommentLeader. set in this file.  .unlimited. is a valid
+# .e. followed by a list of keywords to not expand.
+# a regular expression which is tested against the directory that the
+# administrative files in \$CVSROOT/CVSROOT, such as template files.
+# against the directory that the change is being committed to, relative
+# against the directory that the change is being committed to, relative
+# against the directory that the change is being committed to, relative
+# against the directory that the change is being committed to, relative
+# against the directory that the change is being committed to, relative
+# against the directory that the change is being committed to, relative
+# against the directory that the change is being committed to, relative
+# against the directory that the change is being made to, relative to the
+# as follows:
+# as follows:
+# as follows:
+# as follows:
+# as follows:
+# as follows:
+# as follows:
+# automagically determined comment leader exceeds .MaxCommentLeaderLength.
+# automagically determined comment leader used when expanding the Log
+# be appended to the filter, but this usage is deprecated.
+# be checked out.
+# being examined will not be expanded.  Defaults to .no..
+# being operated upon.  i.e. if two files, file1 & file2, are having a tag
+# being operated upon.  i.e. if two files, file1 & file2, are having a tag
+# better handled by an entry in the loginfo file.
+# buffer memory cache size before the buffer begins being stored to disk, in
+# bytes.  If .UseArchiveCommentLeader. is not set and a comment leader
+# bytes.  Must be a positive integer but may end in .k., .M., .G., or .T. (for
+# can be useful for creating a module that consists of many directories
+# cause the commit to be aborted.
+# change is being made to, relative to the \$CVSROOT.  If it matches,
+# character to interpose another module into the current module.  This
+# command to a primary server and immediately before it opens a
+# command.
+# comment leader exceeds this length is dependant on the value of
+# comment lines begin with .#.
+# connection to the primary server.  This script might, for example, be
+# defaults to .k., or only allowing the changing of the default
+# deprecated.
+# enabling the deprecated old style info file command line format strings.
+# establishing one or more read-only mirrors which serve as proxies for
+# every .cvs import. command to behave as if the .-X. flag was
+# everything on the right of the .-a. had been typed on the command line.
+# file attibute (watch/edit) information in a directory.
+# file name and new revision.
+# file, the .DEFAULT. line is used, if it is specified.
+# file, the .DEFAULT. line is used, if it is specified.
+# file, the .DEFAULT. line is used, if it is specified.
+# file, the .DEFAULT. line is used, if it is specified.
+# file, the .DEFAULT. line is used, if it is specified.
+# file, the .DEFAULT. line is used, if it is specified.
+# file, the .DEFAULT. line is used, if it is specified.
+# file, the .DEFAULT. line is used, if it is specified.
+# file, the .DEFAULT. line is used, if it is specified.
+# file1, 1.1, 1.1.2.1, file2, 1.1.2.2, 1.1.2.3.
+# file1, 1.1, 1.1.2.9, file2, 1.1, 1.1.2.9.
+# file1, 1.1, 1.1.2.9, file2, 1.1, 1.1.2.9.
+# filter program that should expect log information on its standard input.
+# following six arguments in this order:
+# following six arguments in this order:
+# following test can be applied to the code:
+# format strings are replaceed as follows:
+# generate the following six arguments in this order:
+# greater than .MaxCommentLeaderLength. is calculated, the Log keyword
+# history file, or a subset as needed (ie .TMAR. logs all write operations)
+# if no format strings are present:
+# in addition to the first matching regex or .DEFAULT..
+# in addition to the first matching regex or .DEFAULT..
+# in addition to the first matching regex or .DEFAULT..
+# in addition to the first matching regex or .DEFAULT..
+# in addition to the first matching regex or .DEFAULT..
+# in addition to the first matching regex or .DEFAULT..
+# in addition to the first matching regex or .DEFAULT..
+# in addition to the first matching regex or .DEFAULT..
+# in addition to the first matching regex or DEFAULT.
+# information.  It works best when a template (as specified in the
+# is invoked on commit and import.
+# key -a    aliases...
+# key .options. directory
+# key .options. directory files...
+# keyword expansion mode for files for users not in the .cvsadmin. group.
+# keyword, in bytes.  CVS.s behavior when the automagically determined
+# kiilo, mega, giga, & tera, respectively).  If an otherwise valid number you
+# level of the new working directory when using the .cvs checkout.
+# line is the name of the file that contains the template.
+# match the directory that the change is being made to, relative to the
+# megabytes).
+# modern system down slightly.
+# moved from version 1.1 to version 1.1.2.9, %{sVv} will generate the
+# moved from version 1.1 to version 1.1.2.9, %{sVv} will generate the
+# name and old revision. it also generates multiple arguments for each file
+# name and old revision. it also generates multiple arguments for each file
+# network.
+# of files to check.  A non-zero exit of the filter program will 
+# of the line is the name of the filter to run.
+# of the line is the name of the filter to run.
+# of the line is the name of the filter to run.
+# of the line is the name of the filter to run.
+# of the line is the name of the filter to run.
+# of the line is the name of the filter to run.
+# of the line is the name of the filter to run.
+# one occurrence of %s for the user to notify, and information on its
+# or
+# or VPN connection to the primary server.s network.
+# process to catalog the differences that were code reviewed, the
+# processing a directory.
+# processing a directory.
+# rcsinfo file) is provided for the logging procedure.  Given a
+# release and re-checkout any working directories of these modules.
+# repositories.  Set it to .never. (the previous CVS behavior) to prevent
+# repository.
+# reviewed the code before it can be checked in, and an external
+# script to change the log message.  Set it to .stat. to force CVS to verify
+# second per directory being committed, so it is not recommended for large
+# sent. The first entry on a line is a regular expression which must
+# setting for this value.  Defaults to 20 bytes.
+# specified.
+# specify is greater than the SIZE_MAX defined by your system.s C compiler,
+# spread out over the entire source repository.
+# standard input.
+# supported.  There can be only one entry that matches a given
+# template with locations for, a bug-id number, a list of people who
+# that the file has changed before reading it (this can take up to an extra
+# that users not in the .cvsadmin. group are allowed to run.  This
+# the comment leader set in the RCS archive file, if any, when the
+# the corresponding RCS file in the \$CVSROOT/CVSROOT directory.
+# the secondary server closes its connection to the primary server.
+# the secondary server determines that it will be proxying a write
+# the write server in write mode or redirect the client to the primary for
+# then it will be resolved to SIZE_MAX without a warning.  Defaults to 8M (8
+# then the remainder of the line is a filter program that should contain
+# to the \$CVSROOT.  For the first match that is found, then the remainder
+# to the \$CVSROOT.  For the first match that is found, then the remainder
+# to the \$CVSROOT.  For the first match that is found, then the remainder
+# to the \$CVSROOT.  For the first match that is found, then the remainder
+# to the \$CVSROOT.  For the first match that is found, then the remainder
+# to the \$CVSROOT.  For the first match that is found, then the remainder
+# to the \$CVSROOT.  For the first match that is found, then the remainder
+# used to launch a dial up or VPN connection to the primary server.s
+# users:
+# verifymsg scripts from changing the log message.
+# version 1.1.2.1 and from 1.1.2.2 to 1.1.2.3, respectively, %{sVv} will
+# with old hardware and a lot of available memory but can actually slow a
+# write requests.
+#\*.gif -k .b.
+#ALL (echo Committed to %r/%p; cat) |mail %s -s .CVS notification.
+#DEFAULT (echo ..; id; echo %s; date; cat) >> \$CVSROOT/CVSROOT/commitlog
+#DEFAULT (echo ..; id; echo %{sVv}; date; cat) >> \$CVSROOT/CVSROOT/commitlog
+#ImportNewFilesToVendorBranchOnly=no
+#KeywordExpand=eCVSHeader
+#KeywordExpand=iMYCVS,Name,Date
+#LocalKeyword=MYCVS=CVSHeader
+#LockDir=/var/lock/cvs
+#LogHistory=TOEFWUPCGMARX
+#RereadLogAfterVerify=always
+#SystemAuth=yes
+#TopLevelAdmin=no
+#UserAdminOptions=aAbceIklLmnNostuU;execute;no-execute
+.
+.
+.
+.
+.
+.
+.
+.
+.
+.
+.
+.
+.
+.
+.
+UseNewInfoFmtStrings=yes" \
 "
   *-> Forking server: ${CVS_SERVER} server
   *-> main loop with CVSROOT=${CVSROOT}
@@ -34213,11 +34857,36 @@
   *-> Lock_Cleanup()
   *-> Parse_Info (${CVSROOT_DIRNAME}/CVSROOT/loginfo, trace, ALL)
   *-> Parse_Info (${CVSROOT_DIRNAME}/CVSROOT/verifymsg, trace, not ALL)
+  *-> Read 0 for UseNewInfoFmtStrings
+  *-> Simple_Lock_Cleanup()
   *-> Simple_Lock_Cleanup()
+  -> add_rcs_file (.${CVSROOT_DIRNAME}/trace/file1,v., .file1., .1\.1., 
.(null)., .1\.1\.1., .MYVENDOR., .(null).)
+  -> add_rcs_file: found signature.
+  -> add_rcs_file: signature not found.
+  -> get_root_config (${CVSROOT_DIRNAME})
+  -> iget_verify_commits () returning VERIFY_OFF
+  -> lock_dir_for_write (${CVSROOT_DIRNAME}/trace)
+  -> lock_exists (${CVSROOT_DIRNAME}/trace, #cvs\.pfl\.\*, (null))
+  -> lock_exists (${CVSROOT_DIRNAME}/trace, #cvs\.rfl\.\*, (null))
+  -> lock_name (${CVSROOT_DIRNAME}/trace, #cvs\.lock)
+  -> lock_name (${CVSROOT_DIRNAME}/trace, #cvs\.wfl\..*)
+  -> lock_name (${CVSROOT_DIRNAME}/trace, )
+  -> lock_name (${CVSROOT_DIRNAME}/trace, )
   *-> main loop with CVSROOT=${CVSROOT_DIRNAME}
-  *-> parse_cvsroot ( ${CVSROOT_DIRNAME} )
+  *-> main: Session ID is ${commitid}
+  *-> new_config ()
+  *-> parse_config (${CVSROOT_DIRNAME})
+  *-> parse_cvsroot (${CVSROOT_DIRNAME})
+  *-> parse_info() examining line: .UseNewInfoFmtStrings=yes.
+  *-> promotable_exists (${CVSROOT_DIRNAME}/trace)
+  *-> readBool (${CVSROOT_DIRNAME}/CVSROOT/config, UseNewInfoFmtStrings, yes)
+  *-> readers_exist (${CVSROOT_DIRNAME}/trace)
+  *-> remove_lock_files (${CVSROOT_DIRNAME}/trace)
   *-> remove_locks()
+  .*
   *-> safe_location( where=(null) )
+  *-> set_lock (${CVSROOT_DIRNAME}/trace, 1)
+  *-> walklist ( list=${PFMT}, proc=${PFMT}, closure=${PFMT} )
   *-> walklist ( list=${PFMT}, proc=${PFMT}, closure=${PFMT} )
   *-> walklist ( list=${PFMT}, proc=${PFMT}, closure=${PFMT} )
 N trace/file1

Index: server.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/server.c,v
retrieving revision 1.473
retrieving revision 1.474
diff -u -b -r1.473 -r1.474
--- server.c    8 May 2007 12:35:53 -0000       1.473
+++ server.c    30 May 2007 23:20:44 -0000      1.474
@@ -893,8 +893,7 @@
 
     /* For pserver, this will already have happened, and the call will do
        nothing.  But for rsh, we need to do it now.  */
-    config = get_root_allow_config (current_parsed_root->directory,
-                                   gConfigPath);
+    config = get_root_config (current_parsed_root->directory, gConfigPath);
 
 # ifdef PROXY_SUPPORT
     /* At this point we have enough information to determine if we are a
@@ -6347,7 +6346,12 @@
 
            /* SIG_beginCrSect(); */
            noexec = 0;
+           if (orig_server_temp_dir)
+           {
            unlink_file_dir (orig_server_temp_dir);
+               free (orig_server_temp_dir);
+               orig_server_temp_dir = NULL;
+           }
            noexec = save_noexec;
            /* SIG_endCrSect(); */
        } /* !dont_delete_temp */
@@ -7382,7 +7386,7 @@
        file, parse_config already printed an error.  We keep going.
        Why?  Because if we didn't, then there would be no way to check
        in a new CVSROOT/config file to fix the broken one!  */
-    config = get_root_allow_config (repository, gConfigPath);
+    config = get_root_config (repository, gConfigPath);
 
     /* We need the real cleartext before we hash it. */
     descrambled_password = descramble (password);

Index: sign.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/sign.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- sign.c      26 Jun 2006 19:40:51 -0000      1.11
+++ sign.c      30 May 2007 23:20:44 -0000      1.12
@@ -292,13 +292,20 @@
                              (char *) NULL);
 
     if (!cmdline || !strlen (cmdline))
+    {
+       if (cmdline) free (cmdline);
        error (1, 0, "sign template resolved to the empty string!");
+    }
 
     noexec = false;
     if (!(pipefp = run_popen (cmdline, "r" POPEN_BINARY_FLAG)))
+    {
+       if (cmdline) free (cmdline);
        error (1, errno, "failed to execute signature generator");
+    }
     noexec = save_noexec;
 
+    if (cmdline) free (cmdline);
     do
     {
        size_t len;

Index: subr.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/subr.c,v
retrieving revision 1.155
retrieving revision 1.156
diff -u -b -r1.155 -r1.156
--- subr.c      11 Jul 2006 21:48:43 -0000      1.155
+++ subr.c      30 May 2007 23:20:44 -0000      1.156
@@ -409,8 +409,11 @@
                 */
                p = strrchr (tmp, '.');
                if (p == NULL)
+               {
                    /* We are on the trunk.  */
+                   free (retval);
                    retval = NULL;
+               }
                else
                {
                    *p = '\0';

Index: tag.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/tag.c,v
retrieving revision 1.149
retrieving revision 1.150
diff -u -b -r1.149 -r1.150
--- tag.c       26 May 2006 19:25:57 -0000      1.149
+++ tag.c       30 May 2007 23:20:44 -0000      1.150
@@ -122,6 +122,19 @@
 
 
 
+void
+del_tag_info (struct tag_info *ti)
+{
+    if (ti)
+    {
+       if (ti->oldrev) free (ti->oldrev);
+       if (ti->rev) free (ti->rev);
+       if (ti->tag) free (ti->tag);
+       if (ti->options) free (ti->options);
+       ti->oldrev = ti->rev = ti->tag = ti->options = NULL;
+    }
+}
+
 int
 cvstag (int argc, char **argv)
 {
@@ -642,6 +655,7 @@
        (e.g. numtag is "foo" which gets moved between here and
        tag_fileproc).  */
     p->data = ti = xmalloc (sizeof (struct tag_info));
+    memset (ti, 0, sizeof (struct tag_info));
     ti->tag = xstrdup (numtag ? numtag : vers->tag);
     if (!is_rtag && numtag == NULL && date == NULL)
        ti->rev = xstrdup (vers->vn_user);
@@ -672,7 +686,7 @@
            ti->rev = NULL;
 #endif /* SUPPORT_OLD_INFO_FMT_STRINGS */
        }
-        else if (strcmp(ti->oldrev, p->data) == 0)
+        else if (strcmp (ti->oldrev, p->data) == 0)
             addit = 0;
         else if (!force_tag_move)
             addit = 0;
@@ -681,7 +695,8 @@
        addit = 0;
     if (!addit)
     {
-       free(p->data);
+       del_tag_info (ti);
+       free (p->data);
        p->data = NULL;
     }
     freevers_ts (&vers);

Index: update.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/update.c,v
retrieving revision 1.267
retrieving revision 1.268
diff -u -b -r1.267 -r1.268
--- update.c    19 Dec 2006 04:24:03 -0000      1.267
+++ update.c    30 May 2007 23:20:45 -0000      1.268
@@ -454,6 +454,8 @@
     /* Free the space allocated for tags and dates, if necessary.  */
     if (tag) free (tag);
     if (date) free (date);
+    if (join_orig1) free (join_orig1);
+    if (join_orig2) free (join_orig2);
 
     return err;
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]