Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51abf45c authored by Salah Triki's avatar Salah Triki Committed by Greg Kroah-Hartman
Browse files

staging: dgnc: take a lock when storing value in dgnc_poll_tick



Reads of dgnc_poll_tick are protected by dgnc_poll_lock spinlock, but the write
to dgnc_poll_tick is not. It could theoretically race.

Signed-off-by: default avatarSalah Triki <salah.triki@acm.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6d99d6a3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ static const struct file_operations dgnc_BoardFops = {
uint			dgnc_NumBoards;
struct dgnc_board		*dgnc_Board[MAXBOARDS];
DEFINE_SPINLOCK(dgnc_global_lock);
DEFINE_SPINLOCK(dgnc_poll_lock); /* Poll scheduling lock */
uint			dgnc_Major;
int			dgnc_poll_tick = 20;	/* Poll interval - 20 ms */

@@ -74,7 +75,6 @@ static struct class *dgnc_class;
/*
 * Poller stuff
 */
static DEFINE_SPINLOCK(dgnc_poll_lock); /* Poll scheduling lock */
static ulong		dgnc_poll_time; /* Time of next poll */
static uint		dgnc_poll_stop; /* Used to tell poller to stop */
static struct timer_list dgnc_poll_timer;
+1 −0
Original line number Diff line number Diff line
@@ -390,6 +390,7 @@ struct channel_t {
extern uint		dgnc_Major;		/* Our driver/mgmt major */
extern int		dgnc_poll_tick;		/* Poll interval - 20 ms */
extern spinlock_t	dgnc_global_lock;	/* Driver global spinlock */
extern spinlock_t	dgnc_poll_lock;		/* Poll scheduling lock */
extern uint		dgnc_NumBoards;		/* Total number of boards */
extern struct dgnc_board	*dgnc_Board[MAXBOARDS];	/* Array of board structs */

+8 −1
Original line number Diff line number Diff line
@@ -56,11 +56,18 @@ static ssize_t dgnc_driver_pollrate_show(struct device_driver *ddp, char *buf)
static ssize_t dgnc_driver_pollrate_store(struct device_driver *ddp,
					  const char *buf, size_t count)
{
	unsigned long flags;
	int tick;
	int ret;

	ret = sscanf(buf, "%d\n", &dgnc_poll_tick);
	ret = sscanf(buf, "%d\n", &tick);
	if (ret != 1)
		return -EINVAL;

	spin_lock_irqsave(&dgnc_poll_lock, flags);
	dgnc_poll_tick = tick;
	spin_unlock_irqrestore(&dgnc_poll_lock, flags);

	return count;
}
static DRIVER_ATTR(pollrate, (S_IRUSR | S_IWUSR), dgnc_driver_pollrate_show,