Fix overflow
[claws.git] / src / plugins / mailmbox / mailmbox_types.c
1 /*
2  * libEtPan! -- a mail stuff library
3  *
4  * Copyright (C) 2001, 2002 - DINH Viet Hoa
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the libEtPan! project nor the names of its
16  *    contributors may be used to endorse or promote products derived
17  *    from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31
32 #include "mailmbox_types.h"
33 #include "utils.h"
34
35 #include <string.h>
36 #include <stdlib.h>
37
38 #ifndef TRUE
39 #define TRUE 1
40 #endif
41
42 #ifndef FALSE
43 #define FALSE 0
44 #endif
45
46 /* *********************************************************************** */
47
48 int claws_mailmbox_msg_info_update(struct claws_mailmbox_folder * folder,
49                              size_t msg_start, size_t msg_start_len,
50                              size_t msg_headers, size_t msg_headers_len,
51                              size_t msg_body, size_t msg_body_len,
52                              size_t msg_size, size_t msg_padding,
53                              uint32_t msg_uid)
54 {
55   struct claws_mailmbox_msg_info * info;
56   int res;
57   chashdatum key;
58   chashdatum data;
59   int r;
60   
61   key.data = &msg_uid;
62   key.len = sizeof(msg_uid);
63   r = chash_get(folder->mb_hash, &key, &data);
64   if (r < 0) {
65     unsigned int index;
66
67     info = claws_mailmbox_msg_info_new(msg_start, msg_start_len,
68         msg_headers, msg_headers_len,
69         msg_body, msg_body_len, msg_size, msg_padding, msg_uid);
70     if (info == NULL) {
71       res = MAILMBOX_ERROR_MEMORY;
72       goto err;
73     }
74
75     r = carray_add(folder->mb_tab, info, &index);
76     if (r < 0) {
77       claws_mailmbox_msg_info_free(info);
78       res = MAILMBOX_ERROR_MEMORY;
79       goto err;
80     }
81
82     if (msg_uid != 0) {
83       chashdatum key;
84       chashdatum data;
85       
86       key.data = &msg_uid;
87       key.len = sizeof(msg_uid);
88       data.data = info;
89       data.len = 0;
90       
91       r = chash_set(folder->mb_hash, &key, &data, NULL);
92       if (r < 0) {
93         claws_mailmbox_msg_info_free(info);
94         carray_delete(folder->mb_tab, index);
95         res = MAILMBOX_ERROR_MEMORY;
96         goto err;
97       }
98     }
99     
100     info->msg_index = index;
101   }
102   else {
103     info = data.data;
104     
105     info->msg_start = msg_start;
106     info->msg_start_len = msg_start_len;
107     info->msg_headers = msg_headers;
108     info->msg_headers_len = msg_headers_len;
109     info->msg_body = msg_body;
110     info->msg_body_len = msg_body_len;
111     info->msg_size = msg_size;
112     info->msg_padding = msg_padding;
113   }
114
115   return MAILMBOX_NO_ERROR;
116
117  err:
118   return res;
119 }
120
121
122 struct claws_mailmbox_msg_info *
123 claws_mailmbox_msg_info_new(size_t msg_start, size_t msg_start_len,
124                       size_t msg_headers, size_t msg_headers_len,
125                       size_t msg_body, size_t msg_body_len,
126                       size_t msg_size, size_t msg_padding,
127                       uint32_t msg_uid)
128 {
129   struct claws_mailmbox_msg_info * info;
130
131   info = malloc(sizeof(* info));
132   if (info == NULL)
133     return NULL;
134
135   info->msg_index = 0;
136   info->msg_uid = msg_uid;
137   if (msg_uid != 0)
138     info->msg_written_uid = TRUE;
139   else
140     info->msg_written_uid = FALSE;
141   info->msg_deleted = FALSE;
142
143   info->msg_start = msg_start;
144   info->msg_start_len = msg_start_len;
145
146   info->msg_headers = msg_headers;
147   info->msg_headers_len = msg_headers_len;
148
149   info->msg_body = msg_body;
150   info->msg_body_len = msg_body_len;
151
152   info->msg_size = msg_size;
153
154   info->msg_padding = msg_padding;
155
156   return info;
157 }
158
159 void claws_mailmbox_msg_info_free(struct claws_mailmbox_msg_info * info)
160 {
161   free(info);
162 }
163
164
165 /* append info */
166
167 struct claws_mailmbox_append_info *
168 claws_mailmbox_append_info_new(const char * ai_message, size_t ai_size)
169 {
170   struct claws_mailmbox_append_info * info;
171
172   info = malloc(sizeof(* info));
173   if (info == NULL)
174     return NULL;
175
176   info->ai_message = ai_message;
177   info->ai_size = ai_size;
178
179   return info;
180 }
181
182 void claws_mailmbox_append_info_free(struct claws_mailmbox_append_info * info)
183 {
184   free(info);
185 }
186
187 struct claws_mailmbox_folder * claws_mailmbox_folder_new(const char * mb_filename)
188 {
189   struct claws_mailmbox_folder * folder;
190
191   folder = malloc(sizeof(* folder));
192   if (folder == NULL)
193     goto err;
194
195   strncpy(folder->mb_filename, mb_filename, PATH_MAX - 1);
196   folder->mb_filename[PATH_MAX - 1] = '\0';
197   folder->mb_mtime = (time_t) -1;
198
199   folder->mb_fd = -1;
200   folder->mb_read_only = TRUE;
201   folder->mb_no_uid = TRUE;
202
203   folder->mb_changed = FALSE;
204   folder->mb_deleted_count = 0;
205   
206   folder->mb_mapping = NULL;
207   folder->mb_mapping_size = 0;
208
209   folder->mb_written_uid = 0;
210   folder->mb_max_uid = 0;
211
212   folder->mb_hash = chash_new(CHASH_DEFAULTSIZE, CHASH_COPYKEY);
213   if (folder->mb_hash == NULL)
214     goto free;
215   
216   folder->mb_tab = carray_new(128);
217   if (folder->mb_tab == NULL)
218     goto free_hash;
219
220   return folder;
221
222  free_hash:
223   chash_free(folder->mb_hash);
224  free:
225   free(folder);
226  err:
227   return NULL;
228 }
229
230 void claws_mailmbox_folder_free(struct claws_mailmbox_folder * folder)
231 {
232   unsigned int i;
233
234   for(i = 0 ; i < carray_count(folder->mb_tab) ; i++) {
235     struct claws_mailmbox_msg_info * info;
236
237     info = carray_get(folder->mb_tab, i);
238     if (info != NULL)
239       claws_mailmbox_msg_info_free(info);
240   }
241
242   carray_free(folder->mb_tab);
243   
244   chash_free(folder->mb_hash);
245
246   free(folder);
247 }