Skip to content

Commit 9e20525

Browse files
committed
fix: gen_struct_equality_fn null pointer crash
1 parent fc31dad commit 9e20525

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

vlib/v/gen/c/auto_eq_methods.v

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -214,21 +214,22 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string {
214214
field_type := g.unwrap(field.typ)
215215
field_name := c_name(field.name)
216216

217-
left_arg := g.read_field(left_type, field_name, 'a')
218-
right_arg := g.read_field(left_type, field_name, 'b')
217+
mut left_arg := g.read_field(left_type, field_name, 'a')
218+
mut right_arg := g.read_field(left_type, field_name, 'b')
219219

220220
if field.typ.has_flag(.option) {
221-
fn_builder.write_string('((${left_arg}.state == ${right_arg}.state && ${right_arg}.state == 2) || ')
221+
fn_builder.write_string('((${left_arg}.state == ${right_arg}.state && ${right_arg}.state == 2) || (${left_arg}.state != 2 && ${right_arg}.state != 2 && (')
222222
}
223223
if field_type.sym.kind == .string {
224224
if field.typ.has_flag(.option) {
225-
left_arg_opt := g.read_opt_field(left_type, field_name, 'a', field.typ)
226-
right_arg_opt := g.read_opt_field(left_type, field_name, 'b', field.typ)
227-
fn_builder.write_string('(((${left_arg_opt}).len == (${right_arg_opt}).len && (${left_arg_opt}).len == 0) || fast_string_eq(${left_arg_opt}, ${right_arg_opt}))')
228-
} else if field.typ.is_ptr() {
229-
fn_builder.write_string('((${left_arg}->len == ${right_arg}->len && ${left_arg}->len != 0) || fast_string_eq(*(${left_arg}), *(${right_arg})))')
225+
left_arg = g.read_opt_field(left_type, field_name, 'a', field.typ)
226+
right_arg = g.read_opt_field(left_type, field_name, 'b', field.typ)
227+
}
228+
229+
if field.typ.is_ptr() {
230+
fn_builder.write_string('(${left_arg} == ${right_arg} || (${left_arg} != 0 && ${right_arg} != 0 && ((${left_arg})->len == (${right_arg})->len && (${left_arg})->len == 0) || fast_string_eq(*(${left_arg}), *(${right_arg}))))')
230231
} else {
231-
fn_builder.write_string('((${left_arg}.len == ${right_arg}.len && ${left_arg}.len != 0) || fast_string_eq(${left_arg}, ${right_arg}))')
232+
fn_builder.write_string('((${left_arg}.len == ${right_arg}.len && ${left_arg}.len == 0) || fast_string_eq(${left_arg}, ${right_arg}))')
232233
}
233234
} else if field_type.sym.kind == .sum_type && !field.typ.is_ptr() {
234235
eq_fn := g.gen_sumtype_equality_fn(field.typ)
@@ -260,7 +261,7 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string {
260261
fn_builder.write_string('${eq_fn}_alias_eq(${left_arg}, ${right_arg})')
261262
}
262263
} else if field_type.sym.kind == .function && !field.typ.has_flag(.option) {
263-
fn_builder.write_string('*((voidptr*)(${left_arg})) == *((voidptr*)(${right_arg}))')
264+
fn_builder.write_string('((voidptr*)(${left_arg})) == ((voidptr*)(${right_arg}))')
264265
} else if field_type.sym.kind == .interface
265266
&& (!field.typ.has_flag(.option) || !field.typ.is_ptr()) {
266267
ptr := if field.typ.is_ptr() { '*'.repeat(field.typ.nr_muls()) } else { '' }
@@ -278,7 +279,7 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string {
278279
fn_builder.write_string('${left_arg} == ${right_arg}')
279280
}
280281
if field.typ.has_flag(.option) {
281-
fn_builder.write_string(')')
282+
fn_builder.write_string(')))')
282283
}
283284
}
284285
} else {

0 commit comments

Comments
 (0)