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:
NotZed
2000-02-28 23:26:13 +00:00
committed by Michael Zucci
parent bbbee6ba11
commit f81ae069e4
8 changed files with 74 additions and 87 deletions

View File

@ -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.

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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");

View File

@ -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,19 +384,11 @@ _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) {
@ -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 */
@ -679,16 +648,9 @@ _delete_messages (CamelFolder *folder, CamelException *ex)
gboolean folder_already_exists; gboolean folder_already_exists;
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 */
folder_already_exists = camel_folder_exists (folder, ex); folder_already_exists = camel_folder_exists (folder, ex);
@ -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);
@ -963,14 +917,11 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException
if (camel_exception_get_id (ex)) { if (camel_exception_get_id (ex)) {
/* ** FIXME : free the preparsed information */ /* ** FIXME : free the preparsed information */
return; return;
} }
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,18 +944,18 @@ _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,
CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION,
"could not open the mbox folder file for appending the message\n" "could not open the mbox folder file for appending the message\n"
"\t%s\n" "\t%s\n"
"Full error is : %s\n", "Full error is : %s\n",
mbox_folder->folder_file_path, mbox_folder->folder_file_path,
strerror (errno)); strerror (errno));
return; return;
} }
camel_mbox_copy_file_chunk (fd1, camel_mbox_copy_file_chunk (fd1,
fd2, fd2,
@ -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");
} }

View File

@ -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;

View File

@ -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;