]> git.ipfire.org Git - thirdparty/git.git/commitdiff
gpg-interface: refactor the free-and-xmemdupz pattern
authorHans Jerry Illikainen <hji@dyntopia.com>
Thu, 21 Nov 2019 23:43:35 +0000 (23:43 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sat, 23 Nov 2019 00:09:32 +0000 (09:09 +0900)
Introduce a static replace_cstring() function to simplify repeated
pattern of free-and-xmemdupz() for GPG status line parsing.

This also helps us avoid potential memleaks if parsing of new status
lines are introduced in the future.

Signed-off-by: Hans Jerry Illikainen <hji@dyntopia.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
gpg-interface.c

index d60115ca404edfedc492c55e5bc0f22fe0eaa5a2..37162c9a43c7e3b5d9135da55520021798a0d160 100644 (file)
@@ -105,6 +105,16 @@ static struct {
        { 0, "VALIDSIG ", GPG_STATUS_FINGERPRINT },
 };
 
+static void replace_cstring(char **field, const char *line, const char *next)
+{
+       free(*field);
+
+       if (line && next)
+               *field = xmemdupz(line, next - line);
+       else
+               *field = NULL;
+}
+
 static void parse_gpg_output(struct signature_check *sigc)
 {
        const char *buf = sigc->gpg_status;
@@ -136,21 +146,18 @@ static void parse_gpg_output(struct signature_check *sigc)
                                /* Do we have key information? */
                                if (sigcheck_gpg_status[i].flags & GPG_STATUS_KEYID) {
                                        next = strchrnul(line, ' ');
-                                       free(sigc->key);
-                                       sigc->key = xmemdupz(line, next - line);
+                                       replace_cstring(&sigc->key, line, next);
                                        /* Do we have signer information? */
                                        if (*next && (sigcheck_gpg_status[i].flags & GPG_STATUS_UID)) {
                                                line = next + 1;
                                                next = strchrnul(line, '\n');
-                                               free(sigc->signer);
-                                               sigc->signer = xmemdupz(line, next - line);
+                                               replace_cstring(&sigc->signer, line, next);
                                        }
                                }
                                /* Do we have fingerprint? */
                                if (sigcheck_gpg_status[i].flags & GPG_STATUS_FINGERPRINT) {
                                        next = strchrnul(line, ' ');
-                                       free(sigc->fingerprint);
-                                       sigc->fingerprint = xmemdupz(line, next - line);
+                                       replace_cstring(&sigc->fingerprint, line, next);
 
                                        /* Skip interim fields */
                                        for (j = 9; j > 0; j--) {
@@ -162,7 +169,8 @@ static void parse_gpg_output(struct signature_check *sigc)
 
                                        next = strchrnul(line, '\n');
                                        free(sigc->primary_key_fingerprint);
-                                       sigc->primary_key_fingerprint = xmemdupz(line, next - line);
+                                       replace_cstring(&sigc->primary_key_fingerprint,
+                                                       line, next);
                                }
 
                                break;