]> diplodocus.org Git - nmh/commitdiff
mh_oauth_cred_fn(): Always freshly allocate result.
authorRalph Corderoy <ralph@inputplus.co.uk>
Tue, 12 Sep 2017 13:32:33 +0000 (14:32 +0100)
committerRalph Corderoy <ralph@inputplus.co.uk>
Tue, 12 Sep 2017 14:00:31 +0000 (15:00 +0100)
If a `credential-file' context was found, and started with a `/', then
the m_defs's n_field was returned, otherwise a newly allocated string.
The caller couldn't tell whether to free the result or not so memory was
leaked.  Alter it to always freshly allocate the result.  Fixes
803f25412.

sbr/oauth_prof.c

index b541638..0d4336d 100644 (file)
@@ -127,28 +127,25 @@ mh_oauth_get_service_info(const char *svc_name, mh_oauth_service_info *svcinfo,
     return update_svc(svcinfo, svc_name, errbuf, errbuflen);
 }
 
+/* Return value must be free(3)'d. */
 const 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 = concat("oauth-", svc, NULL);
-        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