未验证 提交 46f89419 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!348 Backport CVEs and fs bugfixes

Merge Pull Request from: @zhangjialin11 
 
Pull new CVEs:
CVE-2022-4662
CVE-2022-3424
CVE-2022-47946

fs bugfixes from Long Li and Baokun Li:
xfs: fix use-after-free in xattr node block inactivation
ext4: fix bad checksum after online resize 
 
Link:https://gitee.com/openeuler/kernel/pulls/348 
Reviewed-by: Zheng Zengkai <zhengzengkai@huawei.com> 
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com> 
...@@ -648,6 +648,7 @@ int gru_handle_user_call_os(unsigned long cb) ...@@ -648,6 +648,7 @@ int gru_handle_user_call_os(unsigned long cb)
if ((cb & (GRU_HANDLE_STRIDE - 1)) || ucbnum >= GRU_NUM_CB) if ((cb & (GRU_HANDLE_STRIDE - 1)) || ucbnum >= GRU_NUM_CB)
return -EINVAL; return -EINVAL;
again:
gts = gru_find_lock_gts(cb); gts = gru_find_lock_gts(cb);
if (!gts) if (!gts)
return -EINVAL; return -EINVAL;
...@@ -656,7 +657,11 @@ int gru_handle_user_call_os(unsigned long cb) ...@@ -656,7 +657,11 @@ int gru_handle_user_call_os(unsigned long cb)
if (ucbnum >= gts->ts_cbr_au_count * GRU_CBR_AU_SIZE) if (ucbnum >= gts->ts_cbr_au_count * GRU_CBR_AU_SIZE)
goto exit; goto exit;
gru_check_context_placement(gts); if (gru_check_context_placement(gts)) {
gru_unlock_gts(gts);
gru_unload_context(gts, 1);
goto again;
}
/* /*
* CCH may contain stale data if ts_force_cch_reload is set. * CCH may contain stale data if ts_force_cch_reload is set.
...@@ -874,7 +879,11 @@ int gru_set_context_option(unsigned long arg) ...@@ -874,7 +879,11 @@ int gru_set_context_option(unsigned long arg)
} else { } else {
gts->ts_user_blade_id = req.val1; gts->ts_user_blade_id = req.val1;
gts->ts_user_chiplet_id = req.val0; gts->ts_user_chiplet_id = req.val0;
gru_check_context_placement(gts); if (gru_check_context_placement(gts)) {
gru_unlock_gts(gts);
gru_unload_context(gts, 1);
return ret;
}
} }
break; break;
case sco_gseg_owner: case sco_gseg_owner:
......
...@@ -716,9 +716,10 @@ static int gru_check_chiplet_assignment(struct gru_state *gru, ...@@ -716,9 +716,10 @@ static int gru_check_chiplet_assignment(struct gru_state *gru,
* chiplet. Misassignment can occur if the process migrates to a different * chiplet. Misassignment can occur if the process migrates to a different
* blade or if the user changes the selected blade/chiplet. * blade or if the user changes the selected blade/chiplet.
*/ */
void gru_check_context_placement(struct gru_thread_state *gts) int gru_check_context_placement(struct gru_thread_state *gts)
{ {
struct gru_state *gru; struct gru_state *gru;
int ret = 0;
/* /*
* If the current task is the context owner, verify that the * If the current task is the context owner, verify that the
...@@ -726,15 +727,23 @@ void gru_check_context_placement(struct gru_thread_state *gts) ...@@ -726,15 +727,23 @@ void gru_check_context_placement(struct gru_thread_state *gts)
* references. Pthread apps use non-owner references to the CBRs. * references. Pthread apps use non-owner references to the CBRs.
*/ */
gru = gts->ts_gru; gru = gts->ts_gru;
/*
* If gru or gts->ts_tgid_owner isn't initialized properly, return
* success to indicate that the caller does not need to unload the
* gru context.The caller is responsible for their inspection and
* reinitialization if needed.
*/
if (!gru || gts->ts_tgid_owner != current->tgid) if (!gru || gts->ts_tgid_owner != current->tgid)
return; return ret;
if (!gru_check_chiplet_assignment(gru, gts)) { if (!gru_check_chiplet_assignment(gru, gts)) {
STAT(check_context_unload); STAT(check_context_unload);
gru_unload_context(gts, 1); ret = -EINVAL;
} else if (gru_retarget_intr(gts)) { } else if (gru_retarget_intr(gts)) {
STAT(check_context_retarget_intr); STAT(check_context_retarget_intr);
} }
return ret;
} }
...@@ -934,7 +943,12 @@ vm_fault_t gru_fault(struct vm_fault *vmf) ...@@ -934,7 +943,12 @@ vm_fault_t gru_fault(struct vm_fault *vmf)
mutex_lock(&gts->ts_ctxlock); mutex_lock(&gts->ts_ctxlock);
preempt_disable(); preempt_disable();
gru_check_context_placement(gts); if (gru_check_context_placement(gts)) {
preempt_enable();
mutex_unlock(&gts->ts_ctxlock);
gru_unload_context(gts, 1);
return VM_FAULT_NOPAGE;
}
if (!gts->ts_gru) { if (!gts->ts_gru) {
STAT(load_user_context); STAT(load_user_context);
......
...@@ -637,7 +637,7 @@ extern int gru_user_flush_tlb(unsigned long arg); ...@@ -637,7 +637,7 @@ extern int gru_user_flush_tlb(unsigned long arg);
extern int gru_user_unload_context(unsigned long arg); extern int gru_user_unload_context(unsigned long arg);
extern int gru_get_exception_detail(unsigned long arg); extern int gru_get_exception_detail(unsigned long arg);
extern int gru_set_context_option(unsigned long address); extern int gru_set_context_option(unsigned long address);
extern void gru_check_context_placement(struct gru_thread_state *gts); extern int gru_check_context_placement(struct gru_thread_state *gts);
extern int gru_cpu_fault_map_id(void); extern int gru_cpu_fault_map_id(void);
extern struct vm_area_struct *gru_find_vma(unsigned long vaddr); extern struct vm_area_struct *gru_find_vma(unsigned long vaddr);
extern void gru_flush_all_tlb(struct gru_state *gru); extern void gru_flush_all_tlb(struct gru_state *gru);
......
...@@ -5967,6 +5967,11 @@ static int usb_reset_and_verify_device(struct usb_device *udev) ...@@ -5967,6 +5967,11 @@ static int usb_reset_and_verify_device(struct usb_device *udev)
* the reset is over (using their post_reset method). * the reset is over (using their post_reset method).
* *
* Return: The same as for usb_reset_and_verify_device(). * Return: The same as for usb_reset_and_verify_device().
* However, if a reset is already in progress (for instance, if a
* driver doesn't have pre_reset() or post_reset() callbacks, and while
* being unbound or re-bound during the ongoing reset its disconnect()
* or probe() routine tries to perform a second, nested reset), the
* routine returns -EINPROGRESS.
* *
* Note: * Note:
* The caller must own the device lock. For example, it's safe to use * The caller must own the device lock. For example, it's safe to use
...@@ -6000,6 +6005,10 @@ int usb_reset_device(struct usb_device *udev) ...@@ -6000,6 +6005,10 @@ int usb_reset_device(struct usb_device *udev)
return -EISDIR; return -EISDIR;
} }
if (udev->reset_in_progress)
return -EINPROGRESS;
udev->reset_in_progress = 1;
port_dev = hub->ports[udev->portnum - 1]; port_dev = hub->ports[udev->portnum - 1];
/* /*
...@@ -6064,6 +6073,7 @@ int usb_reset_device(struct usb_device *udev) ...@@ -6064,6 +6073,7 @@ int usb_reset_device(struct usb_device *udev)
usb_autosuspend_device(udev); usb_autosuspend_device(udev);
memalloc_noio_restore(noio_flag); memalloc_noio_restore(noio_flag);
udev->reset_in_progress = 0;
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(usb_reset_device); EXPORT_SYMBOL_GPL(usb_reset_device);
......
...@@ -1440,8 +1440,6 @@ static void ext4_update_super(struct super_block *sb, ...@@ -1440,8 +1440,6 @@ static void ext4_update_super(struct super_block *sb,
* active. */ * active. */
ext4_r_blocks_count_set(es, ext4_r_blocks_count(es) + ext4_r_blocks_count_set(es, ext4_r_blocks_count(es) +
reserved_blocks); reserved_blocks);
ext4_superblock_csum_set(sb);
unlock_buffer(sbi->s_sbh);
/* Update the free space counts */ /* Update the free space counts */
percpu_counter_add(&sbi->s_freeclusters_counter, percpu_counter_add(&sbi->s_freeclusters_counter,
...@@ -1469,6 +1467,8 @@ static void ext4_update_super(struct super_block *sb, ...@@ -1469,6 +1467,8 @@ static void ext4_update_super(struct super_block *sb,
ext4_calculate_overhead(sb); ext4_calculate_overhead(sb);
es->s_overhead_clusters = cpu_to_le32(sbi->s_overhead); es->s_overhead_clusters = cpu_to_le32(sbi->s_overhead);
ext4_superblock_csum_set(sb);
unlock_buffer(sbi->s_sbh);
if (test_opt(sb, DEBUG)) if (test_opt(sb, DEBUG))
printk(KERN_DEBUG "EXT4-fs: added group %u:" printk(KERN_DEBUG "EXT4-fs: added group %u:"
"%llu blocks(%llu free %llu reserved)\n", flex_gd->count, "%llu blocks(%llu free %llu reserved)\n", flex_gd->count,
......
...@@ -9073,7 +9073,7 @@ static int io_sqpoll_wait_sq(struct io_ring_ctx *ctx) ...@@ -9073,7 +9073,7 @@ static int io_sqpoll_wait_sq(struct io_ring_ctx *ctx)
if (unlikely(ctx->sqo_dead)) { if (unlikely(ctx->sqo_dead)) {
ret = -EOWNERDEAD; ret = -EOWNERDEAD;
goto out; break;
} }
if (!io_sqring_full(ctx)) if (!io_sqring_full(ctx))
...@@ -9083,7 +9083,6 @@ static int io_sqpoll_wait_sq(struct io_ring_ctx *ctx) ...@@ -9083,7 +9083,6 @@ static int io_sqpoll_wait_sq(struct io_ring_ctx *ctx)
} while (!signal_pending(current)); } while (!signal_pending(current));
finish_wait(&ctx->sqo_sq_wait, &wait); finish_wait(&ctx->sqo_sq_wait, &wait);
out:
return ret; return ret;
} }
......
...@@ -158,6 +158,7 @@ xfs_attr3_node_inactive( ...@@ -158,6 +158,7 @@ xfs_attr3_node_inactive(
} }
child_fsb = be32_to_cpu(ichdr.btree[0].before); child_fsb = be32_to_cpu(ichdr.btree[0].before);
xfs_trans_brelse(*trans, bp); /* no locks for later trans */ xfs_trans_brelse(*trans, bp); /* no locks for later trans */
bp = NULL;
/* /*
* If this is the node level just above the leaves, simply loop * If this is the node level just above the leaves, simply loop
...@@ -211,12 +212,8 @@ xfs_attr3_node_inactive( ...@@ -211,12 +212,8 @@ xfs_attr3_node_inactive(
&child_bp); &child_bp);
if (error) if (error)
return error; return error;
error = bp->b_error;
if (error) {
xfs_trans_brelse(*trans, child_bp);
return error;
}
xfs_trans_binval(*trans, child_bp); xfs_trans_binval(*trans, child_bp);
child_bp = NULL;
/* /*
* If we're not done, re-read the parent to get the next * If we're not done, re-read the parent to get the next
...@@ -233,6 +230,7 @@ xfs_attr3_node_inactive( ...@@ -233,6 +230,7 @@ xfs_attr3_node_inactive(
bp->b_addr); bp->b_addr);
child_fsb = be32_to_cpu(phdr.btree[i + 1].before); child_fsb = be32_to_cpu(phdr.btree[i + 1].before);
xfs_trans_brelse(*trans, bp); xfs_trans_brelse(*trans, bp);
bp = NULL;
} }
/* /*
* Atomically commit the whole invalidate stuff. * Atomically commit the whole invalidate stuff.
......
...@@ -580,6 +580,7 @@ struct usb3_lpm_parameters { ...@@ -580,6 +580,7 @@ struct usb3_lpm_parameters {
* @devaddr: device address, XHCI: assigned by HW, others: same as devnum * @devaddr: device address, XHCI: assigned by HW, others: same as devnum
* @can_submit: URBs may be submitted * @can_submit: URBs may be submitted
* @persist_enabled: USB_PERSIST enabled for this device * @persist_enabled: USB_PERSIST enabled for this device
* @reset_in_progress: the device is being reset
* @have_langid: whether string_langid is valid * @have_langid: whether string_langid is valid
* @authorized: policy has said we can use it; * @authorized: policy has said we can use it;
* (user space) policy determines if we authorize this device to be * (user space) policy determines if we authorize this device to be
...@@ -665,6 +666,7 @@ struct usb_device { ...@@ -665,6 +666,7 @@ struct usb_device {
unsigned can_submit:1; unsigned can_submit:1;
unsigned persist_enabled:1; unsigned persist_enabled:1;
unsigned reset_in_progress:1;
unsigned have_langid:1; unsigned have_langid:1;
unsigned authorized:1; unsigned authorized:1;
unsigned authenticated:1; unsigned authenticated:1;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册