Skip to content

Commit 811476e

Browse files
anakryikoAlexei Starovoitov
authored andcommitted
bpf: prepare reg_set_min_max for second set of registers
Similarly to is_branch_taken()-related refactorings, start preparing reg_set_min_max() to handle more generic case of two non-const registers. Start with renaming arguments to accommodate later addition of second register as an input argument. Signed-off-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent 4d34588 commit 811476e

File tree

1 file changed

+40
-40
lines changed

1 file changed

+40
-40
lines changed

kernel/bpf/verifier.c

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -14405,25 +14405,25 @@ static int is_branch_taken(struct bpf_reg_state *reg1, struct bpf_reg_state *reg
1440514405
* simply doing a BPF_K check.
1440614406
* In JEQ/JNE cases we also adjust the var_off values.
1440714407
*/
14408-
static void reg_set_min_max(struct bpf_reg_state *true_reg,
14409-
struct bpf_reg_state *false_reg,
14408+
static void reg_set_min_max(struct bpf_reg_state *true_reg1,
14409+
struct bpf_reg_state *false_reg1,
1441014410
u64 uval, u32 uval32,
1441114411
u8 opcode, bool is_jmp32)
1441214412
{
14413-
struct tnum false_32off = tnum_subreg(false_reg->var_off);
14414-
struct tnum false_64off = false_reg->var_off;
14415-
struct tnum true_32off = tnum_subreg(true_reg->var_off);
14416-
struct tnum true_64off = true_reg->var_off;
14413+
struct tnum false_32off = tnum_subreg(false_reg1->var_off);
14414+
struct tnum false_64off = false_reg1->var_off;
14415+
struct tnum true_32off = tnum_subreg(true_reg1->var_off);
14416+
struct tnum true_64off = true_reg1->var_off;
1441714417
s64 sval = (s64)uval;
1441814418
s32 sval32 = (s32)uval32;
1441914419

1442014420
/* If the dst_reg is a pointer, we can't learn anything about its
1442114421
* variable offset from the compare (unless src_reg were a pointer into
1442214422
* the same object, but we don't bother with that.
14423-
* Since false_reg and true_reg have the same type by construction, we
14423+
* Since false_reg1 and true_reg1 have the same type by construction, we
1442414424
* only need to check one of them for pointerness.
1442514425
*/
14426-
if (__is_pointer_value(false, false_reg))
14426+
if (__is_pointer_value(false, false_reg1))
1442714427
return;
1442814428

1442914429
switch (opcode) {
@@ -14438,20 +14438,20 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg,
1443814438
*/
1443914439
case BPF_JEQ:
1444014440
if (is_jmp32) {
14441-
__mark_reg32_known(true_reg, uval32);
14442-
true_32off = tnum_subreg(true_reg->var_off);
14441+
__mark_reg32_known(true_reg1, uval32);
14442+
true_32off = tnum_subreg(true_reg1->var_off);
1444314443
} else {
14444-
___mark_reg_known(true_reg, uval);
14445-
true_64off = true_reg->var_off;
14444+
___mark_reg_known(true_reg1, uval);
14445+
true_64off = true_reg1->var_off;
1444614446
}
1444714447
break;
1444814448
case BPF_JNE:
1444914449
if (is_jmp32) {
14450-
__mark_reg32_known(false_reg, uval32);
14451-
false_32off = tnum_subreg(false_reg->var_off);
14450+
__mark_reg32_known(false_reg1, uval32);
14451+
false_32off = tnum_subreg(false_reg1->var_off);
1445214452
} else {
14453-
___mark_reg_known(false_reg, uval);
14454-
false_64off = false_reg->var_off;
14453+
___mark_reg_known(false_reg1, uval);
14454+
false_64off = false_reg1->var_off;
1445514455
}
1445614456
break;
1445714457
case BPF_JSET:
@@ -14474,16 +14474,16 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg,
1447414474
u32 false_umax = opcode == BPF_JGT ? uval32 : uval32 - 1;
1447514475
u32 true_umin = opcode == BPF_JGT ? uval32 + 1 : uval32;
1447614476

14477-
false_reg->u32_max_value = min(false_reg->u32_max_value,
14477+
false_reg1->u32_max_value = min(false_reg1->u32_max_value,
1447814478
false_umax);
14479-
true_reg->u32_min_value = max(true_reg->u32_min_value,
14479+
true_reg1->u32_min_value = max(true_reg1->u32_min_value,
1448014480
true_umin);
1448114481
} else {
1448214482
u64 false_umax = opcode == BPF_JGT ? uval : uval - 1;
1448314483
u64 true_umin = opcode == BPF_JGT ? uval + 1 : uval;
1448414484

14485-
false_reg->umax_value = min(false_reg->umax_value, false_umax);
14486-
true_reg->umin_value = max(true_reg->umin_value, true_umin);
14485+
false_reg1->umax_value = min(false_reg1->umax_value, false_umax);
14486+
true_reg1->umin_value = max(true_reg1->umin_value, true_umin);
1448714487
}
1448814488
break;
1448914489
}
@@ -14494,14 +14494,14 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg,
1449414494
s32 false_smax = opcode == BPF_JSGT ? sval32 : sval32 - 1;
1449514495
s32 true_smin = opcode == BPF_JSGT ? sval32 + 1 : sval32;
1449614496

14497-
false_reg->s32_max_value = min(false_reg->s32_max_value, false_smax);
14498-
true_reg->s32_min_value = max(true_reg->s32_min_value, true_smin);
14497+
false_reg1->s32_max_value = min(false_reg1->s32_max_value, false_smax);
14498+
true_reg1->s32_min_value = max(true_reg1->s32_min_value, true_smin);
1449914499
} else {
1450014500
s64 false_smax = opcode == BPF_JSGT ? sval : sval - 1;
1450114501
s64 true_smin = opcode == BPF_JSGT ? sval + 1 : sval;
1450214502

14503-
false_reg->smax_value = min(false_reg->smax_value, false_smax);
14504-
true_reg->smin_value = max(true_reg->smin_value, true_smin);
14503+
false_reg1->smax_value = min(false_reg1->smax_value, false_smax);
14504+
true_reg1->smin_value = max(true_reg1->smin_value, true_smin);
1450514505
}
1450614506
break;
1450714507
}
@@ -14512,16 +14512,16 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg,
1451214512
u32 false_umin = opcode == BPF_JLT ? uval32 : uval32 + 1;
1451314513
u32 true_umax = opcode == BPF_JLT ? uval32 - 1 : uval32;
1451414514

14515-
false_reg->u32_min_value = max(false_reg->u32_min_value,
14515+
false_reg1->u32_min_value = max(false_reg1->u32_min_value,
1451614516
false_umin);
14517-
true_reg->u32_max_value = min(true_reg->u32_max_value,
14517+
true_reg1->u32_max_value = min(true_reg1->u32_max_value,
1451814518
true_umax);
1451914519
} else {
1452014520
u64 false_umin = opcode == BPF_JLT ? uval : uval + 1;
1452114521
u64 true_umax = opcode == BPF_JLT ? uval - 1 : uval;
1452214522

14523-
false_reg->umin_value = max(false_reg->umin_value, false_umin);
14524-
true_reg->umax_value = min(true_reg->umax_value, true_umax);
14523+
false_reg1->umin_value = max(false_reg1->umin_value, false_umin);
14524+
true_reg1->umax_value = min(true_reg1->umax_value, true_umax);
1452514525
}
1452614526
break;
1452714527
}
@@ -14532,14 +14532,14 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg,
1453214532
s32 false_smin = opcode == BPF_JSLT ? sval32 : sval32 + 1;
1453314533
s32 true_smax = opcode == BPF_JSLT ? sval32 - 1 : sval32;
1453414534

14535-
false_reg->s32_min_value = max(false_reg->s32_min_value, false_smin);
14536-
true_reg->s32_max_value = min(true_reg->s32_max_value, true_smax);
14535+
false_reg1->s32_min_value = max(false_reg1->s32_min_value, false_smin);
14536+
true_reg1->s32_max_value = min(true_reg1->s32_max_value, true_smax);
1453714537
} else {
1453814538
s64 false_smin = opcode == BPF_JSLT ? sval : sval + 1;
1453914539
s64 true_smax = opcode == BPF_JSLT ? sval - 1 : sval;
1454014540

14541-
false_reg->smin_value = max(false_reg->smin_value, false_smin);
14542-
true_reg->smax_value = min(true_reg->smax_value, true_smax);
14541+
false_reg1->smin_value = max(false_reg1->smin_value, false_smin);
14542+
true_reg1->smax_value = min(true_reg1->smax_value, true_smax);
1454314543
}
1454414544
break;
1454514545
}
@@ -14548,17 +14548,17 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg,
1454814548
}
1454914549

1455014550
if (is_jmp32) {
14551-
false_reg->var_off = tnum_or(tnum_clear_subreg(false_64off),
14551+
false_reg1->var_off = tnum_or(tnum_clear_subreg(false_64off),
1455214552
tnum_subreg(false_32off));
14553-
true_reg->var_off = tnum_or(tnum_clear_subreg(true_64off),
14553+
true_reg1->var_off = tnum_or(tnum_clear_subreg(true_64off),
1455414554
tnum_subreg(true_32off));
14555-
reg_bounds_sync(false_reg);
14556-
reg_bounds_sync(true_reg);
14555+
reg_bounds_sync(false_reg1);
14556+
reg_bounds_sync(true_reg1);
1455714557
} else {
14558-
false_reg->var_off = false_64off;
14559-
true_reg->var_off = true_64off;
14560-
reg_bounds_sync(false_reg);
14561-
reg_bounds_sync(true_reg);
14558+
false_reg1->var_off = false_64off;
14559+
true_reg1->var_off = true_64off;
14560+
reg_bounds_sync(false_reg1);
14561+
reg_bounds_sync(true_reg1);
1456214562
}
1456314563
}
1456414564

0 commit comments

Comments
 (0)