]> git.ipfire.org Git - thirdparty/git.git/commitdiff
imap: replace atoi() with strtol_i() for UIDVALIDITY and UIDNEXT parsing
authorUsman Akinyemi <usmanakinyemi202@gmail.com>
Thu, 24 Oct 2024 00:24:58 +0000 (00:24 +0000)
committerTaylor Blau <me@ttaylorr.com>
Thu, 24 Oct 2024 18:03:44 +0000 (14:03 -0400)
Replace unsafe uses of atoi() with strtol_i() to improve error handling
when parsing UIDVALIDITY, UIDNEXT, and APPENDUID in IMAP commands.
Invalid values, such as those with letters, now trigger error messages and
prevent malformed status responses.
I did not add any test for this commit as we do not have any test
for git-imap-send(1) at this point.

Signed-off-by: Usman Akinyemi <usmanakinyemi202@gmail.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
imap-send.c

index ec68a0668777658bd981c3f46e030d4fcd47af34..488c06e6139fb72290a0f49268e7d847ce60a403 100644 (file)
@@ -668,12 +668,12 @@ static int parse_response_code(struct imap_store *ctx, struct imap_cmd_cb *cb,
                return RESP_BAD;
        }
        if (!strcmp("UIDVALIDITY", arg)) {
-               if (!(arg = next_arg(&s)) || !(ctx->uidvalidity = atoi(arg))) {
+               if (!(arg = next_arg(&s)) || strtol_i(arg, 10, &ctx->uidvalidity) || !ctx->uidvalidity) {
                        fprintf(stderr, "IMAP error: malformed UIDVALIDITY status\n");
                        return RESP_BAD;
                }
        } else if (!strcmp("UIDNEXT", arg)) {
-               if (!(arg = next_arg(&s)) || !(imap->uidnext = atoi(arg))) {
+               if (!(arg = next_arg(&s)) || strtol_i(arg, 10, &imap->uidnext) || !imap->uidnext) {
                        fprintf(stderr, "IMAP error: malformed NEXTUID status\n");
                        return RESP_BAD;
                }
@@ -686,8 +686,8 @@ static int parse_response_code(struct imap_store *ctx, struct imap_cmd_cb *cb,
                for (; isspace((unsigned char)*p); p++);
                fprintf(stderr, "*** IMAP ALERT *** %s\n", p);
        } else if (cb && cb->ctx && !strcmp("APPENDUID", arg)) {
-               if (!(arg = next_arg(&s)) || !(ctx->uidvalidity = atoi(arg)) ||
-                   !(arg = next_arg(&s)) || !(*(int *)cb->ctx = atoi(arg))) {
+               if (!(arg = next_arg(&s)) || strtol_i(arg, 10, &ctx->uidvalidity) || !ctx->uidvalidity ||
+                   !(arg = next_arg(&s)) || strtol_i(arg, 10, (int *)cb->ctx) || !cb->ctx) {
                        fprintf(stderr, "IMAP error: malformed APPENDUID status\n");
                        return RESP_BAD;
                }
@@ -773,7 +773,10 @@ static int get_cmd_result(struct imap_store *ctx, struct imap_cmd *tcmd)
                        if (!tcmd)
                                return DRV_OK;
                } else {
-                       tag = atoi(arg);
+                       if (strtol_i(arg, 10, &tag)) {
+                               fprintf(stderr, "IMAP error: malformed tag %s\n", arg);
+                               return RESP_BAD;
+                       }
                        for (pcmdp = &imap->in_progress; (cmdp = *pcmdp); pcmdp = &cmdp->next)
                                if (cmdp->tag == tag)
                                        goto gottag;