Skip to content

Commit 30be5cb

Browse 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

File tree

1 file changed

+54
-55
lines changed

1 file changed

+54
-55
lines changed

src/cares_wrap.cc

+54-55
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)