summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/shared/can/grcan.c
diff options
context:
space:
mode:
authorMartin Aberg <maberg@gaisler.com>2017-03-13 12:44:58 +0100
committerDaniel Hellstrom <daniel@gaisler.com>2017-05-14 12:31:57 +0200
commitc297060b111701b2d16365485038e6cf80d279f2 (patch)
tree1983aa2000bcdc0f23de9faf616e8c232581d36e /c/src/lib/libbsp/sparc/shared/can/grcan.c
parentleon, grcan: use RTEMS 4.12 SMP interrupt lock (diff)
downloadrtems-c297060b111701b2d16365485038e6cf80d279f2.tar.bz2
leon, grcan: protect statistics on copy to user
Locking the stats structure when copying to user buffer ensures a consistent view to the user.
Diffstat (limited to 'c/src/lib/libbsp/sparc/shared/can/grcan.c')
-rw-r--r--c/src/lib/libbsp/sparc/shared/can/grcan.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/can/grcan.c b/c/src/lib/libbsp/sparc/shared/can/grcan.c
index 409e68bf72..003cecf54d 100644
--- a/c/src/lib/libbsp/sparc/shared/can/grcan.c
+++ b/c/src/lib/libbsp/sparc/shared/can/grcan.c
@@ -1612,13 +1612,16 @@ int grcan_set_rxcomplete(void *d, int complete)
int grcan_get_stats(void *d, struct grcan_stats *stats)
{
struct grcan_priv *pDev = d;
+ SPIN_IRQFLAGS(oldLevel);
FUNCDBG();
if ( !stats )
return -1;
+ SPIN_LOCK_IRQ(&pDev->devlock, oldLevel);
*stats = pDev->stats;
+ SPIN_UNLOCK_IRQ(&pDev->devlock, oldLevel);
return 0;
}