@@ -1061,118 +1061,117 @@ int ParseSoaReply(Environment* env,
1061
1061
EscapableHandleScope handle_scope (env->isolate ());
1062
1062
auto context = env->context ();
1063
1063
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 );
1066
1072
unsigned char * ptr = buf + NS_HFIXEDSZ;
1067
- char * name;
1068
- char * rr_name;
1073
+ char * name_temp;
1069
1074
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);
1071
1077
if (status != ARES_SUCCESS) {
1072
- /* returns EBADRESP in case of invalid input */
1078
+ // returns EBADRESP in case of invalid input
1073
1079
return status == ARES_EBADNAME ? ARES_EBADRESP : status;
1074
1080
}
1075
1081
1076
1082
if (ptr + temp_len + NS_QFIXEDSZ > buf + len) {
1077
- free (name);
1078
1083
return ARES_EBADRESP;
1079
1084
}
1080
1085
ptr += temp_len + NS_QFIXEDSZ;
1081
1086
1082
1087
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);
1084
1092
1085
- if (status != ARES_SUCCESS)
1086
- break ;
1093
+ if (status2 != ARES_SUCCESS)
1094
+ return status2 == ARES_EBADNAME ? ARES_EBADRESP : status2 ;
1087
1095
1088
- ptr += temp_len ;
1096
+ ptr += rr_temp_len ;
1089
1097
if (ptr + NS_RRFIXEDSZ > buf + len) {
1090
- free (rr_name);
1091
- status = ARES_EBADRESP;
1092
- break ;
1098
+ return ARES_EBADRESP;
1093
1099
}
1094
1100
1095
1101
const int rr_type = cares_get_16bit (ptr);
1096
1102
const int rr_len = cares_get_16bit (ptr + 8 );
1097
1103
ptr += NS_RRFIXEDSZ;
1098
1104
1099
- /* only need SOA */
1105
+ // only need SOA
1100
1106
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;
1107
1116
}
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;
1115
1127
}
1116
- ptr += temp_len ;
1128
+ ptr += hostmaster_temp_len ;
1117
1129
1118
1130
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;
1124
1132
}
1125
1133
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 );
1131
1139
1132
1140
Local<Object> soa_record = Object::New (env->isolate ());
1133
1141
soa_record->Set (context,
1134
1142
env->nsname_string (),
1135
- OneByteString (env->isolate (), soa. nsname )).FromJust ();
1143
+ OneByteString (env->isolate (), nsname. get () )).FromJust ();
1136
1144
soa_record->Set (context,
1137
1145
env->hostmaster_string (),
1138
1146
OneByteString (env->isolate (),
1139
- soa. hostmaster )).FromJust ();
1147
+ hostmaster. get () )).FromJust ();
1140
1148
soa_record->Set (context,
1141
1149
env->serial_string (),
1142
- Integer::New (env->isolate (), soa. serial )).FromJust ();
1150
+ Integer::New (env->isolate (), serial)).FromJust ();
1143
1151
soa_record->Set (context,
1144
1152
env->refresh_string (),
1145
- Integer::New (env->isolate (), soa. refresh )).FromJust ();
1153
+ Integer::New (env->isolate (), refresh)).FromJust ();
1146
1154
soa_record->Set (context,
1147
1155
env->retry_string (),
1148
- Integer::New (env->isolate (), soa. retry )).FromJust ();
1156
+ Integer::New (env->isolate (), retry)).FromJust ();
1149
1157
soa_record->Set (context,
1150
1158
env->expire_string (),
1151
- Integer::New (env->isolate (), soa. expire )).FromJust ();
1159
+ Integer::New (env->isolate (), expire)).FromJust ();
1152
1160
soa_record->Set (context,
1153
1161
env->minttl_string (),
1154
- Integer::New (env->isolate (), soa. minttl )).FromJust ();
1162
+ Integer::New (env->isolate (), minttl)).FromJust ();
1155
1163
soa_record->Set (context,
1156
1164
env->type_string (),
1157
1165
env->dns_soa_string ()).FromJust ();
1158
1166
1159
- free (soa.nsname );
1160
- free (soa.hostmaster );
1161
1167
1162
1168
*ret = handle_scope.Escape (soa_record);
1163
1169
break ;
1164
1170
}
1165
1171
1166
- free (rr_name);
1167
1172
ptr += rr_len;
1168
1173
}
1169
1174
1170
- free (name);
1171
-
1172
- if (status != ARES_SUCCESS) {
1173
- return status == ARES_EBADNAME ? ARES_EBADRESP : status;
1174
- }
1175
-
1176
1175
return ARES_SUCCESS;
1177
1176
}
1178
1177
0 commit comments