Fix a bunch of serious small bugs.
2000-02-28 NotZed <NotZed@HelixCode.com> * camel-mime-part.c (_parse_header_pair): Dont free this either. * camel-medium.c (_remove_header): Ugh, dont free the header before we actually remove it. (_add_header): Ugh, dont free hashtable entries which may be duplicated (hash_insert _will_ reference that memory). * string-utils.c (string_trim): Trimming a 0-length string is not an error. * camel-mime-message.c (_parse_header_pair): Fixed very broken memory handling of header_name/value. * providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev): Initialise end_of_last_message always. (camel_mbox_copy_file_chunk): Stop trying to read if we run out of data, rather than looping forever. * providers/mbox/camel-mbox-folder.c (_init): Set search cap on. (_open): Call parent class to perform open. Remove folder-open check to parent instead. (_create): open takes a creation mask, dont use umask to try and set the open mode. (_delete): Dont bother checking folder==NULL, its already been checked on the external interface (changed to an assertion, this would have to be a camel bug). (_delete_messages): Likewise. (_create): Ditto. (_init): Dont go and clear all the paths and shit that the parent open just setup for us. (_delete_messages): Get rid of more umask stuff. (_append_message): Make sure we pass file mode to open with create. (_append_message): Cleaned up some indenting to make it readable. svn path=/trunk/; revision=1985
This commit is contained in:
@ -1,5 +1,23 @@
|
|||||||
2000-02-28 NotZed <NotZed@HelixCode.com>
|
2000-02-28 NotZed <NotZed@HelixCode.com>
|
||||||
|
|
||||||
|
* camel-mime-part.c (_parse_header_pair): Dont free this either.
|
||||||
|
|
||||||
|
* camel-medium.c (_remove_header): Ugh, dont free the header
|
||||||
|
before we actually remove it.
|
||||||
|
(_add_header): Ugh, dont free hashtable entries which may be
|
||||||
|
duplicated (hash_insert _will_ reference that memory).
|
||||||
|
|
||||||
|
* string-utils.c (string_trim): Trimming a 0-length string is not
|
||||||
|
an error.
|
||||||
|
|
||||||
|
* camel-mime-message.c (_parse_header_pair): Fixed very broken
|
||||||
|
memory handling of header_name/value.
|
||||||
|
|
||||||
|
* providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev):
|
||||||
|
Initialise end_of_last_message always.
|
||||||
|
(camel_mbox_copy_file_chunk): Stop trying to read if we run out of
|
||||||
|
data, rather than looping forever.
|
||||||
|
|
||||||
* camel-folder.c (camel_folder_search_by_expression): No, its not
|
* camel-folder.c (camel_folder_search_by_expression): No, its not
|
||||||
a fatal error to search on a non-searchable folder, you just dont
|
a fatal error to search on a non-searchable folder, you just dont
|
||||||
get any matches.
|
get any matches.
|
||||||
@ -9,6 +27,18 @@
|
|||||||
* providers/mbox/camel-mbox-folder.c (_init): Set search cap on.
|
* providers/mbox/camel-mbox-folder.c (_init): Set search cap on.
|
||||||
(_open): Call parent class to perform open. Remove folder-open
|
(_open): Call parent class to perform open. Remove folder-open
|
||||||
check to parent instead.
|
check to parent instead.
|
||||||
|
(_create): open takes a creation mask, dont use umask to try and
|
||||||
|
set the open mode.
|
||||||
|
(_delete): Dont bother checking folder==NULL, its already been
|
||||||
|
checked on the external interface (changed to an assertion, this
|
||||||
|
would have to be a camel bug).
|
||||||
|
(_delete_messages): Likewise.
|
||||||
|
(_create): Ditto.
|
||||||
|
(_init): Dont go and clear all the paths and shit that the parent
|
||||||
|
open just setup for us.
|
||||||
|
(_delete_messages): Get rid of more umask stuff.
|
||||||
|
(_append_message): Make sure we pass file mode to open with create.
|
||||||
|
(_append_message): Cleaned up some indenting to make it readable.
|
||||||
|
|
||||||
* camel-stream-b64.c (my_read_encode): Fixed a typo.
|
* camel-stream-b64.c (my_read_encode): Fixed a typo.
|
||||||
|
|
||||||
|
@ -150,11 +150,15 @@ _add_header (CamelMedium *medium, gchar *header_name, gchar *header_value)
|
|||||||
header_exists = g_hash_table_lookup_extended (medium->headers, header_name,
|
header_exists = g_hash_table_lookup_extended (medium->headers, header_name,
|
||||||
(gpointer *) &old_header_name,
|
(gpointer *) &old_header_name,
|
||||||
(gpointer *) &old_header_value);
|
(gpointer *) &old_header_value);
|
||||||
|
/* ghashtables actually dont duplicate key pointers on existing fields,
|
||||||
|
just remove the old one first always (avoiding this assumption) */
|
||||||
if (header_exists) {
|
if (header_exists) {
|
||||||
|
g_hash_table_remove (medium->headers, old_header_name);
|
||||||
|
#if 1
|
||||||
g_free (old_header_name);
|
g_free (old_header_name);
|
||||||
g_free (old_header_value);
|
g_free (old_header_value);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
g_hash_table_insert (medium->headers, g_strdup (header_name),
|
g_hash_table_insert (medium->headers, g_strdup (header_name),
|
||||||
g_strdup (header_value));
|
g_strdup (header_value));
|
||||||
}
|
}
|
||||||
@ -182,12 +186,11 @@ _remove_header (CamelMedium *medium, const gchar *header_name)
|
|||||||
(gpointer *) &old_header_name,
|
(gpointer *) &old_header_name,
|
||||||
(gpointer *) &old_header_value);
|
(gpointer *) &old_header_value);
|
||||||
if (header_exists) {
|
if (header_exists) {
|
||||||
|
g_hash_table_remove (medium->headers, header_name);
|
||||||
|
|
||||||
g_free (old_header_name);
|
g_free (old_header_name);
|
||||||
g_free (old_header_value);
|
g_free (old_header_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_hash_table_remove (medium->headers, header_name);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -681,7 +681,6 @@ _parse_header_pair (CamelMimePart *mime_part, gchar *header_name, gchar *header_
|
|||||||
header_value );
|
header_value );
|
||||||
|
|
||||||
_set_recipient_list_from_string (message, "To", header_value);
|
_set_recipient_list_from_string (message, "To", header_value);
|
||||||
g_free (header_value);
|
|
||||||
header_handled = TRUE;
|
header_handled = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -691,7 +690,6 @@ _parse_header_pair (CamelMimePart *mime_part, gchar *header_name, gchar *header_
|
|||||||
header_value );
|
header_value );
|
||||||
|
|
||||||
_set_recipient_list_from_string (message, "Cc", header_value);
|
_set_recipient_list_from_string (message, "Cc", header_value);
|
||||||
g_free (header_value);
|
|
||||||
header_handled = TRUE;
|
header_handled = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -701,14 +699,12 @@ _parse_header_pair (CamelMimePart *mime_part, gchar *header_name, gchar *header_
|
|||||||
header_value );
|
header_value );
|
||||||
|
|
||||||
_set_recipient_list_from_string (message, "Bcc", header_value);
|
_set_recipient_list_from_string (message, "Bcc", header_value);
|
||||||
g_free (header_value);
|
|
||||||
header_handled = TRUE;
|
header_handled = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if (header_handled) {
|
if (header_handled) {
|
||||||
g_free (header_name);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
} else
|
} else
|
||||||
return parent_class->parse_header_pair (mime_part, header_name, header_value);
|
return parent_class->parse_header_pair (mime_part, header_name, header_value);
|
||||||
|
@ -806,7 +806,6 @@ _parse_header_pair (CamelMimePart *mime_part, gchar *header_name, gchar *header_
|
|||||||
|
|
||||||
|
|
||||||
if (header_handled) {
|
if (header_handled) {
|
||||||
g_free (header_name);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
} else return FALSE;
|
} else return FALSE;
|
||||||
|
|
||||||
|
@ -130,6 +130,13 @@ _store_header_pair_from_string (GArray *header_array, gchar *header_line)
|
|||||||
|
|
||||||
|
|
||||||
if (header_line) {
|
if (header_line) {
|
||||||
|
char *p = strchr(header_line, ':');
|
||||||
|
if (p) {
|
||||||
|
header.name = g_strndup(header_line, p-header_line);
|
||||||
|
header.value = g_strdup(p+1);
|
||||||
|
g_array_append_val (header_array, header);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
dich_result = string_dichotomy ( header_line, ':',
|
dich_result = string_dichotomy ( header_line, ':',
|
||||||
&header_name, &header_value,
|
&header_name, &header_value,
|
||||||
STRING_DICHOTOMY_NONE);
|
STRING_DICHOTOMY_NONE);
|
||||||
@ -152,6 +159,7 @@ _store_header_pair_from_string (GArray *header_array, gchar *header_line)
|
|||||||
header.value = header_value;
|
header.value = header_value;
|
||||||
g_array_append_val (header_array, header);
|
g_array_append_val (header_array, header);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
CAMEL_LOG_FULL_DEBUG ( "_store_header_pair_from_string:: Leaving\n");
|
CAMEL_LOG_FULL_DEBUG ( "_store_header_pair_from_string:: Leaving\n");
|
||||||
|
@ -199,15 +199,6 @@ _init (CamelFolder *folder, CamelStore *parent_store,
|
|||||||
folder->has_search_capability = TRUE;
|
folder->has_search_capability = TRUE;
|
||||||
folder->summary = camel_folder_summary_new ();
|
folder->summary = camel_folder_summary_new ();
|
||||||
|
|
||||||
#if 0
|
|
||||||
mbox_folder->folder_file_path = NULL;
|
|
||||||
mbox_folder->summary_file_path = NULL;
|
|
||||||
mbox_folder->folder_dir_path = NULL;
|
|
||||||
mbox_folder->index_file_path = NULL;
|
|
||||||
mbox_folder->internal_summary = NULL;
|
|
||||||
mbox_folder->uid_array = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CAMEL_LOG_FULL_DEBUG ("Leaving CamelMboxFolder::init_with_store\n");
|
CAMEL_LOG_FULL_DEBUG ("Leaving CamelMboxFolder::init_with_store\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -393,20 +384,12 @@ _exists (CamelFolder *folder, CamelException *ex)
|
|||||||
gint stat_error;
|
gint stat_error;
|
||||||
gboolean exists;
|
gboolean exists;
|
||||||
|
|
||||||
|
g_assert(folder != NULL);
|
||||||
|
|
||||||
CAMEL_LOG_FULL_DEBUG ("Entering CamelMboxFolder::exists\n");
|
CAMEL_LOG_FULL_DEBUG ("Entering CamelMboxFolder::exists\n");
|
||||||
|
|
||||||
|
|
||||||
/* check if the folder object exists */
|
|
||||||
if (!folder) {
|
|
||||||
camel_exception_set (ex,
|
|
||||||
CAMEL_EXCEPTION_FOLDER_NULL,
|
|
||||||
"folder object is NULL");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
mbox_folder = CAMEL_MBOX_FOLDER(folder);
|
mbox_folder = CAMEL_MBOX_FOLDER(folder);
|
||||||
|
|
||||||
|
|
||||||
/* check if the mbox file path is determined */
|
/* check if the mbox file path is determined */
|
||||||
if (!mbox_folder->folder_file_path) {
|
if (!mbox_folder->folder_file_path) {
|
||||||
camel_exception_set (ex,
|
camel_exception_set (ex,
|
||||||
@ -482,14 +465,7 @@ _create (CamelFolder *folder, CamelException *ex)
|
|||||||
int creat_fd;
|
int creat_fd;
|
||||||
mode_t old_umask;
|
mode_t old_umask;
|
||||||
|
|
||||||
/* check if the folder object exists */
|
g_assert(folder != NULL);
|
||||||
if (!folder) {
|
|
||||||
camel_exception_set (ex,
|
|
||||||
CAMEL_EXCEPTION_FOLDER_NULL,
|
|
||||||
"folder object is NULL");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* call default implementation */
|
/* call default implementation */
|
||||||
parent_class->create (folder, ex);
|
parent_class->create (folder, ex);
|
||||||
@ -520,11 +496,9 @@ _create (CamelFolder *folder, CamelException *ex)
|
|||||||
|
|
||||||
/* create the mbox file */
|
/* create the mbox file */
|
||||||
/* it must be rw for the user and none for the others */
|
/* it must be rw for the user and none for the others */
|
||||||
old_umask = umask (0700);
|
|
||||||
creat_fd = open (folder_file_path,
|
creat_fd = open (folder_file_path,
|
||||||
O_WRONLY | O_CREAT | O_APPEND,
|
O_WRONLY | O_CREAT | O_APPEND,
|
||||||
S_IRUSR | S_IWUSR);
|
S_IRUSR | S_IWUSR, 0600);
|
||||||
umask (old_umask);
|
|
||||||
if (creat_fd == -1) goto io_error;
|
if (creat_fd == -1) goto io_error;
|
||||||
close (creat_fd);
|
close (creat_fd);
|
||||||
|
|
||||||
@ -573,14 +547,9 @@ _delete (CamelFolder *folder, gboolean recurse, CamelException *ex)
|
|||||||
gint unlink_error = 0;
|
gint unlink_error = 0;
|
||||||
gboolean folder_already_exists;
|
gboolean folder_already_exists;
|
||||||
|
|
||||||
/* check if the folder object exists */
|
g_assert(folder != NULL);
|
||||||
if (!folder) {
|
|
||||||
camel_exception_set (ex,
|
|
||||||
CAMEL_EXCEPTION_FOLDER_NULL,
|
|
||||||
"folder object is NULL");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/* check if the folder object exists */
|
||||||
|
|
||||||
/* in the case where the folder does not exist,
|
/* in the case where the folder does not exist,
|
||||||
return immediatly */
|
return immediatly */
|
||||||
@ -680,14 +649,7 @@ _delete_messages (CamelFolder *folder, CamelException *ex)
|
|||||||
int creat_fd;
|
int creat_fd;
|
||||||
mode_t old_umask;
|
mode_t old_umask;
|
||||||
|
|
||||||
|
g_assert(folder!=NULL);
|
||||||
/* check if the folder object exists */
|
|
||||||
if (!folder) {
|
|
||||||
camel_exception_set (ex,
|
|
||||||
CAMEL_EXCEPTION_FOLDER_NULL,
|
|
||||||
"folder object is NULL");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* in the case where the folder does not exist,
|
/* in the case where the folder does not exist,
|
||||||
return immediatly */
|
return immediatly */
|
||||||
@ -711,11 +673,9 @@ _delete_messages (CamelFolder *folder, CamelException *ex)
|
|||||||
|
|
||||||
/* create the mbox file */
|
/* create the mbox file */
|
||||||
/* it must be rw for the user and none for the others */
|
/* it must be rw for the user and none for the others */
|
||||||
old_umask = umask (0700);
|
|
||||||
creat_fd = open (folder_file_path,
|
creat_fd = open (folder_file_path,
|
||||||
O_WRONLY | O_TRUNC,
|
O_WRONLY | O_TRUNC,
|
||||||
S_IRUSR | S_IWUSR);
|
S_IRUSR | S_IWUSR, 0600);
|
||||||
umask (old_umask);
|
|
||||||
if (creat_fd == -1) goto io_error;
|
if (creat_fd == -1) goto io_error;
|
||||||
close (creat_fd);
|
close (creat_fd);
|
||||||
|
|
||||||
@ -910,7 +870,6 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException
|
|||||||
gchar *tmp_message_filename;
|
gchar *tmp_message_filename;
|
||||||
gint fd1, fd2;
|
gint fd1, fd2;
|
||||||
|
|
||||||
|
|
||||||
CAMEL_LOG_FULL_DEBUG ("Entering CamelMboxFolder::append_message\n");
|
CAMEL_LOG_FULL_DEBUG ("Entering CamelMboxFolder::append_message\n");
|
||||||
|
|
||||||
tmp_message_filename = g_strdup_printf ("%s.tmp", mbox_folder->folder_file_path);
|
tmp_message_filename = g_strdup_printf ("%s.tmp", mbox_folder->folder_file_path);
|
||||||
@ -936,15 +895,10 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException
|
|||||||
*/
|
*/
|
||||||
next_uid = mbox_folder->internal_summary->next_uid;
|
next_uid = mbox_folder->internal_summary->next_uid;
|
||||||
tmp_file_fd = open (tmp_message_filename, O_RDONLY);
|
tmp_file_fd = open (tmp_message_filename, O_RDONLY);
|
||||||
message_info_array = camel_mbox_parse_file (tmp_file_fd,
|
message_info_array =
|
||||||
"From - ",
|
camel_mbox_parse_file (tmp_file_fd, "From - ", 0,
|
||||||
0,
|
&tmp_file_size, &next_uid, TRUE,
|
||||||
&tmp_file_size,
|
NULL, 0, ex);
|
||||||
&next_uid,
|
|
||||||
TRUE,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
ex);
|
|
||||||
|
|
||||||
close (tmp_file_fd);
|
close (tmp_file_fd);
|
||||||
|
|
||||||
@ -968,9 +922,6 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException
|
|||||||
mbox_summary_info =
|
mbox_summary_info =
|
||||||
parsed_information_to_mbox_summary (message_info_array);
|
parsed_information_to_mbox_summary (message_info_array);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* store the number of messages as well as the summary array */
|
/* store the number of messages as well as the summary array */
|
||||||
mbox_folder->internal_summary->nb_message += 1;
|
mbox_folder->internal_summary->nb_message += 1;
|
||||||
mbox_folder->internal_summary->next_uid = next_uid;
|
mbox_folder->internal_summary->next_uid = next_uid;
|
||||||
@ -993,7 +944,7 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException
|
|||||||
fd1 = open (tmp_message_filename, O_RDONLY);
|
fd1 = open (tmp_message_filename, O_RDONLY);
|
||||||
fd2 = open (mbox_folder->folder_file_path,
|
fd2 = open (mbox_folder->folder_file_path,
|
||||||
O_WRONLY | O_CREAT | O_APPEND,
|
O_WRONLY | O_CREAT | O_APPEND,
|
||||||
S_IRUSR | S_IWUSR);
|
S_IRUSR | S_IWUSR, 0600);
|
||||||
|
|
||||||
if (fd2 == -1) {
|
if (fd2 == -1) {
|
||||||
camel_exception_setv (ex,
|
camel_exception_setv (ex,
|
||||||
@ -1019,7 +970,6 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException
|
|||||||
/* generate the folder md5 signature */
|
/* generate the folder md5 signature */
|
||||||
md5_get_digest_from_file (mbox_folder->folder_file_path, mbox_folder->internal_summary->md5_digest);
|
md5_get_digest_from_file (mbox_folder->folder_file_path, mbox_folder->internal_summary->md5_digest);
|
||||||
|
|
||||||
|
|
||||||
g_free (tmp_message_filename);
|
g_free (tmp_message_filename);
|
||||||
CAMEL_LOG_FULL_DEBUG ("Leaving CamelMboxFolder::append_message\n");
|
CAMEL_LOG_FULL_DEBUG ("Leaving CamelMboxFolder::append_message\n");
|
||||||
}
|
}
|
||||||
|
@ -168,10 +168,10 @@ camel_mbox_copy_file_chunk (gint fd_src,
|
|||||||
{
|
{
|
||||||
gchar buffer [1000];
|
gchar buffer [1000];
|
||||||
glong nb_to_read;
|
glong nb_to_read;
|
||||||
glong nb_read, v;
|
glong nb_read=1, v;
|
||||||
|
|
||||||
nb_to_read = nb_bytes;
|
nb_to_read = nb_bytes;
|
||||||
while (nb_to_read > 0) {
|
while (nb_to_read > 0 && nb_read>0) {
|
||||||
|
|
||||||
do {
|
do {
|
||||||
nb_read = read (fd_src, buffer, MIN (1000, nb_to_read));
|
nb_read = read (fd_src, buffer, MIN (1000, nb_to_read));
|
||||||
@ -223,7 +223,7 @@ camel_mbox_write_xev (gchar *mbox_file_name,
|
|||||||
guint bytes_to_copy = 0;
|
guint bytes_to_copy = 0;
|
||||||
glong cur_pos = 0;
|
glong cur_pos = 0;
|
||||||
glong cur_offset = 0;
|
glong cur_offset = 0;
|
||||||
glong end_of_last_message;
|
glong end_of_last_message = 0;
|
||||||
glong next_free_uid;
|
glong next_free_uid;
|
||||||
gchar xev_header[20] = "X-Evolution:XXXX-X\n";
|
gchar xev_header[20] = "X-Evolution:XXXX-X\n";
|
||||||
gchar *tmp_file_name;
|
gchar *tmp_file_name;
|
||||||
|
@ -228,7 +228,8 @@ string_trim (gchar *string, const gchar *trim_chars, StringTrimOption options)
|
|||||||
|
|
||||||
g_return_if_fail (string);
|
g_return_if_fail (string);
|
||||||
length = strlen (string);
|
length = strlen (string);
|
||||||
g_return_if_fail (length > 0);
|
if (length==0)
|
||||||
|
return;
|
||||||
|
|
||||||
first_ok = 0;
|
first_ok = 0;
|
||||||
last_ok = length - 1;
|
last_ok = length - 1;
|
||||||
|
Reference in New Issue
Block a user