4.19.240-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainercover 4.19.240-rc1 review
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 28 Apr 2022 08:17:22 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.240-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.19.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.19.240-rc1
Marek Vasut <[email protected]>
Revert "net: micrel: fix KS8851_MLL Kconfig"
Duoming Zhou <[email protected]>
ax25: Fix UAF bugs in ax25 timers
Duoming Zhou <[email protected]>
ax25: Fix NULL pointer dereferences in ax25 timers
Duoming Zhou <[email protected]>
ax25: fix NPD bug in ax25_disconnect
Duoming Zhou <[email protected]>
ax25: fix UAF bug in ax25_send_control()
Duoming Zhou <[email protected]>
ax25: Fix refcount leaks caused by ax25_cb_del()
Duoming Zhou <[email protected]>
ax25: fix UAF bugs of net_device caused by rebinding operation
Duoming Zhou <[email protected]>
ax25: fix reference count leaks of ax25_dev
Duoming Zhou <[email protected]>
ax25: add refcount in ax25_dev to avoid UAF bugs
Khazhismel Kumykov <[email protected]>
block/compat_ioctl: fix range check in BLKGETSIZE
Lee Jones <[email protected]>
staging: ion: Prevent incorrect reference counting behavour
Theodore Ts'o <[email protected]>
ext4: force overhead calculation if the s_overhead_cluster makes no sense
Theodore Ts'o <[email protected]>
ext4: fix overhead calculation to account for the reserved gdt blocks
Tadeusz Struk <[email protected]>
ext4: limit length to bitmap_maxbytes - blocksize in punch_hole
Ye Bin <[email protected]>
ext4: fix symlink file size not match to file content
Rob Herring <[email protected]>
arm_pmu: Validate single/group leader events
Sergey Matyukevich <[email protected]>
ARC: entry: fix syscall_trace_exit argument
Sasha Neftin <[email protected]>
e1000e: Fix possible overflow in LTR decoding
Xiaomeng Tong <[email protected]>
ASoC: soc-dapm: fix two incorrect uses of list iterator
Paolo Valerio <[email protected]>
openvswitch: fix OOB access in reserve_sfa_size()
Athira Rajeev <[email protected]>
powerpc/perf: Fix power9 event alternatives
Dave Stevenson <[email protected]>
drm/panel/raspberrypi-touchscreen: Initialise the bridge in prepare
Dave Stevenson <[email protected]>
drm/panel/raspberrypi-touchscreen: Avoid NULL deref if not initialised
Xiaomeng Tong <[email protected]>
dma: at_xdmac: fix a missing check on list iterator
Zheyu Ma <[email protected]>
ata: pata_marvell: Check the 'bmdma_addr' beforing reading
Mikulas Patocka <[email protected]>
stat: fix inconsistency between struct stat and struct compat_stat
Tomas Melin <[email protected]>
net: macb: Restart tx only if queue pointer is lagging
Xiaoke Wang <[email protected]>
drm/msm/mdp5: check the return of kzalloc()
Lv Ruyi <[email protected]>
dpaa_eth: Fix missing of_node_put in dpaa_get_ts_info()
Borislav Petkov <[email protected]>
brcmfmac: sdio: Fix undefined behavior due to shift overflowing the constant
Borislav Petkov <[email protected]>
mt76: Fix undefined behavior due to shift overflowing the constant
David Howells <[email protected]>
cifs: Check the IOCB_DIRECT flag, not O_DIRECT
Hongbin Wang <[email protected]>
vxlan: fix error return code in vxlan_fdb_append
Borislav Petkov <[email protected]>
ALSA: usb-audio: Fix undefined behavior due to shift overflowing the constant
Jiapeng Chong <[email protected]>
platform/x86: samsung-laptop: Fix an unsigned comparison which can never be negative
Sameer Pujar <[email protected]>
reset: tegra-bpmp: Restore Handle errors in BPMP response
Kees Cook <[email protected]>
ARM: vexpress/spc: Avoid negative array index when !SMP
Eric Dumazet <[email protected]>
netlink: reset network and mac headers in netlink_dump()
Eric Dumazet <[email protected]>
net/sched: cls_u32: fix possible leak in u32_init_knode()
Hangbin Liu <[email protected]>
net/packet: fix packet_sock xmit return value checking
David Howells <[email protected]>
rxrpc: Restore removed timer deletion
Miaoqian Lin <[email protected]>
dmaengine: imx-sdma: Fix error checking in sdma_event_remap
Miaoqian Lin <[email protected]>
ASoC: msm8916-wcd-digital: Check failure for devm_snd_soc_register_component
Mark Brown <[email protected]>
ASoC: atmel: Remove system clock tree configuration for at91sam9g20ek
Kuniyuki Iwashima <[email protected]>
tcp: Fix potential use-after-free due to double kfree()
Ricardo Dias <[email protected]>
tcp: fix race condition when creating child sockets from syncookies
Takashi Iwai <[email protected]>
ALSA: usb-audio: Clear MIDI port active flag after draining
Bob Peterson <[email protected]>
gfs2: assign rgrp glock before compute_bitstructs
Mikulas Patocka <[email protected]>
dm integrity: fix memory corruption when tag_size is less than digest size
Hangyu Hua <[email protected]>
can: usb_8dev: usb_8dev_start_xmit(): fix double dev_kfree_skb() in error path
Daniel Bristot de Oliveira <[email protected]>
tracing: Dump stacktrace trigger to the corresponding instance
Xiongwei Song <[email protected]>
mm: page_alloc: fix building error on -Werror=array-compare
Kees Cook <[email protected]>
etherdevice: Adjust ether_addr* prototypes to silence -Wstringop-overead
-------------
Diffstat:
Makefile | 4 +- arch/arc/kernel/entry.S | 1 + arch/arm/mach-vexpress/spc.c | 2 +- arch/powerpc/perf/power9-pmu.c | 8 +-- arch/x86/include/asm/compat.h | 6 +- block/compat_ioctl.c | 2 +- drivers/ata/pata_marvell.c | 2 + drivers/dma/at_xdmac.c | 12 ++-- drivers/dma/imx-sdma.c | 4 +- drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c | 3 + .../gpu/drm/panel/panel-raspberrypi-touchscreen.c | 13 ++++- drivers/md/dm-integrity.c | 7 ++- drivers/net/can/usb/usb_8dev.c | 30 +++++----- drivers/net/ethernet/cadence/macb_main.c | 8 +++ drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c | 8 ++- drivers/net/ethernet/intel/e1000e/ich8lan.c | 4 +- drivers/net/ethernet/micrel/Kconfig | 1 - drivers/net/vxlan.c | 4 +- .../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76x2_pci.c | 2 +- drivers/perf/arm_pmu.c | 10 ++-- drivers/platform/x86/samsung-laptop.c | 2 - drivers/reset/tegra/reset-bpmp.c | 9 ++- drivers/staging/android/ion/ion.c | 3 + fs/cifs/cifsfs.c | 2 +- fs/ext4/inode.c | 11 +++- fs/ext4/page-io.c | 4 +- fs/ext4/super.c | 19 ++++-- fs/gfs2/rgrp.c | 9 +-- fs/stat.c | 19 +++--- include/linux/etherdevice.h | 5 +- include/net/ax25.h | 12 ++++ include/net/inet_hashtables.h | 5 +- kernel/trace/trace_events_trigger.c | 9 ++- mm/page_alloc.c | 2 +- net/ax25/af_ax25.c | 38 +++++++++--- net/ax25/ax25_dev.c | 28 +++++++-- net/ax25/ax25_route.c | 13 ++++- net/ax25/ax25_subr.c | 20 +++++-- net/dccp/ipv4.c | 2 +- net/dccp/ipv6.c | 2 +- net/ipv4/inet_connection_sock.c | 2 +- net/ipv4/inet_hashtables.c | 68 +++++++++++++++++++--- net/ipv4/tcp_ipv4.c | 13 ++++- net/ipv6/tcp_ipv6.c | 13 ++++- net/netlink/af_netlink.c | 7 +++ net/openvswitch/flow_netlink.c | 2 +- net/packet/af_packet.c | 13 +++-- net/rxrpc/net_ns.c | 2 + net/sched/cls_u32.c | 8 +-- sound/soc/atmel/sam9g20_wm8731.c | 61 ------------------- sound/soc/codecs/msm8916-wcd-digital.c | 9 ++- sound/soc/soc-dapm.c | 6 +- sound/usb/midi.c | 1 + sound/usb/usbaudio.h | 2 +- 55 files changed, 359 insertions(+), 195 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/53 etherdevice: Adjust ether_addr* prototypes to silence -Wstringop-overead
From: Kees Cook <[email protected]>
commit 2618a0dae09ef37728dab89ff60418cbe25ae6bd upstream.
With GCC 12, -Wstringop-overread was warning about an implicit cast from char[6] to char[8]. However, the extra 2 bytes are always thrown away, alignment doesn't matter, and the risk of hitting the edge of unallocated memory has been accepted, so this prototype can just be converted to a regular char *. Silences:
net/core/dev.c: In function ‘bpf_prog_run_generic_xdp’: net/core/dev.c:4618:21: warning: ‘ether_addr_equal_64bits’ reading 8 bytes from a region of size 6 [-Wstringop-overread]
4618 | orig_host = ether_addr_equal_64bits(eth->h_dest, > skb->dev->dev_addr);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~net/core/dev.c:4618:21: note: referencing argument 1 of type ‘const u8[8]’ {aka ‘const unsigned char[8]’} net/core/dev.c:4618:21: note: referencing argument 2 of type ‘const u8[8]’ {aka ‘const unsigned char[8]’}
In file included from net/core/dev.c:91: include/linux/etherdevice.h:375:20: note: in a call to function ‘ether_addr_equal_64bits’
375 | static inline bool ether_addr_equal_64bits(const u8 addr1[6+2],
| ^~~~~~~~~~~~~~~~~~~~~~~
--- include/linux/etherdevice.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
include/linux/etherdevice.h +2 -3
@@ -130,7 +130,7 @@ static inline bool is_multicast_ether_ad#endif } -static inline bool is_multicast_ether_addr_64bits (const u8 addr[6 +2 ]) +static inline bool is_multicast_ether_addr_64bits (const u8 *addr) {#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS ) &&BITS_PER_LONG ==64 #ifdef __BIG_ENDIAN
@@ -344,8 +344,7 @@ static inline bool ether_addr_equal(cons* Please note that alignment of addr1 & addr2 are only guaranteed to be 16 bits. */ -static inline bool ether_addr_equal_64bits (const u8 addr1[6 +2 ], -const u8 addr2[6 +2 ]) +static inline bool ether_addr_equal_64bits (const u8 *addr1,const u8 *addr2) {#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS ) &&BITS_PER_LONG ==64 u64 fold = (*(const u64 *)addr1) ^ (*(const u64 *)addr2);
Greg Kroah-Hartman
maintainerPATCH 2/53 mm: page_alloc: fix building error on -Werror=array-compare
In reply to Greg Kroah-HartmanFrom: Xiongwei Song <[email protected]>
commit ca831f29f8f25c97182e726429b38c0802200c8f upstream.
Arthur Marsh reported we would hit the error below when building kernel with gcc-12:
CC mm/page_alloc.o
mm/page_alloc.c: In function `mem_init_print_info':
mm/page_alloc.c:8173:27: error: comparison between two arrays [-Werror=array-compare]
8173 | if (start <= pos && pos < end && size > adj) \
|In C++20, the comparision between arrays should be warned.
--- mm/page_alloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/page_alloc.c +1 -1
@@ -7117,7 +7117,7 @@ void __init mem_init_print_info(const ch*/ #define adj_init_size (start, end, size, pos, adj) \ do { \ - if (start <= pos && pos < end && size > adj) \ + if (&start[0] <= &pos[0] && &pos[0] < &end[0] && size > adj) \ size -= adj; \ } while (0)
Greg Kroah-Hartman
maintainerPATCH 3/53 tracing: Dump stacktrace trigger to the corresponding instance
In reply to Greg Kroah-HartmanFrom: Daniel Bristot de Oliveira <[email protected]>
commit ce33c845b030c9cf768370c951bc699470b09fa7 upstream.
The stacktrace event trigger is not dumping the stacktrace to the instance where it was enabled, but to the global "instance."
Use the private_data, pointing to the trigger file, to figure out the corresponding trace instance, and use it in the trigger action, like snapshot_trigger does.
--- kernel/trace/trace_events_trigger.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
kernel/trace/trace_events_trigger.c +8 -1
@@ -1212,7 +1212,14 @@ static void stacktrace_trigger(struct event_trigger_data *data, void *rec, struct ring_buffer_event *event) { -trace_dump_stack (STACK_SKIP); + struct trace_event_file *file = data->private_data; +unsigned long flags; + +if (file) { +local_save_flags (flags); +__trace_stack (file->tr, flags,STACK_SKIP ,preempt_count ()); + }else +trace_dump_stack (STACK_SKIP ); } static void
Greg Kroah-Hartman
maintainerPATCH 4/53 can: usb_8dev: usb_8dev_start_xmit(): fix double dev_kfree_skb() in error path
In reply to Greg Kroah-HartmanFrom: Hangyu Hua <[email protected]>
commit 3d3925ff6433f98992685a9679613a2cc97f3ce2 upstream.
There is no need to call dev_kfree_skb() when usb_submit_urb() fails because can_put_echo_skb() deletes original skb and can_free_echo_skb() deletes the cloned skb.
--- drivers/net/can/usb/usb_8dev.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-)
drivers/net/can/usb/usb_8dev.c +14 -16
@@ -681,9 +681,20 @@ static netdev_tx_t usb_8dev_start_xmit(satomic_inc (&priv->active_tx_urbs); err =usb_submit_urb (urb,GFP_ATOMIC ); -if (unlikely (err)) - goto failed; -else if (atomic_read (&priv->active_tx_urbs) >=MAX_TX_URBS ) +if (unlikely (err)) { +can_free_echo_skb (netdev, context->echo_index); + +usb_unanchor_urb (urb); +usb_free_coherent (priv->udev, size, buf, urb->transfer_dma); + +atomic_dec (&priv->active_tx_urbs); + +if (err == -ENODEV ) +netif_device_detach (netdev); +else +netdev_warn (netdev,"failed tx_urb %d\n" , err); + stats->tx_dropped++; + }else if (atomic_read (&priv->active_tx_urbs) >=MAX_TX_URBS )/* Slow down tx path */ netif_stop_queue (netdev);
@@ -702,19 +713,6 @@ nofreecontext:return NETDEV_TX_BUSY ; -failed: -can_free_echo_skb (netdev, context->echo_index); - -usb_unanchor_urb (urb); -usb_free_coherent (priv->udev, size, buf, urb->transfer_dma); - -atomic_dec (&priv->active_tx_urbs); - -if (err == -ENODEV ) -netif_device_detach (netdev); -else -netdev_warn (netdev,"failed tx_urb %d\n" , err); - nomembuf:usb_free_urb (urb);
Greg Kroah-Hartman
maintainerPATCH 5/53 dm integrity: fix memory corruption when tag_size is less than digest size
In reply to Greg Kroah-HartmanFrom: Mikulas Patocka <[email protected]>
commit 08c1af8f1c13bbf210f1760132f4df24d0ed46d6 upstream.
It is possible to set up dm-integrity in such a way that the "tag_size" parameter is less than the actual digest size. In this situation, a part of the digest beyond tag_size is ignored.
In this case, dm-integrity would write beyond the end of the ic->recalc_tags array and corrupt memory. The corruption happened in integrity_recalc->integrity_sector_checksum->crypto_shash_final.
Fix this corruption by increasing the tags array so that it has enough padding at the end to accomodate the loop in integrity_recalc() being able to write a full digest size for the last member of the tags array.
--- drivers/md/dm-integrity.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/md/dm-integrity.c +5 -2
@@ -3504,6 +3504,7 @@ try_smaller_buffer: }if (ic->sb->flags &cpu_to_le32 (SB_FLAG_RECALCULATING )) { +size_t recalc_tags_size;if (!ic->internal_hash) { r = -EINVAL ; ti->error ="Recalculate is only valid with internal hash" ;
@@ -3522,8 +3523,10 @@ try_smaller_buffer: r = -ENOMEM ; goto bad; } - ic->recalc_tags =kvmalloc_array (RECALC_SECTORS >> ic->sb->log2_sectors_per_block, - ic->tag_size,GFP_KERNEL ); + recalc_tags_size = (RECALC_SECTORS >> ic->sb->log2_sectors_per_block) * ic->tag_size; +if (crypto_shash_digestsize (ic->internal_hash) > ic->tag_size) + recalc_tags_size +=crypto_shash_digestsize (ic->internal_hash) - ic->tag_size; + ic->recalc_tags =kvmalloc (recalc_tags_size,GFP_KERNEL );if (!ic->recalc_tags) { ti->error ="Cannot allocate tags for recalculating" ; r = -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 6/53 gfs2: assign rgrp glock before compute_bitstructs
In reply to Greg Kroah-HartmanFrom: Bob Peterson <[email protected]>
commit 428f651cb80b227af47fc302e4931791f2fb4741 upstream.
Before this patch, function read_rindex_entry called compute_bitstructs before it allocated a glock for the rgrp. But if compute_bitstructs found a problem with the rgrp, it called gfs2_consist_rgrpd, and that called gfs2_dump_glock for rgd->rd_gl which had not yet been assigned.
read_rindex_entry
compute_bitstructs
gfs2_consist_rgrpd
gfs2_dump_glock <---------rgd->rd_gl was not set.This patch changes read_rindex_entry so it assigns an rgrp glock before calling compute_bitstructs so gfs2_dump_glock does not reference an unassigned pointer. If an error is discovered, the glock must also be put, so a new goto and label were added.
--- fs/gfs2/rgrp.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
fs/gfs2/rgrp.c +5 -4
@@ -926,15 +926,15 @@ static int read_rindex_entry(struct gfs2 rgd->rd_bitbytes =be32_to_cpu (buf.ri_bitbytes);spin_lock_init (&rgd->rd_rsspin); - error =compute_bitstructs (rgd); -if (error) - goto fail; - error =gfs2_glock_get (sdp, rgd->rd_addr, &gfs2_rgrp_glops,CREATE , &rgd->rd_gl);if (error) goto fail; + error =compute_bitstructs (rgd); +if (error) + goto fail_glock; + rgd->rd_rgl = (struct gfs2_rgrp_lvb *)rgd->rd_gl->gl_lksb.sb_lvbptr; rgd->rd_flags &= ~(GFS2_RDF_UPTODATE |GFS2_RDF_PREFERRED );if (rgd->rd_data > sdp->sd_max_rg_data)
@@ -951,6 +951,7 @@ static int read_rindex_entry(struct gfs2 } error =0 ;/* someone else read in the rgrp; free it and ignore it */ +fail_glock:gfs2_glock_put (rgd->rd_gl); fail:
Greg Kroah-Hartman
maintainerPATCH 7/53 ALSA: usb-audio: Clear MIDI port active flag after draining
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 0665886ad1392e6b5bae85d7a6ccbed48dca1522 upstream.
When a rawmidi output stream is closed, it calls the drain at first, then does trigger-off only when the drain returns -ERESTARTSYS as a fallback. It implies that each driver should turn off the stream properly after the drain. Meanwhile, USB-audio MIDI interface didn't change the port->active flag after the drain. This may leave the output work picking up the port that is closed right now, which eventually leads to a use-after-free for the already released rawmidi object.
This patch fixes the bug by properly clearing the port->active flag after the output drain.
--- sound/usb/midi.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/midi.c +1 -0
@@ -1211,6 +1211,7 @@ static void snd_usbmidi_output_drain(str }while (drain_urbs && timeout);finish_wait (&ep->drain_wait, &wait); } + port->active =0 ;spin_unlock_irq (&ep->buffer_lock); }
Greg Kroah-Hartman
maintainerPATCH 8/53 tcp: fix race condition when creating child sockets from syncookies
In reply to Greg Kroah-HartmanFrom: Ricardo Dias <[email protected]>
[ Upstream commit 01770a166165738a6e05c3d911fb4609cc4eb416 ]
When the TCP stack is in SYN flood mode, the server child socket is created from the SYN cookie received in a TCP packet with the ACK flag set.
The child socket is created when the server receives the first TCP packet with a valid SYN cookie from the client. Usually, this packet corresponds to the final step of the TCP 3-way handshake, the ACK packet. But is also possible to receive a valid SYN cookie from the first TCP data packet sent by the client, and thus create a child socket from that SYN cookie.
Since a client socket is ready to send data as soon as it receives the SYN+ACK packet from the server, the client can send the ACK packet (sent by the TCP stack code), and the first data packet (sent by the userspace program) almost at the same time, and thus the server will equally receive the two TCP packets with valid SYN cookies almost at the same instant.
When such event happens, the TCP stack code has a race condition that occurs between the momement a lookup is done to the established connections hashtable to check for the existence of a connection for the same client, and the moment that the child socket is added to the established connections hashtable. As a consequence, this race condition can lead to a situation where we add two child sockets to the established connections hashtable and deliver two sockets to the userspace program to the same client.
This patch fixes the race condition by checking if an existing child socket exists for the same client when we are adding the second child socket to the established connections socket. If an existing child socket exists, we drop the packet and discard the second child socket to the same client.
--- include/net/inet_hashtables.h | 5 +- net/dccp/ipv4.c | 2 - net/dccp/ipv6.c | 2 - net/ipv4/inet_connection_sock.c | 2 - net/ipv4/inet_hashtables.c | 68 +++++++++++++++++++++++++++++++++++----- net/ipv4/tcp_ipv4.c | 15 +++++++- net/ipv6/tcp_ipv6.c | 13 +++++++ 7 files changed, 91 insertions(+), 16 deletions(-)
include/net/inet_hashtables.h +3 -2
@@ -232,8 +232,9 @@ void inet_hashinfo2_init(struct inet_hasunsigned long low_limit, unsigned long high_limit); -bool inet_ehash_insert (struct sock *sk,struct sock *osk); -bool inet_ehash_nolisten (struct sock *sk,struct sock *osk); +bool inet_ehash_insert (struct sock *sk,struct sock *osk,bool *found_dup_sk); +bool inet_ehash_nolisten (struct sock *sk,struct sock *osk, +bool *found_dup_sk);int __inet_hash (struct sock *sk,struct sock *osk);int inet_hash (struct sock *sk);void inet_unhash (struct sock *sk);
net/dccp/ipv4.c +1 -1
@@ -428,7 +428,7 @@ struct sock *dccp_v4_request_recv_sock(cif (__inet_inherit_port (sk, newsk) <0 ) goto put_and_exit; - *own_req =inet_ehash_nolisten (newsk,req_to_sk (req_unhash)); + *own_req =inet_ehash_nolisten (newsk,req_to_sk (req_unhash),NULL );if (*own_req) ireq->ireq_opt =NULL ;else
net/dccp/ipv6.c +1 -1
@@ -538,7 +538,7 @@ static struct sock *dccp_v6_request_recvdccp_done (newsk); goto out; } - *own_req =inet_ehash_nolisten (newsk,req_to_sk (req_unhash)); + *own_req =inet_ehash_nolisten (newsk,req_to_sk (req_unhash),NULL );/* Clone pktoptions received with SYN, if we own the req */ if (*own_req && ireq->pktopts) { newnp->pktoptions =skb_clone (ireq->pktopts,GFP_ATOMIC );
net/ipv4/inet_connection_sock.c +1 -1
@@ -793,7 +793,7 @@ static void reqsk_queue_hash_req(structtimer_setup (&req->rsk_timer, reqsk_timer_handler,TIMER_PINNED );mod_timer (&req->rsk_timer, jiffies + timeout); -inet_ehash_insert (req_to_sk (req),NULL ); +inet_ehash_insert (req_to_sk (req),NULL ,NULL );/* before letting lookups find us, make sure all req fields * are committed to memory and refcnt initialized. */
net/ipv4/inet_hashtables.c +60 -8
113 lines not on this page · raw message
net/ipv4/tcp_ipv4.c +13 -2
@@ -1415,6 +1415,7 @@ struct sock *tcp_v4_syn_recv_sock(const bool *own_req) {struct inet_request_sock *ireq; +bool found_dup_sk = false;struct inet_sock *newinet;struct tcp_sock *newtp;struct sock *newsk;
@@ -1485,12 +1486,22 @@ struct sock *tcp_v4_syn_recv_sock(constif (__inet_inherit_port (sk, newsk) <0 ) goto put_and_exit; - *own_req =inet_ehash_nolisten (newsk,req_to_sk (req_unhash)); + *own_req =inet_ehash_nolisten (newsk,req_to_sk (req_unhash), + &found_dup_sk);if (likely (*own_req)) {tcp_move_syn (newtp, req); ireq->ireq_opt =NULL ; }else { - newinet->inet_opt =NULL ; +if (!req_unhash && found_dup_sk) { +/* This code path should only be executed in the +* syncookie case only +*/ +bh_unlock_sock (newsk); +sock_put (newsk); + newsk =NULL ; + }else { + newinet->inet_opt =NULL ; + } }return newsk;
net/ipv6/tcp_ipv6.c +12 -1
@@ -1090,6 +1090,7 @@ static struct sock *tcp_v6_syn_recv_sockstruct ipv6_txoptions *opt;struct tcp6_sock *newtcp6sk;struct inet_sock *newinet; +bool found_dup_sk = false;struct tcp_sock *newtp;struct sock *newsk;#ifdef CONFIG_TCP_MD5SIG
@@ -1258,7 +1259,8 @@ static struct sock *tcp_v6_syn_recv_socktcp_done (newsk); goto out; } - *own_req =inet_ehash_nolisten (newsk,req_to_sk (req_unhash)); + *own_req =inet_ehash_nolisten (newsk,req_to_sk (req_unhash), + &found_dup_sk);if (*own_req) {tcp_move_syn (newtp, req);
@@ -1273,6 +1275,15 @@ static struct sock *tcp_v6_syn_recv_sockskb_set_owner_r (newnp->pktoptions, newsk); } } + }else { +if (!req_unhash && found_dup_sk) { +/* This code path should only be executed in the +* syncookie case only +*/ +bh_unlock_sock (newsk); +sock_put (newsk); + newsk =NULL ; + } }return newsk;
Greg Kroah-Hartman
maintainerPATCH 9/53 tcp: Fix potential use-after-free due to double kfree()
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
commit c89dffc70b340780e5b933832d8c3e045ef3791e upstream.
Receiving ACK with a valid SYN cookie, cookie_v4_check() allocates struct request_sock and then can allocate inet_rsk(req)->ireq_opt. After that, tcp_v4_syn_recv_sock() allocates struct sock and copies ireq_opt to inet_sk(sk)->inet_opt. Normally, tcp_v4_syn_recv_sock() inserts the full socket into ehash and sets NULL to ireq_opt. Otherwise, tcp_v4_syn_recv_sock() has to reset inet_opt by NULL and free the full socket.
The commit 01770a1661657 ("tcp: fix race condition when creating child sockets from syncookies") added a new path, in which more than one cores create full sockets for the same SYN cookie. Currently, the core which loses the race frees the full socket without resetting inet_opt, resulting in that both sock_put() and reqsk_put() call kfree() for the same memory:
sock_put
sk_free
__sk_free
sk_destruct
__sk_destruct
sk->sk_destruct/inet_sock_destruct
kfree(rcu_dereference_protected(inet->inet_opt, 1));
reqsk_put
reqsk_free
__reqsk_free
req->rsk_ops->destructor/tcp_v4_reqsk_destructor
kfree(rcu_dereference_protected(inet_rsk(req)->ireq_opt, 1));Calling kmalloc() between the double kfree() can lead to use-after-free, so this patch fixes it by setting NULL to inet_opt before sock_put().
As a side note, this kind of issue does not happen for IPv6. This is because tcp_v6_syn_recv_sock() clones both ipv6_opt and pktopts which correspond to ireq_opt in IPv4.
--- net/ipv4/tcp_ipv4.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/tcp_ipv4.c +2 -2
@@ -1492,6 +1492,8 @@ struct sock *tcp_v4_syn_recv_sock(consttcp_move_syn (newtp, req); ireq->ireq_opt =NULL ; }else { + newinet->inet_opt =NULL ; +if (!req_unhash && found_dup_sk) {/* This code path should only be executed in the * syncookie case only
@@ -1499,8 +1501,6 @@ struct sock *tcp_v4_syn_recv_sock(constbh_unlock_sock (newsk);sock_put (newsk); newsk =NULL ; - }else { - newinet->inet_opt =NULL ; } }return newsk;
Greg Kroah-Hartman
maintainerPATCH 10/53 ASoC: atmel: Remove system clock tree configuration for at91sam9g20ek
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
[ Upstream commit c775cbf62ed4911e4f0f23880f01815753123690 ]
The MCLK of the WM8731 on the AT91SAM9G20-EK board is connected to the PCK0 output of the SoC, intended in the reference software to be supplied using PLLB and programmed to 12MHz. As originally written for use with a board file the audio driver was responsible for configuring the entire tree but in the conversion to the common clock framework the registration of the named pck0 and pllb clocks was removed so the driver has failed to instantiate ever since.
Since the WM8731 driver has had support for managing a MCLK provided via the common clock framework for some time we can simply drop all the clock management code from the machine driver other than configuration of the sysclk rate, the CODEC driver still respects that configuration from the machine driver.
--- sound/soc/atmel/sam9g20_wm8731.c | 61 -------------------------------- 1 file changed, 61 deletions(-)
sound/soc/atmel/sam9g20_wm8731.c +0 -61
@@ -59,35 +59,6 @@*/ #undef ENABLE_MIC_INPUT -static struct clk *mclk; - -static int at91sam9g20ek_set_bias_level (struct snd_soc_card *card, -struct snd_soc_dapm_context *dapm, -enum snd_soc_bias_level level) -{ -static int mclk_on; -int ret =0 ; - -switch (level) { -case SND_SOC_BIAS_ON : -case SND_SOC_BIAS_PREPARE : -if (!mclk_on) - ret =clk_enable (mclk); -if (ret ==0 ) - mclk_on =1 ; -break ; - -case SND_SOC_BIAS_OFF : -case SND_SOC_BIAS_STANDBY : -if (mclk_on) -clk_disable (mclk); - mclk_on =0 ; -break ; - } - -return ret; -} -static const struct snd_soc_dapm_widget at91sam9g20ek_dapm_widgets[] = {SND_SOC_DAPM_MIC ("Int Mic" ,NULL ),SND_SOC_DAPM_SPK ("Ext Spk" ,NULL ),
@@ -146,7 +117,6 @@ static struct snd_soc_card snd_soc_at91sam9g20ek = { .owner = THIS_MODULE, .dai_link = &at91sam9g20ek_dai, .num_links = 1, - .set_bias_level = at91sam9g20ek_set_bias_level, .dapm_widgets = at91sam9g20ek_dapm_widgets, .num_dapm_widgets = ARRAY_SIZE(at91sam9g20ek_dapm_widgets),
@@ -159,7 +129,6 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev) {struct device_node *np = pdev->dev.of_node;struct device_node *codec_np, *cpu_np; -struct clk *pllb;struct snd_soc_card *card = &snd_soc_at91sam9g20ek;int ret;
@@ -173,31 +142,6 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)return -EINVAL ; } -/* -* Codec MCLK is supplied by PCK0 - set it up. -*/ - mclk =clk_get (NULL ,"pck0" ); -if (IS_ERR (mclk)) { -dev_err (&pdev->dev,"Failed to get MCLK\n" ); - ret =PTR_ERR (mclk); - goto err; - } - - pllb =clk_get (NULL ,"pllb" ); -if (IS_ERR (pllb)) { -dev_err (&pdev->dev,"Failed to get PLLB\n" ); - ret =PTR_ERR (pllb); - goto err_mclk; - } - ret =clk_set_parent (mclk, pllb); -clk_put (pllb); -if (ret !=0 ) { -dev_err (&pdev->dev,"Failed to set MCLK parent\n" ); - goto err_mclk; - } - -clk_set_rate (mclk,MCLK_RATE ); - card->dev = &pdev->dev;/* Parse device node info */
@@ -241,9 +185,6 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)return ret; -err_mclk: -clk_put (mclk); - mclk =NULL ; err:atmel_ssc_put_audio (0 );return ret;
@@ -253,8 +194,6 @@ static int at91sam9g20ek_audio_remove(struct platform_device *pdev) {struct snd_soc_card *card =platform_get_drvdata (pdev); -clk_disable (mclk); - mclk =NULL ;snd_soc_unregister_card (card);atmel_ssc_put_audio (0 );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 11/53 ASoC: msm8916-wcd-digital: Check failure for devm_snd_soc_register_component
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit e927b05f3cc20de87f6b7d912a5bbe556931caca ]
devm_snd_soc_register_component() may fails, we should check the error and do the corresponding error handling.
--- sound/soc/codecs/msm8916-wcd-digital.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
sound/soc/codecs/msm8916-wcd-digital.c +8 -1
@@ -923,9 +923,16 @@ static int msm8916_wcd_digital_probe(struct platform_device *pdev)dev_set_drvdata (dev, priv); -return devm_snd_soc_register_component (dev, &msm8916_wcd_digital, + ret =devm_snd_soc_register_component (dev, &msm8916_wcd_digital, msm8916_wcd_digital_dai,ARRAY_SIZE (msm8916_wcd_digital_dai)); +if (ret) + goto err_mclk; + +return 0 ; + +err_mclk: +clk_disable_unprepare (priv->mclk); err_clk:clk_disable_unprepare (priv->ahbclk);return ret;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 12/53 dmaengine: imx-sdma: Fix error checking in sdma_event_remap
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 7104b9cb35a33ad803a1adbbfa50569b008faf15 ]
of_parse_phandle() returns NULL on errors, rather than error pointers. Using NULL check on grp_np to fix this.
--- drivers/dma/imx-sdma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/dma/imx-sdma.c +2 -2
@@ -1771,7 +1771,7 @@ static int sdma_event_remap(struct sdma_engine *sdma)u32 reg, val, shift, num_map, i;int ret =0 ; -if (IS_ERR (np) ||IS_ERR (gpr_np)) +if (IS_ERR (np) || !gpr_np) goto out; event_remap =of_find_property (np, propname,NULL );
@@ -1819,7 +1819,7 @@ static int sdma_event_remap(struct sdma_engine *sdma) } out: -if (!IS_ERR (gpr_np)) +if (gpr_np)of_node_put (gpr_np);return ret;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 13/53 rxrpc: Restore removed timer deletion
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
[ Upstream commit ee3b0826b4764f6c13ad6db67495c5a1c38e9025 ]
A recent patch[1] from Eric Dumazet flipped the order in which the keepalive timer and the keepalive worker were cancelled in order to fix a syzbot reported issue[2]. Unfortunately, this enables the mirror image bug whereby the timer races with rxrpc_exit_net(), restarting the worker after it has been cancelled:
CPU 1 CPU 2 =============== ===================== if (rxnet->live) <INTERRUPT> rxnet->live = false; cancel_work_sync(&rxnet->peer_keepalive_work); rxrpc_queue_work(&rxnet->peer_keepalive_work); del_timer_sync(&rxnet->peer_keepalive_timer);
Fix this by restoring the removed del_timer_sync() so that we try to remove the timer twice. If the timer runs again, it should see ->live == false and not restart the worker.
--- net/rxrpc/net_ns.c | 2 ++ 1 file changed, 2 insertions(+)
net/rxrpc/net_ns.c +2 -0
@@ -117,7 +117,9 @@ static __net_exit void rxrpc_exit_net(struct net *net)struct rxrpc_net *rxnet =rxrpc_net (net); rxnet->live = false; +del_timer_sync (&rxnet->peer_keepalive_timer);cancel_work_sync (&rxnet->peer_keepalive_work); +/* Remove the timer again as the worker may have restarted it. */ del_timer_sync (&rxnet->peer_keepalive_timer);rxrpc_destroy_all_calls (rxnet);rxrpc_destroy_all_connections (rxnet);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 14/53 net/packet: fix packet_sock xmit return value checking
In reply to Greg Kroah-HartmanFrom: Hangbin Liu <[email protected]>
[ Upstream commit 29e8e659f984be00d75ec5fef4e37c88def72712 ]
packet_sock xmit could be dev_queue_xmit, which also returns negative errors. So only checking positive errors is not enough, or userspace sendmsg may return success while packet is not send out.
Move the net_xmit_errno() assignment in the braces as checkpatch.pl said do not use assignment in if condition.
--- net/packet/af_packet.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
net/packet/af_packet.c +9 -4
@@ -2791,8 +2791,9 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) status =TP_STATUS_SEND_REQUEST ; err = po->xmit (skb); -if (unlikely (err >0 )) { - err =net_xmit_errno (err); +if (unlikely (err !=0 )) { +if (err >0 ) + err =net_xmit_errno (err);if (err &&__packet_get_status (po, ph) ==TP_STATUS_AVAILABLE ) {/* skb was destructed already */
@@ -2993,8 +2994,12 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) skb->no_fcs =1 ; err = po->xmit (skb); -if (err >0 && (err =net_xmit_errno (err)) !=0 ) - goto out_unlock; +if (unlikely (err !=0 )) { +if (err >0 ) + err =net_xmit_errno (err); +if (err) + goto out_unlock; + }dev_put (dev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 15/53 net/sched: cls_u32: fix possible leak in u32_init_knode()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit ec5b0f605b105457f257f2870acad4a5d463984b ]
While investigating a related syzbot report, I found that whenever call to tcf_exts_init() from u32_init_knode() is failing, we end up with an elevated refcount on ht->refcnt
To avoid that, only increase the refcount after all possible errors have been evaluated.
--- net/sched/cls_u32.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/sched/cls_u32.c +4 -4
@@ -873,10 +873,6 @@ static struct tc_u_knode *u32_init_knode(struct tcf_proto *tp, new->flags = n->flags;RCU_INIT_POINTER (new->ht_down, ht); -/* bump reference count as long as we hold pointer to structure */ -if (ht) - ht->refcnt++; -#ifdef CONFIG_CLS_U32_PERF /* Statistics may be incremented by readers during update * so we must keep them in tact. When the node is later destroyed
@@ -899,6 +895,10 @@ static struct tc_u_knode *u32_init_knode(struct tcf_proto *tp,return NULL ; } +/* bump reference count as long as we hold pointer to structure */ +if (ht) + ht->refcnt++; +return new; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 16/53 netlink: reset network and mac headers in netlink_dump()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 99c07327ae11e24886d552dddbe4537bfca2765d ]
netlink_dump() is allocating an skb, reserves space in it but forgets to reset network header.
This allows a BPF program, invoked later from sk_filter() to access uninitialized kernel memory from the reserved space.
Theorically mac header reset could be omitted, because
it is set to a special initial value. bpf_internal_load_pointer_neg_helper calls skb_mac_header() without checking skb_mac_header_was_set().
Relying on skb->len not being too big seems fragile.
We also could add a sanity check in bpf_internal_load_pointer_neg_helper() to avoid surprises in the future.
syzbot report was:
BUG: KMSAN: uninit-value in ___bpf_prog_run+0xa22b/0xb420 kernel/bpf/core.c:1637 ___bpf_prog_run+0xa22b/0xb420 kernel/bpf/core.c:1637 __bpf_prog_run32+0x121/0x180 kernel/bpf/core.c:1796 bpf_dispatcher_nop_func include/linux/bpf.h:784 [inline] __bpf_prog_run include/linux/filter.h:626 [inline] bpf_prog_run include/linux/filter.h:633 [inline] __bpf_prog_run_save_cb+0x168/0x580 include/linux/filter.h:756 bpf_prog_run_save_cb include/linux/filter.h:770 [inline] sk_filter_trim_cap+0x3bc/0x8c0 net/core/filter.c:150 sk_filter include/linux/filter.h:905 [inline] netlink_dump+0xe0c/0x16c0 net/netlink/af_netlink.c:2276 netlink_recvmsg+0x1129/0x1c80 net/netlink/af_netlink.c:2002 sock_recvmsg_nosec net/socket.c:948 [inline] sock_recvmsg net/socket.c:966 [inline] sock_read_iter+0x5a9/0x630 net/socket.c:1039 do_iter_readv_writev+0xa7f/0xc70 do_iter_read+0x52c/0x14c0 fs/read_write.c:786 vfs_readv fs/read_write.c:906 [inline] do_readv+0x432/0x800 fs/read_write.c:943 __do_sys_readv fs/read_write.c:1034 [inline] __se_sys_readv fs/read_write.c:1031 [inline] __x64_sys_readv+0xe5/0x120 fs/read_write.c:1031 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x54/0xd0 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x44/0xae
Uninit was stored to memory at:
___bpf_prog_run+0x96c/0xb420 kernel/bpf/core.c:1558 __bpf_prog_run32+0x121/0x180 kernel/bpf/core.c:1796 bpf_dispatcher_nop_func include/linux/bpf.h:784 [inline] __bpf_prog_run include/linux/filter.h:626 [inline] bpf_prog_run include/linux/filter.h:633 [inline] __bpf_prog_run_save_cb+0x168/0x580 include/linux/filter.h:756 bpf_prog_run_save_cb include/linux/filter.h:770 [inline] sk_filter_trim_cap+0x3bc/0x8c0 net/core/filter.c:150 sk_filter include/linux/filter.h:905 [inline] netlink_dump+0xe0c/0x16c0 net/netlink/af_netlink.c:2276 netlink_recvmsg+0x1129/0x1c80 net/netlink/af_netlink.c:2002 sock_recvmsg_nosec net/socket.c:948 [inline] sock_recvmsg net/socket.c:966 [inline] sock_read_iter+0x5a9/0x630 net/socket.c:1039 do_iter_readv_writev+0xa7f/0xc70 do_iter_read+0x52c/0x14c0 fs/read_write.c:786 vfs_readv fs/read_write.c:906 [inline] do_readv+0x432/0x800 fs/read_write.c:943 __do_sys_readv fs/read_write.c:1034 [inline] __se_sys_readv fs/read_write.c:1031 [inline] __x64_sys_readv+0xe5/0x120 fs/read_write.c:1031 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x54/0xd0 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x44/0xae
Uninit was created at:
slab_post_alloc_hook mm/slab.h:737 [inline] slab_alloc_node mm/slub.c:3244 [inline] __kmalloc_node_track_caller+0xde3/0x14f0 mm/slub.c:4972 kmalloc_reserve net/core/skbuff.c:354 [inline] __alloc_skb+0x545/0xf90 net/core/skbuff.c:426 alloc_skb include/linux/skbuff.h:1158 [inline] netlink_dump+0x30f/0x16c0 net/netlink/af_netlink.c:2242 netlink_recvmsg+0x1129/0x1c80 net/netlink/af_netlink.c:2002 sock_recvmsg_nosec net/socket.c:948 [inline] sock_recvmsg net/socket.c:966 [inline] sock_read_iter+0x5a9/0x630 net/socket.c:1039 do_iter_readv_writev+0xa7f/0xc70 do_iter_read+0x52c/0x14c0 fs/read_write.c:786 vfs_readv fs/read_write.c:906 [inline] do_readv+0x432/0x800 fs/read_write.c:943 __do_sys_readv fs/read_write.c:1034 [inline] __se_sys_readv fs/read_write.c:1031 [inline] __x64_sys_readv+0xe5/0x120 fs/read_write.c:1031 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x54/0xd0 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x44/0xae CPU: 0 PID: 3470 Comm: syz-executor751 Not tainted 5.17.0-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
--- net/netlink/af_netlink.c | 7 +++++++ 1 file changed, 7 insertions(+)
net/netlink/af_netlink.c +7 -0
@@ -2243,6 +2243,13 @@ static int netlink_dump(struct sock *sk)* single netdev. The outcome is MSG_TRUNC error. */ skb_reserve (skb,skb_tailroom (skb) - alloc_size); + +/* Make sure malicious BPF programs can not read unitialized memory +* from skb->head -> skb->data +*/ +skb_reset_network_header (skb); +skb_reset_mac_header (skb); +netlink_skb_set_owner_r (skb, sk);if (nlk->dump_done_errno >0 )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 17/53 ARM: vexpress/spc: Avoid negative array index when !SMP
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
[ Upstream commit b3f1dd52c991d79118f35e6d1bf4d7cb09882e38 ]
When building multi_v7_defconfig+CONFIG_SMP=n, -Warray-bounds exposes a couple negative array index accesses:
arch/arm/mach-vexpress/spc.c: In function 've_spc_clk_init':arch/arm/mach-vexpress/spc.c:583:21: warning: array subscript -1 is below array bounds of 'bool[2]' {aka '_Bool[2]'} [-Warray-bounds]
583 | if (init_opp_table[cluster])
| ~~~~~~~~~~~~~~^~~~~~~~~
arch/arm/mach-vexpress/spc.c:556:7: note: while referencing 'init_opp_table'
556 | bool init_opp_table[MAX_CLUSTERS] = { false };
| ^~~~~~~~~~~~~~
arch/arm/mach-vexpress/spc.c:592:18: warning: array subscript -1 is below array bounds of 'bool[2]' {aka '_Bool[2]'} [-Warray-bounds]
592 | init_opp_table[cluster] = true;
| ~~~~~~~~~~~~~~^~~~~~~~~
arch/arm/mach-vexpress/spc.c:556:7: note: while referencing 'init_opp_table'
556 | bool init_opp_table[MAX_CLUSTERS] = { false };
| ^~~~~~~~~~~~~~Skip this logic when built !SMP.
--- arch/arm/mach-vexpress/spc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-vexpress/spc.c +1 -1
@@ -580,7 +580,7 @@ static int __init ve_spc_clk_init(void) } cluster =topology_physical_package_id (cpu_dev->id); -if (init_opp_table[cluster]) +if (cluster <0 || init_opp_table[cluster])continue ;if (ve_init_opp_table (cpu_dev))
Signature · 9 lines
2.35.1 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Greg Kroah-Hartman
maintainerPATCH 18/53 reset: tegra-bpmp: Restore Handle errors in BPMP response
In reply to Greg Kroah-HartmanFrom: Sameer Pujar <[email protected]>
[ Upstream commit d1da1052ffad63aa5181b69f20a6952e31f339c2 ]
This reverts following commit 69125b4b9440 ("reset: tegra-bpmp: Revert Handle errors in BPMP response").
The Tegra194 HDA reset failure is fixed by commit d278dc9151a0 ("ALSA:
hda/tegra: Fix Tegra194 HDA reset failure"). The temporary revert of original commit c045ceb5a145 ("reset: tegra-bpmp: Handle errors in BPMP response") can be removed now.
--- drivers/reset/tegra/reset-bpmp.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/reset/tegra/reset-bpmp.c +8 -1
@@ -23,6 +23,7 @@ static int tegra_bpmp_reset_common(struct reset_controller_dev *rstc,struct tegra_bpmp *bpmp =to_tegra_bpmp (rstc);struct mrq_reset_request request;struct tegra_bpmp_message msg; +int err;memset (&request,0 ,sizeof (request)); request.cmd = command;
@@ -33,7 +34,13 @@ static int tegra_bpmp_reset_common(struct reset_controller_dev *rstc, msg.tx.data = &request; msg.tx.size =sizeof (request); -return tegra_bpmp_transfer (bpmp, &msg); + err =tegra_bpmp_transfer (bpmp, &msg); +if (err) +return err; +if (msg.rx.ret) +return -EINVAL ; + +return 0 ; } static int tegra_bpmp_reset_module(struct reset_controller_dev *rstc,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 19/53 platform/x86: samsung-laptop: Fix an unsigned comparison which can never be negative
In reply to Greg Kroah-HartmanFrom: Jiapeng Chong <[email protected]>
[ Upstream commit 0284d4d1be753f648f28b77bdfbe6a959212af5c ]
Eliminate the follow smatch warnings:
drivers/platform/x86/samsung-laptop.c:1124 kbd_led_set() warn: unsigned 'value' is never less than zero.
--- drivers/platform/x86/samsung-laptop.c | 2 -- 1 file changed, 2 deletions(-)
drivers/platform/x86/samsung-laptop.c +0 -2
@@ -1125,8 +1125,6 @@ static void kbd_led_set(struct led_classdev *led_cdev,if (value > samsung->kbd_led.max_brightness) value = samsung->kbd_led.max_brightness; -else if (value <0 ) - value =0 ; samsung->kbd_led_wk = value;queue_work (samsung->led_workqueue, &samsung->kbd_led_work);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 20/53 ALSA: usb-audio: Fix undefined behavior due to shift overflowing the constant
In reply to Greg Kroah-HartmanFrom: Borislav Petkov <[email protected]>
[ Upstream commit 1ef8715975de8bd481abbd0839ed4f49d9e5b0ff ]
Fix:
sound/usb/midi.c: In function ‘snd_usbmidi_out_endpoint_create’:
sound/usb/midi.c:1389:2: error: case label does not reduce to an integer constant
case USB_ID(0xfc08, 0x0101): /* Unknown vendor Cable */
^~~~See https://lore.kernel.org/r/YkwQ6%[email protected] for the gory details as to why it triggers with older gccs only.
[ A slight correction with parentheses around the argument by tiwai ]
--- sound/usb/usbaudio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/usb/usbaudio.h +1 -1
@@ -22,7 +22,7 @@*/ /* handling of USB vendor/product ID pairs as 32-bit numbers */ -#define USB_ID (vendor, product) (((vendor) << 16) | (product)) +#define USB_ID (vendor, product) (((unsigned int)(vendor) << 16) | (product))#define USB_ID_VENDOR (id) ((id) >> 16)#define USB_ID_PRODUCT (id) ((u16)(id))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 21/53 vxlan: fix error return code in vxlan_fdb_append
In reply to Greg Kroah-HartmanFrom: Hongbin Wang <[email protected]>
[ Upstream commit 7cea5560bf656b84f9ed01c0cc829d4eecd0640b ]
When kmalloc and dst_cache_init failed, should return ENOMEM rather than ENOBUFS.
--- drivers/net/vxlan.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/vxlan.c +2 -2
@@ -524,11 +524,11 @@ static int vxlan_fdb_append(struct vxlan_fdb *f, rd =kmalloc (sizeof (*rd),GFP_ATOMIC );if (rd ==NULL ) -return -ENOBUFS ; +return -ENOMEM ;if (dst_cache_init (&rd->dst_cache,GFP_ATOMIC )) {kfree (rd); -return -ENOBUFS ; +return -ENOMEM ; } rd->remote_ip = *ip;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 22/53 cifs: Check the IOCB_DIRECT flag, not O_DIRECT
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
[ Upstream commit 994fd530a512597ffcd713b0f6d5bc916c5698f0 ]
Use the IOCB_DIRECT indicator flag on the I/O context rather than checking to see if the file was opened O_DIRECT.
--- fs/cifs/cifsfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/cifs/cifsfs.c +1 -1
@@ -813,7 +813,7 @@ cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter)ssize_t rc;struct inode *inode =file_inode (iocb->ki_filp); -if (iocb->ki_filp->f_flags &O_DIRECT ) +if (iocb->ki_flags &IOCB_DIRECT )return cifs_user_readv (iocb, iter); rc =cifs_revalidate_mapping (inode);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 23/53 mt76: Fix undefined behavior due to shift overflowing the constant
In reply to Greg Kroah-HartmanFrom: Borislav Petkov <[email protected]>
[ Upstream commit dbc2b1764734857d68425468ffa8486e97ab89df ]
Fix:
drivers/net/wireless/mediatek/mt76/mt76x2/pci.c: In function ‘mt76x2e_probe’:
././include/linux/compiler_types.h:352:38: error: call to ‘__compiletime_assert_946’ \
declared with attribute error: FIELD_PREP: mask is not constant
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
See https://lore.kernel.org/r/YkwQ6%[email protected] for the gory details as to why it triggers with older gccs only.
--- drivers/net/wireless/mediatek/mt76/mt76x2_pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt76x2_pci.c +1 -1
@@ -73,7 +73,7 @@ mt76pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)mt76_rmw_field (dev,0x15a10 ,0x1f <<16 ,0x9 );/* RG_SSUSB_G1_CDR_BIC_LTR = 0xf */ -mt76_rmw_field (dev,0x15a0c ,0xf <<28 ,0xf ); +mt76_rmw_field (dev,0x15a0c ,0xfU <<28 ,0xf );/* RG_SSUSB_CDR_BR_PE1D = 0x3 */ mt76_rmw_field (dev,0x15c58 ,0x3 <<6 ,0x3 );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 24/53 brcmfmac: sdio: Fix undefined behavior due to shift overflowing the constant
In reply to Greg Kroah-HartmanFrom: Borislav Petkov <[email protected]>
[ Upstream commit 6fb3a5868b2117611f41e421e10e6a8c2a13039a ]
Fix:
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c: In function ‘brcmf_sdio_drivestrengthinit’:
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c:3798:2: error: case label does not reduce to an integer constant
case SDIOD_DRVSTR_KEY(BRCM_CC_43143_CHIP_ID, 17):
^~~~
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c:3809:2: error: case label does not reduce to an integer constant
case SDIOD_DRVSTR_KEY(BRCM_CC_43362_CHIP_ID, 13):
^~~~See https://lore.kernel.org/r/YkwQ6%[email protected] for the gory details as to why it triggers with older gccs only.
--- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +1 -1
@@ -560,7 +560,7 @@ enum brcmf_sdio_frmtype { BRCMF_SDIO_FT_SUB, }; -#define SDIOD_DRVSTR_KEY (chip, pmu) (((chip) << 16) | (pmu)) +#define SDIOD_DRVSTR_KEY (chip, pmu) (((unsigned int)(chip) << 16) | (pmu))/* SDIO Pad drive strength to select value mappings */ struct sdiod_drive_str {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 25/53 dpaa_eth: Fix missing of_node_put in dpaa_get_ts_info()
In reply to Greg Kroah-HartmanFrom: Lv Ruyi <[email protected]>
[ Upstream commit 1a7eb80d170c28be2928433702256fe2a0bd1e0f ]
Both of of_get_parent() and of_parse_phandle() return node pointer with refcount incremented, use of_node_put() on it to decrease refcount when done.
--- drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c +6 -2
@@ -530,11 +530,15 @@ static int dpaa_get_ts_info(struct net_device *net_dev, info->phc_index =-1 ; fman_node =of_get_parent (mac_node); -if (fman_node) +if (fman_node) { ptp_node =of_parse_phandle (fman_node,"ptimer-handle" ,0 ); +of_node_put (fman_node); + } -if (ptp_node) +if (ptp_node) { ptp_dev =of_find_device_by_node (ptp_node); +of_node_put (ptp_node); + }if (ptp_dev) ptp =platform_get_drvdata (ptp_dev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 26/53 drm/msm/mdp5: check the return of kzalloc()
In reply to Greg Kroah-HartmanFrom: Xiaoke Wang <[email protected]>
[ Upstream commit 047ae665577776b7feb11bd4f81f46627cff95e7 ]
kzalloc() is a memory allocation function which can return NULL when some internal memory errors happen. So it is better to check it to prevent potential wrong memory access.
Besides, since mdp5_plane_reset() is void type, so we should better set plane-state to NULL after releasing it.
Patchwork: https://patchwork.freedesktop.org/patch/481055/
--- drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c +3 -0
@@ -188,7 +188,10 @@ static void mdp5_plane_reset(struct drm_plane *plane)drm_framebuffer_unreference (plane->state->fb);kfree (to_mdp5_plane_state (plane->state)); + plane->state =NULL ; mdp5_state =kzalloc (sizeof (*mdp5_state),GFP_KERNEL ); +if (!mdp5_state) +return ;/* assign default blend parameters */ mdp5_state->alpha =255 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 27/53 net: macb: Restart tx only if queue pointer is lagging
In reply to Greg Kroah-HartmanFrom: Tomas Melin <[email protected]>
[ Upstream commit 5ad7f18cd82cee8e773d40cc7a1465a526f2615c ]
commit 4298388574da ("net: macb: restart tx after tx used bit read") added support for restarting transmission. Restarting tx does not work in case controller asserts TXUBR interrupt and TQBP is already at the end of the tx queue. In that situation, restarting tx will immediately cause assertion of another TXUBR interrupt. The driver will end up in an infinite interrupt loop which it cannot break out of.
For cases where TQBP is at the end of the tx queue, instead only clear TX_USED interrupt. As more data gets pushed to the queue, transmission will resume.
This issue was observed on a Xilinx Zynq-7000 based board. During stress test of the network interface,
driver would get stuck on interrupt loop within seconds or minutes causing CPU to stall.
--- drivers/net/ethernet/cadence/macb_main.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/ethernet/cadence/macb_main.c +8 -0
@@ -1364,6 +1364,7 @@ static void macb_tx_restart(struct macb_queue *queue)unsigned int head = queue->tx_head;unsigned int tail = queue->tx_tail;struct macb *bp = queue->bp; +unsigned int head_idx, tbqp;if (bp->caps &MACB_CAPS_ISR_CLEAR_ON_WRITE )queue_writel (queue,ISR ,MACB_BIT (TXUBR ));
@@ -1371,6 +1372,13 @@ static void macb_tx_restart(struct macb_queue *queue)if (head == tail)return ; + tbqp =queue_readl (queue,TBQP ) /macb_dma_desc_get_size (bp); + tbqp =macb_adj_dma_desc_idx (bp,macb_tx_ring_wrap (bp, tbqp)); + head_idx =macb_adj_dma_desc_idx (bp,macb_tx_ring_wrap (bp, head)); + +if (tbqp == head_idx) +return ; +macb_writel (bp,NCR ,macb_readl (bp,NCR ) |MACB_BIT (TSTART )); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 28/53 stat: fix inconsistency between struct stat and struct compat_stat
In reply to Greg Kroah-HartmanFrom: Mikulas Patocka <[email protected]>
[ Upstream commit 932aba1e169090357a77af18850a10c256b50819 ]
struct stat (defined in arch/x86/include/uapi/asm/stat.h) has 32-bit st_dev and st_rdev; struct compat_stat (defined in arch/x86/include/asm/compat.h) has 16-bit st_dev and st_rdev followed by a 16-bit padding.
This patch fixes struct compat_stat to match struct stat.
[ Historical note: the old x86 'struct stat' did have that 16-bit field
that the compat layer had kept around, but it was changes back in 2003 by "struct stat - support larger dev_t":
https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git/commit/?id=e95b2065677fe32512a597a79db94b77b90c968d
and back in those days, the x86_64 port was still new, and separate from the i386 code, and had already picked up the old version with a 16-bit st_dev field ]
Note that we can't change compat_dev_t because it is used by compat_loop_info.
Also, if the st_dev and st_rdev values are 32-bit, we don't have to use old_valid_dev to test if the value fits into them. This fixes -EOVERFLOW on filesystems that are on NVMe because NVMe uses the major number 259.
--- arch/x86/include/asm/compat.h | 6 ++---- fs/stat.c | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-)
arch/x86/include/asm/compat.h +2 -4
@@ -46,15 +46,13 @@ typedef u64 __attribute__((aligned(4))) compat_u64;typedef u32 compat_uptr_t ;struct compat_stat { -compat_dev_t st_dev; -u16 __pad1; +u32 st_dev;compat_ino_t st_ino;compat_mode_t st_mode;compat_nlink_t st_nlink;__compat_uid_t st_uid;__compat_gid_t st_gid; -compat_dev_t st_rdev; -u16 __pad2; +u32 st_rdev;u32 st_size;u32 st_blksize;u32 st_blocks;
fs/stat.c +10 -9
@@ -286,9 +286,6 @@ SYSCALL_DEFINE2(fstat, unsigned int, fd, struct __old_kernel_stat __user *, stat# define choose_32_64 (a,b) b#endif -#define valid_dev (x) choose_32_64(old_valid_dev(x),true) -#define encode_dev (x) choose_32_64(old_encode_dev,new_encode_dev)(x) -#ifndef INIT_STRUCT_STAT_PADDING # define INIT_STRUCT_STAT_PADDING (st) memset(&st, 0, sizeof(st))#endif
@@ -297,7 +294,9 @@ static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf) {struct stat tmp; -if (!valid_dev (stat->dev) || !valid_dev (stat->rdev)) +if (sizeof (tmp.st_dev) <4 && !old_valid_dev (stat->dev)) +return -EOVERFLOW ; +if (sizeof (tmp.st_rdev) <4 && !old_valid_dev (stat->rdev))return -EOVERFLOW ;#if BITS_PER_LONG ==32 if (stat->size >MAX_NON_LFS )
@@ -305,7 +304,7 @@ static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf)#endif INIT_STRUCT_STAT_PADDING (tmp); - tmp.st_dev =encode_dev (stat->dev); + tmp.st_dev =new_encode_dev (stat->dev); tmp.st_ino = stat->ino;if (sizeof (tmp.st_ino) <sizeof (stat->ino) && tmp.st_ino != stat->ino)return -EOVERFLOW ;
@@ -315,7 +314,7 @@ static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf)return -EOVERFLOW ;SET_UID (tmp.st_uid,from_kuid_munged (current_user_ns (), stat->uid));SET_GID (tmp.st_gid,from_kgid_munged (current_user_ns (), stat->gid)); - tmp.st_rdev =encode_dev (stat->rdev); + tmp.st_rdev =new_encode_dev (stat->rdev); tmp.st_size = stat->size; tmp.st_atime = stat->atime.tv_sec; tmp.st_mtime = stat->mtime.tv_sec;
@@ -588,11 +587,13 @@ static int cp_compat_stat(struct kstat *stat, struct compat_stat __user *ubuf) {struct compat_stat tmp; -if (!old_valid_dev (stat->dev) || !old_valid_dev (stat->rdev)) +if (sizeof (tmp.st_dev) <4 && !old_valid_dev (stat->dev)) +return -EOVERFLOW ; +if (sizeof (tmp.st_rdev) <4 && !old_valid_dev (stat->rdev))return -EOVERFLOW ;memset (&tmp,0 ,sizeof (tmp)); - tmp.st_dev =old_encode_dev (stat->dev); + tmp.st_dev =new_encode_dev (stat->dev); tmp.st_ino = stat->ino;if (sizeof (tmp.st_ino) <sizeof (stat->ino) && tmp.st_ino != stat->ino)return -EOVERFLOW ;
@@ -602,7 +603,7 @@ static int cp_compat_stat(struct kstat *stat, struct compat_stat __user *ubuf)return -EOVERFLOW ;SET_UID (tmp.st_uid,from_kuid_munged (current_user_ns (), stat->uid));SET_GID (tmp.st_gid,from_kgid_munged (current_user_ns (), stat->gid)); - tmp.st_rdev =old_encode_dev (stat->rdev); + tmp.st_rdev =new_encode_dev (stat->rdev);if ((u64 ) stat->size >MAX_NON_LFS )return -EOVERFLOW ; tmp.st_size = stat->size;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 29/53 ata: pata_marvell: Check the bmdma_addr beforing reading
In reply to Greg Kroah-HartmanFrom: Zheyu Ma <[email protected]>
commit aafa9f958342db36c17ac2a7f1b841032c96feb4 upstream.
Before detecting the cable type on the dma bar, the driver should check whether the 'bmdma_addr' is zero, which means the adapter does not support DMA, otherwise we will get the following error:
[ 5.146634] Bad IO access at port 0x1 (return inb(port)) [ 5.147206] WARNING: CPU: 2 PID: 303 at lib/iomap.c:44 ioread8+0x4a/0x60 [ 5.150856] RIP: 0010:ioread8+0x4a/0x60 [ 5.160238] Call Trace: [ 5.160470] <TASK> [ 5.160674] marvell_cable_detect+0x6e/0xc0 [pata_marvell] [ 5.161728] ata_eh_recover+0x3520/0x6cc0 [ 5.168075] ata_do_eh+0x49/0x3c0
--- drivers/ata/pata_marvell.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/ata/pata_marvell.c +2 -0
@@ -82,6 +82,8 @@ static int marvell_cable_detect(struct aswitch (ap->port_no) {case 0 : +if (!ap->ioaddr.bmdma_addr) +return ATA_CBL_PATA_UNK ;if (ioread8 (ap->ioaddr.bmdma_addr +1 ) &1 )return ATA_CBL_PATA40 ;return ATA_CBL_PATA80 ;
Greg Kroah-Hartman
maintainerPATCH 30/53 dma: at_xdmac: fix a missing check on list iterator
In reply to Greg Kroah-HartmanFrom: Xiaomeng Tong <[email protected]>
commit 206680c4e46b62fd8909385e0874a36952595b85 upstream.
The bug is here:
__func__, desc, &desc->tx_dma_desc.phys, ret, cookie, residue);
The list iterator 'desc' will point to a bogus position containing HEAD if the list is empty or no element is found. To avoid dev_dbg() prints a invalid address, use a new variable 'iter' as the list iterator, while use the origin variable 'desc' as a dedicated pointer to point to the found element.
--- drivers/dma/at_xdmac.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/dma/at_xdmac.c +7 -5
@@ -1390,7 +1390,7 @@ at_xdmac_tx_status(struct dma_chan *chan {struct at_xdmac_chan *atchan =to_at_xdmac_chan (chan);struct at_xdmac *atxdmac =to_at_xdmac (atchan->chan.device); -struct at_xdmac_desc *desc, *_desc; +struct at_xdmac_desc *desc, *_desc, *iter;struct list_head *descs_list;enum dma_status ret;int residue, retry;
@@ -1505,11 +1505,13 @@ at_xdmac_tx_status(struct dma_chan *chan* microblock. */ descs_list = &desc->descs_list; -list_for_each_entry_safe (desc, _desc, descs_list, desc_node) { - dwidth =at_xdmac_get_dwidth (desc->lld.mbr_cfg); - residue -= (desc->lld.mbr_ubc &0xffffff ) << dwidth; -if ((desc->lld.mbr_nda &0xfffffffc ) == cur_nda) +list_for_each_entry_safe (iter, _desc, descs_list, desc_node) { + dwidth =at_xdmac_get_dwidth (iter->lld.mbr_cfg); + residue -= (iter->lld.mbr_ubc &0xffffff ) << dwidth; +if ((iter->lld.mbr_nda &0xfffffffc ) == cur_nda) { + desc = iter;break ; + } } residue += cur_ubc << dwidth;
Greg Kroah-Hartman
maintainerPATCH 31/53 drm/panel/raspberrypi-touchscreen: Avoid NULL deref if not initialised
In reply to Greg Kroah-HartmanFrom: Dave Stevenson <[email protected]>
[ Upstream commit f92055ae0acb035891e988ce345d6b81a0316423 ]
If a call to rpi_touchscreen_i2c_write from rpi_touchscreen_probe fails before mipi_dsi_device_register_full is called, then in trying to log the error message if uses ts->dsi->dev when it is still NULL.
Use ts->i2c->dev instead, which is initialised earlier in probe.
--- drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +1 -1
@@ -233,7 +233,7 @@ static void rpi_touchscreen_i2c_write(struct rpi_touchscreen *ts, ret =i2c_smbus_write_byte_data (ts->i2c, reg, val);if (ret) -dev_err (&ts->dsi->dev,"I2C write failed: %d\n" , ret); +dev_err (&ts->i2c->dev,"I2C write failed: %d\n" , ret); }static int rpi_touchscreen_write (struct rpi_touchscreen *ts,u16 reg,u32 val)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 32/53 drm/panel/raspberrypi-touchscreen: Initialise the bridge in prepare
In reply to Greg Kroah-HartmanFrom: Dave Stevenson <[email protected]>
[ Upstream commit 5f18c0782b99e26121efa93d20b76c19e17aa1dd ]
The panel has a prepare call which is before video starts, and an enable call which is after.
The Toshiba bridge should be configured before video, so move the relevant power and initialisation calls to prepare.
--- drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +9 -2
@@ -269,7 +269,7 @@ static int rpi_touchscreen_noop(struct drm_panel *panel)return 0 ; } -static int rpi_touchscreen_enable (struct drm_panel *panel) +static int rpi_touchscreen_prepare (struct drm_panel *panel) {struct rpi_touchscreen *ts =panel_to_ts (panel);int i;
@@ -299,6 +299,13 @@ static int rpi_touchscreen_enable(struct drm_panel *panel)rpi_touchscreen_write (ts,DSI_STARTDSI ,0x01 );msleep (100 ); +return 0 ; +} + +static int rpi_touchscreen_enable (struct drm_panel *panel) +{ +struct rpi_touchscreen *ts =panel_to_ts (panel); +/* Turn on the backlight. */ rpi_touchscreen_i2c_write (ts,REG_PWM ,255 );
@@ -353,7 +360,7 @@ static int rpi_touchscreen_get_modes(struct drm_panel *panel)static const struct drm_panel_funcs rpi_touchscreen_funcs = { .disable = rpi_touchscreen_disable, .unprepare = rpi_touchscreen_noop, - .prepare = rpi_touchscreen_noop, + .prepare = rpi_touchscreen_prepare, .enable = rpi_touchscreen_enable, .get_modes = rpi_touchscreen_get_modes, };
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 33/53 powerpc/perf: Fix power9 event alternatives
In reply to Greg Kroah-HartmanFrom: Athira Rajeev <[email protected]>
[ Upstream commit 0dcad700bb2776e3886fe0a645a4bf13b1e747cd ]
When scheduling a group of events, there are constraint checks done to make sure all events can go in a group. Example, one of the criteria is that events in a group cannot use the same PMC. But platform specific PMU supports alternative event for some of the event codes. During perf_event_open(), if any event group doesn't match constraint check criteria, further lookup is done to find alternative event.
By current design, the array of alternatives events in PMU code is expected to be sorted by column 0. This is because in find_alternative() the return criteria is based on event code comparison. ie. "event < ev_alt[i][0])". This optimisation is there since find_alternative() can be called multiple times. In power9 PMU code, the alternative event array is not sorted properly and hence there is breakage in finding alternative events.
To work with existing logic, fix the alternative event array to be sorted by column 0 for power9-pmu.c
Results:
With alternative events, multiplexing can be avoided. That is, for example, in power9 PM_LD_MISS_L1 (0x3e054) has alternative event, PM_LD_MISS_L1_ALT (0x400f0). This is an identical event which can be programmed in a different PMC.
Before:
# perf stat -e r3e054,r300fc
Performance counter stats for 'system wide':
1057860 r3e054 (50.21%)
379 r300fc (49.79%)0.944329741 seconds time elapsed
Since both the events are using PMC3 in this case, they are multiplexed here.
After:
# perf stat -e r3e054,r300fc
Performance counter stats for 'system wide':
1006948 r3e054
182 r300fc--- arch/powerpc/perf/power9-pmu.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/powerpc/perf/power9-pmu.c +4 -4
@@ -143,11 +143,11 @@ int p9_dd22_bl_ev[] = {/* Table of alternatives, sorted by column 0 */ static const unsigned int power9_event_alternatives[][MAX_ALT ] = { - {PM_INST_DISP ,PM_INST_DISP_ALT }, - {PM_RUN_CYC_ALT ,PM_RUN_CYC }, - {PM_RUN_INST_CMPL_ALT ,PM_RUN_INST_CMPL }, - {PM_LD_MISS_L1 ,PM_LD_MISS_L1_ALT }, {PM_BR_2PATH ,PM_BR_2PATH_ALT }, + {PM_INST_DISP ,PM_INST_DISP_ALT }, + {PM_RUN_CYC_ALT ,PM_RUN_CYC }, + {PM_LD_MISS_L1 ,PM_LD_MISS_L1_ALT }, + {PM_RUN_INST_CMPL_ALT ,PM_RUN_INST_CMPL }, };static int power9_get_alternatives (u64 event,unsigned int flags,u64 alt[])
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 34/53 openvswitch: fix OOB access in reserve_sfa_size()
In reply to Greg Kroah-HartmanFrom: Paolo Valerio <[email protected]>
commit cefa91b2332d7009bc0be5d951d6cbbf349f90f8 upstream.
Given a sufficiently large number of actions, while copying and reserving memory for a new action of a new flow, if next_offset is greater than MAX_ACTIONS_BUFSIZE, the function reserve_sfa_size() does not return -EMSGSIZE as expected, but it allocates MAX_ACTIONS_BUFSIZE bytes increasing actions_len by req_size. This can then lead to an OOB write access, especially when further actions need to be copied.
Fix it by rearranging the flow action size check.
KASAN splat below:
==================================================================
BUG: KASAN: slab-out-of-bounds in reserve_sfa_size+0x1ba/0x380 [openvswitch] Write of size 65360 at addr ffff888147e4001c by task handler15/836 CPU: 1 PID: 836 Comm: handler15 Not tainted 5.18.0-rc1+ #27 ... Call Trace: <TASK> dump_stack_lvl+0x45/0x5a print_report.cold+0x5e/0x5db ? __lock_text_start+0x8/0x8 ? reserve_sfa_size+0x1ba/0x380 [openvswitch] kasan_report+0xb5/0x130 ? reserve_sfa_size+0x1ba/0x380 [openvswitch] kasan_check_range+0xf5/0x1d0 memcpy+0x39/0x60 reserve_sfa_size+0x1ba/0x380 [openvswitch] __add_action+0x24/0x120 [openvswitch] ovs_nla_add_action+0xe/0x20 [openvswitch] ovs_ct_copy_action+0x29d/0x1130 [openvswitch] ? __kernel_text_address+0xe/0x30 ? unwind_get_return_address+0x56/0xa0 ? create_prof_cpu_mask+0x20/0x20 ? ovs_ct_verify+0xf0/0xf0 [openvswitch] ? prep_compound_page+0x198/0x2a0 ? __kasan_check_byte+0x10/0x40 ? kasan_unpoison+0x40/0x70 ? ksize+0x44/0x60 ? reserve_sfa_size+0x75/0x380 [openvswitch] __ovs_nla_copy_actions+0xc26/0x2070 [openvswitch] ? __zone_watermark_ok+0x420/0x420 ? validate_set.constprop.0+0xc90/0xc90 [openvswitch] ? __alloc_pages+0x1a9/0x3e0 ? __alloc_pages_slowpath.constprop.0+0x1da0/0x1da0 ? unwind_next_frame+0x991/0x1e40 ? __mod_node_page_state+0x99/0x120 ? __mod_lruvec_page_state+0x2e3/0x470 ? __kasan_kmalloc_large+0x90/0xe0 ovs_nla_copy_actions+0x1b4/0x2c0 [openvswitch] ovs_flow_cmd_new+0x3cd/0xb10 [openvswitch] ...
--- net/openvswitch/flow_netlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/openvswitch/flow_netlink.c +1 -1
@@ -2316,7 +2316,7 @@ static struct nlattr *reserve_sfa_size(s new_acts_size =max (next_offset + req_size,ksize (*sfa) *2 );if (new_acts_size >MAX_ACTIONS_BUFSIZE ) { -if ((MAX_ACTIONS_BUFSIZE - next_offset) < req_size) { +if ((next_offset + req_size) >MAX_ACTIONS_BUFSIZE ) {OVS_NLERR (log,"Flow action size exceeds max %u" ,MAX_ACTIONS_BUFSIZE );return ERR_PTR (-EMSGSIZE );
Greg Kroah-Hartman
maintainerPATCH 35/53 ASoC: soc-dapm: fix two incorrect uses of list iterator
In reply to Greg Kroah-HartmanFrom: Xiaomeng Tong <[email protected]>
commit f730a46b931d894816af34a0ff8e4ad51565b39f upstream.
These two bug are here:
list_for_each_entry_safe_continue(w, n, list, power_list); list_for_each_entry_safe_continue(w, n, list, power_list);
After the list_for_each_entry_safe_continue() exits, the list iterator will always be a bogus pointer which point to an invalid struct objdect containing HEAD member. The funciton poniter 'w->event' will be a invalid value which can lead to a control-flow hijack if the 'w' can be controlled.
The original intention was to continue the outer list_for_each_entry_safe() loop with the same entry if w->event is NULL, but misunderstanding the meaning of list_for_each_entry_safe_continue().
So just add a 'continue;' to fix the bug.
--- sound/soc/soc-dapm.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
sound/soc/soc-dapm.c +2 -4
@@ -1635,8 +1635,7 @@ static void dapm_seq_run(struct snd_soc_switch (w->id) {case snd_soc_dapm_pre:if (!w->event) -list_for_each_entry_safe_continue (w, n, list, - power_list); +continue ;if (event ==SND_SOC_DAPM_STREAM_START ) ret = w->event(w,
@@ -1648,8 +1647,7 @@ static void dapm_seq_run(struct snd_soc_case snd_soc_dapm_post:if (!w->event) -list_for_each_entry_safe_continue (w, n, list, - power_list); +continue ;if (event ==SND_SOC_DAPM_STREAM_START ) ret = w->event(w,
Greg Kroah-Hartman
maintainerPATCH 36/53 e1000e: Fix possible overflow in LTR decoding
In reply to Greg Kroah-HartmanFrom: Sasha Neftin <[email protected]>
commit 04ebaa1cfddae5f240cc7404f009133bb0389a47 upstream.
When we decode the latency and the max_latency, u16 value may not fit the required size and could lead to the wrong LTR representation.
Scaling is represented as:
scale 0 - 1 (2^(5*0)) = 2^0 scale 1 - 32 (2^(5 *1))= 2^5 scale 2 - 1024 (2^(5 *2)) =2^10 scale 3 - 32768 (2^(5 *3)) =2^15 scale 4 - 1048576 (2^(5 *4)) = 2^20 scale 5 - 33554432 (2^(5 *4)) = 2^25
scale 4 and scale 5 required 20 and 25 bits respectively. scale 6 reserved.
Replace the u16 type with the u32 type and allow corrected LTR representation.
--- drivers/net/ethernet/intel/e1000e/ich8lan.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/e1000e/ich8lan.c +2 -2
@@ -995,8 +995,8 @@ static s32 e1000_platform_pm_pch_lpt(str {u32 reg = link << (E1000_LTRV_REQ_SHIFT +E1000_LTRV_NOSNOOP_SHIFT ) | link <<E1000_LTRV_REQ_SHIFT |E1000_LTRV_SEND ; -u16 max_ltr_enc_d =0 ;/* maximum LTR decoded by platform */ -u16 lat_enc_d =0 ;/* latency decoded */ +u32 max_ltr_enc_d =0 ;/* maximum LTR decoded by platform */ +u32 lat_enc_d =0 ;/* latency decoded */ u16 lat_enc =0 ;/* latency encoded */ if (link) {
Greg Kroah-Hartman
maintainerPATCH 37/53 ARC: entry: fix syscall_trace_exit argument
In reply to Greg Kroah-HartmanFrom: Sergey Matyukevich <[email protected]>
commit b1c6ecfdd06907554518ec384ce8e99889d15193 upstream.
Function syscall_trace_exit expects pointer to pt_regs. However r0 is also used to keep syscall return value. Restore pointer to pt_regs before calling syscall_trace_exit.
--- arch/arc/kernel/entry.S | 1 + 1 file changed, 1 insertion(+)
arch/arc/kernel/entry.S +1 -0
@@ -191,6 +191,7 @@ tracesys_exit: st r0, [sp, PT_r0] ; sys call return value in pt_regs ;POST Sys Call Ptrace Hook + mov r0, sp ; pt_regs needed bl @syscall_trace_exit b ret_from_exception ; NOT ret_from_system_call at is saves r0 which ; we'd done before calling post hook above
Greg Kroah-Hartman
maintainerPATCH 38/53 arm_pmu: Validate single/group leader events
In reply to Greg Kroah-HartmanFrom: Rob Herring <[email protected]>
commit e5c23779f93d45e39a52758ca593bd7e62e9b4be upstream.
In the case where there is only a cycle counter available (i.e. PMCR_EL0.N is 0) and an event other than CPU cycles is opened, the open should fail as the event can never possibly be scheduled. However, the event validation when an event is opened is skipped when the group leader is opened. Fix this by always validating the group leader events.
--- drivers/perf/arm_pmu.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/perf/arm_pmu.c +4 -6
@@ -321,6 +321,9 @@ validate_group(struct perf_event *event)if (!validate_event (event->pmu, &fake_pmu, leader))return -EINVAL ; +if (event == leader) +return 0 ; +for_each_sibling_event (sibling, leader) {if (!validate_event (event->pmu, &fake_pmu, sibling))return -EINVAL ;
@@ -418,12 +421,7 @@ __hw_perf_event_init(struct perf_event *local64_set (&hwc->period_left, hwc->sample_period); } -if (event->group_leader != event) { -if (validate_group (event) !=0 ) -return -EINVAL ; - } - -return 0 ; +return validate_group (event); }static int armpmu_event_init (struct perf_event *event)
Greg Kroah-Hartman
maintainerPATCH 39/53 ext4: fix symlink file size not match to file content
In reply to Greg Kroah-HartmanFrom: Ye Bin <[email protected]>
commit a2b0b205d125f27cddfb4f7280e39affdaf46686 upstream.
We got issue as follows:
[home]# fsck.ext4 -fn ram0yb
e2fsck 1.45.6 (20-Mar-2020)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Symlink /p3/d14/d1a/l3d (inode #3494) is invalid.
Clear? no
Entry 'l3d' in /p3/d14/d1a (3383) has an incorrect filetype (was 7, should be 0). Fix? no
As the symlink file size does not match the file content. If the writeback of the symlink data block failed, ext4_finish_bio() handles the end of IO. However this function fails to mark the buffer with BH_write_io_error and so when unmount does journal checkpoint it cannot detect the writeback error and will cleanup the journal. Thus we've lost the correct data in the journal area. To solve this issue, mark the buffer as BH_write_io_error in ext4_finish_bio().
--- fs/ext4/page-io.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/ext4/page-io.c +3 -1
@@ -105,8 +105,10 @@ static void ext4_finish_bio(struct bio *continue ; }clear_buffer_async_write (bh); -if (bio->bi_status) +if (bio->bi_status) { +set_buffer_write_io_error (bh);buffer_io_error (bh); + } }while ((bh = bh->b_this_page) != head);bit_spin_unlock (BH_Uptodate_Lock, &head->b_state);local_irq_restore (flags);
Greg Kroah-Hartman
maintainerPATCH 40/53 ext4: limit length to bitmap_maxbytes - blocksize in punch_hole
In reply to Greg Kroah-HartmanFrom: Tadeusz Struk <[email protected]>
commit 2da376228a2427501feb9d15815a45dbdbdd753e upstream.
Syzbot found an issue [1] in ext4_fallocate().
The C reproducer [2] calls fallocate(), passing size 0xffeffeff000ul, and offset 0x1000000ul, which, when added together exceed the bitmap_maxbytes for the inode. This triggers a BUG in ext4_ind_remove_space(). According to the comments in this function the 'end' parameter needs to be one block after the last block to be removed. In the case when the BUG is triggered it points to the last block. Modify the ext4_punch_hole() function and add constraint that caps the length to satisfy the one before laster block requirement.
--- fs/ext4/inode.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
fs/ext4/inode.c +10 -1
@@ -4314,7 +4314,8 @@ int ext4_punch_hole(struct inode *inode,struct super_block *sb = inode->i_sb;ext4_lblk_t first_block, stop_block;struct address_space *mapping = inode->i_mapping; -loff_t first_block_offset, last_block_offset; +loff_t first_block_offset, last_block_offset, max_length; +struct ext4_sb_info *sbi =EXT4_SB (inode->i_sb);handle_t *handle;unsigned int credits;int ret =0 ;
@@ -4360,6 +4361,14 @@ int ext4_punch_hole(struct inode *inode, offset; } +/* +* For punch hole the length + offset needs to be within one block +* before last range. Adjust the length if it goes beyond that limit. +*/ + max_length = sbi->s_bitmap_maxbytes - inode->i_sb->s_blocksize; +if (offset + length > max_length) + length = max_length - offset; +if (offset & (sb->s_blocksize -1 ) || (offset + length) & (sb->s_blocksize -1 )) {/*
Greg Kroah-Hartman
maintainerPATCH 41/53 ext4: fix overhead calculation to account for the reserved gdt blocks
In reply to Greg Kroah-HartmanFrom: Theodore Ts'o <[email protected]>
commit 10b01ee92df52c8d7200afead4d5e5f55a5c58b1 upstream.
The kernel calculation was underestimating the overhead by not taking into account the reserved gdt blocks. With this change, the overhead calculated by the kernel matches the overhead calculation in mke2fs.
--- fs/ext4/super.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/ext4/super.c +3 -1
@@ -3440,9 +3440,11 @@ static int count_overhead(struct super_bext4_fsblk_t first_block, last_block, b;ext4_group_t i, ngroups =ext4_get_groups_count (sb);int s, j, count =0 ; +int has_super =ext4_bg_has_super (sb, grp);if (!ext4_has_feature_bigalloc (sb)) -return (ext4_bg_has_super (sb, grp) +ext4_bg_num_gdb (sb, grp) + +return (has_super +ext4_bg_num_gdb (sb, grp) + + (has_super ?le16_to_cpu (sbi->s_es->s_reserved_gdt_blocks) :0 ) + sbi->s_itb_per_group +2 ); first_block = le32_to_cpu(sbi->s_es->s_first_data_block) +
Greg Kroah-Hartman
maintainerPATCH 42/53 ext4: force overhead calculation if the s_overhead_cluster makes no sense
In reply to Greg Kroah-HartmanFrom: Theodore Ts'o <[email protected]>
commit 85d825dbf4899a69407338bae462a59aa9a37326 upstream.
If the file system does not use bigalloc, calculating the overhead is cheap, so force the recalculation of the overhead so we don't have to trust the precalculated overhead in the superblock.
--- fs/ext4/super.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
fs/ext4/super.c +12 -3
@@ -4423,9 +4423,18 @@ no_journal:* Get the # of file system overhead blocks from the * superblock if present. */ -if (es->s_overhead_clusters) - sbi->s_overhead =le32_to_cpu (es->s_overhead_clusters); -else { + sbi->s_overhead =le32_to_cpu (es->s_overhead_clusters); +/* ignore the precalculated value if it is ridiculous */ +if (sbi->s_overhead >ext4_blocks_count (es)) + sbi->s_overhead =0 ; +/* +* If the bigalloc feature is not enabled recalculating the +* overhead doesn't take long, so we might as well just redo +* it to make sure we are using the correct value. +*/ +if (!ext4_has_feature_bigalloc (sb)) + sbi->s_overhead =0 ; +if (sbi->s_overhead ==0 ) { err =ext4_calculate_overhead (sb);if (err) goto failed_mount_wq;
Greg Kroah-Hartman
maintainerPATCH 43/53 staging: ion: Prevent incorrect reference counting behavour
In reply to Greg Kroah-HartmanSupply additional check in order to prevent unexpected results.
--- drivers/staging/android/ion/ion.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/staging/android/ion/ion.c +3 -0
@@ -140,6 +140,9 @@ static void *ion_buffer_kmap_get(structvoid *vaddr;if (buffer->kmap_cnt) { +if (buffer->kmap_cnt ==INT_MAX ) +return ERR_PTR (-EOVERFLOW ); + buffer->kmap_cnt++;return buffer->vaddr; }
Greg Kroah-Hartman
maintainerPATCH 44/53 block/compat_ioctl: fix range check in BLKGETSIZE
In reply to Greg Kroah-HartmanFrom: Khazhismel Kumykov <[email protected]>
commit ccf16413e520164eb718cf8b22a30438da80ff23 upstream.
kernel ulong and compat_ulong_t may not be same width. Use type directly to eliminate mismatches.
This would result in truncation rather than EFBIG for 32bit mode for large disks.
--- block/compat_ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/compat_ioctl.c +1 -1
@@ -391,7 +391,7 @@ long compat_blkdev_ioctl(struct file *fireturn 0 ;case BLKGETSIZE : size =i_size_read (bdev->bd_inode); -if ((size >>9 ) > ~0UL ) +if ((size >>9 ) > ~(compat_ulong_t )0 )return -EFBIG ;return compat_put_ulong (arg, size >>9 );
Greg Kroah-Hartman
maintainerPATCH 45/53 ax25: add refcount in ax25_dev to avoid UAF bugs
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit d01ffb9eee4af165d83b08dd73ebdf9fe94a519b upstream.
If we dereference ax25_dev after we call kfree(ax25_dev) in ax25_dev_device_down(), it will lead to concurrency UAF bugs. There are eight syscall functions suffer from UAF bugs, include ax25_bind(), ax25_release(), ax25_connect(), ax25_ioctl(), ax25_getname(), ax25_sendmsg(), ax25_getsockopt() and ax25_info_show().
One of the concurrency UAF can be shown as below:
(USE) | (FREE)
| ax25_device_event
| ax25_dev_device_down
ax25_bind | ...
... | kfree(ax25_dev)
ax25_fillin_cb() | ...
ax25_fillin_cb_from_dev() |
... |The root cause of UAF bugs is that kfree(ax25_dev) in ax25_dev_device_down() is not protected by any locks. When ax25_dev, which there are still pointers point to, is released, the concurrency UAF bug will happen.
This patch introduces refcount into ax25_dev in order to guarantee that there are no pointers point to it when ax25_dev is released.
--- include/net/ax25.h | 10 ++++++++++ net/ax25/af_ax25.c | 2 ++ net/ax25/ax25_dev.c | 12 ++++++++++-- net/ax25/ax25_route.c | 3 +++ 4 files changed, 25 insertions(+), 2 deletions(-)
include/net/ax25.h +10 -0
@@ -236,6 +236,7 @@ typedef struct ax25_dev {#if defined(CONFIG_AX25_DAMA_SLAVE ) || defined(CONFIG_AX25_DAMA_MASTER )ax25_dama_info dama;#endif +refcount_t refcount; } ax25_dev; typedef struct ax25_cb {
@@ -290,6 +291,15 @@ static __inline__ void ax25_cb_put(ax25_ } } +#define ax25_dev_hold (__ax25_dev) \ + refcount_inc(&((__ax25_dev)->refcount)) + +static __inline__void ax25_dev_put (ax25_dev *ax25_dev) +{ +if (refcount_dec_and_test (&ax25_dev->refcount)) { +kfree (ax25_dev); + } +}static inline __be16 ax25_type_trans (struct sk_buff *skb,struct net_device *dev) { skb->dev = dev;
net/ax25/af_ax25.c +2 -0
@@ -101,6 +101,7 @@ again:spin_unlock_bh (&ax25_list_lock);lock_sock (sk); s->ax25_dev =NULL ; +ax25_dev_put (ax25_dev);release_sock (sk);ax25_disconnect (s,ENETUNREACH );spin_lock_bh (&ax25_list_lock);
@@ -449,6 +450,7 @@ static int ax25_ctl_ioctl(const unsigned } out_put: +ax25_dev_put (ax25_dev);ax25_cb_put (ax25);return ret;
net/ax25/ax25_dev.c +10 -2
@@ -40,6 +40,7 @@ ax25_dev *ax25_addr_ax25dev(ax25_addressfor (ax25_dev = ax25_dev_list; ax25_dev !=NULL ; ax25_dev = ax25_dev->next)if (ax25cmp (addr, (ax25_address *)ax25_dev->dev->dev_addr) ==0 ) { res = ax25_dev; +ax25_dev_hold (ax25_dev); }spin_unlock_bh (&ax25_dev_lock);
@@ -59,6 +60,7 @@ void ax25_dev_device_up(struct net_devicreturn ; } +refcount_set (&ax25_dev->refcount,1 ); dev->ax25_ptr = ax25_dev; ax25_dev->dev = dev;dev_hold (dev);
@@ -86,6 +88,7 @@ void ax25_dev_device_up(struct net_devicspin_lock_bh (&ax25_dev_lock); ax25_dev->next = ax25_dev_list; ax25_dev_list = ax25_dev; +ax25_dev_hold (ax25_dev);spin_unlock_bh (&ax25_dev_lock);ax25_register_dev_sysctl (ax25_dev);
@@ -115,20 +118,22 @@ void ax25_dev_device_down(struct net_devif ((s = ax25_dev_list) == ax25_dev) { ax25_dev_list = s->next; +ax25_dev_put (ax25_dev);spin_unlock_bh (&ax25_dev_lock); dev->ax25_ptr =NULL ;dev_put (dev); -kfree (ax25_dev); +ax25_dev_put (ax25_dev);return ; }while (s !=NULL && s->next !=NULL ) {if (s->next == ax25_dev) { s->next = ax25_dev->next; +ax25_dev_put (ax25_dev);spin_unlock_bh (&ax25_dev_lock); dev->ax25_ptr =NULL ;dev_put (dev); -kfree (ax25_dev); +ax25_dev_put (ax25_dev);return ; }
@@ -136,6 +141,7 @@ void ax25_dev_device_down(struct net_dev }spin_unlock_bh (&ax25_dev_lock); dev->ax25_ptr =NULL ; +ax25_dev_put (ax25_dev); }int ax25_fwd_ioctl (unsigned int cmd,struct ax25_fwd_struct *fwd)
@@ -152,6 +158,7 @@ int ax25_fwd_ioctl(unsigned int cmd, strif (ax25_dev->forward !=NULL )return -EINVAL ; ax25_dev->forward = fwd_dev->dev; +ax25_dev_put (fwd_dev);break ;case SIOCAX25DELFWD :
@@ -164,6 +171,7 @@ int ax25_fwd_ioctl(unsigned int cmd, strreturn -EINVAL ; } +ax25_dev_put (ax25_dev);return 0 ; }
net/ax25/ax25_route.c +3 -0
@@ -119,6 +119,7 @@ static int __must_check ax25_rt_add(stru ax25_rt->dev = ax25_dev->dev; ax25_rt->digipeat =NULL ; ax25_rt->ip_mode =' ' ; +ax25_dev_put (ax25_dev);if (route->digi_count !=0 ) {if ((ax25_rt->digipeat =kmalloc (sizeof (ax25_digi),GFP_ATOMIC )) ==NULL ) {write_unlock_bh (&ax25_route_lock);
@@ -175,6 +176,7 @@ static int ax25_rt_del(struct ax25_route } } } +ax25_dev_put (ax25_dev);write_unlock_bh (&ax25_route_lock);return 0 ;
@@ -217,6 +219,7 @@ static int ax25_rt_opt(struct ax25_route } out: +ax25_dev_put (ax25_dev);write_unlock_bh (&ax25_route_lock);return err; }
Greg Kroah-Hartman
maintainerPATCH 46/53 ax25: fix reference count leaks of ax25_dev
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 87563a043cef044fed5db7967a75741cc16ad2b1 upstream.
The previous commit d01ffb9eee4a ("ax25: add refcount in ax25_dev to avoid UAF bugs") introduces refcount into ax25_dev, but there are reference leak paths in ax25_ctl_ioctl(), ax25_fwd_ioctl(), ax25_rt_add(), ax25_rt_del() and ax25_rt_opt().
This patch uses ax25_dev_put() and adjusts the position of ax25_addr_ax25dev() to fix reference cout leaks of ax25_dev.
--- include/net/ax25.h | 8 +++++--- net/ax25/af_ax25.c | 12 ++++++++---- net/ax25/ax25_dev.c | 24 +++++++++++++++++------- net/ax25/ax25_route.c | 16 +++++++++++----- 4 files changed, 41 insertions(+), 19 deletions(-)
include/net/ax25.h +5 -3
@@ -291,10 +291,12 @@ static __inline__ void ax25_cb_put(ax25_ } } -#define ax25_dev_hold (__ax25_dev) \ - refcount_inc(&((__ax25_dev)->refcount)) +static inline void ax25_dev_hold (ax25_dev *ax25_dev) +{ +refcount_inc (&ax25_dev->refcount); +} -static __inline__void ax25_dev_put (ax25_dev *ax25_dev) +static inline void ax25_dev_put (ax25_dev *ax25_dev) {if (refcount_dec_and_test (&ax25_dev->refcount)) {kfree (ax25_dev);
net/ax25/af_ax25.c +8 -4
@@ -369,21 +369,25 @@ static int ax25_ctl_ioctl(const unsignedif (copy_from_user (&ax25_ctl, arg,sizeof (ax25_ctl)))return -EFAULT ; -if ((ax25_dev =ax25_addr_ax25dev (&ax25_ctl.port_addr)) ==NULL ) -return -ENODEV ; -if (ax25_ctl.digi_count >AX25_MAX_DIGIS )return -EINVAL ;if (ax25_ctl.arg >ULONG_MAX /HZ && ax25_ctl.cmd !=AX25_KILL )return -EINVAL ; + ax25_dev =ax25_addr_ax25dev (&ax25_ctl.port_addr); +if (!ax25_dev) +return -ENODEV ; + digi.ndigi = ax25_ctl.digi_count;for (k =0 ; k < digi.ndigi; k++) digi.calls[k] = ax25_ctl.digi_addr[k]; -if ((ax25 =ax25_find_cb (&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) ==NULL ) + ax25 =ax25_find_cb (&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev); +if (!ax25) { +ax25_dev_put (ax25_dev);return -ENOTCONN ; + }switch (ax25_ctl.cmd) {case AX25_KILL :
net/ax25/ax25_dev.c +17 -7
@@ -88,8 +88,8 @@ void ax25_dev_device_up(struct net_devicspin_lock_bh (&ax25_dev_lock); ax25_dev->next = ax25_dev_list; ax25_dev_list = ax25_dev; -ax25_dev_hold (ax25_dev);spin_unlock_bh (&ax25_dev_lock); +ax25_dev_hold (ax25_dev);ax25_register_dev_sysctl (ax25_dev); }
@@ -118,8 +118,8 @@ void ax25_dev_device_down(struct net_devif ((s = ax25_dev_list) == ax25_dev) { ax25_dev_list = s->next; -ax25_dev_put (ax25_dev);spin_unlock_bh (&ax25_dev_lock); +ax25_dev_put (ax25_dev); dev->ax25_ptr =NULL ;dev_put (dev);ax25_dev_put (ax25_dev);
@@ -129,8 +129,8 @@ void ax25_dev_device_down(struct net_devwhile (s !=NULL && s->next !=NULL ) {if (s->next == ax25_dev) { s->next = ax25_dev->next; -ax25_dev_put (ax25_dev);spin_unlock_bh (&ax25_dev_lock); +ax25_dev_put (ax25_dev); dev->ax25_ptr =NULL ;dev_put (dev);ax25_dev_put (ax25_dev);
@@ -153,25 +153,35 @@ int ax25_fwd_ioctl(unsigned int cmd, strswitch (cmd) {case SIOCAX25ADDFWD : -if ((fwd_dev =ax25_addr_ax25dev (&fwd->port_to)) ==NULL ) + fwd_dev =ax25_addr_ax25dev (&fwd->port_to); +if (!fwd_dev) { +ax25_dev_put (ax25_dev);return -EINVAL ; -if (ax25_dev->forward !=NULL ) + } +if (ax25_dev->forward) { +ax25_dev_put (fwd_dev); +ax25_dev_put (ax25_dev);return -EINVAL ; + } ax25_dev->forward = fwd_dev->dev;ax25_dev_put (fwd_dev); +ax25_dev_put (ax25_dev);break ;case SIOCAX25DELFWD : -if (ax25_dev->forward ==NULL ) +if (!ax25_dev->forward) { +ax25_dev_put (ax25_dev);return -EINVAL ; + } ax25_dev->forward =NULL ; +ax25_dev_put (ax25_dev);break ;default : +ax25_dev_put (ax25_dev);return -EINVAL ; } -ax25_dev_put (ax25_dev);return 0 ; }
net/ax25/ax25_route.c +11 -5
@@ -78,11 +78,13 @@ static int __must_check ax25_rt_add(struax25_dev *ax25_dev;int i; -if ((ax25_dev =ax25_addr_ax25dev (&route->port_addr)) ==NULL ) -return -EINVAL ;if (route->digi_count >AX25_MAX_DIGIS )return -EINVAL ; + ax25_dev =ax25_addr_ax25dev (&route->port_addr); +if (!ax25_dev) +return -EINVAL ; +write_lock_bh (&ax25_route_lock); ax25_rt = ax25_route_list;
@@ -94,6 +96,7 @@ static int __must_check ax25_rt_add(struif (route->digi_count !=0 ) {if ((ax25_rt->digipeat =kmalloc (sizeof (ax25_digi),GFP_ATOMIC )) ==NULL ) {write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return -ENOMEM ; } ax25_rt->digipeat->lastrepeat =-1 ;
@@ -104,6 +107,7 @@ static int __must_check ax25_rt_add(stru } }write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return 0 ; } ax25_rt = ax25_rt->next;
@@ -111,6 +115,7 @@ static int __must_check ax25_rt_add(struif ((ax25_rt =kmalloc (sizeof (ax25_route),GFP_ATOMIC )) ==NULL ) {write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return -ENOMEM ; }
@@ -119,11 +124,11 @@ static int __must_check ax25_rt_add(stru ax25_rt->dev = ax25_dev->dev; ax25_rt->digipeat =NULL ; ax25_rt->ip_mode =' ' ; -ax25_dev_put (ax25_dev);if (route->digi_count !=0 ) {if ((ax25_rt->digipeat =kmalloc (sizeof (ax25_digi),GFP_ATOMIC )) ==NULL ) {write_unlock_bh (&ax25_route_lock);kfree (ax25_rt); +ax25_dev_put (ax25_dev);return -ENOMEM ; } ax25_rt->digipeat->lastrepeat =-1 ;
@@ -136,6 +141,7 @@ static int __must_check ax25_rt_add(stru ax25_rt->next = ax25_route_list; ax25_route_list = ax25_rt;write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return 0 ; }
@@ -176,8 +182,8 @@ static int ax25_rt_del(struct ax25_route } } } -ax25_dev_put (ax25_dev);write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return 0 ; }
@@ -219,8 +225,8 @@ static int ax25_rt_opt(struct ax25_route } out: -ax25_dev_put (ax25_dev);write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return err; }
Greg Kroah-Hartman
maintainerPATCH 47/53 ax25: fix UAF bugs of net_device caused by rebinding operation
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit feef318c855a361a1eccd880f33e88c460eb63b4 upstream.
The ax25_kill_by_device() will set s->ax25_dev = NULL and call ax25_disconnect() to change states of ax25_cb and sock, if we call ax25_bind() before ax25_kill_by_device().
However, if we call ax25_bind() again between the window of ax25_kill_by_device() and ax25_dev_device_down(), the values and states changed by ax25_kill_by_device() will be reassigned.
Finally, ax25_dev_device_down() will deallocate net_device. If we dereference net_device in syscall functions such as ax25_release(), ax25_sendmsg(), ax25_getsockopt(), ax25_getname() and ax25_info_show(), a UAF bug will occur.
One of the possible race conditions is shown below:
(USE) | (FREE)
ax25_bind() |
| ax25_kill_by_device()
ax25_bind() |
ax25_connect() | ...
| ax25_dev_device_down()
| ...
| dev_put_track(dev, ...) //FREE
ax25_release() | ...
ax25_send_control() |
alloc_skb() //USE |the corresponding fail log is shown below:
===============================================================
BUG: KASAN: use-after-free in ax25_send_control+0x43/0x210 ... Call Trace: ... ax25_send_control+0x43/0x210 ax25_release+0x2db/0x3b0 __sock_release+0x6d/0x120 sock_close+0xf/0x20 __fput+0x11f/0x420 ... Allocated by task 1283: ... __kasan_kmalloc+0x81/0xa0 alloc_netdev_mqs+0x5a/0x680 mkiss_open+0x6c/0x380 tty_ldisc_open+0x55/0x90 ... Freed by task 1969: ... kfree+0xa3/0x2c0 device_release+0x54/0xe0 kobject_put+0xa5/0x120 tty_ldisc_kill+0x3e/0x80 ...
In order to fix these UAF bugs caused by rebinding operation, this patch adds dev_hold_track() into ax25_bind() and corresponding dev_put_track() into ax25_kill_by_device().
[OP: backport to 4.19: adjust dev_put_track()->dev_put() and dev_hold_track()->dev_hold()]
--- net/ax25/af_ax25.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/ax25/af_ax25.c +4 -1
@@ -101,6 +101,7 @@ again:spin_unlock_bh (&ax25_list_lock);lock_sock (sk); s->ax25_dev =NULL ; +dev_put (ax25_dev->dev);ax25_dev_put (ax25_dev);release_sock (sk);ax25_disconnect (s,ENETUNREACH );
@@ -1125,8 +1126,10 @@ static int ax25_bind(struct socket *sock } } -if (ax25_dev !=NULL ) +if (ax25_dev) {ax25_fillin_cb (ax25, ax25_dev); +dev_hold (ax25_dev->dev); + } done:ax25_cb_add (ax25);
Greg Kroah-Hartman
maintainerPATCH 48/53 ax25: Fix refcount leaks caused by ax25_cb_del()
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 9fd75b66b8f68498454d685dc4ba13192ae069b0 upstream.
The previous commit d01ffb9eee4a ("ax25: add refcount in ax25_dev to avoid UAF bugs") and commit feef318c855a ("ax25: fix UAF bugs of net_device caused by rebinding operation") increase the refcounts of ax25_dev and net_device in ax25_bind() and decrease the matching refcounts in ax25_kill_by_device() in order to prevent UAF bugs, but there are reference count leaks.
The root cause of refcount leaks is shown below:
(Thread 1) | (Thread 2)
ax25_bind() |
... |
ax25_addr_ax25dev() |
ax25_dev_hold() //(1) |
... |
dev_hold_track() //(2) |
... | ax25_destroy_socket()
| ax25_cb_del()
| ...
| hlist_del_init() //(3)
|
|
(Thread 3) |
ax25_kill_by_device() |
... |
ax25_for_each(s, &ax25_list) { |
if (s->ax25_dev == ax25_dev) //(4) |
... |Firstly, we use ax25_bind() to increase the refcount of ax25_dev in position (1) and increase the refcount of net_device in position (2). Then, we use ax25_cb_del() invoked by ax25_destroy_socket() to delete ax25_cb in hlist in position (3) before calling ax25_kill_by_device(). Finally, the decrements of refcounts in ax25_kill_by_device() will not be executed, because no s->ax25_dev equals to ax25_dev in position (4).
This patch adds decrements of refcounts in ax25_release() and use lock_sock() to do synchronization. If refcounts decrease in ax25_release(), the decrements of refcounts in ax25_kill_by_device() will not be executed and vice versa.
--- net/ax25/af_ax25.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
net/ax25/af_ax25.c +11 -3
@@ -101,8 +101,10 @@ again:spin_unlock_bh (&ax25_list_lock);lock_sock (sk); s->ax25_dev =NULL ; -dev_put (ax25_dev->dev); -ax25_dev_put (ax25_dev); +if (sk->sk_socket) { +dev_put (ax25_dev->dev); +ax25_dev_put (ax25_dev); + }release_sock (sk);ax25_disconnect (s,ENETUNREACH );spin_lock_bh (&ax25_list_lock);
@@ -981,14 +983,20 @@ static int ax25_release(struct socket *s {struct sock *sk = sock->sk;ax25_cb *ax25; +ax25_dev *ax25_dev;if (sk ==NULL )return 0 ;sock_hold (sk); -sock_orphan (sk);lock_sock (sk); +sock_orphan (sk); ax25 =sk_to_ax25 (sk); + ax25_dev = ax25->ax25_dev; +if (ax25_dev) { +dev_put (ax25_dev->dev); +ax25_dev_put (ax25_dev); + }if (sk->sk_type ==SOCK_SEQPACKET ) {switch (ax25->state) {
Greg Kroah-Hartman
maintainerPATCH 49/53 ax25: fix UAF bug in ax25_send_control()
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 5352a761308397a0e6250fdc629bb3f615b94747 upstream.
There are UAF bugs in ax25_send_control(), when we call ax25_release() to deallocate ax25_dev. The possible race condition is shown below:
(Thread 1) | (Thread 2)
ax25_dev_device_up() //(1) |
| ax25_kill_by_device()
ax25_bind() //(2) |
ax25_connect() | ...
ax25->state = AX25_STATE_1 |
... | ax25_dev_device_down() //(3)(Thread 3) ax25_release() | ax25_dev_put() //(4) FREE | case AX25_STATE_1: | ax25_send_control() | alloc_skb() //USE |
The refcount of ax25_dev increases in position (1) and (2), and decreases in position (3) and (4). The ax25_dev will be freed before dereference sites in ax25_send_control().
The following is part of the report:
[ 102.297448] BUG: KASAN: use-after-free in ax25_send_control+0x33/0x210 [ 102.297448] Read of size 8 at addr ffff888009e6e408 by task ax25_close/602 [ 102.297448] Call Trace: [ 102.303751] ax25_send_control+0x33/0x210 [ 102.303751] ax25_release+0x356/0x450 [ 102.305431] __sock_release+0x6d/0x120 [ 102.305431] sock_close+0xf/0x20 [ 102.305431] __fput+0x11f/0x420 [ 102.305431] task_work_run+0x86/0xd0 [ 102.307130] get_signal+0x1075/0x1220 [ 102.308253] arch_do_signal_or_restart+0x1df/0xc00 [ 102.308253] exit_to_user_mode_prepare+0x150/0x1e0 [ 102.308253] syscall_exit_to_user_mode+0x19/0x50 [ 102.308253] do_syscall_64+0x48/0x90 [ 102.308253] entry_SYSCALL_64_after_hwframe+0x44/0xae [ 102.308253] RIP: 0033:0x405ae7
This patch defers the free operation of ax25_dev and net_device after all corresponding dereference sites in ax25_release() to avoid UAF.
--- net/ax25/af_ax25.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/ax25/af_ax25.c +4 -4
@@ -993,10 +993,6 @@ static int ax25_release(struct socket *ssock_orphan (sk); ax25 =sk_to_ax25 (sk); ax25_dev = ax25->ax25_dev; -if (ax25_dev) { -dev_put (ax25_dev->dev); -ax25_dev_put (ax25_dev); - }if (sk->sk_type ==SOCK_SEQPACKET ) {switch (ax25->state) {
@@ -1058,6 +1054,10 @@ static int ax25_release(struct socket *s sk->sk_state_change (sk);ax25_destroy_socket (ax25); } +if (ax25_dev) { +dev_put (ax25_dev->dev); +ax25_dev_put (ax25_dev); + } sock->sk =NULL ;release_sock (sk);
Greg Kroah-Hartman
maintainerPATCH 50/53 ax25: fix NPD bug in ax25_disconnect
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 7ec02f5ac8a5be5a3f20611731243dc5e1d9ba10 upstream.
The ax25_disconnect() in ax25_kill_by_device() is not protected by any locks, thus there is a race condition between ax25_disconnect() and ax25_destroy_socket(). when ax25->sk is assigned as NULL by ax25_destroy_socket(), a NULL pointer dereference bug will occur if site (1) or (2) dereferences ax25->sk.
ax25_kill_by_device() | ax25_release()
ax25_disconnect() | ax25_destroy_socket()
... |
if(ax25->sk != NULL) | ...
... | ax25->sk = NULL;
bh_lock_sock(ax25->sk); //(1) | ...
... |
bh_unlock_sock(ax25->sk); //(2)|This patch moves ax25_disconnect() into lock_sock(), which can synchronize with ax25_destroy_socket() in ax25_release().
Fail log:
===============================================================
BUG: kernel NULL pointer dereference, address: 0000000000000088 ... RIP: 0010:_raw_spin_lock+0x7e/0xd0 ... Call Trace: ax25_disconnect+0xf6/0x220 ax25_device_event+0x187/0x250 raw_notifier_call_chain+0x5e/0x70 dev_close_many+0x17d/0x230 rollback_registered_many+0x1f1/0x950 unregister_netdevice_queue+0x133/0x200 unregister_netdev+0x13/0x20
...
--- net/ax25/af_ax25.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ax25/af_ax25.c +1 -1
@@ -105,8 +105,8 @@ again:dev_put (ax25_dev->dev);ax25_dev_put (ax25_dev); } -release_sock (sk);ax25_disconnect (s,ENETUNREACH ); +release_sock (sk);spin_lock_bh (&ax25_list_lock);sock_put (sk);/* The entry could have been deleted from the
Greg Kroah-Hartman
maintainerPATCH 51/53 ax25: Fix NULL pointer dereferences in ax25 timers
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit fc6d01ff9ef03b66d4a3a23b46fc3c3d8cf92009 upstream.
The previous commit 7ec02f5ac8a5 ("ax25: fix NPD bug in ax25_disconnect") move ax25_disconnect into lock_sock() in order to prevent NPD bugs. But there are race conditions that may lead to null pointer dereferences in ax25_heartbeat_expiry(), ax25_t1timer_expiry(), ax25_t2timer_expiry(), ax25_t3timer_expiry() and ax25_idletimer_expiry(), when we use ax25_kill_by_device() to detach the ax25 device.
One of the race conditions that cause null pointer dereferences can be shown as below:
(Thread 1) | (Thread 2)
ax25_connect() |
ax25_std_establish_data_link() |
ax25_start_t1timer() |
mod_timer(&ax25->t1timer,..) |
| ax25_kill_by_device()
(wait a time) | ...
| s->ax25_dev = NULL; //(1)
ax25_t1timer_expiry() |
ax25->ax25_dev->values[..] //(2)| ...
... |We set null to ax25_cb->ax25_dev in position (1) and dereference the null pointer in position (2).
The corresponding fail log is shown below:
===============================================================
BUG: kernel NULL pointer dereference, address: 0000000000000050 CPU: 1 PID: 0 Comm: swapper/1 Not tainted 5.17.0-rc6-00794-g45690b7d0 RIP: 0010:ax25_t1timer_expiry+0x12/0x40 ... Call Trace: call_timer_fn+0x21/0x120 __run_timers.part.0+0x1ca/0x250 run_timer_softirq+0x2c/0x60 __do_softirq+0xef/0x2f3 irq_exit_rcu+0xb6/0x100 sysvec_apic_timer_interrupt+0xa2/0xd0
...
This patch moves ax25_disconnect() before s->ax25_dev = NULL and uses del_timer_sync() to delete timers in ax25_disconnect(). If ax25_disconnect() is called by ax25_kill_by_device() or ax25->ax25_dev is NULL, the reason in ax25_disconnect() will be equal to ENETUNREACH, it will wait all timers to stop before we set null to s->ax25_dev in ax25_kill_by_device().
--- net/ax25/af_ax25.c | 4 ++-- net/ax25/ax25_subr.c | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-)
net/ax25/af_ax25.c +2 -2
@@ -92,20 +92,20 @@ again: sk = s->sk;if (!sk) {spin_unlock_bh (&ax25_list_lock); - s->ax25_dev =NULL ;ax25_disconnect (s,ENETUNREACH ); + s->ax25_dev =NULL ;spin_lock_bh (&ax25_list_lock); goto again; }sock_hold (sk);spin_unlock_bh (&ax25_list_lock);lock_sock (sk); +ax25_disconnect (s,ENETUNREACH ); s->ax25_dev =NULL ;if (sk->sk_socket) {dev_put (ax25_dev->dev);ax25_dev_put (ax25_dev); } -ax25_disconnect (s,ENETUNREACH );release_sock (sk);spin_lock_bh (&ax25_list_lock);sock_put (sk);
net/ax25/ax25_subr.c +14 -6
@@ -264,12 +264,20 @@ void ax25_disconnect(ax25_cb *ax25, int {ax25_clear_queues (ax25); -if (!ax25->sk || !sock_flag (ax25->sk,SOCK_DESTROY )) -ax25_stop_heartbeat (ax25); -ax25_stop_t1timer (ax25); -ax25_stop_t2timer (ax25); -ax25_stop_t3timer (ax25); -ax25_stop_idletimer (ax25); +if (reason ==ENETUNREACH ) { +del_timer_sync (&ax25->timer); +del_timer_sync (&ax25->t1timer); +del_timer_sync (&ax25->t2timer); +del_timer_sync (&ax25->t3timer); +del_timer_sync (&ax25->idletimer); + }else { +if (!ax25->sk || !sock_flag (ax25->sk,SOCK_DESTROY )) +ax25_stop_heartbeat (ax25); +ax25_stop_t1timer (ax25); +ax25_stop_t2timer (ax25); +ax25_stop_t3timer (ax25); +ax25_stop_idletimer (ax25); + } ax25->state =AX25_STATE_0 ;
Greg Kroah-Hartman
maintainerPATCH 52/53 ax25: Fix UAF bugs in ax25 timers
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 82e31755e55fbcea6a9dfaae5fe4860ade17cbc0 upstream.
There are race conditions that may lead to UAF bugs in ax25_heartbeat_expiry(), ax25_t1timer_expiry(), ax25_t2timer_expiry(), ax25_t3timer_expiry() and ax25_idletimer_expiry(), when we call ax25_release() to deallocate ax25_dev.
One of the UAF bugs caused by ax25_release() is shown below:
(Thread 1) | (Thread 2)
ax25_dev_device_up() //(1) |
... | ax25_kill_by_device()
ax25_bind() //(2) |
ax25_connect() | ...
ax25_std_establish_data_link() |
ax25_start_t1timer() | ax25_dev_device_down() //(3)
mod_timer(&ax25->t1timer,..) |
| ax25_release()
(wait a time) | ...
| ax25_dev_put(ax25_dev) //(4)FREE
ax25_t1timer_expiry() |
ax25->ax25_dev->values[..] //USE| ...
... |We increase the refcount of ax25_dev in position (1) and (2), and decrease the refcount of ax25_dev in position (3) and (4). The ax25_dev will be freed in position (4) and be used in ax25_t1timer_expiry().
The fail log is shown below:
==============================================================
[ 106.116942] BUG: KASAN: use-after-free in ax25_t1timer_expiry+0x1c/0x60 [ 106.116942] Read of size 8 at addr ffff88800bda9028 by task swapper/0/0 [ 106.116942] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.17.0-06123-g0905eec574 [ 106.116942] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-14 [ 106.116942] Call Trace: ... [ 106.116942] ax25_t1timer_expiry+0x1c/0x60 [ 106.116942] call_timer_fn+0x122/0x3d0 [ 106.116942] __run_timers.part.0+0x3f6/0x520 [ 106.116942] run_timer_softirq+0x4f/0xb0 [ 106.116942] __do_softirq+0x1c2/0x651
...
This patch adds del_timer_sync() in ax25_release(), which could ensure that all timers stop before we deallocate ax25_dev.
--- net/ax25/af_ax25.c | 5 +++++ 1 file changed, 5 insertions(+)
net/ax25/af_ax25.c +5 -0
@@ -1055,6 +1055,11 @@ static int ax25_release(struct socket *sax25_destroy_socket (ax25); }if (ax25_dev) { +del_timer_sync (&ax25->timer); +del_timer_sync (&ax25->t1timer); +del_timer_sync (&ax25->t2timer); +del_timer_sync (&ax25->t3timer); +del_timer_sync (&ax25->idletimer);dev_put (ax25_dev->dev);ax25_dev_put (ax25_dev); }
Greg Kroah-Hartman
maintainerPATCH 53/53 Revert "net: micrel: fix KS8851_MLL Kconfig"
In reply to Greg Kroah-HartmanFrom: Marek Vasut <[email protected]>
This reverts commit 05b4c37fca84976ab9e3873d36fe53cd88d45408 which is commit c3efcedd272aa6dd5929e20cf902a52ddaa1197a upstream.
The upstream commit c3efcedd272a ("net: micrel: fix KS8851_MLL Kconfig") depends on e5f31552674e ("ethernet: fix PTP_1588_CLOCK dependencies") which is not part of Linux 4.19.y . Revert the aforementioned commit to prevent breakage in 4.19.y .
--- drivers/net/ethernet/micrel/Kconfig | 1 - 1 file changed, 1 deletion(-)
drivers/net/ethernet/micrel/Kconfig +0 -1
@@ -45,7 +45,6 @@ config KS8851 config KS8851_MLL tristate "Micrel KS8851 MLL" depends on HAS_IOMEM - depends on PTP_1588_CLOCK_OPTIONAL select MII ---help--- This platform driver is for Micrel KS8851 Address/data bus
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 28 Apr 2022 08:17:22 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.240-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v4.19:
10 builds: 10 pass, 0 fail
22 boots: 22 pass, 0 fail
40 tests: 40 pass, 0 failLinux version: 4.19.240-rc1-g5e5c9d690926
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra30-cardhu-a04Jon
Hi!
Quoted 7 lines
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 28 Apr 2022 08:17:22 +0000. Anything received after that time might be too late.
I still see problems on socfpga:
[ 1.227759] mmcblk0: p1 p2 p3 [ 1.269825] Micrel KSZ9031 Gigabit PHY stmmac-0:01: attached PHY driver [Micrel KSZ9031 Gigabit PHY] (mii_bus:phy_addr=stmmac-0:01, irq=POLL) [ 1.284600] socfpga-dwmac ff702000.ethernet eth0: No Safety Features support found [ 1.292374] socfpga-dwmac ff702000.ethernet eth0: registered PTP clock [ 1.299247] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready [ 5.444552] Unable to handle kernel NULL pointer dereference at virtual address 00000000 [ 5.452609] pgd = (ptrval) [ 5.455322] [00000000] *pgd=00000000 [ 5.458890] Internal error: Oops: 805 [#1] SMP ARM [ 5.463660] Modules linked in: [ 5.466708] CPU: 0 PID: 766 Comm: kworker/0:2 Not tainted 4.19.240-rc1-g5e5c9d690926 #1 [ 5.474674] Hardware name: Altera SOCFPGA [ 5.478679] Workqueue: events_power_efficient phy_state_machine [ 5.484579] PC is at socfpga_dwmac_fix_mac_speed+0x3c/0xbc [ 5.490044] LR is at arm_heavy_mb+0x2c/0x48 [ 5.494208] pc : [<c05d9a2c>] lr : [<c01182e8>] psr: 60000013 [ 5.500446] sp : ee84de58 ip : ee84de48 fp : ee84de7c [ 5.505648] r10: 00000001 r9 : ee8fb800 r8 : 00000000 [ 5.510848] r7 : 00000000 r6 : 000003e8 r5 : eebe4000 r4 : eeb0a880 [ 5.517343] r3 : 00000001 r2 : 00000730 r1 : 00000000 r0 : eeb0a880 [ 5.523842] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none [ 5.530945] Control: 10c5387d Table: 0000404a DAC: 00000051 [ 5.536665] Process kworker/0:2 (pid: 766, stack limit = 0x(ptrval)) [ 5.542989] Stack: (0xee84de58 to 0xee84e000) [ 5.547328] de40: ee8fb800 eebe4000 [ 5.555470] de60: eebe5000 eebe4538 00610c8c eebe4500 ee84deb4 ee84de80 c05cd084 c05d99fc [ 5.563613] de80: c07058f0 c018fabc eebe4000 ee8fb800 eebe4000 ee8fba90 00000000 00000000 [ 5.571756] dea0: c0c77830 00000000 ee84decc ee84deb8 c05baf3c c05ccef0 ee8fba64 ee8fb800 [ 5.579899] dec0: ee84def4 ee84ded0 c05b921c c05baf08 ee8fba64 ef1cda80 ef7d2fc0 ef7d6500 [ 5.588041] dee0: 00000000 c0c77830 ee84df34 ee84def8 c013e18c c05b8ee0 ef7d2fc0 ef7d2fc0 [ 5.596183] df00: 00000008 ef7d2fd8 c0c02d00 ef1cda80 ef1cda94 ef7d2fc0 00000008 ef7d2fd8 [ 5.604327] df20: c0c02d00 ef7d2fc0 ee84df74 ee84df38 c013f178 c013df74 c013f118 c09e2128 [ 5.612469] df40: c0c77250 ffffe000 ee84df74 ef375140 ef3b9900 00000000 ee84c000 ef1cda80 [ 5.620612] df60: c013f118 ef127e74 ee84dfac ee84df78 c0144ac8 c013f124 ef37515c ef37515c [ 5.628754] df80: ee84dfac ef3b9900 c014495c 00000000 00000000 00000000 00000000 00000000 [ 5.636896] dfa0: 00000000 ee84dfb0 c01010e8 c0144968 00000000 00000000 00000000 00000000 [ 5.645038] dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 5.653180] dfe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000 [ 5.661317] Backtrace: [ 5.663767] [<c05d99f0>] (socfpga_dwmac_fix_mac_speed) from [<c05cd084>] (stmmac_adjust_link+0x1a0/0x21c) [ 5.673294] r9:eebe4500 r8:00610c8c r7:eebe4538 r6:eebe5000 r5:eebe4000 r4:ee8fb800 [ 5.681009] [<c05ccee4>] (stmmac_adjust_link) from [<c05baf3c>] (phy_link_change+0x40/0x4c) [ 5.689323] r10:00000000 r9:c0c77830 r8:00000000 r7:00000000 r6:ee8fba90 r5:eebe4000 [ 5.697116] r4:ee8fb800 [ 5.699644] [<c05baefc>] (phy_link_change) from [<c05b921c>] (phy_state_machine+0x348/0x580) [ 5.708042] r5:ee8fb800 r4:ee8fba64 [ 5.711610] [<c05b8ed4>] (phy_state_machine) from [<c013e18c>] (process_one_work+0x224/0x518) [ 5.720098] r9:c0c77830 r8:00000000 r7:ef7d6500 r6:ef7d2fc0 r5:ef1cda80 r4:ee8fba64 [ 5.727811] [<c013df68>] (process_one_work) from [<c013f178>] (worker_thread+0x60/0x5ac) [ 5.735866] r10:ef7d2fc0 r9:c0c02d00 r8:ef7d2fd8 r7:00000008 r6:ef7d2fc0 r5:ef1cda94 [ 5.743658] r4:ef1cda80 [ 5.746187] [<c013f118>] (worker_thread) from [<c0144ac8>] (kthread+0x16c/0x174) [ 5.753551] r10:ef127e74 r9:c013f118 r8:ef1cda80 r7:ee84c000 r6:00000000 r5:ef3b9900 [ 5.761342] r4:ef375140 [ 5.763869] [<c014495c>] (kthread) from [<c01010e8>] (ret_from_fork+0x14/0x2c) [ 5.771057] Exception stack(0xee84dfb0 to 0xee84dff8) [ 5.776087] dfa0: 00000000 00000000 00000000 00000000 [ 5.784229] dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 5.792370] dfe0: 00000000 00000000 00000000 00000000 00000013 00000000 [ 5.798955] r10:00000000 r9:00000000 r8:00000000 r7:00000000 r6:00000000 r5:c014495c [ 5.806747] r4:ef3b9900 [ 5.809273] Code: e59394b8 f57ff04e ebecfa24 e3a03001 (e1c830b0) [ 5.815374] ---[ end trace 922ea6407635ba6b ]---
https://lava.ciplatform.org/scheduler/job/669257
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/jobs/2377419824
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Greg Kroah-Hartman
maintainerQuoted 76 lines · Pavel Machek
Hi!
Quoted 7 lines
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 28 Apr 2022 08:17:22 +0000. Anything received after that time might be too late.
I still see problems on socfpga:
[ 1.227759] mmcblk0: p1 p2 p3 [ 1.269825] Micrel KSZ9031 Gigabit PHY stmmac-0:01: attached PHY driver [Micrel KSZ9031 Gigabit PHY] (mii_bus:phy_addr=stmmac-0:01, irq=POLL) [ 1.284600] socfpga-dwmac ff702000.ethernet eth0: No Safety Features support found [ 1.292374] socfpga-dwmac ff702000.ethernet eth0: registered PTP clock [ 1.299247] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready [ 5.444552] Unable to handle kernel NULL pointer dereference at virtual address 00000000 [ 5.452609] pgd = (ptrval) [ 5.455322] [00000000] *pgd=00000000 [ 5.458890] Internal error: Oops: 805 [#1] SMP ARM [ 5.463660] Modules linked in: [ 5.466708] CPU: 0 PID: 766 Comm: kworker/0:2 Not tainted 4.19.240-rc1-g5e5c9d690926 #1 [ 5.474674] Hardware name: Altera SOCFPGA [ 5.478679] Workqueue: events_power_efficient phy_state_machine [ 5.484579] PC is at socfpga_dwmac_fix_mac_speed+0x3c/0xbc [ 5.490044] LR is at arm_heavy_mb+0x2c/0x48 [ 5.494208] pc : [<c05d9a2c>] lr : [<c01182e8>] psr: 60000013 [ 5.500446] sp : ee84de58 ip : ee84de48 fp : ee84de7c [ 5.505648] r10: 00000001 r9 : ee8fb800 r8 : 00000000 [ 5.510848] r7 : 00000000 r6 : 000003e8 r5 : eebe4000 r4 : eeb0a880 [ 5.517343] r3 : 00000001 r2 : 00000730 r1 : 00000000 r0 : eeb0a880 [ 5.523842] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none [ 5.530945] Control: 10c5387d Table: 0000404a DAC: 00000051 [ 5.536665] Process kworker/0:2 (pid: 766, stack limit = 0x(ptrval)) [ 5.542989] Stack: (0xee84de58 to 0xee84e000) [ 5.547328] de40: ee8fb800 eebe4000 [ 5.555470] de60: eebe5000 eebe4538 00610c8c eebe4500 ee84deb4 ee84de80 c05cd084 c05d99fc [ 5.563613] de80: c07058f0 c018fabc eebe4000 ee8fb800 eebe4000 ee8fba90 00000000 00000000 [ 5.571756] dea0: c0c77830 00000000 ee84decc ee84deb8 c05baf3c c05ccef0 ee8fba64 ee8fb800 [ 5.579899] dec0: ee84def4 ee84ded0 c05b921c c05baf08 ee8fba64 ef1cda80 ef7d2fc0 ef7d6500 [ 5.588041] dee0: 00000000 c0c77830 ee84df34 ee84def8 c013e18c c05b8ee0 ef7d2fc0 ef7d2fc0 [ 5.596183] df00: 00000008 ef7d2fd8 c0c02d00 ef1cda80 ef1cda94 ef7d2fc0 00000008 ef7d2fd8 [ 5.604327] df20: c0c02d00 ef7d2fc0 ee84df74 ee84df38 c013f178 c013df74 c013f118 c09e2128 [ 5.612469] df40: c0c77250 ffffe000 ee84df74 ef375140 ef3b9900 00000000 ee84c000 ef1cda80 [ 5.620612] df60: c013f118 ef127e74 ee84dfac ee84df78 c0144ac8 c013f124 ef37515c ef37515c [ 5.628754] df80: ee84dfac ef3b9900 c014495c 00000000 00000000 00000000 00000000 00000000 [ 5.636896] dfa0: 00000000 ee84dfb0 c01010e8 c0144968 00000000 00000000 00000000 00000000 [ 5.645038] dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 5.653180] dfe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000 [ 5.661317] Backtrace: [ 5.663767] [<c05d99f0>] (socfpga_dwmac_fix_mac_speed) from [<c05cd084>] (stmmac_adjust_link+0x1a0/0x21c) [ 5.673294] r9:eebe4500 r8:00610c8c r7:eebe4538 r6:eebe5000 r5:eebe4000 r4:ee8fb800 [ 5.681009] [<c05ccee4>] (stmmac_adjust_link) from [<c05baf3c>] (phy_link_change+0x40/0x4c) [ 5.689323] r10:00000000 r9:c0c77830 r8:00000000 r7:00000000 r6:ee8fba90 r5:eebe4000 [ 5.697116] r4:ee8fb800 [ 5.699644] [<c05baefc>] (phy_link_change) from [<c05b921c>] (phy_state_machine+0x348/0x580) [ 5.708042] r5:ee8fb800 r4:ee8fba64 [ 5.711610] [<c05b8ed4>] (phy_state_machine) from [<c013e18c>] (process_one_work+0x224/0x518) [ 5.720098] r9:c0c77830 r8:00000000 r7:ef7d6500 r6:ef7d2fc0 r5:ef1cda80 r4:ee8fba64 [ 5.727811] [<c013df68>] (process_one_work) from [<c013f178>] (worker_thread+0x60/0x5ac) [ 5.735866] r10:ef7d2fc0 r9:c0c02d00 r8:ef7d2fd8 r7:00000008 r6:ef7d2fc0 r5:ef1cda94 [ 5.743658] r4:ef1cda80 [ 5.746187] [<c013f118>] (worker_thread) from [<c0144ac8>] (kthread+0x16c/0x174) [ 5.753551] r10:ef127e74 r9:c013f118 r8:ef1cda80 r7:ee84c000 r6:00000000 r5:ef3b9900 [ 5.761342] r4:ef375140 [ 5.763869] [<c014495c>] (kthread) from [<c01010e8>] (ret_from_fork+0x14/0x2c) [ 5.771057] Exception stack(0xee84dfb0 to 0xee84dff8) [ 5.776087] dfa0: 00000000 00000000 00000000 00000000 [ 5.784229] dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 5.792370] dfe0: 00000000 00000000 00000000 00000000 00000013 00000000 [ 5.798955] r10:00000000 r9:00000000 r8:00000000 r7:00000000 r6:00000000 r5:c014495c [ 5.806747] r4:ef3b9900 [ 5.809273] Code: e59394b8 f57ff04e ebecfa24 e3a03001 (e1c830b0) [ 5.815374] ---[ end trace 922ea6407635ba6b ]---
Quoted 2 lines
https://lava.ciplatform.org/scheduler/job/669257
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/jobs/2377419824
Can you run git bisect?
Re: [PATCH 4.19 00/53] 4.19.240-rc1 review [net: ethernet: stmmac: fix altr_tse_pcs function when using a]
Hi!
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
...
Quoted 8 lines
Quoted 8 lines
I still see problems on socfpga:
[ 1.227759] mmcblk0: p1 p2 p3 [ 1.269825] Micrel KSZ9031 Gigabit PHY stmmac-0:01: attached PHY driver [Micrel KSZ9031 Gigabit PHY] (mii_bus:phy_addr=stmmac-0:01, irq=POLL) [ 1.284600] socfpga-dwmac ff702000.ethernet eth0: No Safety Features support found [ 1.292374] socfpga-dwmac ff702000.ethernet eth0: registered PTP clock [ 1.299247] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready [ 5.444552] Unable to handle kernel NULL pointer dereference at virtual address 00000000
...
Quoted 8 lines
Quoted 6 lines
[ 5.478679] Workqueue: events_power_efficient phy_state_machine [ 5.484579] PC is at socfpga_dwmac_fix_mac_speed+0x3c/0xbc [ 5.490044] LR is at arm_heavy_mb+0x2c/0x48https://lava.ciplatform.org/scheduler/job/669257
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/jobs/2377419824Can you run git bisect?
Not a bisect, but we guessed e2423aa174e6 was responsible, and tested it boots with that patch reverted.
Best regards,
Pavel
commit e2423aa174e6c3e9805e96db778245ba73cdd88c
net: ethernet: stmmac: fix altr_tse_pcs function when using a fixed-link
[ Upstream commit a6aaa00324240967272b451bfa772547bd576ee6 ]
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Greg Kroah-Hartman
maintainerRe: [PATCH 4.19 00/53] 4.19.240-rc1 review [net: ethernet: stmmac: fix altr_tse_pcs function when using a]
Quoted 31 lines · Pavel Machek
Hi!
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
...
Quoted 8 lines
Quoted 8 lines
I still see problems on socfpga:
[ 1.227759] mmcblk0: p1 p2 p3 [ 1.269825] Micrel KSZ9031 Gigabit PHY stmmac-0:01: attached PHY driver [Micrel KSZ9031 Gigabit PHY] (mii_bus:phy_addr=stmmac-0:01, irq=POLL) [ 1.284600] socfpga-dwmac ff702000.ethernet eth0: No Safety Features support found [ 1.292374] socfpga-dwmac ff702000.ethernet eth0: registered PTP clock [ 1.299247] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready [ 5.444552] Unable to handle kernel NULL pointer dereference at virtual address 00000000...
Quoted 8 lines
Quoted 6 lines
[ 5.478679] Workqueue: events_power_efficient phy_state_machine [ 5.484579] PC is at socfpga_dwmac_fix_mac_speed+0x3c/0xbc [ 5.490044] LR is at arm_heavy_mb+0x2c/0x48https://lava.ciplatform.org/scheduler/job/669257
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/jobs/2377419824Can you run git bisect?
Not a bisect, but we guessed
e2423aa174e6was responsible, and tested it boots with that patch reverted.Best regards,
Pavel
Quoted 7 lines
commit
e2423aa174e6c3e9805e96db778245ba73cdd88cnet: ethernet: stmmac: fix
altr_tse_pcsfunction when using a fixed-link[ Upstream commit
a6aaa00324240967272b451bfa772547bd576ee6]
Thanks, now reverted from 4.19.y, 4.14.y, and 4.9.y
greg k-h
Re: [PATCH 4.19 00/53] 4.19.240-rc1 review [net: ethernet: stmmac: fix altr_tse_pcs function when using a]
Quoted 34 lines · Greg Kroah-Hartman
Quoted 33 lines · Pavel Machek
Hi!
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
...
Quoted 8 lines
Quoted 8 lines
I still see problems on socfpga:
[ 1.227759] mmcblk0: p1 p2 p3 [ 1.269825] Micrel KSZ9031 Gigabit PHY stmmac-0:01: attached PHY driver [Micrel KSZ9031 Gigabit PHY] (mii_bus:phy_addr=stmmac-0:01, irq=POLL) [ 1.284600] socfpga-dwmac ff702000.ethernet eth0: No Safety Features support found [ 1.292374] socfpga-dwmac ff702000.ethernet eth0: registered PTP clock [ 1.299247] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready [ 5.444552] Unable to handle kernel NULL pointer dereference at virtual address 00000000...
Quoted 8 lines
Quoted 6 lines
[ 5.478679] Workqueue: events_power_efficient phy_state_machine [ 5.484579] PC is at socfpga_dwmac_fix_mac_speed+0x3c/0xbc [ 5.490044] LR is at arm_heavy_mb+0x2c/0x48https://lava.ciplatform.org/scheduler/job/669257
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/jobs/2377419824Can you run git bisect?
Not a bisect, but we guessed
e2423aa174e6was responsible, and tested it boots with that patch reverted.Best regards,
Pavelcommit
e2423aa174e6c3e9805e96db778245ba73cdd88c
Quoted 8 lines
Quoted 5 lines
net: ethernet: stmmac: fix
altr_tse_pcsfunction when using a fixed-link[ Upstream commit
a6aaa00324240967272b451bfa772547bd576ee6]Thanks, now reverted from 4.19.y, 4.14.y, and 4.9.y
I have fixed this with this patch that is in linux-next:
5fd1fe4807f9 ("net: ethernet: stmmac: fix write to sgmii_adapter_base")
Dinh
Re: [PATCH 4.19 00/53] 4.19.240-rc1 review [net: ethernet: stmmac: fix altr_tse_pcs function when using a]
In reply to Greg Kroah-HartmanHi!
Quoted 7 lines
Quoted 7 lines
Quoted 1 line
Can you run git bisect?
Not a bisect, but we guessed
e2423aa174e6was responsible, and tested it boots with that patch reverted.commit
e2423aa174e6c3e9805e96db778245ba73cdd88c
Quoted 7 lines
Quoted 5 lines
net: ethernet: stmmac: fix
altr_tse_pcsfunction when using a fixed-link[ Upstream commit
a6aaa00324240967272b451bfa772547bd576ee6]Thanks, now reverted from 4.19.y, 4.14.y, and 4.9.y
Thank you!
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 28 Apr 2022 08:17:22 +0000. Anything received after that time might be too late.
Build results:
total: 156 pass: 156 fail: 0 Qemu test results: total: 425 pass: 425 fail: 0
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 28 Apr 2022 08:17:22 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.240-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 28 Apr 2022 08:17:22 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.240-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
Tested on arm64 and x86 for 4.19.240-rc1,
Kernel repo:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Branch: linux-4.19.y
Version: 4.19.240-rc1
Commit: 5e5c9d690926bf43bc1405d163e02768a56c56dc
Compiler: gcc version 7.3.0 (GCC)
arm64:
--------------------------------------------------------------------
Testcase Result Summary:
total: 8960
passed: 8960
failed: 0
timeout: 0
--------------------------------------------------------------------
x86:
--------------------------------------------------------------------
Testcase Result Summary:
total: 8960
passed: 8960
failed: 0
timeout: 0
--------------------------------------------------------------------
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 28 Apr 2022 08:17:22 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.240-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 4.19.240-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git branch: linux-4.19.y
* git commit: 5e5c9d690926bf43bc1405d163e02768a56c56dc
* git describe: v4.19.239-54-g5e5c9d690926
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-4.19.y/build/v4.19.239-54-g5e5c9d690926
## Test Regressions (compared to v4.19.239)
No test regressions found.
## Metric Regressions (compared to v4.19.239)
No metric regressions found.
## Test Fixes (compared to v4.19.239)
No test fixes found.
## Metric Fixes (compared to v4.19.239)
No metric fixes found.
## Test result summary
total: 81844, pass: 65248, fail: 1145, skip: 13273, xfail: 2178
## Build Summary
* arm: 281 total, 275 passed, 6 failed
* arm64: 39 total, 39 passed, 0 failed
* dragonboard-410c: 1 total, 1 passed, 0 failed
* hi6220-hikey: 1 total, 1 passed, 0 failed
* i386: 19 total, 19 passed, 0 failed
* juno-r2: 1 total, 1 passed, 0 failed
* mips: 27 total, 27 passed, 0 failed
* powerpc: 60 total, 54 passed, 6 failed
* s390: 12 total, 12 passed, 0 failed
* sparc: 12 total, 12 passed, 0 failed
* x15: 1 total, 1 passed, 0 failed
* x86: 1 total, 1 passed, 0 failed
* x86_64: 38 total, 38 passed, 0 failed
## Test suites summary
* fwts
* igt-gpu-tools
* kselftest-android
* kselftest-arm64
* kselftest-bpf
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers
* kselftest-efivarfs
* kselftest-filesystems
* kselftest-firmware
* kselftest-fpu
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-vm
* kselftest-x86
* kselftest-zram
* kvm-unit-tests
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-controllers-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-open-posix-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-tracing-tests
* network-basic-tests
* packetdrill
* perf
* rcutorture
* ssuite
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.240 release. There are 53 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 28 Apr 2022 08:17:22 +0000. Anything received after that time might be too late.
Build test:
mips (gcc version 11.2.1 20220408): 63 configs -> no failure arm (gcc version 11.2.1 20220408): 116 configs -> no new failure arm64 (gcc version 11.2.1 20220408): 2 configs -> no failure x86_64 (gcc version 11.2.1 20220408): 4 configs -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
[1]. https://openqa.qa.codethink.co.uk/tests/1065
--
Regards
Sudip