Hi all, attached is a small patch with the following changes: - libbalsa/misc.c: simplify deleting a folder recursively and creating a temp folder by exclusively using glib functions - libbalsa/rfc3156.c: fix mem leak when encrypting a message - libbalsa/smtp-server.c: remove misleading/confusing comment
I'm still working n the bigger patch with several gpg-related extensions... Comments? Cheers, Albrecht.
diff --git a/libbalsa/misc.c b/libbalsa/misc.c
index c05da73..40b2ff8 100644
--- a/libbalsa/misc.c
+++ b/libbalsa/misc.c
@@ -29,7 +29,6 @@
#define _SVID_SOURCE 1
#include <ctype.h>
-#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
@@ -43,6 +42,7 @@
#include "libbalsa_private.h"
#include "html.h"
#include <glib/gi18n.h>
+#include <glib/gstdio.h>
static const gchar *libbalsa_get_codeset_name(const gchar *txt,
LibBalsaCodeset Codeset);
@@ -191,41 +191,39 @@ libbalsa_wrap_string(gchar * str, int width)
gboolean
libbalsa_delete_directory_contents(const gchar *path)
{
- struct stat sb;
- DIR *d;
- struct dirent *de;
- gchar *new_path;
-
- d = opendir(path);
- g_return_val_if_fail(d, FALSE);
-
- for (de = readdir(d); de; de = readdir(d)) {
- if (strcmp(de->d_name, ".") == 0 ||
- strcmp(de->d_name, "..") == 0)
- continue;
- new_path = g_strdup_printf("%s/%s", path, de->d_name);
-
- stat(new_path, &sb);
- if (S_ISDIR(sb.st_mode)) {
- if (!libbalsa_delete_directory_contents(new_path) ||
- rmdir(new_path) == -1) {
- g_free(new_path);
- closedir(d);
- return FALSE;
- }
- } else {
- if (unlink( new_path ) == -1) {
- g_free(new_path);
- closedir(d);
- return FALSE;
- }
- }
- g_free(new_path);
- new_path = 0;
+ GDir *dir;
+ gboolean result;
+
+ g_return_val_if_fail(path != NULL, FALSE);
+ dir = g_dir_open(path, 0, NULL);
+ if (dir == NULL) {
+ result = FALSE;
+ } else {
+ const gchar *item;
+
+ result = TRUE;
+ item = g_dir_read_name(dir);
+ while (result && (item != NULL)) {
+ gchar *full_path;
+
+ full_path = g_build_filename(path, item, NULL);
+ if (g_file_test(full_path, G_FILE_TEST_IS_DIR)) {
+ result = libbalsa_delete_directory_contents(full_path);
+ if (g_rmdir(full_path) != 0) {
+ result = FALSE;
+ }
+ } else {
+ if (g_unlink(full_path) != 0) {
+ result = FALSE;
+ }
+ }
+ g_free(full_path);
+ item = g_dir_read_name(dir);
+ }
+ g_dir_close(dir);
}
- closedir(d);
- return TRUE;
+ return result;
}
/* libbalsa_expand_path:
@@ -252,29 +250,9 @@ libbalsa_expand_path(const gchar * path)
gboolean
libbalsa_mktempdir (char **s)
{
- gchar *name;
- int fd;
-
g_return_val_if_fail(s != NULL, FALSE);
-
- do {
- GError *error = NULL;
- fd = g_file_open_tmp("balsa-tmpdir-XXXXXX", &name, &error);
- close(fd);
- unlink(name);
- /* Here is a short time that the name could be reused */
- fd = mkdir(name, 0700);
- if (fd == -1) {
- g_free(name);
- if (!g_error_matches(error, G_FILE_ERROR, G_FILE_ERROR_EXIST))
- return FALSE;
- }
- if (error)
- g_error_free(error);
- } while (fd == -1);
- *s = name;
- /* FIXME: rmdir(name) at sometime */
- return TRUE;
+ *s = g_build_filename(g_get_tmp_dir(), "balsa-tmpdir-XXXXXX", NULL);
+ return g_mkdtemp_full(*s, 0700) != NULL;
}
/* libbalsa_set_fallback_codeset: sets the codeset for incorrectly
diff --git a/libbalsa/rfc3156.c b/libbalsa/rfc3156.c
index 87084ea..f3b5fe8 100644
--- a/libbalsa/rfc3156.c
+++ b/libbalsa/rfc3156.c
@@ -262,7 +262,7 @@ libbalsa_encrypt_mime_object(GMimeObject ** content, GList * rfc822_for,
result = g_mime_application_pkcs7_encrypt(pkcs7, *content, recipients, always_trust, parent, error);
}
- g_ptr_array_free(recipients, FALSE);
+ g_ptr_array_unref(recipients);
/* error checking */
if (!result) {
@@ -497,7 +497,7 @@ libbalsa_rfc2440_sign_encrypt(GMimePart *part, const gchar *sign_for,
always_trust, parent, error);
/* clean up */
if (recipients)
- g_ptr_array_free(recipients, FALSE);
+ g_ptr_array_unref(recipients);
return result;
}
diff --git a/libbalsa/smtp-server.c b/libbalsa/smtp-server.c
index d1a24e2..3157ca2 100644
--- a/libbalsa/smtp-server.c
+++ b/libbalsa/smtp-server.c
@@ -47,7 +47,6 @@ struct _LibBalsaSmtpServer {
gchar *name;
guint big_message; /* size of partial messages; in kB; 0 disables splitting */
gint lock_state; /* 0 means unlocked; access via atomic operations */
- // FIXME - add an atomic flag if an operation is running on this server
};
typedef struct _LibBalsaSmtpServerClass {
pgpwI1AN1iVpu.pgp
Description: PGP signature
_______________________________________________ balsa-list mailing list [email protected] https://mail.gnome.org/mailman/listinfo/balsa-list
