Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 30be5cb

Browse filesBrowse files
uttampawartargos
authored andcommitted
src: memory management using smart pointer
Introduced use of smart pointers instead of MallocedBuffer to manage memory allocated in the cares library. PR-URL: #23628 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com>
1 parent db113a2 commit 30be5cb
Copy full SHA for 30be5cb

File tree

Expand file treeCollapse file tree

1 file changed

+54
-55
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

1 file changed

+54
-55
lines changed
Open diff view settings
Collapse file

‎src/cares_wrap.cc‎

Copy file name to clipboardExpand all lines: src/cares_wrap.cc
+54-55Lines changed: 54 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,118 +1061,117 @@ int ParseSoaReply(Environment* env,
10611061
EscapableHandleScope handle_scope(env->isolate());
10621062
auto context = env->context();
10631063

1064-
/* Can't use ares_parse_soa_reply() here which can only parse single record */
1065-
unsigned int ancount = cares_get_16bit(buf + 6);
1064+
// Manage memory using standardard smart pointer std::unique_tr
1065+
struct AresDeleter {
1066+
void operator()(char* ptr) const noexcept { ares_free_string(ptr); }
1067+
};
1068+
using ares_unique_ptr = std::unique_ptr<char[], AresDeleter>;
1069+
1070+
// Can't use ares_parse_soa_reply() here which can only parse single record
1071+
const unsigned int ancount = cares_get_16bit(buf + 6);
10661072
unsigned char* ptr = buf + NS_HFIXEDSZ;
1067-
char* name;
1068-
char* rr_name;
1073+
char* name_temp;
10691074
long temp_len; // NOLINT(runtime/int)
1070-
int status = ares_expand_name(ptr, buf, len, &name, &temp_len);
1075+
int status = ares_expand_name(ptr, buf, len, &name_temp, &temp_len);
1076+
const ares_unique_ptr name(name_temp);
10711077
if (status != ARES_SUCCESS) {
1072-
/* returns EBADRESP in case of invalid input */
1078+
// returns EBADRESP in case of invalid input
10731079
return status == ARES_EBADNAME ? ARES_EBADRESP : status;
10741080
}
10751081

10761082
if (ptr + temp_len + NS_QFIXEDSZ > buf + len) {
1077-
free(name);
10781083
return ARES_EBADRESP;
10791084
}
10801085
ptr += temp_len + NS_QFIXEDSZ;
10811086

10821087
for (unsigned int i = 0; i < ancount; i++) {
1083-
status = ares_expand_name(ptr, buf, len, &rr_name, &temp_len);
1088+
char* rr_name_temp;
1089+
long rr_temp_len; // NOLINT(runtime/int)
1090+
int status2 = ares_expand_name(ptr, buf, len, &rr_name_temp, &rr_temp_len);
1091+
const ares_unique_ptr rr_name(rr_name_temp);
10841092

1085-
if (status != ARES_SUCCESS)
1086-
break;
1093+
if (status2 != ARES_SUCCESS)
1094+
return status2 == ARES_EBADNAME ? ARES_EBADRESP : status2;
10871095

1088-
ptr += temp_len;
1096+
ptr += rr_temp_len;
10891097
if (ptr + NS_RRFIXEDSZ > buf + len) {
1090-
free(rr_name);
1091-
status = ARES_EBADRESP;
1092-
break;
1098+
return ARES_EBADRESP;
10931099
}
10941100

10951101
const int rr_type = cares_get_16bit(ptr);
10961102
const int rr_len = cares_get_16bit(ptr + 8);
10971103
ptr += NS_RRFIXEDSZ;
10981104

1099-
/* only need SOA */
1105+
// only need SOA
11001106
if (rr_type == ns_t_soa) {
1101-
ares_soa_reply soa;
1102-
1103-
status = ares_expand_name(ptr, buf, len, &soa.nsname, &temp_len);
1104-
if (status != ARES_SUCCESS) {
1105-
free(rr_name);
1106-
break;
1107+
char* nsname_temp;
1108+
long nsname_temp_len; // NOLINT(runtime/int)
1109+
1110+
int status3 = ares_expand_name(ptr, buf, len,
1111+
&nsname_temp,
1112+
&nsname_temp_len);
1113+
const ares_unique_ptr nsname(nsname_temp);
1114+
if (status3 != ARES_SUCCESS) {
1115+
return status3 == ARES_EBADNAME ? ARES_EBADRESP : status3;
11071116
}
1108-
ptr += temp_len;
1109-
1110-
status = ares_expand_name(ptr, buf, len, &soa.hostmaster, &temp_len);
1111-
if (status != ARES_SUCCESS) {
1112-
free(rr_name);
1113-
free(soa.nsname);
1114-
break;
1117+
ptr += nsname_temp_len;
1118+
1119+
char* hostmaster_temp;
1120+
long hostmaster_temp_len; // NOLINT(runtime/int)
1121+
int status4 = ares_expand_name(ptr, buf, len,
1122+
&hostmaster_temp,
1123+
&hostmaster_temp_len);
1124+
const ares_unique_ptr hostmaster(hostmaster_temp);
1125+
if (status4 != ARES_SUCCESS) {
1126+
return status4 == ARES_EBADNAME ? ARES_EBADRESP : status4;
11151127
}
1116-
ptr += temp_len;
1128+
ptr += hostmaster_temp_len;
11171129

11181130
if (ptr + 5 * 4 > buf + len) {
1119-
free(rr_name);
1120-
free(soa.nsname);
1121-
free(soa.hostmaster);
1122-
status = ARES_EBADRESP;
1123-
break;
1131+
return ARES_EBADRESP;
11241132
}
11251133

1126-
soa.serial = cares_get_32bit(ptr + 0 * 4);
1127-
soa.refresh = cares_get_32bit(ptr + 1 * 4);
1128-
soa.retry = cares_get_32bit(ptr + 2 * 4);
1129-
soa.expire = cares_get_32bit(ptr + 3 * 4);
1130-
soa.minttl = cares_get_32bit(ptr + 4 * 4);
1134+
const unsigned int serial = cares_get_32bit(ptr + 0 * 4);
1135+
const unsigned int refresh = cares_get_32bit(ptr + 1 * 4);
1136+
const unsigned int retry = cares_get_32bit(ptr + 2 * 4);
1137+
const unsigned int expire = cares_get_32bit(ptr + 3 * 4);
1138+
const unsigned int minttl = cares_get_32bit(ptr + 4 * 4);
11311139

11321140
Local<Object> soa_record = Object::New(env->isolate());
11331141
soa_record->Set(context,
11341142
env->nsname_string(),
1135-
OneByteString(env->isolate(), soa.nsname)).FromJust();
1143+
OneByteString(env->isolate(), nsname.get())).FromJust();
11361144
soa_record->Set(context,
11371145
env->hostmaster_string(),
11381146
OneByteString(env->isolate(),
1139-
soa.hostmaster)).FromJust();
1147+
hostmaster.get())).FromJust();
11401148
soa_record->Set(context,
11411149
env->serial_string(),
1142-
Integer::New(env->isolate(), soa.serial)).FromJust();
1150+
Integer::New(env->isolate(), serial)).FromJust();
11431151
soa_record->Set(context,
11441152
env->refresh_string(),
1145-
Integer::New(env->isolate(), soa.refresh)).FromJust();
1153+
Integer::New(env->isolate(), refresh)).FromJust();
11461154
soa_record->Set(context,
11471155
env->retry_string(),
1148-
Integer::New(env->isolate(), soa.retry)).FromJust();
1156+
Integer::New(env->isolate(), retry)).FromJust();
11491157
soa_record->Set(context,
11501158
env->expire_string(),
1151-
Integer::New(env->isolate(), soa.expire)).FromJust();
1159+
Integer::New(env->isolate(), expire)).FromJust();
11521160
soa_record->Set(context,
11531161
env->minttl_string(),
1154-
Integer::New(env->isolate(), soa.minttl)).FromJust();
1162+
Integer::New(env->isolate(), minttl)).FromJust();
11551163
soa_record->Set(context,
11561164
env->type_string(),
11571165
env->dns_soa_string()).FromJust();
11581166

1159-
free(soa.nsname);
1160-
free(soa.hostmaster);
11611167

11621168
*ret = handle_scope.Escape(soa_record);
11631169
break;
11641170
}
11651171

1166-
free(rr_name);
11671172
ptr += rr_len;
11681173
}
11691174

1170-
free(name);
1171-
1172-
if (status != ARES_SUCCESS) {
1173-
return status == ARES_EBADNAME ? ARES_EBADRESP : status;
1174-
}
1175-
11761175
return ARES_SUCCESS;
11771176
}
11781177

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.