]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add error_r to t_abspath and its callers
authorMartti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
Thu, 29 Dec 2016 21:04:56 +0000 (23:04 +0200)
committerGitLab <gitlab@git.dovecot.net>
Mon, 30 Jan 2017 16:48:15 +0000 (18:48 +0200)
src/imap-urlauth/imap-urlauth.c
src/imap/main.c
src/lda/main.c
src/lib/path-util.c
src/lib/path-util.h
src/lmtp/main.c
src/master/main.c
src/pop3/main.c

index 181c12385673e1622f312647c2611cceeb1c0867..17ec764ae1a5ccabbf7391bc21d9c34f32a6c776 100644 (file)
@@ -233,7 +233,9 @@ int main(int argc, char *argv[])
        if (imap_urlauth_settings->verbose_proctitle)
                verbose_proctitle = TRUE;
 
-       login_set.auth_socket_path = t_abspath(auth_socket_path);
+       if (t_abspath(auth_socket_path, &login_set.auth_socket_path, &error) < 0) {
+               i_fatal("t_abspath(%s) failed: %s", auth_socket_path, error);
+       }
        login_set.callback = login_client_connected;
        login_set.failure_callback = login_client_failed;
 
index cd066cd255241b2fd1cc99e9447cd304db6a4620..132d3cff69e2e8f9ebdadb5fcd37ff5bcd3f8086 100644 (file)
@@ -451,10 +451,17 @@ int main(int argc, char *argv[])
                        main_stdio_run(username);
                } T_END;
        } else T_BEGIN {
-               login_set.auth_socket_path = t_abspath(auth_socket_path);
+               const char *error;
+               if (t_abspath(auth_socket_path, &login_set.auth_socket_path,
+                             &error) < 0) {
+                       i_fatal("t_abspath(%s) failed: %s", auth_socket_path,
+                               error);
+               }
+
                if (argv[optind] != NULL) {
-                       login_set.postlogin_socket_path =
-                               t_abspath(argv[optind]);
+                       if (t_abspath(argv[optind], &login_set.postlogin_socket_path, &error) < 0) {
+                               i_fatal("t_abspath(%s) failed: %s", argv[optind], error);
+                       }
                }
                login_set.callback = login_client_connected;
                login_set.failure_callback = login_client_failed;
index 5947c513ed4ea89f1ef683009e1544e72ff21b45..1dda36d012758466d9b08ab7fe228525cb7fc9e6 100644 (file)
@@ -353,7 +353,10 @@ int main(int argc, char *argv[])
                        break;
                case 'p':
                        /* input path */
-                       path = t_abspath(optarg);
+                       if (t_abspath(optarg, &path, &errstr) < 0) {
+                               i_fatal("t_abspath(%s) failed: %s",
+                                       optarg, errstr);
+                       }
                        break;
                case 'r':
                        /* final recipient address */
index b0f04b2c568e4ac39e15c6e792fecd24712a7b4b..cc1696b810c7732842349be39afb95b71692c7a7 100644 (file)
@@ -270,17 +270,25 @@ int t_realpath_to(const char *path, const char *root, const char **npath_r,
        return t_realpath(t_strconcat(root, "/", path, NULL), npath_r, error_r);
 }
 
-const char *t_abspath(const char *path)
+int t_abspath(const char *path, const char **abspath_r, const char **error_r)
 {
        i_assert(path != NULL);
+       i_assert(abspath_r != NULL);
+       i_assert(error_r != NULL);
 
-       if (*path == '/')
-               return path;
+       if (*path == '/') {
+               *abspath_r = path;
+               return 0;
+       }
 
        const char *dir, *error;
-       if (t_get_working_dir(&dir, &error) < 0)
-               i_fatal("Failed to get working directory: %s", error);
-       return t_strconcat(dir, "/", path, NULL);
+       if (t_get_working_dir(&dir, &error) < 0) {
+               *error_r = t_strconcat("Failed to get working directory: ",
+                                      error, NULL);
+               return -1;
+       }
+       *abspath_r = t_strconcat(dir, "/", path, NULL);
+       return 0;
 }
 
 const char *t_abspath_to(const char *path, const char *root)
@@ -336,7 +344,12 @@ bool t_binary_abspath(const char **binpath)
                return TRUE;
        } else if (strchr(*binpath, '/') != NULL) {
                /* relative to current directory */
-               *binpath = t_abspath(*binpath);
+               const char *error;
+               if (t_abspath(*binpath, binpath, &error) < 0) {
+                       i_error("t_abspath(%s) failed: %s",
+                               *binpath, error);
+                       return FALSE;
+               }
                return TRUE;
        } else if ((path_env = getenv("PATH")) != NULL) {
                /* we have to find our executable from path */
index 0ac0a07e00d663366127a0c2313beb807d0844c1..6758af8177f8cadaa7edb2c6e6c8ae5e20b4e06d 100644 (file)
@@ -41,8 +41,11 @@ int t_realpath_to(const char *path, const char *root, const char **npath_r,
  * In the t_abspath functions, the returned paths are not normalized. This
  * means that './' and '../' are not resolved, but they left in the returned
  * path as given in the parameters. Symbolic links are not resolved either.
+ *
+ * Returns 0 on success, and -1 on failure. error_r is set on failure, and
+ * cannot be NULL.
  */
-const char *t_abspath(const char *path);
+int t_abspath(const char *path, const char **abspath_r, const char **error_r);
 /* Like t_abspath(), but path is relative to given root. */
 const char *t_abspath_to(const char *path, const char *root);
 
index 5a4f4f9bbdee9a37b2da67664fbdeb05fe2dd398..5f7841453addeb04648114b470ef14c63ab813d0 100644 (file)
@@ -62,7 +62,12 @@ static void main_init(void)
                i_zero(&conn);
                (void)client_create(STDIN_FILENO, STDOUT_FILENO, &conn);
        }
-       dns_client_socket_path = i_strdup(t_abspath(DNS_CLIENT_SOCKET_PATH));
+
+       const char *error, *tmp_socket_path;
+       if (t_abspath(DNS_CLIENT_SOCKET_PATH, &tmp_socket_path, &error) < 0) {
+               i_fatal("t_abspath(%s) failed: %s", DNS_CLIENT_SOCKET_PATH, error);
+       }
+       dns_client_socket_path = i_strdup(tmp_socket_path);
 }
 
 static void main_deinit(void)
