Skip to content

Commit 6d1f198

Browse files
pks-tgitster
authored andcommitted
imap-send: fix leaking memory in imap_server_conf
We never free any of the config strings that we populate into the `struct imap_server_conf`. Fix this by creating a common exit path where we can free resources. While at it, drop the unused member `imap_server_conf::name`. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent cea1ff7 commit 6d1f198

File tree

1 file changed

+42
-23
lines changed

1 file changed

+42
-23
lines changed

imap-send.c

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ static void imap_warn(const char *, ...);
6969
static char *next_arg(char **);
7070

7171
struct imap_server_conf {
72-
const char *name;
7372
char *tunnel;
7473
char *host;
7574
int port;
@@ -1300,23 +1299,28 @@ static int git_imap_config(const char *var, const char *val,
13001299
{
13011300
struct imap_server_conf *cfg = cb;
13021301

1303-
if (!strcmp("imap.sslverify", var))
1302+
if (!strcmp("imap.sslverify", var)) {
13041303
cfg->ssl_verify = git_config_bool(var, val);
1305-
else if (!strcmp("imap.preformattedhtml", var))
1304+
} else if (!strcmp("imap.preformattedhtml", var)) {
13061305
cfg->use_html = git_config_bool(var, val);
1307-
else if (!strcmp("imap.folder", var))
1306+
} else if (!strcmp("imap.folder", var)) {
1307+
FREE_AND_NULL(cfg->folder);
13081308
return git_config_string(&cfg->folder, var, val);
1309-
else if (!strcmp("imap.user", var))
1309+
} else if (!strcmp("imap.user", var)) {
1310+
FREE_AND_NULL(cfg->folder);
13101311
return git_config_string(&cfg->user, var, val);
1311-
else if (!strcmp("imap.pass", var))
1312+
} else if (!strcmp("imap.pass", var)) {
1313+
FREE_AND_NULL(cfg->folder);
13121314
return git_config_string(&cfg->pass, var, val);
1313-
else if (!strcmp("imap.tunnel", var))
1315+
} else if (!strcmp("imap.tunnel", var)) {
1316+
FREE_AND_NULL(cfg->folder);
13141317
return git_config_string(&cfg->tunnel, var, val);
1315-
else if (!strcmp("imap.authmethod", var))
1318+
} else if (!strcmp("imap.authmethod", var)) {
1319+
FREE_AND_NULL(cfg->folder);
13161320
return git_config_string(&cfg->auth_method, var, val);
1317-
else if (!strcmp("imap.port", var))
1321+
} else if (!strcmp("imap.port", var)) {
13181322
cfg->port = git_config_int(var, val, ctx->kvi);
1319-
else if (!strcmp("imap.host", var)) {
1323+
} else if (!strcmp("imap.host", var)) {
13201324
if (!val) {
13211325
return config_error_nonbool(var);
13221326
} else {
@@ -1330,8 +1334,9 @@ static int git_imap_config(const char *var, const char *val,
13301334
val += 2;
13311335
cfg->host = xstrdup(val);
13321336
}
1333-
} else
1337+
} else {
13341338
return git_default_config(var, val, ctx, cb);
1339+
}
13351340

13361341
return 0;
13371342
}
@@ -1503,6 +1508,7 @@ int cmd_main(int argc, const char **argv)
15031508
struct strbuf all_msgs = STRBUF_INIT;
15041509
int total;
15051510
int nongit_ok;
1511+
int ret;
15061512

15071513
setup_git_directory_gently(&nongit_ok);
15081514
git_config(git_imap_config, &server);
@@ -1529,42 +1535,55 @@ int cmd_main(int argc, const char **argv)
15291535

15301536
if (!server.folder) {
15311537
fprintf(stderr, "no imap store specified\n");
1532-
return 1;
1538+
ret = 1;
1539+
goto out;
15331540
}
15341541
if (!server.host) {
15351542
if (!server.tunnel) {
15361543
fprintf(stderr, "no imap host specified\n");
1537-
return 1;
1544+
ret = 1;
1545+
goto out;
15381546
}
1539-
server.host = "tunnel";
1547+
server.host = xstrdup("tunnel");
15401548
}
15411549

15421550
/* read the messages */
15431551
if (strbuf_read(&all_msgs, 0, 0) < 0) {
15441552
error_errno(_("could not read from stdin"));
1545-
return 1;
1553+
ret = 1;
1554+
goto out;
15461555
}
15471556

15481557
if (all_msgs.len == 0) {
15491558
fprintf(stderr, "nothing to send\n");
1550-
return 1;
1559+
ret = 1;
1560+
goto out;
15511561
}
15521562

15531563
total = count_messages(&all_msgs);
15541564
if (!total) {
15551565
fprintf(stderr, "no messages to send\n");
1556-
return 1;
1566+
ret = 1;
1567+
goto out;
15571568
}
15581569

15591570
/* write it to the imap server */
15601571

15611572
if (server.tunnel)
1562-
return append_msgs_to_imap(&server, &all_msgs, total);
1563-
1573+
ret = append_msgs_to_imap(&server, &all_msgs, total);
15641574
#ifdef USE_CURL_FOR_IMAP_SEND
1565-
if (use_curl)
1566-
return curl_append_msgs_to_imap(&server, &all_msgs, total);
1575+
else if (use_curl)
1576+
ret = curl_append_msgs_to_imap(&server, &all_msgs, total);
15671577
#endif
1568-
1569-
return append_msgs_to_imap(&server, &all_msgs, total);
1578+
else
1579+
ret = append_msgs_to_imap(&server, &all_msgs, total);
1580+
1581+
out:
1582+
free(server.tunnel);
1583+
free(server.host);
1584+
free(server.folder);
1585+
free(server.user);
1586+
free(server.pass);
1587+
free(server.auth_method);
1588+
return ret;
15701589
}

0 commit comments

Comments
 (0)