Skip to content

Commit 31835a1

Browse files
committed
exmdb: switch filename construction buffers to std::string (2)
1 parent 2e035d3 commit 31835a1

File tree

1 file changed

+29
-37
lines changed

1 file changed

+29
-37
lines changed

exch/exmdb/message.cpp

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2650,21 +2650,19 @@ static ec_error_t message_forward_message(const rulexec_in &rp,
26502650
uint32_t action_flavor, std::vector<std::string> &&rcpt_list) try
26512651
{
26522652
int offset;
2653-
char tmp_path[256];
26542653
struct tm time_buff;
2655-
char mid_string[128];
26562654
struct stat node_stat;
26572655
char tmp_buff[64*1024];
26582656
MESSAGE_CONTENT *pmsgctnt;
26592657

26602658
std::unique_ptr<char[], stdlib_delete> pbuff;
26612659
MAIL imail;
26622660
if (rp.digest.has_value()) {
2663-
if (!get_digest(*rp.digest, "file", mid_string, std::size(mid_string)))
2661+
std::string mid_string;
2662+
if (!get_digest(*rp.digest, "file", mid_string))
26642663
return ecError;
2665-
snprintf(tmp_path, std::size(tmp_path), "%s/eml/%s",
2666-
exmdb_server::get_dir(), mid_string);
2667-
wrapfd fd = open(tmp_path, O_RDONLY);
2664+
auto eml_path = exmdb_server::get_dir() + "/eml/"s + mid_string;
2665+
wrapfd fd = open(eml_path.c_str(), O_RDONLY);
26682666
if (fd.get() < 0 || fstat(fd.get(), &node_stat) != 0)
26692667
return ecNotFound;
26702668
if (!S_ISREG(node_stat.st_mode)) {
@@ -3102,18 +3100,17 @@ static ec_error_t op_delegate(const rulexec_in &rp, seen_list &seen,
31023100
std::vector<std::string> rcpt_list;
31033101
if (!msg_rcpt_blocks_to_list(*pfwddlgt, rcpt_list))
31043102
return ecError;
3105-
char mid_string1[128], tmp_path1[256];
3106-
get_digest(*rp.digest, "file", mid_string1, std::size(mid_string1));
3107-
snprintf(tmp_path1, std::size(tmp_path1), "%s/eml/%s",
3108-
exmdb_server::get_dir(), mid_string1);
3103+
std::string mid_string_src;
3104+
get_digest(*rp.digest, "file", mid_string_src);
3105+
auto eml_path_src = exmdb_server::get_dir() + "/eml/"s + mid_string_src;
31093106
for (const auto &eaddr : rcpt_list) {
31103107
sql_meta_result mres;
31113108
if (mysql_adaptor_meta(eaddr.c_str(), WANTPRIV_METAONLY, mres) != 0)
31123109
continue;
31133110
auto maildir = mres.maildir.c_str();
31143111
if (*maildir == '\0') {
31153112
mlog(LV_ERR, "E-1740: copy from %s to delegate %s not possible: no homedir",
3116-
tmp_path1, eaddr.c_str());
3113+
eml_path_src.c_str(), eaddr.c_str());
31173114
continue;
31183115
}
31193116
char guidtxt[GUIDSTR_SIZE]{};
@@ -3125,10 +3122,10 @@ static ec_error_t op_delegate(const rulexec_in &rp, seen_list &seen,
31253122
mlog(LV_ERR, "E-1492: mkbasedir for %s: %s", eml_path.c_str(), strerror(-ret));
31263123
continue;
31273124
}
3128-
ret = HX_copy_file(tmp_path1, eml_path.c_str(), 0);
3125+
ret = HX_copy_file(eml_path_src.c_str(), eml_path.c_str(), 0);
31293126
if (ret < 0) {
31303127
mlog(LV_ERR, "E-1606: HX_copy_file %s -> %s: %s",
3131-
tmp_path1, eml_path.c_str(), strerror(-ret));
3128+
eml_path_src.c_str(), eml_path.c_str(), strerror(-ret));
31323129
continue;
31333130
}
31343131
Json::Value newdigest = *rp.digest;
@@ -3420,10 +3417,9 @@ static ec_error_t opx_delegate(const rulexec_in &rp, const rule_node &rule,
34203417
std::vector<std::string> rcpt_list;
34213418
if (!msg_rcpt_blocks_to_list(*pextfwddlgt, rcpt_list))
34223419
return ecError;
3423-
char mid_string1[128], tmp_path1[256];
3424-
get_digest(*rp.digest, "file", mid_string1, std::size(mid_string1));
3425-
snprintf(tmp_path1, std::size(tmp_path1), "%s/eml/%s",
3426-
exmdb_server::get_dir(), mid_string1);
3420+
std::string mid_string_src;
3421+
get_digest(*rp.digest, "file", mid_string_src);
3422+
auto eml_path_src = exmdb_server::get_dir() + "/eml/"s + mid_string_src;
34273423
for (const auto &eaddr : rcpt_list) {
34283424
sql_meta_result mres;
34293425
if (mysql_adaptor_meta(eaddr.c_str(), WANTPRIV_METAONLY, mres) != 0)
@@ -3438,10 +3434,10 @@ static ec_error_t opx_delegate(const rulexec_in &rp, const rule_node &rule,
34383434
mlog(LV_ERR, "E-1493: mkbasedir for %s: %s", eml_path.c_str(), strerror(-ret));
34393435
continue;
34403436
}
3441-
ret = HX_copy_file(tmp_path1, eml_path.c_str(), 0);
3437+
ret = HX_copy_file(eml_path_src.c_str(), eml_path.c_str(), 0);
34423438
if (ret < 0) {
34433439
mlog(LV_ERR, "E-1607: HX_copy_file %s -> %s: %s",
3444-
tmp_path1, eml_path.c_str(), strerror(-ret));
3440+
eml_path_src.c_str(), eml_path.c_str(), strerror(-ret));
34453441
continue;
34463442
}
34473443
Json::Value newdigest = *rp.digest;
@@ -3613,12 +3609,11 @@ static ec_error_t message_rule_new_message(const rulexec_in &rp, seen_list &seen
36133609
return ecError;
36143610
if (!rp.digest.has_value())
36153611
return ecSuccess;
3616-
char mid_string1[128], tmp_path1[256];
3617-
get_digest(*rp.digest, "file", mid_string1, std::size(mid_string1));
3618-
snprintf(tmp_path1, std::size(tmp_path1), "%s/eml/%s",
3619-
exmdb_server::get_dir(), mid_string1);
3620-
if (::remove(tmp_path1) != 0 && errno != ENOENT)
3621-
mlog(LV_WARN, "W-1345: remove %s: %s", tmp_path1, strerror(errno));
3612+
std::string mid_string_src;
3613+
get_digest(*rp.digest, "file", mid_string_src);
3614+
auto eml_path_src = exmdb_server::get_dir() + "/eml/"s + mid_string_src;
3615+
if (::remove(eml_path_src.c_str()) != 0 && errno != ENOENT)
3616+
mlog(LV_WARN, "W-1345: remove %s: %s", eml_path_src.c_str(), strerror(errno));
36223617
return ecSuccess;
36233618
}
36243619

@@ -3653,7 +3648,6 @@ BOOL exmdb_server::deliver_message(const char *dir, const char *from_address,
36533648
{
36543649
bool b_oof;
36553650
uint64_t fid_val;
3656-
char tmp_path[256];
36573651
BINARY searchkey_bin;
36583652
char mid_string[128];
36593653
std::string account, display_name;
@@ -3791,23 +3785,22 @@ BOOL exmdb_server::deliver_message(const char *dir, const char *from_address,
37913785
get_digest(*digest, "file", mid_string, std::size(mid_string))) {
37923786
Json::Value newdigest = *digest;
37933787
newdigest["file"] = "";
3794-
snprintf(tmp_path, std::size(tmp_path), "%s/ext/%s",
3795-
exmdb_server::get_dir(), mid_string);
3788+
auto ext_path = exmdb_server::get_dir() + "/ext/"s + mid_string;
37963789
auto djson = json_to_str(std::move(newdigest));
3797-
auto ret = gx_mkbasedir(tmp_path, FMODE_PRIVATE | S_IXUSR | S_IXGRP);
3790+
auto ret = gx_mkbasedir(ext_path.c_str(), FMODE_PRIVATE | S_IXUSR | S_IXGRP);
37983791
if (ret < 0) {
3799-
mlog(LV_ERR, "E-1942: mkbasedir for %s: %s", tmp_path, strerror(-ret));
3792+
mlog(LV_ERR, "E-1942: mkbasedir for %s: %s", ext_path.c_str(), strerror(-ret));
38003793
return false;
38013794
}
3802-
wrapfd fd = open(tmp_path, O_CREAT | O_TRUNC | O_WRONLY, FMODE_PRIVATE);
3795+
wrapfd fd = open(ext_path.c_str(), O_CREAT | O_TRUNC | O_WRONLY, FMODE_PRIVATE);
38033796
if (fd.get() >= 0) {
38043797
if (HXio_fullwrite(fd.get(), djson.c_str(), djson.size()) < 0) {
3805-
mlog(LV_ERR, "E-1319: write %s: %s", tmp_path, strerror(errno));
3798+
mlog(LV_ERR, "E-1319: write %s: %s", ext_path.c_str(), strerror(errno));
38063799
return false;
38073800
}
38083801
auto err = fd.close_wr();
38093802
if (err != 0) {
3810-
mlog(LV_ERR, "E-1319: close %s: %s", tmp_path, strerror(err));
3803+
mlog(LV_ERR, "E-1319: close %s: %s", ext_path.c_str(), strerror(err));
38113804
return false;
38123805
}
38133806
if (!common_util_set_mid_string(pdb->psqlite,
@@ -4009,7 +4002,7 @@ BOOL exmdb_server::read_message(const char *dir, const char *username,
40094002
BOOL exmdb_server::rule_new_message(const char *dir, const char *username,
40104003
cpid_t cpid, uint64_t folder_id, uint64_t message_id) try
40114004
{
4012-
char *pmid_string = nullptr, tmp_path[256];
4005+
char *pmid_string = nullptr;
40134006

40144007
auto pdb = db_engine_get_db(dir);
40154008
if (!pdb)
@@ -4027,10 +4020,9 @@ BOOL exmdb_server::rule_new_message(const char *dir, const char *username,
40274020
return FALSE;
40284021
std::optional<Json::Value> digest;
40294022
if (NULL != pmid_string) {
4030-
snprintf(tmp_path, std::size(tmp_path), "%s/ext/%s",
4031-
exmdb_server::get_dir(), pmid_string);
4023+
auto ext_path = exmdb_server::get_dir() + "/ext/"s + pmid_string;
40324024
size_t slurp_size = 0;
4033-
std::unique_ptr<char[], stdlib_delete> slurp_data(HX_slurp_file(tmp_path, &slurp_size));
4025+
std::unique_ptr<char[], stdlib_delete> slurp_data(HX_slurp_file(ext_path.c_str(), &slurp_size));
40344026
if (slurp_data != nullptr) {
40354027
digest.emplace();
40364028
if (!json_from_str({slurp_data.get(), slurp_size}, *digest))

0 commit comments

Comments
 (0)