]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/imap/serv_imap.c
IMAP: fix memcpy, don't coppy blocks when loaded from DB - steal pointer.
[citadel.git] / citadel / modules / imap / serv_imap.c
index 46a6ba7d94591183cc231dfade9ee22db3183649..7dc318aff159a40acc25d36e0118bdb230cece77 100644 (file)
@@ -293,7 +293,7 @@ void imap_add_single_msgid(long msgnum, void *userdata)
        if (Imap->num_msgs > Imap->num_alloc) {
                Imap->num_alloc += REALLOC_INCREMENT;
                Imap->msgids = realloc(Imap->msgids, (Imap->num_alloc * sizeof(long)) );
-               Imap->flags = realloc(Imap->flags, (Imap->num_alloc * sizeof(long)) );
+               Imap->flags = realloc(Imap->flags, (Imap->num_alloc * sizeof(unsigned int)) );
        }
        Imap->msgids[Imap->num_msgs - 1] = msgnum;
        Imap->flags[Imap->num_msgs - 1] = 0;
@@ -320,16 +320,17 @@ void imap_load_msgids(void)
        /* Load the message list */
        cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
        if (cdbfr != NULL) {
-               Imap->msgids = malloc(cdbfr->len);
-               memcpy(Imap->msgids, cdbfr->ptr, cdbfr->len);
+               Imap->msgids = (long*)cdbfr->ptr;
                Imap->num_msgs = cdbfr->len / sizeof(long);
                Imap->num_alloc = cdbfr->len / sizeof(long);
+               cdbfr->ptr = NULL;
+               cdbfr->len = 0;
                cdb_free(cdbfr);
        }
 
        if (Imap->num_msgs) {
-               Imap->flags = malloc(Imap->num_alloc * sizeof(long));
-               memset(Imap->flags, 0, (Imap->num_alloc * sizeof(long)) );
+               Imap->flags = malloc(Imap->num_alloc * sizeof(unsigned int));
+               memset(Imap->flags, 0, (Imap->num_alloc * sizeof(unsigned int)) );
        }
 
        imap_set_seen_flags(0);
@@ -371,14 +372,10 @@ void imap_rescan_msgids(void)
         */
        cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
        if (cdbfr != NULL) {
-               msglist = malloc(cdbfr->len + 1);
-               if (msglist == NULL) {
-                       IMAPM_syslog(LOG_CRIT, "malloc() failed");
-                       CC->kill_me = KILLME_MALLOC_FAILED;
-                       return;
-               }
-               memcpy(msglist, cdbfr->ptr, (size_t)cdbfr->len);
+               msglist = (long*)cdbfr->ptr;
+               cdbfr->ptr = NULL;
                num_msgs = cdbfr->len / sizeof(long);
+               cdbfr->len = 0;
                cdb_free(cdbfr);
        } else {
                num_msgs = 0;
@@ -417,9 +414,8 @@ void imap_rescan_msgids(void)
                                         (Imap->num_msgs - i)));
                                memmove(&Imap->flags[i],
                                        &Imap->flags[i + 1],
-                                       (sizeof(long) *
+                                       (sizeof(unsigned int) *
                                         (Imap->num_msgs - i)));
-
                                --i;
                        }
 
@@ -1721,7 +1717,7 @@ CTDL_MODULE_INIT(imap)
                CtdlRegisterServiceHook(config.c_imaps_port,
                                        NULL, imaps_greeting, imap_command_loop, NULL, CitadelServiceIMAPS);
 #endif
-               CtdlRegisterSessionHook(imap_cleanup_function, EVT_STOP);
+               CtdlRegisterSessionHook(imap_cleanup_function, EVT_STOP, PRIO_STOP + 30);
                CtdlRegisterCleanupHook(imap_cleanup);
        }