@@ -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