Merge 4.14.199 into android-4.14-q
Linux 4.14.199
x86/defconfig: Enable CONFIG_USB_XHCI_HCD=y
powerpc/dma: Fix dma_map_ops::get_required_mask
* ehci-hcd: Move include to keep CRC stable
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci-hub.c
serial: 8250_pci: Add Realtek 816a and 816b
Input: i8042 - add Entroware Proteus EL07R4 to nomux and reset lists
Input: trackpoint - add new trackpoint variant IDs
* percpu: fix first chunk size calculation for populated bitmap
mm/percpu.c
i2c: i801: Fix resume bug
usblp: fix race between disconnect() and read()
USB: UAS: fix disconnect by unplugging a hub
* USB: quirks: Add USB_QUIRK_IGNORE_REMOTE_WAKEUP quirk for BYD zhaoxin notebook
drivers/usb/core/quirks.c
drm/mediatek: Add missing put_device() call in mtk_hdmi_dt_parse_pdata()
drm/mediatek: Add exception handing in mtk_drm_probe() if component init fail
MIPS: SNI: Fix spurious interrupts
fbcon: Fix user font detection test at fbcon_resize().
perf test: Free formats for perf pmu parse test
MIPS: SNI: Fix MIPS_L1_CACHE_SHIFT
Drivers: hv: vmbus: Add timeout to vmbus_wait_for_unload
clk: rockchip: Fix initialization of mux_pll_src_4plls_p
* KVM: MIPS: Change the definition of kvm type
include/uapi/linux/kvm.h
* spi: Fix memory leak on splited transfers
drivers/spi/spi.c
* i2c: algo: pca: Reapply i2c bus settings after reset
include/linux/i2c-algo-pca.h
* f2fs: fix indefinite loop scanning for free nid
fs/f2fs/node.c
nvme-fc: cancel async events before freeing event struct
rapidio: Replace 'select' DMAENGINES 'with depends on'
SUNRPC: stop printk reading past end of string
spi: spi-loopback-test: Fix out-of-bounds read
scsi: lpfc: Fix FLOGI/PLOGI receive race condition in pt2pt discovery
scsi: libfc: Fix for double free()
scsi: pm8001: Fix memleak in pm8001_exec_internal_task_abort
NFSv4.1 handle ERR_DELAY error reclaiming locking state on delegation recall
hv_netvsc: Remove "unlikely" from netvsc_select_queue
* net: handle the return value of pskb_carve_frag_list() correctly
net/core/skbuff.c
gfs2: initialize transaction tr_ailX_lists earlier
* gcov: add support for GCC 10.1
kernel/gcov/Kconfig
usb: typec: ucsi: acpi: Check the _DEP dependencies
* usb: Fix out of sync data toggle if a configured device is reconfigured
drivers/usb/core/message.c
USB: serial: option: add support for SIM7070/SIM7080/SIM7090 modules
USB: serial: option: support dynamic Quectel USB compositions
USB: serial: ftdi_sio: add IDs for Xsens Mti USB converter
* usb: core: fix slab-out-of-bounds Read in read_descriptors
drivers/usb/core/sysfs.c
staging: greybus: audio: fix uninitialized value issue
video: fbdev: fix OOB read in vga_8planes_imageblit()
ARM: dts: vfxxx: Add syscon compatible with OCOTP
KVM: VMX: Don't freeze guest when event delivery causes an APIC-access exit
* vgacon: remove software scrollback support
drivers/video/console/Kconfig
fbcon: remove now unusued 'softback_lines' cursor() argument
fbcon: remove soft scrollback code
RDMA/rxe: Fix the parent sysfs read when the interface has 15 chars
rbd: require global CAP_SYS_ADMIN for mapping and unmapping
scsi: target: iscsi: Fix hang in iscsit_access_np() when getting tpg->np_login_sem
scsi: target: iscsi: Fix data digest calculation
* regulator: push allocation in set_consumer_device_supply() out of lock
drivers/regulator/core.c
btrfs: fix wrong address when faulting in pages in the search ioctl
btrfs: fix lockdep splat in add_missing_dev
btrfs: require only sector size alignment for parent eb bytenr
staging: wlan-ng: fix out of bounds read in prism2sta_probe_usb()
iio:accel:mma8452: Fix timestamp alignment and prevent data leak.
iio:accel:mma7455: Fix timestamp alignment and prevent data leak.
iio: accel: kxsd9: Fix alignment of local buffer.
iio:chemical:ccs811: Fix timestamp alignment and prevent data leak.
iio:light:max44000 Fix timestamp alignment and prevent data leak.
iio:magnetometer:ak8975 Fix alignment and data leak issues.
iio:adc:ti-adc081c Fix alignment and data leak issues
iio:adc:max1118 Fix alignment of timestamp and data leak issues
iio:adc:ina2xx Fix timestamp alignment issue.
iio:adc:ti-adc084s021 Fix alignment and data leak issues.
iio:accel:bmc150-accel: Fix timestamp alignment and prevent data leak.
iio:light:ltr501 Fix timestamp alignment issue.
iio: adc: ti-ads1015: fix conversion when CONFIG_PM is not set
iio: adc: mcp3422: fix locking on error path
iio: adc: mcp3422: fix locking scope
* gcov: Disable gcov build with GCC 10
kernel/gcov/Kconfig
ALSA: hda: fix a runtime pm issue in SOF when integrated GPU is disabled
cpufreq: intel_pstate: Refuse to turn off with HWP enabled
ARC: [plat-hsdk]: Switch ethernet phy-mode to rgmii-id
drivers/net/wan/hdlc_cisco: Add hard_header_len
* irqchip/eznps: Fix build error for !ARC700 builds
arch/arc/plat-eznps/include/plat/ctop.h
include/soc/nps/common.h
xfs: initialize the shortform attr header padding entry
drivers/net/wan/lapbether: Set network_header before transmitting
ALSA: hda: Fix 2 channel swapping for Tegra
firestream: Fix memleak in fs_open
NFC: st95hf: Fix memleak in st95hf_in_send_cmd
drivers/net/wan/lapbether: Added needed_tailroom
dmaengine: acpi: Put the CSRT table after using it
ARC: HSDK: wireup perf irq
arm64: dts: ns2: Fixed QSPI compatible string
ARM: dts: BCM5301X: Fixed QSPI compatible string
mmc: sdhci-msm: Add retries when all tuning phases are found valid
RDMA/core: Fix reported speed and width
scsi: libsas: Set data_dir as DMA_NONE if libata marks qc as NODATA
RDMA/rxe: Drop pointless checks in rxe_init_ports
RDMA/rxe: Fix memleak in rxe_mem_init_user
ARM: dts: socfpga: fix register entry for timer3 on Arria10
* ANDROID: Fix mismerge of f2fs into android-4.14-q
fs/f2fs/super.c
Merge 4.14.198 into android-4.14-q
Linux 4.14.198
* net: disable netpoll on fresh napis
net/core/dev.c
tipc: fix shutdown() of connectionless socket
* sctp: not disable bh in the whole sctp_get_port_local()
net/sctp/socket.c
net: usb: dm9601: Add USB ID of Keenetic Plus DSL
* netlabel: fix problems with mapping removal
net/netlabel/netlabel_domainhash.c
bnxt: don't enable NAPI until rings are ready
vfio/pci: Fix SR-IOV VF handling with MMIO blocking
vfio-pci: Invalidate mmaps and block MMIO access on disabled memory
vfio-pci: Fault mmaps to enable vma tracking
vfio/type1: Support faulting PFNMAP vmas
* block: ensure bdi->io_pages is always initialized
block/blk-core.c
ALSA; firewire-tascam: exclude Tascam FE-8 from detection
Merge 4.14.197 into android-4.14-q
Linux 4.14.197
* net: usb: Fix uninit-was-stored issue in asix_read_phy_addr()
drivers/net/usb/asix_common.c
* cfg80211: regulatory: reject invalid hints
net/wireless/reg.c
mm/hugetlb: fix a race between hugetlb sysctl handlers
checkpatch: fix the usage of capture group ( ... )
* KVM: arm64: Set HCR_EL2.PTW to prevent AT taking synchronous exception
arch/arm64/include/asm/kvm_arm.h
* KVM: arm64: Survive synchronous exceptions caused by AT instructions
arch/arm64/include/asm/kvm_asm.h
KVM: arm64: Defer guest entry when an asynchronous exception is pending
* KVM: arm64: Add kvm_extable for vaxorcism code
arch/arm64/include/asm/kvm_asm.h
arch/arm64/kernel/vmlinux.lds.S
* mm: slub: fix conversion of freelist_corrupted()
mm/slub.c
dm thin metadata: Avoid returning cmd->bm wild pointer on error
dm cache metadata: Avoid returning cmd->bm wild pointer on error
* libata: implement ATA_HORKAGE_MAX_TRIM_128M and apply to Sandisks
include/linux/libata.h
* block: Move SECTOR_SIZE and SECTOR_SHIFT definitions into <linux/blkdev.h>
drivers/block/brd.c
drivers/block/zram/zram_drv.h
include/linux/blkdev.h
include/linux/device-mapper.h
include/linux/ide.h
include/uapi/linux/msdos_fs.h
* block: allow for_each_bvec to support zero len bvec
include/linux/bvec.h
affs: fix basic permission bits to actually work
ALSA: firewire-digi00x: exclude Avid Adrenaline from detection
ALSA: hda/hdmi: always check pin power status in i915 pin fixup
ALSA: pcm: oss: Remove superfluous WARN_ON() for mulaw sanity check
ALSA: ca0106: fix error code handling
usb: qmi_wwan: add D-Link DWM-222 A2 device ID
net: usb: qmi_wwan: add Telit 0x1050 composition
btrfs: fix potential deadlock in the search ioctl
* uaccess: Add non-pagefault user-space write function
include/linux/uaccess.h
mm/maccess.c
* uaccess: Add non-pagefault user-space read functions
include/linux/uaccess.h
mm/maccess.c
btrfs: set the lockdep class for log tree extent buffers
btrfs: Remove extraneous extent_buffer_get from tree_mod_log_rewind
btrfs: Remove redundant extent_buffer_get in get_old_root
btrfs: drop path before adding new uuid tree entry
* include/linux/log2.h: add missing () around n in roundup_pow_of_two()
include/linux/log2.h
thermal: ti-soc-thermal: Fix bogus thermal shutdowns for omap4430
iommu/vt-d: Serialize IOMMU GCMD register modifications
tg3: Fix soft lockup when tg3_reset_task() fails.
* fix regression in "epoll: Keep a reference on files added to the check list"
fs/eventpoll.c
net: ethernet: mlx4: Fix memory allocation in mlx4_buddy_init()
perf tools: Correct SNOOPX field offset
nvmet-fc: Fix a missed _irqsave version of spin_lock in 'nvmet_fc_fod_op_done()'
bnxt_en: Fix PCI AER error recovery flow
bnxt_en: Check for zero dir entries in NVRAM.
gtp: add GTPA_LINK info to msg sent to userspace
dmaengine: pl330: Fix burst length if burst size is smaller than bus width
net: arc_emac: Fix memleak in arc_mdio_probe
ravb: Fixed to be able to unload modules
net: systemport: Fix memleak in bcm_sysport_probe
net: hns: Fix memleak in hns_nic_dev_probe
* netfilter: nf_tables: fix destination register zeroing
include/net/netfilter/nf_tables.h
* netfilter: nf_tables: incorrect enum nft_list_attributes definition
include/uapi/linux/netfilter/nf_tables.h
netfilter: nf_tables: add NFTA_SET_USERDATA if not null
MIPS: BMIPS: Also call bmips_cpu_setup() for secondary cores
MIPS: mm: BMIPS5000 has inclusive physical caches
dmaengine: at_hdmac: check return value of of_find_device_by_node() in at_dma_xlate()
batman-adv: bla: use netif_rx_ni when not in interrupt context
batman-adv: Fix own OGM check in aggregated OGMs
batman-adv: Avoid uninitialized chaddr when handling DHCP
* dmaengine: of-dma: Fix of_dma_router_xlate's of_dma_xlate handling
drivers/dma/of-dma.c
xen/xenbus: Fix granting of vmalloc'd memory
* s390: don't trace preemption in percpu macros
arch/s390/include/asm/percpu.h
* cpuidle: Fixup IRQ state
drivers/cpuidle/cpuidle.c
ceph: don't allow setlease on cephfs
nvmet: Disable keep-alive timer when kato is cleared to 0h
hwmon: (applesmc) check status earlier.
* drm/msm: add shutdown support for display platform_driver
drivers/gpu/drm/msm/msm_drv.c
perf record/stat: Explicitly call out event modifiers in the documentation
* HID: core: Sanitize event code and type when mapping input
drivers/hid/hid-input.c
drivers/hid/hid-multitouch.c
include/linux/hid.h
* HID: core: Correctly handle ReportSize being zero
drivers/hid/hid-core.c
* ANDROID: overflow.h: fix merge issue with 4.14.196
include/linux/overflow.h
Merge 4.14.196 into android-4.14-q
Linux 4.14.196
* ALSA: usb-audio: Update documentation comment for MS2109 quirk
sound/usb/quirks-table.h
* HID: hiddev: Fix slab-out-of-bounds write in hiddev_ioctl_usage()
drivers/hid/usbhid/hiddev.c
tpm: Unify the mismatching TPM space buffer sizes
btrfs: check the right error variable in btrfs_del_dir_entries_in_log
usb: storage: Add unusual_uas entry for Sony PSZ drives
USB: cdc-acm: rework notification_buffer resizing
* USB: gadget: u_f: Unbreak offset calculation in VLAs
drivers/usb/gadget/u_f.h
* USB: gadget: f_ncm: add bounds checks to ncm_unwrap_ntb()
drivers/usb/gadget/function/f_ncm.c
* USB: gadget: u_f: add overflow checks to VLA macros
drivers/usb/gadget/u_f.h
* overflow.h: Add allocation size calculation helpers
drivers/md/dm-table.c
include/linux/overflow.h
usb: host: ohci-exynos: Fix error handling in exynos_ohci_probe()
* USB: Ignore UAS for JMicron JMS567 ATA/ATAPI Bridge
drivers/usb/storage/unusual_devs.h
* USB: quirks: Add no-lpm quirk for another Raydium touchscreen
drivers/usb/core/quirks.c
usb: uas: Add quirk for PNY Pro Elite
USB: yurex: Fix bad gfp argument
drm/amdgpu: Fix buffer overflow in INFO ioctl
* device property: Fix the secondary firmware node handling in set_primary_fwnode()
drivers/base/core.c
* PM: sleep: core: Fix the handling of pending runtime resume requests
drivers/base/power/main.c
* xhci: Do warm-reset when both CAS and XDEV_RESUME are set
drivers/usb/host/xhci-hub.c
XEN uses irqdesc::irq_data_common::handler_data to store a per interrupt XEN data pointer which contains XEN specific information.
* writeback: Fix sync livelock due to b_dirty_time processing
fs/fs-writeback.c
include/trace/events/writeback.h
* writeback: Avoid skipping inode writeback
fs/fs-writeback.c
include/linux/fs.h
* writeback: Protect inode->i_io_list with inode->i_lock
fs/fs-writeback.c
serial: 8250: change lock order in serial8250_do_startup()
serial: 8250_exar: Fix number of ports for Commtech PCIe cards
serial: pl011: Don't leak amba_ports entry on driver register error
serial: pl011: Fix oops on -EPROBE_DEFER
serial: samsung: Removes the IRQ not found warning
vt_ioctl: change VT_RESIZEX ioctl to check for error return from vc_resize()
vt: defer kfree() of vc_screenbuf in vc_do_resize()
* USB: lvtest: return proper error code in probe
drivers/usb/misc/lvstest.c
fbcon: prevent user font height or width change from causing potential out-of-bounds access
btrfs: fix space cache memory leak after transaction abort
HID: i2c-hid: Always sleep 60ms after I2C_HID_PWR_ON commands
powerpc/perf: Fix soft lockups due to missed interrupt accounting
net: gianfar: Add of_node_put() before goto statement
* scsi: ufs: Clean up completed request without interrupt notification
drivers/scsi/ufs/ufshcd.c
* scsi: ufs: Improve interrupt handling for shared interrupts
drivers/scsi/ufs/ufshcd.c
* scsi: ufs: Fix possible infinite loop in ufshcd_hold
drivers/scsi/ufs/ufshcd.c
s390/cio: add cond_resched() in the slow_eval_known_fn() loop
spi: stm32: fix stm32_spi_prepare_mbr in case of odd clk_rate
* fs: prevent BUG_ON in submit_bh_wbc()
fs/buffer.c
fs/ext4/super.c
* jbd2: abort journal if free a async write error metadata buffer
fs/jbd2/transaction.c
* ext4: don't BUG on inconsistent journal feature
fs/ext4/super.c
* jbd2: make sure jh have b_transaction set in refile/unfile_buffer
fs/jbd2/transaction.c
usb: gadget: f_tcm: Fix some resource leaks in some error paths
i2c: rcar: in slave mode, clear NACK earlier
null_blk: fix passing of REQ_FUA flag in null_handle_rq
nvme-fc: Fix wrong return value in __nvme_fc_init_request()
media: gpio-ir-tx: improve precision of transmitted signal due to scheduling
Revert "ath10k: fix DMA related firmware crashes on multiple devices"
* efi: provide empty efi_enter_virtual_mode implementation
include/linux/efi.h
USB: sisusbvga: Fix a potential UB casued by left shifting a negative value
powerpc/spufs: add CONFIG_COREDUMP dependency
KVM: arm64: Fix symbol dependency in __hyp_call_panic_nvhe
media: davinci: vpif_capture: fix potential double free
EDAC/ie31200: Fallback if host bridge device is already initialized
scsi: fcoe: Memory leak fix in fcoe_sysfs_fcf_del()
ceph: fix potential mdsc use-after-free crash
scsi: iscsi: Do not put host in iscsi_set_flashnode_param()
locking/lockdep: Fix overflow in presentation of average lock-time
drm/nouveau: Fix reference count leak in nouveau_connector_detect
drm/nouveau/drm/noveau: fix reference count leak in nouveau_fbcon_open
* f2fs: fix use-after-free issue
fs/f2fs/super.c
cec-api: prevent leaking memory through hole in structure
mips/vdso: Fix resource leaks in genvdso.c
rtlwifi: rtl8192cu: Prevent leaking urb
* PCI: Fix pci_create_slot() reference count leak
drivers/pci/slot.c
omapfb: fix multiple reference count leaks due to pm_runtime_get_sync
selftests/powerpc: Purge extra count_pmc() calls of ebb selftests
scsi: lpfc: Fix shost refcount mismatch when deleting vport
drm/amdgpu/display: fix ref count leak when pm_runtime_get_sync fails
drm/amdgpu: fix ref count leak in amdgpu_display_crtc_set_config
drm/amd/display: fix ref count leak in amdgpu_drm_ioctl
drm/amdgpu: fix ref count leak in amdgpu_driver_open_kms
drm/radeon: fix multiple reference count leak
drm/amdkfd: Fix reference count leaks.
* iommu/iova: Don't BUG on invalid PFNs
drivers/iommu/iova.c
scsi: target: tcmu: Fix crash on ARM during cmd completion
* blktrace: ensure our debugfs dir exists
kernel/trace/blktrace.c
media: pci: ttpci: av7110: fix possible buffer overflow caused by bad DMA value in debiirq()
powerpc/xive: Ignore kmemleak false positives
arm64: dts: qcom: msm8916: Pull down PDM GPIOs during sleep
mfd: intel-lpss: Add Intel Emmitsburg PCH PCI IDs
ASoC: tegra: Fix reference count leaks.
ALSA: pci: delete repeated words in comments
* gre6: Fix reception with IP6_TNL_F_RCV_DSCP_COPY
net/ipv6/ip6_tunnel.c
ipvlan: fix device features
tipc: fix uninit skb->data in tipc_nl_compat_dumpit()
* net: Fix potential wrong skb->protocol in skb_vlan_untag()
net/core/skbuff.c
powerpc/64s: Don't init FSCR_DSCR in __init_FSCR()
Change-Id: I859e5233b7b9e6b1cd64de707f4ee4a00c0860a6
Signed-off-by: lucaswei <lucaswei@google.com>
309 lines
10 KiB
C
309 lines
10 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __LINUX_UACCESS_H__
|
|
#define __LINUX_UACCESS_H__
|
|
|
|
#include <linux/sched.h>
|
|
#include <linux/thread_info.h>
|
|
#include <linux/kasan-checks.h>
|
|
|
|
#define VERIFY_READ 0
|
|
#define VERIFY_WRITE 1
|
|
|
|
#define uaccess_kernel() segment_eq(get_fs(), KERNEL_DS)
|
|
|
|
#include <asm/uaccess.h>
|
|
|
|
#ifndef untagged_addr
|
|
#define untagged_addr(addr) addr
|
|
#endif
|
|
|
|
/*
|
|
* Architectures should provide two primitives (raw_copy_{to,from}_user())
|
|
* and get rid of their private instances of copy_{to,from}_user() and
|
|
* __copy_{to,from}_user{,_inatomic}().
|
|
*
|
|
* raw_copy_{to,from}_user(to, from, size) should copy up to size bytes and
|
|
* return the amount left to copy. They should assume that access_ok() has
|
|
* already been checked (and succeeded); they should *not* zero-pad anything.
|
|
* No KASAN or object size checks either - those belong here.
|
|
*
|
|
* Both of these functions should attempt to copy size bytes starting at from
|
|
* into the area starting at to. They must not fetch or store anything
|
|
* outside of those areas. Return value must be between 0 (everything
|
|
* copied successfully) and size (nothing copied).
|
|
*
|
|
* If raw_copy_{to,from}_user(to, from, size) returns N, size - N bytes starting
|
|
* at to must become equal to the bytes fetched from the corresponding area
|
|
* starting at from. All data past to + size - N must be left unmodified.
|
|
*
|
|
* If copying succeeds, the return value must be 0. If some data cannot be
|
|
* fetched, it is permitted to copy less than had been fetched; the only
|
|
* hard requirement is that not storing anything at all (i.e. returning size)
|
|
* should happen only when nothing could be copied. In other words, you don't
|
|
* have to squeeze as much as possible - it is allowed, but not necessary.
|
|
*
|
|
* For raw_copy_from_user() to always points to kernel memory and no faults
|
|
* on store should happen. Interpretation of from is affected by set_fs().
|
|
* For raw_copy_to_user() it's the other way round.
|
|
*
|
|
* Both can be inlined - it's up to architectures whether it wants to bother
|
|
* with that. They should not be used directly; they are used to implement
|
|
* the 6 functions (copy_{to,from}_user(), __copy_{to,from}_user_inatomic())
|
|
* that are used instead. Out of those, __... ones are inlined. Plain
|
|
* copy_{to,from}_user() might or might not be inlined. If you want them
|
|
* inlined, have asm/uaccess.h define INLINE_COPY_{TO,FROM}_USER.
|
|
*
|
|
* NOTE: only copy_from_user() zero-pads the destination in case of short copy.
|
|
* Neither __copy_from_user() nor __copy_from_user_inatomic() zero anything
|
|
* at all; their callers absolutely must check the return value.
|
|
*
|
|
* Biarch ones should also provide raw_copy_in_user() - similar to the above,
|
|
* but both source and destination are __user pointers (affected by set_fs()
|
|
* as usual) and both source and destination can trigger faults.
|
|
*/
|
|
|
|
static __always_inline unsigned long
|
|
__copy_from_user_inatomic(void *to, const void __user *from, unsigned long n)
|
|
{
|
|
kasan_check_write(to, n);
|
|
check_object_size(to, n, false);
|
|
return raw_copy_from_user(to, from, n);
|
|
}
|
|
|
|
static __always_inline unsigned long
|
|
__copy_from_user(void *to, const void __user *from, unsigned long n)
|
|
{
|
|
might_fault();
|
|
kasan_check_write(to, n);
|
|
check_object_size(to, n, false);
|
|
return raw_copy_from_user(to, from, n);
|
|
}
|
|
|
|
/**
|
|
* __copy_to_user_inatomic: - Copy a block of data into user space, with less checking.
|
|
* @to: Destination address, in user space.
|
|
* @from: Source address, in kernel space.
|
|
* @n: Number of bytes to copy.
|
|
*
|
|
* Context: User context only.
|
|
*
|
|
* Copy data from kernel space to user space. Caller must check
|
|
* the specified block with access_ok() before calling this function.
|
|
* The caller should also make sure he pins the user space address
|
|
* so that we don't result in page fault and sleep.
|
|
*/
|
|
static __always_inline unsigned long
|
|
__copy_to_user_inatomic(void __user *to, const void *from, unsigned long n)
|
|
{
|
|
kasan_check_read(from, n);
|
|
check_object_size(from, n, true);
|
|
return raw_copy_to_user(to, from, n);
|
|
}
|
|
|
|
static __always_inline unsigned long
|
|
__copy_to_user(void __user *to, const void *from, unsigned long n)
|
|
{
|
|
might_fault();
|
|
kasan_check_read(from, n);
|
|
check_object_size(from, n, true);
|
|
return raw_copy_to_user(to, from, n);
|
|
}
|
|
|
|
#ifdef INLINE_COPY_FROM_USER
|
|
static inline unsigned long
|
|
_copy_from_user(void *to, const void __user *from, unsigned long n)
|
|
{
|
|
unsigned long res = n;
|
|
might_fault();
|
|
if (likely(access_ok(VERIFY_READ, from, n))) {
|
|
kasan_check_write(to, n);
|
|
res = raw_copy_from_user(to, from, n);
|
|
}
|
|
if (unlikely(res))
|
|
memset(to + (n - res), 0, res);
|
|
return res;
|
|
}
|
|
#else
|
|
extern unsigned long
|
|
_copy_from_user(void *, const void __user *, unsigned long);
|
|
#endif
|
|
|
|
#ifdef INLINE_COPY_TO_USER
|
|
static inline unsigned long
|
|
_copy_to_user(void __user *to, const void *from, unsigned long n)
|
|
{
|
|
might_fault();
|
|
if (access_ok(VERIFY_WRITE, to, n)) {
|
|
kasan_check_read(from, n);
|
|
n = raw_copy_to_user(to, from, n);
|
|
}
|
|
return n;
|
|
}
|
|
#else
|
|
extern unsigned long
|
|
_copy_to_user(void __user *, const void *, unsigned long);
|
|
#endif
|
|
|
|
static __always_inline unsigned long __must_check
|
|
copy_from_user(void *to, const void __user *from, unsigned long n)
|
|
{
|
|
if (likely(check_copy_size(to, n, false)))
|
|
n = _copy_from_user(to, from, n);
|
|
return n;
|
|
}
|
|
|
|
static __always_inline unsigned long __must_check
|
|
copy_to_user(void __user *to, const void *from, unsigned long n)
|
|
{
|
|
if (likely(check_copy_size(from, n, true)))
|
|
n = _copy_to_user(to, from, n);
|
|
return n;
|
|
}
|
|
#ifdef CONFIG_COMPAT
|
|
static __always_inline unsigned long __must_check
|
|
copy_in_user(void __user *to, const void __user *from, unsigned long n)
|
|
{
|
|
might_fault();
|
|
if (access_ok(VERIFY_WRITE, to, n) && access_ok(VERIFY_READ, from, n))
|
|
n = raw_copy_in_user(to, from, n);
|
|
return n;
|
|
}
|
|
#endif
|
|
|
|
static __always_inline void pagefault_disabled_inc(void)
|
|
{
|
|
current->pagefault_disabled++;
|
|
}
|
|
|
|
static __always_inline void pagefault_disabled_dec(void)
|
|
{
|
|
current->pagefault_disabled--;
|
|
}
|
|
|
|
/*
|
|
* These routines enable/disable the pagefault handler. If disabled, it will
|
|
* not take any locks and go straight to the fixup table.
|
|
*
|
|
* User access methods will not sleep when called from a pagefault_disabled()
|
|
* environment.
|
|
*/
|
|
static inline void pagefault_disable(void)
|
|
{
|
|
pagefault_disabled_inc();
|
|
/*
|
|
* make sure to have issued the store before a pagefault
|
|
* can hit.
|
|
*/
|
|
barrier();
|
|
}
|
|
|
|
static inline void pagefault_enable(void)
|
|
{
|
|
/*
|
|
* make sure to issue those last loads/stores before enabling
|
|
* the pagefault handler again.
|
|
*/
|
|
barrier();
|
|
pagefault_disabled_dec();
|
|
}
|
|
|
|
/*
|
|
* Is the pagefault handler disabled? If so, user access methods will not sleep.
|
|
*/
|
|
#define pagefault_disabled() (current->pagefault_disabled != 0)
|
|
|
|
/*
|
|
* The pagefault handler is in general disabled by pagefault_disable() or
|
|
* when in irq context (via in_atomic()).
|
|
*
|
|
* This function should only be used by the fault handlers. Other users should
|
|
* stick to pagefault_disabled().
|
|
* Please NEVER use preempt_disable() to disable the fault handler. With
|
|
* !CONFIG_PREEMPT_COUNT, this is like a NOP. So the handler won't be disabled.
|
|
* in_atomic() will report different values based on !CONFIG_PREEMPT_COUNT.
|
|
*/
|
|
#define faulthandler_disabled() (pagefault_disabled() || in_atomic())
|
|
|
|
#ifndef ARCH_HAS_NOCACHE_UACCESS
|
|
|
|
static inline unsigned long __copy_from_user_inatomic_nocache(void *to,
|
|
const void __user *from, unsigned long n)
|
|
{
|
|
return __copy_from_user_inatomic(to, from, n);
|
|
}
|
|
|
|
#endif /* ARCH_HAS_NOCACHE_UACCESS */
|
|
|
|
/*
|
|
* probe_kernel_read(): safely attempt to read from a location
|
|
* @dst: pointer to the buffer that shall take the data
|
|
* @src: address to read from
|
|
* @size: size of the data chunk
|
|
*
|
|
* Safely read from address @src to the buffer at @dst. If a kernel fault
|
|
* happens, handle that and return -EFAULT.
|
|
*/
|
|
extern long probe_kernel_read(void *dst, const void *src, size_t size);
|
|
extern long __probe_kernel_read(void *dst, const void *src, size_t size);
|
|
|
|
/*
|
|
* probe_user_read(): safely attempt to read from a location in user space
|
|
* @dst: pointer to the buffer that shall take the data
|
|
* @src: address to read from
|
|
* @size: size of the data chunk
|
|
*
|
|
* Safely read from address @src to the buffer at @dst. If a kernel fault
|
|
* happens, handle that and return -EFAULT.
|
|
*/
|
|
extern long probe_user_read(void *dst, const void __user *src, size_t size);
|
|
|
|
/*
|
|
* probe_kernel_write(): safely attempt to write to a location
|
|
* @dst: address to write to
|
|
* @src: pointer to the data that shall be written
|
|
* @size: size of the data chunk
|
|
*
|
|
* Safely write to address @dst from the buffer at @src. If a kernel fault
|
|
* happens, handle that and return -EFAULT.
|
|
*/
|
|
extern long notrace probe_kernel_write(void *dst, const void *src, size_t size);
|
|
extern long notrace __probe_kernel_write(void *dst, const void *src, size_t size);
|
|
|
|
/*
|
|
* probe_user_write(): safely attempt to write to a location in user space
|
|
* @dst: address to write to
|
|
* @src: pointer to the data that shall be written
|
|
* @size: size of the data chunk
|
|
*
|
|
* Safely write to address @dst from the buffer at @src. If a kernel fault
|
|
* happens, handle that and return -EFAULT.
|
|
*/
|
|
extern long notrace probe_user_write(void __user *dst, const void *src, size_t size);
|
|
extern long notrace __probe_user_write(void __user *dst, const void *src, size_t size);
|
|
|
|
extern long strncpy_from_unsafe(char *dst, const void *unsafe_addr, long count);
|
|
extern long strncpy_from_unsafe_user(char *dst, const void __user *unsafe_addr,
|
|
long count);
|
|
extern long strnlen_unsafe_user(const void __user *unsafe_addr, long count);
|
|
|
|
/**
|
|
* probe_kernel_address(): safely attempt to read from a location
|
|
* @addr: address to read from
|
|
* @retval: read into this variable
|
|
*
|
|
* Returns 0 on success, or -EFAULT.
|
|
*/
|
|
#define probe_kernel_address(addr, retval) \
|
|
probe_kernel_read(&retval, addr, sizeof(retval))
|
|
|
|
#ifndef user_access_begin
|
|
#define user_access_begin(type, ptr, len) access_ok(type, ptr, len)
|
|
#define user_access_end() do { } while (0)
|
|
#define unsafe_get_user(x, ptr, err) do { if (unlikely(__get_user(x, ptr))) goto err; } while (0)
|
|
#define unsafe_put_user(x, ptr, err) do { if (unlikely(__put_user(x, ptr))) goto err; } while (0)
|
|
static inline unsigned long user_access_save(void) { return 0UL; }
|
|
static inline void user_access_restore(unsigned long flags) { }
|
|
#endif
|
|
|
|
#endif /* __LINUX_UACCESS_H__ */
|