You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
treewide: Change list_sort to use const pointers
[ Upstream commit 4f0f586bf0 ]
list_sort() internally casts the comparison function passed to it
to a different type with constant struct list_head pointers, and
uses this pointer to call the functions, which trips indirect call
Control-Flow Integrity (CFI) checking.
Instead of removing the consts, this change defines the
list_cmp_func_t type and changes the comparison function types of
all list_sort() callers to use const pointers, thus avoiding type
mismatches.
Suggested-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Kees Cook <keescook@chromium.org>
Tested-by: Nick Desaulniers <ndesaulniers@google.com>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20210408182843.1754385-10-samitolvanen@google.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
419fab1cb0
commit
55e6f8b3c0
@@ -2190,8 +2190,8 @@ static int vgic_its_restore_ite(struct vgic_its *its, u32 event_id,
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int vgic_its_ite_cmp(void *priv, struct list_head *a,
|
||||
struct list_head *b)
|
||||
static int vgic_its_ite_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct its_ite *itea = container_of(a, struct its_ite, ite_list);
|
||||
struct its_ite *iteb = container_of(b, struct its_ite, ite_list);
|
||||
@@ -2329,8 +2329,8 @@ static int vgic_its_restore_dte(struct vgic_its *its, u32 id,
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int vgic_its_device_cmp(void *priv, struct list_head *a,
|
||||
struct list_head *b)
|
||||
static int vgic_its_device_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct its_device *deva = container_of(a, struct its_device, dev_list);
|
||||
struct its_device *devb = container_of(b, struct its_device, dev_list);
|
||||
|
||||
@@ -255,7 +255,8 @@ static struct kvm_vcpu *vgic_target_oracle(struct vgic_irq *irq)
|
||||
* Return negative if "a" sorts before "b", 0 to preserve order, and positive
|
||||
* to sort "b" before "a".
|
||||
*/
|
||||
static int vgic_irq_cmp(void *priv, struct list_head *a, struct list_head *b)
|
||||
static int vgic_irq_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct vgic_irq *irqa = container_of(a, struct vgic_irq, ap_list);
|
||||
struct vgic_irq *irqb = container_of(b, struct vgic_irq, ap_list);
|
||||
|
||||
@@ -75,7 +75,8 @@ void blk_mq_sched_restart(struct blk_mq_hw_ctx *hctx)
|
||||
blk_mq_run_hw_queue(hctx, true);
|
||||
}
|
||||
|
||||
static int sched_rq_cmp(void *priv, struct list_head *a, struct list_head *b)
|
||||
static int sched_rq_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct request *rqa = container_of(a, struct request, queuelist);
|
||||
struct request *rqb = container_of(b, struct request, queuelist);
|
||||
|
||||
@@ -1866,7 +1866,8 @@ void blk_mq_insert_requests(struct blk_mq_hw_ctx *hctx, struct blk_mq_ctx *ctx,
|
||||
spin_unlock(&ctx->lock);
|
||||
}
|
||||
|
||||
static int plug_rq_cmp(void *priv, struct list_head *a, struct list_head *b)
|
||||
static int plug_rq_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct request *rqa = container_of(a, struct request, queuelist);
|
||||
struct request *rqb = container_of(b, struct request, queuelist);
|
||||
|
||||
@@ -1194,7 +1194,8 @@ static int __nfit_mem_init(struct acpi_nfit_desc *acpi_desc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nfit_mem_cmp(void *priv, struct list_head *_a, struct list_head *_b)
|
||||
static int nfit_mem_cmp(void *priv, const struct list_head *_a,
|
||||
const struct list_head *_b)
|
||||
{
|
||||
struct nfit_mem *a = container_of(_a, typeof(*a), list);
|
||||
struct nfit_mem *b = container_of(_b, typeof(*b), list);
|
||||
|
||||
@@ -558,7 +558,8 @@ static bool hmat_update_best(u8 type, u32 value, u32 *best)
|
||||
return updated;
|
||||
}
|
||||
|
||||
static int initiator_cmp(void *priv, struct list_head *a, struct list_head *b)
|
||||
static int initiator_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct memory_initiator *ia;
|
||||
struct memory_initiator *ib;
|
||||
|
||||
@@ -503,8 +503,8 @@ static int ti_sci_scan_clocks_from_fw(struct sci_clk_provider *provider)
|
||||
|
||||
#else
|
||||
|
||||
static int _cmp_sci_clk_list(void *priv, struct list_head *a,
|
||||
struct list_head *b)
|
||||
static int _cmp_sci_clk_list(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct sci_clk *ca = container_of(a, struct sci_clk, node);
|
||||
struct sci_clk *cb = container_of(b, struct sci_clk, node);
|
||||
|
||||
@@ -1290,7 +1290,8 @@ EXPORT_SYMBOL(drm_mode_prune_invalid);
|
||||
* Negative if @lh_a is better than @lh_b, zero if they're equivalent, or
|
||||
* positive if @lh_b is better than @lh_a.
|
||||
*/
|
||||
static int drm_mode_compare(void *priv, struct list_head *lh_a, struct list_head *lh_b)
|
||||
static int drm_mode_compare(void *priv, const struct list_head *lh_a,
|
||||
const struct list_head *lh_b)
|
||||
{
|
||||
struct drm_display_mode *a = list_entry(lh_a, struct drm_display_mode, head);
|
||||
struct drm_display_mode *b = list_entry(lh_b, struct drm_display_mode, head);
|
||||
|
||||
@@ -49,7 +49,8 @@ static const u8 uabi_classes[] = {
|
||||
[VIDEO_ENHANCEMENT_CLASS] = I915_ENGINE_CLASS_VIDEO_ENHANCE,
|
||||
};
|
||||
|
||||
static int engine_cmp(void *priv, struct list_head *A, struct list_head *B)
|
||||
static int engine_cmp(void *priv, const struct list_head *A,
|
||||
const struct list_head *B)
|
||||
{
|
||||
const struct intel_engine_cs *a =
|
||||
container_of((struct rb_node *)A, typeof(*a), uabi_node);
|
||||
|
||||
@@ -41,7 +41,7 @@ struct diff_mmio {
|
||||
|
||||
/* Compare two diff_mmio items. */
|
||||
static int mmio_offset_compare(void *priv,
|
||||
struct list_head *a, struct list_head *b)
|
||||
const struct list_head *a, const struct list_head *b)
|
||||
{
|
||||
struct diff_mmio *ma;
|
||||
struct diff_mmio *mb;
|
||||
|
||||
@@ -1075,7 +1075,8 @@ static int igt_ppgtt_shrink_boom(void *arg)
|
||||
return exercise_ppgtt(arg, shrink_boom);
|
||||
}
|
||||
|
||||
static int sort_holes(void *priv, struct list_head *A, struct list_head *B)
|
||||
static int sort_holes(void *priv, const struct list_head *A,
|
||||
const struct list_head *B)
|
||||
{
|
||||
struct drm_mm_node *a = list_entry(A, typeof(*a), hole_stack);
|
||||
struct drm_mm_node *b = list_entry(B, typeof(*b), hole_stack);
|
||||
|
||||
@@ -394,8 +394,8 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cmp_size_smaller_first(void *priv, struct list_head *a,
|
||||
struct list_head *b)
|
||||
static int cmp_size_smaller_first(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct radeon_bo_list *la = list_entry(a, struct radeon_bo_list, tv.head);
|
||||
struct radeon_bo_list *lb = list_entry(b, struct radeon_bo_list, tv.head);
|
||||
|
||||
@@ -83,7 +83,8 @@ usnic_uiom_interval_node_alloc(long int start, long int last, int ref_cnt,
|
||||
return interval;
|
||||
}
|
||||
|
||||
static int interval_cmp(void *priv, struct list_head *a, struct list_head *b)
|
||||
static int interval_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct usnic_uiom_interval_node *node_a, *node_b;
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ struct bcm_voter {
|
||||
u32 tcs_wait;
|
||||
};
|
||||
|
||||
static int cmp_vcd(void *priv, struct list_head *a, struct list_head *b)
|
||||
static int cmp_vcd(void *priv, const struct list_head *a, const struct list_head *b)
|
||||
{
|
||||
const struct qcom_icc_bcm *bcm_a =
|
||||
list_entry(a, struct qcom_icc_bcm, list);
|
||||
|
||||
@@ -953,7 +953,8 @@ static void dispatch_bio_list(struct bio_list *tmp)
|
||||
submit_bio_noacct(bio);
|
||||
}
|
||||
|
||||
static int cmp_stripe(void *priv, struct list_head *a, struct list_head *b)
|
||||
static int cmp_stripe(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
const struct r5pending_data *da = list_entry(a,
|
||||
struct r5pending_data, sibling);
|
||||
|
||||
@@ -144,8 +144,8 @@ static void sram_free_partitions(struct sram_dev *sram)
|
||||
}
|
||||
}
|
||||
|
||||
static int sram_reserve_cmp(void *priv, struct list_head *a,
|
||||
struct list_head *b)
|
||||
static int sram_reserve_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct sram_reserve *ra = list_entry(a, struct sram_reserve, list);
|
||||
struct sram_reserve *rb = list_entry(b, struct sram_reserve, list);
|
||||
|
||||
@@ -3801,7 +3801,8 @@ out_unlock:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ns_cmp(void *priv, struct list_head *a, struct list_head *b)
|
||||
static int ns_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct nvme_ns *nsa = container_of(a, struct nvme_ns, list);
|
||||
struct nvme_ns *nsb = container_of(b, struct nvme_ns, list);
|
||||
|
||||
@@ -345,7 +345,8 @@ static int cdns_pcie_host_bar_config(struct cdns_pcie_rc *rc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cdns_pcie_host_dma_ranges_cmp(void *priv, struct list_head *a, struct list_head *b)
|
||||
static int cdns_pcie_host_dma_ranges_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct resource_entry *entry1, *entry2;
|
||||
|
||||
|
||||
@@ -454,7 +454,8 @@ struct rx_ranges {
|
||||
u8 *end;
|
||||
};
|
||||
|
||||
static int rx_ranges_cmp(void *priv, struct list_head *a, struct list_head *b)
|
||||
static int rx_ranges_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct rx_ranges *rx_a = list_entry(a, struct rx_ranges, list);
|
||||
struct rx_ranges *rx_b = list_entry(b, struct rx_ranges, list);
|
||||
|
||||
@@ -1646,7 +1646,8 @@ struct btrfs_plug_cb {
|
||||
/*
|
||||
* rbios on the plug list are sorted for easier merging.
|
||||
*/
|
||||
static int plug_cmp(void *priv, struct list_head *a, struct list_head *b)
|
||||
static int plug_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct btrfs_raid_bio *ra = container_of(a, struct btrfs_raid_bio,
|
||||
plug_list);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user