Attempting to fix a segfault generated in Removecontext()
authorArt Cancro <ajc@uncensored.citadel.org>
Fri, 15 Jul 2011 18:46:41 +0000 (14:46 -0400)
committerWilfried Goesgens <dothebart@citadel.org>
Sun, 4 Sep 2011 21:36:41 +0000 (21:36 +0000)
citadel/context.c
citadel/modules/wiki/serv_wiki.c
citadel/msgbase.c

index 95bdc46f1bb342a1f7d41336088ecf5f65d92403..181d0347c87db600a9862d947130a4511fca7b13 100644 (file)
@@ -338,15 +338,16 @@ void terminate_all_sessions(void)
 void RemoveContext (CitContext *con)
 {
        const char *c;
-       if (con==NULL) {
-               syslog(LOG_ERR, "WARNING: RemoveContext() called with NULL!\n");
+       if (con == NULL) {
+               syslog(LOG_ERR, "WARNING: RemoveContext() called with NULL!");
                return;
        }
        c = con->ServiceName;
-       if (c == NULL)
+       if (c == NULL) {
                c = "WTF?";
-       syslog(LOG_DEBUG, "RemoveContext(%s) session %d\n", c, con->cs_pid);
-       cit_backtrace ();
+       }
+       syslog(LOG_DEBUG, "RemoveContext(%s) session %d", c, con->cs_pid);
+       cit_backtrace();
 
        /* Run any cleanup routines registered by loadable modules.
         * Note: We have to "become_session()" because the cleanup functions
@@ -358,7 +359,7 @@ void RemoveContext (CitContext *con)
        client_close();                         /* If the client is still connected, blow 'em away. */
        become_session(NULL);
 
-       syslog(LOG_NOTICE, "[%3d] Session ended.\n", con->cs_pid);
+       syslog(LOG_NOTICE, "[%3d] Session ended.", con->cs_pid);
 
        /* 
         * If the client is still connected, blow 'em away. 
@@ -366,7 +367,7 @@ void RemoveContext (CitContext *con)
         */
        if (con->client_socket > 0)
        {
-               syslog(LOG_NOTICE, "Closing socket %d\n", con->client_socket);
+               syslog(LOG_NOTICE, "Closing socket %d", con->client_socket);
                close(con->client_socket);
        }
 
@@ -382,7 +383,7 @@ void RemoveContext (CitContext *con)
                free(con->cached_msglist);
        }
 
-       syslog(LOG_DEBUG, "Done with RemoveContext()\n");
+       syslog(LOG_DEBUG, "Done with RemoveContext()");
 }
 
 
index 77f7899f157c6d3e5acca6081a78bb80117accd0..242f52d0457a46e85cbf6500d413472a710e55f6 100644 (file)
@@ -610,10 +610,16 @@ void wiki_rev(char *pagename, char *rev, char *operation)
                         * but only if the client fetches the message we just generated immediately
                         * without first trying to perform other fetch operations.
                         */
-                       if (CC->cached_msglist != NULL) free(CC->cached_msglist);
-                       CC->cached_num_msgs = 1;
+                       if (CC->cached_msglist != NULL) {
+                               free(CC->cached_msglist);
+                               CC->cached_msglist = NULL;
+                               CC->cached_num_msgs = 0;
+                       }
                        CC->cached_msglist = malloc(sizeof(long));
-                       CC->cached_msglist[0] = msgnum;
+                       if (CC->cached_msglist != NULL) {
+                               CC->cached_num_msgs = 1;
+                               CC->cached_msglist[0] = msgnum;
+                       }
 
                }
                else if (!strcasecmp(operation, "revert")) {
index 304023bc6aa71c900de422b5f7b81bd2690a2695..c252f5ff0d4b57f643c2dfd5046eae96dafda2a2 100644 (file)
@@ -644,18 +644,6 @@ int CtdlForEachMessage(int mode, long ref, char *search_string,
        cdbfr->ptr = NULL;      /* clear this so that cdb_free() doesn't free it */
        cdb_free(cdbfr);        /* we own this memory now */
 
-       /*
-        * We cache the most recent msglist in order to do security checks later
-        */
-       if (CC->client_socket > 0) {
-               if (CC->cached_msglist != NULL) {
-                       free(CC->cached_msglist);
-               }
-       
-               CC->cached_msglist = msglist;
-               CC->cached_num_msgs = num_msgs;
-       }
-
        /*
         * Now begin the traversal.
         */
@@ -787,7 +775,21 @@ int CtdlForEachMessage(int mode, long ref, char *search_string,
                        }
                }
        if (need_to_free_re) regfree(&re);
-       if (CC->client_socket <= 0) free(msglist);
+
+       /*
+        * We cache the most recent msglist in order to do security checks later
+        */
+       if (CC->client_socket > 0) {
+               if (CC->cached_msglist != NULL) {
+                       free(CC->cached_msglist);
+               }
+               CC->cached_msglist = msglist;
+               CC->cached_num_msgs = num_msgs;
+       }
+       else {
+               free(msglist);
+       }
+
        return num_processed;
 }