633 lines
21 KiB
Diff
633 lines
21 KiB
Diff
|
diff --git a/Makefile b/Makefile
|
||
|
index b919a66788b5..67c9106594be 100644
|
||
|
--- a/Makefile
|
||
|
+++ b/Makefile
|
||
|
@@ -1,6 +1,6 @@
|
||
|
VERSION = 4
|
||
|
PATCHLEVEL = 9
|
||
|
-SUBLEVEL = 221
|
||
|
+SUBLEVEL = 222
|
||
|
EXTRAVERSION =
|
||
|
NAME = Roaring Lionus
|
||
|
|
||
|
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
|
||
|
index c76e4527620c..245bcdb44c64 100644
|
||
|
--- a/drivers/acpi/device_pm.c
|
||
|
+++ b/drivers/acpi/device_pm.c
|
||
|
@@ -226,13 +226,13 @@ int acpi_device_set_power(struct acpi_device *device, int state)
|
||
|
end:
|
||
|
if (result) {
|
||
|
dev_warn(&device->dev, "Failed to change power state to %s\n",
|
||
|
- acpi_power_state_string(state));
|
||
|
+ acpi_power_state_string(target_state));
|
||
|
} else {
|
||
|
device->power.state = target_state;
|
||
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||
|
"Device [%s] transitioned to %s\n",
|
||
|
device->pnp.bus_id,
|
||
|
- acpi_power_state_string(state)));
|
||
|
+ acpi_power_state_string(target_state)));
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c
|
||
|
index 7dd46cf5ed84..7a028b57a7ef 100644
|
||
|
--- a/drivers/dma/dmatest.c
|
||
|
+++ b/drivers/dma/dmatest.c
|
||
|
@@ -505,8 +505,8 @@ static int dmatest_func(void *data)
|
||
|
flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT;
|
||
|
|
||
|
ktime = ktime_get();
|
||
|
- while (!kthread_should_stop()
|
||
|
- && !(params->iterations && total_tests >= params->iterations)) {
|
||
|
+ while (!(kthread_should_stop() ||
|
||
|
+ (params->iterations && total_tests >= params->iterations))) {
|
||
|
struct dma_async_tx_descriptor *tx = NULL;
|
||
|
struct dmaengine_unmap_data *um;
|
||
|
dma_addr_t srcs[src_cnt];
|
||
|
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
||
|
index a9bf02ea0a3b..5b5970f0e91d 100644
|
||
|
--- a/drivers/gpu/drm/drm_edid.c
|
||
|
+++ b/drivers/gpu/drm/drm_edid.c
|
||
|
@@ -3970,7 +3970,7 @@ static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *d
|
||
|
struct drm_display_mode *mode;
|
||
|
unsigned pixel_clock = (timings->pixel_clock[0] |
|
||
|
(timings->pixel_clock[1] << 8) |
|
||
|
- (timings->pixel_clock[2] << 16));
|
||
|
+ (timings->pixel_clock[2] << 16)) + 1;
|
||
|
unsigned hactive = (timings->hactive[0] | timings->hactive[1] << 8) + 1;
|
||
|
unsigned hblank = (timings->hblank[0] | timings->hblank[1] << 8) + 1;
|
||
|
unsigned hsync = (timings->hsync[0] | (timings->hsync[1] & 0x7f) << 8) + 1;
|
||
|
diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c
|
||
|
index 04270f5d110c..3e6fd393da15 100644
|
||
|
--- a/drivers/gpu/drm/qxl/qxl_cmd.c
|
||
|
+++ b/drivers/gpu/drm/qxl/qxl_cmd.c
|
||
|
@@ -500,9 +500,10 @@ int qxl_hw_surface_alloc(struct qxl_device *qdev,
|
||
|
return ret;
|
||
|
|
||
|
ret = qxl_release_reserve_list(release, true);
|
||
|
- if (ret)
|
||
|
+ if (ret) {
|
||
|
+ qxl_release_free(qdev, release);
|
||
|
return ret;
|
||
|
-
|
||
|
+ }
|
||
|
cmd = (struct qxl_surface_cmd *)qxl_release_map(qdev, release);
|
||
|
cmd->type = QXL_SURFACE_CMD_CREATE;
|
||
|
cmd->flags = QXL_SURF_FLAG_KEEP_DATA;
|
||
|
@@ -528,8 +529,8 @@ int qxl_hw_surface_alloc(struct qxl_device *qdev,
|
||
|
/* no need to add a release to the fence for this surface bo,
|
||
|
since it is only released when we ask to destroy the surface
|
||
|
and it would never signal otherwise */
|
||
|
- qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
|
||
|
qxl_release_fence_buffer_objects(release);
|
||
|
+ qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
|
||
|
|
||
|
surf->hw_surf_alloc = true;
|
||
|
spin_lock(&qdev->surf_id_idr_lock);
|
||
|
@@ -571,9 +572,8 @@ int qxl_hw_surface_dealloc(struct qxl_device *qdev,
|
||
|
cmd->surface_id = id;
|
||
|
qxl_release_unmap(qdev, release, &cmd->release_info);
|
||
|
|
||
|
- qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
|
||
|
-
|
||
|
qxl_release_fence_buffer_objects(release);
|
||
|
+ qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
|
||
|
index a61c0d460ec2..f8a1f84c8838 100644
|
||
|
--- a/drivers/gpu/drm/qxl/qxl_display.c
|
||
|
+++ b/drivers/gpu/drm/qxl/qxl_display.c
|
||
|
@@ -292,8 +292,8 @@ qxl_hide_cursor(struct qxl_device *qdev)
|
||
|
cmd->type = QXL_CURSOR_HIDE;
|
||
|
qxl_release_unmap(qdev, release, &cmd->release_info);
|
||
|
|
||
|
- qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
|
||
|
qxl_release_fence_buffer_objects(release);
|
||
|
+ qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@@ -333,8 +333,8 @@ static int qxl_crtc_apply_cursor(struct drm_crtc *crtc)
|
||
|
cmd->u.set.visible = 1;
|
||
|
qxl_release_unmap(qdev, release, &cmd->release_info);
|
||
|
|
||
|
- qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
|
||
|
qxl_release_fence_buffer_objects(release);
|
||
|
+ qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
|
||
|
|
||
|
return ret;
|
||
|
|
||
|
@@ -436,8 +436,8 @@ static int qxl_crtc_cursor_set2(struct drm_crtc *crtc,
|
||
|
cmd->u.set.visible = 1;
|
||
|
qxl_release_unmap(qdev, release, &cmd->release_info);
|
||
|
|
||
|
- qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
|
||
|
qxl_release_fence_buffer_objects(release);
|
||
|
+ qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
|
||
|
|
||
|
/* finish with the userspace bo */
|
||
|
ret = qxl_bo_reserve(user_bo, false);
|
||
|
@@ -497,8 +497,8 @@ static int qxl_crtc_cursor_move(struct drm_crtc *crtc,
|
||
|
cmd->u.position.y = qcrtc->cur_y + qcrtc->hot_spot_y;
|
||
|
qxl_release_unmap(qdev, release, &cmd->release_info);
|
||
|
|
||
|
- qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
|
||
|
qxl_release_fence_buffer_objects(release);
|
||
|
+ qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
diff --git a/drivers/gpu/drm/qxl/qxl_draw.c b/drivers/gpu/drm/qxl/qxl_draw.c
|
||
|
index 9b728edf1b49..d1407d162877 100644
|
||
|
--- a/drivers/gpu/drm/qxl/qxl_draw.c
|
||
|
+++ b/drivers/gpu/drm/qxl/qxl_draw.c
|
||
|
@@ -241,8 +241,8 @@ void qxl_draw_opaque_fb(const struct qxl_fb_image *qxl_fb_image,
|
||
|
qxl_bo_physical_address(qdev, dimage->bo, 0);
|
||
|
qxl_release_unmap(qdev, release, &drawable->release_info);
|
||
|
|
||
|
- qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false);
|
||
|
qxl_release_fence_buffer_objects(release);
|
||
|
+ qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false);
|
||
|
|
||
|
out_free_palette:
|
||
|
if (palette_bo)
|
||
|
@@ -348,9 +348,10 @@ void qxl_draw_dirty_fb(struct qxl_device *qdev,
|
||
|
goto out_release_backoff;
|
||
|
|
||
|
rects = drawable_set_clipping(qdev, num_clips, clips_bo);
|
||
|
- if (!rects)
|
||
|
+ if (!rects) {
|
||
|
+ ret = -EINVAL;
|
||
|
goto out_release_backoff;
|
||
|
-
|
||
|
+ }
|
||
|
drawable = (struct qxl_drawable *)qxl_release_map(qdev, release);
|
||
|
|
||
|
drawable->clip.type = SPICE_CLIP_TYPE_RECTS;
|
||
|
@@ -381,8 +382,8 @@ void qxl_draw_dirty_fb(struct qxl_device *qdev,
|
||
|
}
|
||
|
qxl_bo_kunmap(clips_bo);
|
||
|
|
||
|
- qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false);
|
||
|
qxl_release_fence_buffer_objects(release);
|
||
|
+ qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false);
|
||
|
|
||
|
out_release_backoff:
|
||
|
if (ret)
|
||
|
@@ -432,8 +433,8 @@ void qxl_draw_copyarea(struct qxl_device *qdev,
|
||
|
drawable->u.copy_bits.src_pos.y = sy;
|
||
|
qxl_release_unmap(qdev, release, &drawable->release_info);
|
||
|
|
||
|
- qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false);
|
||
|
qxl_release_fence_buffer_objects(release);
|
||
|
+ qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false);
|
||
|
|
||
|
out_free_release:
|
||
|
if (ret)
|
||
|
@@ -476,8 +477,8 @@ void qxl_draw_fill(struct qxl_draw_fill *qxl_draw_fill_rec)
|
||
|
|
||
|
qxl_release_unmap(qdev, release, &drawable->release_info);
|
||
|
|
||
|
- qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false);
|
||
|
qxl_release_fence_buffer_objects(release);
|
||
|
+ qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false);
|
||
|
|
||
|
out_free_release:
|
||
|
if (ret)
|
||
|
diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c
|
||
|
index 5a4c8c492683..db0afb0613c9 100644
|
||
|
--- a/drivers/gpu/drm/qxl/qxl_ioctl.c
|
||
|
+++ b/drivers/gpu/drm/qxl/qxl_ioctl.c
|
||
|
@@ -256,11 +256,8 @@ static int qxl_process_single_command(struct qxl_device *qdev,
|
||
|
apply_surf_reloc(qdev, &reloc_info[i]);
|
||
|
}
|
||
|
|
||
|
+ qxl_release_fence_buffer_objects(release);
|
||
|
ret = qxl_push_command_ring_release(qdev, release, cmd->type, true);
|
||
|
- if (ret)
|
||
|
- qxl_release_backoff_reserve_list(release);
|
||
|
- else
|
||
|
- qxl_release_fence_buffer_objects(release);
|
||
|
|
||
|
out_free_bos:
|
||
|
out_free_release:
|
||
|
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
|
||
|
index adc46b809ef2..0555c939c948 100644
|
||
|
--- a/drivers/infiniband/hw/mlx4/main.c
|
||
|
+++ b/drivers/infiniband/hw/mlx4/main.c
|
||
|
@@ -1589,8 +1589,9 @@ static int __mlx4_ib_create_default_rules(
|
||
|
int i;
|
||
|
|
||
|
for (i = 0; i < ARRAY_SIZE(pdefault_rules->rules_create_list); i++) {
|
||
|
+ union ib_flow_spec ib_spec = {};
|
||
|
int ret;
|
||
|
- union ib_flow_spec ib_spec;
|
||
|
+
|
||
|
switch (pdefault_rules->rules_create_list[i]) {
|
||
|
case 0:
|
||
|
/* no rule */
|
||
|
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
|
||
|
index c113e46fdc3a..e6ae8d123984 100644
|
||
|
--- a/drivers/iommu/amd_iommu_init.c
|
||
|
+++ b/drivers/iommu/amd_iommu_init.c
|
||
|
@@ -2574,7 +2574,7 @@ static int __init parse_amd_iommu_intr(char *str)
|
||
|
{
|
||
|
for (; *str; ++str) {
|
||
|
if (strncmp(str, "legacy", 6) == 0) {
|
||
|
- amd_iommu_guest_ir = AMD_IOMMU_GUEST_IR_LEGACY;
|
||
|
+ amd_iommu_guest_ir = AMD_IOMMU_GUEST_IR_LEGACY_GA;
|
||
|
break;
|
||
|
}
|
||
|
if (strncmp(str, "vapic", 5) == 0) {
|
||
|
diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c
|
||
|
index 8f9957d31a3e..1640298d90fd 100644
|
||
|
--- a/drivers/md/dm-verity-fec.c
|
||
|
+++ b/drivers/md/dm-verity-fec.c
|
||
|
@@ -447,7 +447,7 @@ int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io,
|
||
|
fio->level++;
|
||
|
|
||
|
if (type == DM_VERITY_BLOCK_TYPE_METADATA)
|
||
|
- block += v->data_blocks;
|
||
|
+ block = block - v->hash_start + v->data_blocks;
|
||
|
|
||
|
/*
|
||
|
* For RS(M, N), the continuous FEC data is divided into blocks of N
|
||
|
diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
|
||
|
index 0d5b667c0e65..a9f58f3867f0 100644
|
||
|
--- a/drivers/vfio/vfio_iommu_type1.c
|
||
|
+++ b/drivers/vfio/vfio_iommu_type1.c
|
||
|
@@ -229,8 +229,8 @@ static int vaddr_get_pfn(unsigned long vaddr, int prot, unsigned long *pfn)
|
||
|
vma = find_vma_intersection(current->mm, vaddr, vaddr + 1);
|
||
|
|
||
|
if (vma && vma->vm_flags & VM_PFNMAP) {
|
||
|
- *pfn = ((vaddr - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
|
||
|
- if (is_invalid_reserved_pfn(*pfn))
|
||
|
+ if (!follow_pfn(vma, vaddr, pfn) &&
|
||
|
+ is_invalid_reserved_pfn(*pfn))
|
||
|
ret = 0;
|
||
|
}
|
||
|
|
||
|
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
|
||
|
index 538f378eea52..a83f353e4418 100644
|
||
|
--- a/fs/btrfs/extent-tree.c
|
||
|
+++ b/fs/btrfs/extent-tree.c
|
||
|
@@ -10645,7 +10645,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
|
||
|
path = btrfs_alloc_path();
|
||
|
if (!path) {
|
||
|
ret = -ENOMEM;
|
||
|
- goto out;
|
||
|
+ goto out_put_group;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
@@ -10684,7 +10684,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
|
||
|
ret = btrfs_orphan_add(trans, inode);
|
||
|
if (ret) {
|
||
|
btrfs_add_delayed_iput(inode);
|
||
|
- goto out;
|
||
|
+ goto out_put_group;
|
||
|
}
|
||
|
clear_nlink(inode);
|
||
|
/* One for the block groups ref */
|
||
|
@@ -10707,13 +10707,13 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
|
||
|
|
||
|
ret = btrfs_search_slot(trans, tree_root, &key, path, -1, 1);
|
||
|
if (ret < 0)
|
||
|
- goto out;
|
||
|
+ goto out_put_group;
|
||
|
if (ret > 0)
|
||
|
btrfs_release_path(path);
|
||
|
if (ret == 0) {
|
||
|
ret = btrfs_del_item(trans, tree_root, path);
|
||
|
if (ret)
|
||
|
- goto out;
|
||
|
+ goto out_put_group;
|
||
|
btrfs_release_path(path);
|
||
|
}
|
||
|
|
||
|
@@ -10871,9 +10871,9 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
|
||
|
|
||
|
ret = remove_block_group_free_space(trans, root->fs_info, block_group);
|
||
|
if (ret)
|
||
|
- goto out;
|
||
|
+ goto out_put_group;
|
||
|
|
||
|
- btrfs_put_block_group(block_group);
|
||
|
+ /* Once for the block groups rbtree */
|
||
|
btrfs_put_block_group(block_group);
|
||
|
|
||
|
ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
|
||
|
@@ -10883,6 +10883,10 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
|
||
|
goto out;
|
||
|
|
||
|
ret = btrfs_del_item(trans, root, path);
|
||
|
+
|
||
|
+out_put_group:
|
||
|
+ /* Once for the lookup reference */
|
||
|
+ btrfs_put_block_group(block_group);
|
||
|
out:
|
||
|
btrfs_free_path(path);
|
||
|
return ret;
|
||
|
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
|
||
|
index e049dc682e57..d8780e04aaf0 100644
|
||
|
--- a/fs/ext4/inode.c
|
||
|
+++ b/fs/ext4/inode.c
|
||
|
@@ -4494,7 +4494,7 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
|
||
|
gid_t i_gid;
|
||
|
projid_t i_projid;
|
||
|
|
||
|
- if (((flags & EXT4_IGET_NORMAL) &&
|
||
|
+ if ((!(flags & EXT4_IGET_SPECIAL) &&
|
||
|
(ino < EXT4_FIRST_INO(sb) && ino != EXT4_ROOT_INO)) ||
|
||
|
(ino < EXT4_ROOT_INO) ||
|
||
|
(ino > le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count))) {
|
||
|
diff --git a/fs/nfs/nfs3acl.c b/fs/nfs/nfs3acl.c
|
||
|
index 720d92f5abfb..6c378435fa29 100644
|
||
|
--- a/fs/nfs/nfs3acl.c
|
||
|
+++ b/fs/nfs/nfs3acl.c
|
||
|
@@ -252,37 +252,45 @@ int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,
|
||
|
|
||
|
int nfs3_set_acl(struct inode *inode, struct posix_acl *acl, int type)
|
||
|
{
|
||
|
- struct posix_acl *alloc = NULL, *dfacl = NULL;
|
||
|
+ struct posix_acl *orig = acl, *dfacl = NULL, *alloc;
|
||
|
int status;
|
||
|
|
||
|
if (S_ISDIR(inode->i_mode)) {
|
||
|
switch(type) {
|
||
|
case ACL_TYPE_ACCESS:
|
||
|
- alloc = dfacl = get_acl(inode, ACL_TYPE_DEFAULT);
|
||
|
+ alloc = get_acl(inode, ACL_TYPE_DEFAULT);
|
||
|
if (IS_ERR(alloc))
|
||
|
goto fail;
|
||
|
+ dfacl = alloc;
|
||
|
break;
|
||
|
|
||
|
case ACL_TYPE_DEFAULT:
|
||
|
- dfacl = acl;
|
||
|
- alloc = acl = get_acl(inode, ACL_TYPE_ACCESS);
|
||
|
+ alloc = get_acl(inode, ACL_TYPE_ACCESS);
|
||
|
if (IS_ERR(alloc))
|
||
|
goto fail;
|
||
|
+ dfacl = acl;
|
||
|
+ acl = alloc;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (acl == NULL) {
|
||
|
- alloc = acl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
|
||
|
+ alloc = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
|
||
|
if (IS_ERR(alloc))
|
||
|
goto fail;
|
||
|
+ acl = alloc;
|
||
|
}
|
||
|
status = __nfs3_proc_setacls(inode, acl, dfacl);
|
||
|
- posix_acl_release(alloc);
|
||
|
+out:
|
||
|
+ if (acl != orig)
|
||
|
+ posix_acl_release(acl);
|
||
|
+ if (dfacl != orig)
|
||
|
+ posix_acl_release(dfacl);
|
||
|
return status;
|
||
|
|
||
|
fail:
|
||
|
- return PTR_ERR(alloc);
|
||
|
+ status = PTR_ERR(alloc);
|
||
|
+ goto out;
|
||
|
}
|
||
|
|
||
|
const struct xattr_handler *nfs3_xattr_handlers[] = {
|
||
|
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
|
||
|
index 81695a492ebe..3c775d6b7317 100644
|
||
|
--- a/kernel/power/hibernate.c
|
||
|
+++ b/kernel/power/hibernate.c
|
||
|
@@ -892,6 +892,13 @@ static int software_resume(void)
|
||
|
error = freeze_processes();
|
||
|
if (error)
|
||
|
goto Close_Finish;
|
||
|
+
|
||
|
+ error = freeze_kernel_threads();
|
||
|
+ if (error) {
|
||
|
+ thaw_processes();
|
||
|
+ goto Close_Finish;
|
||
|
+ }
|
||
|
+
|
||
|
error = load_image_and_restore();
|
||
|
thaw_processes();
|
||
|
Finish:
|
||
|
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
|
||
|
index 772df402c495..a2b63a6a33c7 100644
|
||
|
--- a/security/selinux/hooks.c
|
||
|
+++ b/security/selinux/hooks.c
|
||
|
@@ -5002,39 +5002,59 @@ static int selinux_tun_dev_open(void *security)
|
||
|
|
||
|
static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
|
||
|
{
|
||
|
- int err = 0;
|
||
|
- u32 perm;
|
||
|
+ int rc = 0;
|
||
|
+ unsigned int msg_len;
|
||
|
+ unsigned int data_len = skb->len;
|
||
|
+ unsigned char *data = skb->data;
|
||
|
struct nlmsghdr *nlh;
|
||
|
struct sk_security_struct *sksec = sk->sk_security;
|
||
|
+ u16 sclass = sksec->sclass;
|
||
|
+ u32 perm;
|
||
|
|
||
|
- if (skb->len < NLMSG_HDRLEN) {
|
||
|
- err = -EINVAL;
|
||
|
- goto out;
|
||
|
- }
|
||
|
- nlh = nlmsg_hdr(skb);
|
||
|
+ while (data_len >= nlmsg_total_size(0)) {
|
||
|
+ nlh = (struct nlmsghdr *)data;
|
||
|
|
||
|
- err = selinux_nlmsg_lookup(sksec->sclass, nlh->nlmsg_type, &perm);
|
||
|
- if (err) {
|
||
|
- if (err == -EINVAL) {
|
||
|
+ /* NOTE: the nlmsg_len field isn't reliably set by some netlink
|
||
|
+ * users which means we can't reject skb's with bogus
|
||
|
+ * length fields; our solution is to follow what
|
||
|
+ * netlink_rcv_skb() does and simply skip processing at
|
||
|
+ * messages with length fields that are clearly junk
|
||
|
+ */
|
||
|
+ if (nlh->nlmsg_len < NLMSG_HDRLEN || nlh->nlmsg_len > data_len)
|
||
|
+ return 0;
|
||
|
+
|
||
|
+ rc = selinux_nlmsg_lookup(sclass, nlh->nlmsg_type, &perm);
|
||
|
+ if (rc == 0) {
|
||
|
+ rc = sock_has_perm(current, sk, perm);
|
||
|
+ if (rc)
|
||
|
+ return rc;
|
||
|
+ } else if (rc == -EINVAL) {
|
||
|
+ /* -EINVAL is a missing msg/perm mapping */
|
||
|
pr_warn_ratelimited("SELinux: unrecognized netlink"
|
||
|
- " message: protocol=%hu nlmsg_type=%hu sclass=%s"
|
||
|
- " pig=%d comm=%s\n",
|
||
|
- sk->sk_protocol, nlh->nlmsg_type,
|
||
|
- secclass_map[sksec->sclass - 1].name,
|
||
|
- task_pid_nr(current), current->comm);
|
||
|
- if (!selinux_enforcing || security_get_allow_unknown())
|
||
|
- err = 0;
|
||
|
+ " message: protocol=%hu nlmsg_type=%hu sclass=%s"
|
||
|
+ " pid=%d comm=%s\n",
|
||
|
+ sk->sk_protocol, nlh->nlmsg_type,
|
||
|
+ secclass_map[sclass - 1].name,
|
||
|
+ task_pid_nr(current), current->comm);
|
||
|
+ if (selinux_enforcing && !security_get_allow_unknown())
|
||
|
+ return rc;
|
||
|
+ rc = 0;
|
||
|
+ } else if (rc == -ENOENT) {
|
||
|
+ /* -ENOENT is a missing socket/class mapping, ignore */
|
||
|
+ rc = 0;
|
||
|
+ } else {
|
||
|
+ return rc;
|
||
|
}
|
||
|
|
||
|
- /* Ignore */
|
||
|
- if (err == -ENOENT)
|
||
|
- err = 0;
|
||
|
- goto out;
|
||
|
+ /* move to the next message after applying netlink padding */
|
||
|
+ msg_len = NLMSG_ALIGN(nlh->nlmsg_len);
|
||
|
+ if (msg_len >= data_len)
|
||
|
+ return 0;
|
||
|
+ data_len -= msg_len;
|
||
|
+ data += msg_len;
|
||
|
}
|
||
|
|
||
|
- err = sock_has_perm(current, sk, perm);
|
||
|
-out:
|
||
|
- return err;
|
||
|
+ return rc;
|
||
|
}
|
||
|
|
||
|
#ifdef CONFIG_NETFILTER
|
||
|
diff --git a/sound/core/oss/pcm_plugin.c b/sound/core/oss/pcm_plugin.c
|
||
|
index 7c5d124d538c..6a7cbad90222 100644
|
||
|
--- a/sound/core/oss/pcm_plugin.c
|
||
|
+++ b/sound/core/oss/pcm_plugin.c
|
||
|
@@ -211,21 +211,23 @@ static snd_pcm_sframes_t plug_client_size(struct snd_pcm_substream *plug,
|
||
|
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||
|
plugin = snd_pcm_plug_last(plug);
|
||
|
while (plugin && drv_frames > 0) {
|
||
|
- if (check_size && drv_frames > plugin->buf_frames)
|
||
|
- drv_frames = plugin->buf_frames;
|
||
|
plugin_prev = plugin->prev;
|
||
|
if (plugin->src_frames)
|
||
|
drv_frames = plugin->src_frames(plugin, drv_frames);
|
||
|
+ if (check_size && plugin->buf_frames &&
|
||
|
+ drv_frames > plugin->buf_frames)
|
||
|
+ drv_frames = plugin->buf_frames;
|
||
|
plugin = plugin_prev;
|
||
|
}
|
||
|
} else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
|
||
|
plugin = snd_pcm_plug_first(plug);
|
||
|
while (plugin && drv_frames > 0) {
|
||
|
plugin_next = plugin->next;
|
||
|
+ if (check_size && plugin->buf_frames &&
|
||
|
+ drv_frames > plugin->buf_frames)
|
||
|
+ drv_frames = plugin->buf_frames;
|
||
|
if (plugin->dst_frames)
|
||
|
drv_frames = plugin->dst_frames(plugin, drv_frames);
|
||
|
- if (check_size && drv_frames > plugin->buf_frames)
|
||
|
- drv_frames = plugin->buf_frames;
|
||
|
plugin = plugin_next;
|
||
|
}
|
||
|
} else
|
||
|
@@ -251,26 +253,28 @@ static snd_pcm_sframes_t plug_slave_size(struct snd_pcm_substream *plug,
|
||
|
plugin = snd_pcm_plug_first(plug);
|
||
|
while (plugin && frames > 0) {
|
||
|
plugin_next = plugin->next;
|
||
|
+ if (check_size && plugin->buf_frames &&
|
||
|
+ frames > plugin->buf_frames)
|
||
|
+ frames = plugin->buf_frames;
|
||
|
if (plugin->dst_frames) {
|
||
|
frames = plugin->dst_frames(plugin, frames);
|
||
|
if (frames < 0)
|
||
|
return frames;
|
||
|
}
|
||
|
- if (check_size && frames > plugin->buf_frames)
|
||
|
- frames = plugin->buf_frames;
|
||
|
plugin = plugin_next;
|
||
|
}
|
||
|
} else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
|
||
|
plugin = snd_pcm_plug_last(plug);
|
||
|
while (plugin) {
|
||
|
- if (check_size && frames > plugin->buf_frames)
|
||
|
- frames = plugin->buf_frames;
|
||
|
plugin_prev = plugin->prev;
|
||
|
if (plugin->src_frames) {
|
||
|
frames = plugin->src_frames(plugin, frames);
|
||
|
if (frames < 0)
|
||
|
return frames;
|
||
|
}
|
||
|
+ if (check_size && plugin->buf_frames &&
|
||
|
+ frames > plugin->buf_frames)
|
||
|
+ frames = plugin->buf_frames;
|
||
|
plugin = plugin_prev;
|
||
|
}
|
||
|
} else
|
||
|
diff --git a/sound/isa/opti9xx/miro.c b/sound/isa/opti9xx/miro.c
|
||
|
index 3a9067db1a84..7fbac24607bc 100644
|
||
|
--- a/sound/isa/opti9xx/miro.c
|
||
|
+++ b/sound/isa/opti9xx/miro.c
|
||
|
@@ -875,10 +875,13 @@ static void snd_miro_write(struct snd_miro *chip, unsigned char reg,
|
||
|
spin_unlock_irqrestore(&chip->lock, flags);
|
||
|
}
|
||
|
|
||
|
+static inline void snd_miro_write_mask(struct snd_miro *chip,
|
||
|
+ unsigned char reg, unsigned char value, unsigned char mask)
|
||
|
+{
|
||
|
+ unsigned char oldval = snd_miro_read(chip, reg);
|
||
|
|
||
|
-#define snd_miro_write_mask(chip, reg, value, mask) \
|
||
|
- snd_miro_write(chip, reg, \
|
||
|
- (snd_miro_read(chip, reg) & ~(mask)) | ((value) & (mask)))
|
||
|
+ snd_miro_write(chip, reg, (oldval & ~mask) | (value & mask));
|
||
|
+}
|
||
|
|
||
|
/*
|
||
|
* Proc Interface
|
||
|
diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c
|
||
|
index 0a5266003786..6777ae84b59e 100644
|
||
|
--- a/sound/isa/opti9xx/opti92x-ad1848.c
|
||
|
+++ b/sound/isa/opti9xx/opti92x-ad1848.c
|
||
|
@@ -327,10 +327,13 @@ static void snd_opti9xx_write(struct snd_opti9xx *chip, unsigned char reg,
|
||
|
}
|
||
|
|
||
|
|
||
|
-#define snd_opti9xx_write_mask(chip, reg, value, mask) \
|
||
|
- snd_opti9xx_write(chip, reg, \
|
||
|
- (snd_opti9xx_read(chip, reg) & ~(mask)) | ((value) & (mask)))
|
||
|
+static inline void snd_opti9xx_write_mask(struct snd_opti9xx *chip,
|
||
|
+ unsigned char reg, unsigned char value, unsigned char mask)
|
||
|
+{
|
||
|
+ unsigned char oldval = snd_opti9xx_read(chip, reg);
|
||
|
|
||
|
+ snd_opti9xx_write(chip, reg, (oldval & ~mask) | (value & mask));
|
||
|
+}
|
||
|
|
||
|
static int snd_opti9xx_configure(struct snd_opti9xx *chip,
|
||
|
long port,
|
||
|
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
|
||
|
index 7a2943a338bf..e19f447e27ae 100644
|
||
|
--- a/sound/pci/hda/patch_hdmi.c
|
||
|
+++ b/sound/pci/hda/patch_hdmi.c
|
||
|
@@ -1699,8 +1699,10 @@ static bool check_non_pcm_per_cvt(struct hda_codec *codec, hda_nid_t cvt_nid)
|
||
|
/* Add sanity check to pass klockwork check.
|
||
|
* This should never happen.
|
||
|
*/
|
||
|
- if (WARN_ON(spdif == NULL))
|
||
|
+ if (WARN_ON(spdif == NULL)) {
|
||
|
+ mutex_unlock(&codec->spdif_mutex);
|
||
|
return true;
|
||
|
+ }
|
||
|
non_pcm = !!(spdif->status & IEC958_AES0_NONAUDIO);
|
||
|
mutex_unlock(&codec->spdif_mutex);
|
||
|
return non_pcm;
|