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