]> diplodocus.org Git - nmh/blobdiff - sbr/oauth_prof.c
Fix invalid pointer arithmetic.
[nmh] / sbr / oauth_prof.c
index a3f2e54ac94f879b0e57301acdaf15b4936e3cdb..51a5f7ac38fb460a016ff1518dd2228d1bf58c86 100644 (file)
@@ -1,4 +1,5 @@
-/*
+/* oauth_prof.c -- OAuth 2.0 implementation for XOAUTH2 in SMTP and POP3.
+ *
  * This code is Copyright (c) 2014, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  * complete copyright information.
@@ -19,6 +20,7 @@
 
 #include <h/oauth.h>
 #include <h/utils.h>
+#include "m_maildir.h"
 
 static const struct mh_oauth_service_info SERVICES[] = {
     /* https://developers.google.com/accounts/docs/OAuth2InstalledApp */
@@ -56,14 +58,8 @@ copy_svc(mh_oauth_service_info *to, const mh_oauth_service_info *from)
 char *
 mh_oauth_node_name_for_svc(const char *base_name, const char *svc)
 {
-    char *result = mh_xmalloc(sizeof "oauth-" - 1
-                              + strlen(svc)
-                              + 1            /* '-' */
-                              + strlen(base_name)
-                              + 1            /* '\0' */);
-    sprintf(result, "oauth-%s-%s", svc, base_name);
     /* TODO: s/_/-/g ? */
-    return result;
+    return concat("oauth-", svc, "-", base_name, NULL);
 }
 
 /* Update one service_info field if overridden in profile. */
@@ -80,7 +76,7 @@ update_svc_field(char **field, const char *base_name, const char *svc)
 }
 
 /* Update all service_info fields that are overridden in profile. */
-static boolean
+static bool
 update_svc(mh_oauth_service_info *svc, const char *svc_name, char *errbuf,
           size_t errbuflen)
 {
@@ -89,7 +85,7 @@ update_svc(mh_oauth_service_info *svc, const char *svc_name, char *errbuf,
     if (svc->name == NULL) {                                             \
        snprintf(errbuf, errbuflen, "%s", #name " is missing");          \
        errbuf[errbuflen - 1] = '\0';                                    \
-        return FALSE;                                                    \
+        return false;                                                    \
     }
     update(scope);
     update(client_id);
@@ -107,10 +103,10 @@ update_svc(mh_oauth_service_info *svc, const char *svc_name, char *errbuf,
         svc->display_name = svc->name;
     }
 
-    return TRUE;
+    return true;
 }
 
-boolean
+bool
 mh_oauth_get_service_info(const char *svc_name, mh_oauth_service_info *svcinfo,
                          char *errbuf, size_t errbuflen)
 {
@@ -121,45 +117,35 @@ mh_oauth_get_service_info(const char *svc_name, mh_oauth_service_info *svcinfo,
     svcinfo->client_secret = svcinfo->auth_endpoint = NULL;
     svcinfo->token_endpoint = svcinfo->redirect_uri = NULL;
 
-    for (i = 0; i < (int) (sizeof SERVICES / sizeof SERVICES[0]); i++) {
+    for (i = 0; i < (int)DIM(SERVICES); i++) {
         if (strcmp(SERVICES[i].name, svc_name) == 0) {
             copy_svc(svcinfo, &SERVICES[i]);
             break;
         }
     }
 
-    if (!update_svc(svcinfo, svc_name, errbuf, errbuflen)) {
-        return FALSE;
-    }
-
-    return TRUE;
+    return update_svc(svcinfo, svc_name, errbuf, errbuflen);
 }
 
-const char *
+/* Return value must be free(3)'d. */
+char *
 mh_oauth_cred_fn(const char *svc)
 {
-    char *result, *result_if_allocated;
-
-    char *component = mh_oauth_node_name_for_svc("credential-file", svc);
-    result = context_find(component);
-    free(component);
-
-    if (result == NULL) {
-        result = mh_xmalloc(sizeof "oauth-" - 1
-                            + strlen(svc)
-                            + 1 /* '\0' */);
-        sprintf(result, "oauth-%s", svc);
-        result_if_allocated = result;
-    } else {
-        result_if_allocated = NULL;
-    }
-
-    if (result[0] != '/') {
-        const char *tmp = m_maildir(result);
-        free(result_if_allocated);
-        result = getcpy(tmp);
-    }
-
-    return result;
+    char *key = mh_oauth_node_name_for_svc("credential-file", svc);
+    char *value = context_find(key);
+    free(key);
+
+    bool found = value;
+    if (found) {
+        if (*value == '/')
+            return mh_xstrdup(value);
+    } else
+        value = concat("oauth-", svc, NULL);
+
+    const char *md = m_maildir(value);
+    if (!found)
+        free(value);
+
+    return mh_xstrdup(md);
 }
 #endif