Merge branch 'rs/imap-send-next-arg-fix' into maint

Error checking in "git imap-send" for empty response has been
improved.

* rs/imap-send-next-arg-fix:
  imap-send: handle missing response codes gracefully
  imap-send: handle NULL return of next_arg()
This commit is contained in:
Junio C Hamano 2017-11-27 10:57:00 +09:00
commit 95bf6151dc

View File

@ -683,7 +683,7 @@ static int parse_response_code(struct imap_store *ctx, struct imap_cmd_cb *cb,
struct imap *imap = ctx->imap; struct imap *imap = ctx->imap;
char *arg, *p; char *arg, *p;
if (*s != '[') if (!s || *s != '[')
return RESP_OK; /* no response code */ return RESP_OK; /* no response code */
s++; s++;
if (!(p = strchr(s, ']'))) { if (!(p = strchr(s, ']'))) {
@ -692,6 +692,10 @@ static int parse_response_code(struct imap_store *ctx, struct imap_cmd_cb *cb,
} }
*p++ = 0; *p++ = 0;
arg = next_arg(&s); arg = next_arg(&s);
if (!arg) {
fprintf(stderr, "IMAP error: empty response code\n");
return RESP_BAD;
}
if (!strcmp("UIDVALIDITY", arg)) { if (!strcmp("UIDVALIDITY", arg)) {
if (!(arg = next_arg(&s)) || !(ctx->uidvalidity = atoi(arg))) { if (!(arg = next_arg(&s)) || !(ctx->uidvalidity = atoi(arg))) {
fprintf(stderr, "IMAP error: malformed UIDVALIDITY status\n"); fprintf(stderr, "IMAP error: malformed UIDVALIDITY status\n");
@ -724,7 +728,8 @@ static int get_cmd_result(struct imap_store *ctx, struct imap_cmd *tcmd)
{ {
struct imap *imap = ctx->imap; struct imap *imap = ctx->imap;
struct imap_cmd *cmdp, **pcmdp; struct imap_cmd *cmdp, **pcmdp;
char *cmd, *arg, *arg1; char *cmd;
const char *arg, *arg1;
int n, resp, resp2, tag; int n, resp, resp2, tag;
for (;;) { for (;;) {
@ -732,6 +737,10 @@ static int get_cmd_result(struct imap_store *ctx, struct imap_cmd *tcmd)
return RESP_BAD; return RESP_BAD;
arg = next_arg(&cmd); arg = next_arg(&cmd);
if (!arg) {
fprintf(stderr, "IMAP error: empty response\n");
return RESP_BAD;
}
if (*arg == '*') { if (*arg == '*') {
arg = next_arg(&cmd); arg = next_arg(&cmd);
if (!arg) { if (!arg) {
@ -806,6 +815,8 @@ static int get_cmd_result(struct imap_store *ctx, struct imap_cmd *tcmd)
if (cmdp->cb.cont || cmdp->cb.data) if (cmdp->cb.cont || cmdp->cb.data)
imap->literal_pending = 0; imap->literal_pending = 0;
arg = next_arg(&cmd); arg = next_arg(&cmd);
if (!arg)
arg = "";
if (!strcmp("OK", arg)) if (!strcmp("OK", arg))
resp = DRV_OK; resp = DRV_OK;
else { else {