index de2cc241786e1ed8e4a15aabc6b3080bfc75fc25..aab942eb4484c3342ab51a69de2ee09fb3cb741a 100644 (file)
@@ -556,7 +556,11 @@ static const char *get_full_config_path(struct service_list *list)
        if (*path == '/')
                return path;
 
-       return p_strdup(list->pool, t_abspath(path));
+       const char *abspath, *error;
+       if (t_abspath(path, &abspath, &error) < 0) {
+               i_fatal("t_abspath(%s) failed: %s", path, error);
+       }
+       return p_strdup(list->pool, abspath);
 }
 
 static void master_time_moved(time_t old_time, time_t new_time)
index 3ad7746fb1683857ff17a6148f192a54033f4a2c..381b057765588b244182eb6df7d6c2bde8b66e2e 100644 (file)
@@ -259,9 +259,15 @@ int main(int argc, char *argv[])
                }
        }
 
-       login_set.auth_socket_path = t_abspath(auth_socket_path);
-       if (argv[optind] != NULL)
-               login_set.postlogin_socket_path = t_abspath(argv[optind]);
+       const char *error;
+       if (t_abspath(auth_socket_path, &login_set.auth_socket_path, &error) < 0) {
+               i_fatal("t_abspath(%s) failed: %s", auth_socket_path, error);
+       }
+       if (argv[optind] != NULL) {
+               if (t_abspath(argv[optind], &login_set.postlogin_socket_path, &error) < 0) {
+                       i_fatal("t_abspath(%s) failed: %s", argv[optind], error);
+               }
+       }
        login_set.callback = login_client_connected;
        login_set.failure_callback = login_client_failed;