diff mbox series

watchdog: Device must be opened for writing

Message ID 20210814191345.27221-1-ginermail@gmail.com (mailing list archive)
State Rejected
Headers show
Series watchdog: Device must be opened for writing | expand

Commit Message

Stanislav German-Evtushenko Aug. 14, 2021, 7:13 p.m. UTC
If userspace opens the watchdog device self-feeding stops. Sometimes
opening the device happens by accident, e.g. by mistakenly running grep
recursively in a wrong directory which leads to the server being reset.

Watchdog device does not handle read operation therefore the issue can be
prevented by requiring the device to be opened for writing:

- Prevent opening the device without FMODE_WRITE

Signed-off-by: Stanislav German-Evtushenko <ginermail@gmail.com>
---
 drivers/watchdog/watchdog_dev.c | 4 ++++
 1 file changed, 4 insertions(+)


base-commit: cf813c67d9619fd474c785698cbed543b94209dd

Comments

Guenter Roeck Aug. 14, 2021, 7:56 p.m. UTC | #1
On Sun, Aug 15, 2021 at 04:13:45AM +0900, Stanislav German-Evtushenko wrote:
> If userspace opens the watchdog device self-feeding stops. Sometimes
> opening the device happens by accident, e.g. by mistakenly running grep
> recursively in a wrong directory which leads to the server being reset.
> 
> Watchdog device does not handle read operation therefore the issue can be
> prevented by requiring the device to be opened for writing:
> 
> - Prevent opening the device without FMODE_WRITE
> 
> Signed-off-by: Stanislav German-Evtushenko <ginermail@gmail.com>

NACK. That would be a major undocumented ABI change. Opening /dev/watchdog
for reading can be and is used today to test a watchdog.

Guenter

> ---
>  drivers/watchdog/watchdog_dev.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
> index 3bab32485273..28b88542a4d0 100644
> --- a/drivers/watchdog/watchdog_dev.c
> +++ b/drivers/watchdog/watchdog_dev.c
> @@ -835,6 +835,10 @@ static int watchdog_open(struct inode *inode, struct file *file)
>  	bool hw_running;
>  	int err;
>  
> +	/* Must be open for writing */
> +	if (!(file->f_mode & FMODE_WRITE))
> +		return -EINVAL;
> +
>  	/* Get the corresponding watchdog device */
>  	if (imajor(inode) == MISC_MAJOR)
>  		wd_data = old_wd_data;
> 
> base-commit: cf813c67d9619fd474c785698cbed543b94209dd
> -- 
> 2.25.1
>
Guenter Roeck Aug. 15, 2021, 1:33 a.m. UTC | #2
On 8/14/21 5:19 PM, Stanislav German-Evtushenko wrote:
> On Saturday, August 14, 2021, Guenter Roeck <linux@roeck-us.net <mailto:linux@roeck-us.net>> wrote:
>  > On Sun, Aug 15, 2021 at 04:13:45AM +0900, Stanislav German-Evtushenko wrote:
>  >> If userspace opens the watchdog device self-feeding stops. Sometimes
>  >> opening the device happens by accident, e.g. by mistakenly running grep
>  >> recursively in a wrong directory which leads to the server being reset.
>  >>
>  >> Watchdog device does not handle read operation therefore the issue can be
>  >> prevented by requiring the device to be opened for writing:
>  >>
>  >> - Prevent opening the device without FMODE_WRITE
>  >>
>  >> Signed-off-by: Stanislav German-Evtushenko <ginermail@gmail.com <mailto:ginermail@gmail.com>>
>  >
>  > NACK. That would be a major undocumented ABI change. Opening /dev/watchdog
>  > for reading can be and is used today to test a watchdog.
>  >
>  > Guenter
>  >
> 
> I see. This is unfortunate.
> 
> In this case I'll try to find the right place in the documentation and make it more explicit unless it is already there and I've overlooked.
> 
No. That isn't the point. This is used and must not be changed.
Again, people (including me( are _using_ this to test watchdogs.
We are not going to disable that because some people are not
careful when executing commands as root.

Guenter
Stanislav German-Evtushenko Aug. 15, 2021, 4:32 a.m. UTC | #3
On 8/15/21, Guenter Roeck <linux@roeck-us.net> wrote:
> On 8/14/21 5:19 PM, Stanislav German-Evtushenko wrote:
>> On Saturday, August 14, 2021, Guenter Roeck <linux@roeck-us.net
>> <mailto:linux@roeck-us.net>> wrote:
>>  > On Sun, Aug 15, 2021 at 04:13:45AM +0900, Stanislav German-Evtushenko
>> wrote:
>>  >> If userspace opens the watchdog device self-feeding stops. Sometimes
>>  >> opening the device happens by accident, e.g. by mistakenly running
>> grep
>>  >> recursively in a wrong directory which leads to the server being
>> reset.
>>  >>
>>  >> Watchdog device does not handle read operation therefore the issue can
>> be
>>  >> prevented by requiring the device to be opened for writing:
>>  >>
>>  >> - Prevent opening the device without FMODE_WRITE
>>  >>
>>  >> Signed-off-by: Stanislav German-Evtushenko <ginermail@gmail.com
>> <mailto:ginermail@gmail.com>>
>>  >
>>  > NACK. That would be a major undocumented ABI change. Opening
>> /dev/watchdog
>>  > for reading can be and is used today to test a watchdog.
>>  >
>>  > Guenter
>>  >
>>
>> I see. This is unfortunate.
>>
>> In this case I'll try to find the right place in the documentation and
>> make it more explicit unless it is already there and I've overlooked.
>>
> No. That isn't the point. This is used and must not be changed.
> Again, people (including me( are _using_ this to test watchdogs.
> We are not going to disable that because some people are not
> careful when executing commands as root.
>
> Guenter
>

I mean I would describe the existing behavior as this is not obvious.

As for testing, opening for writing is not harder than for reading but
I understand that it would be a breaking change now.
diff mbox series

Patch

diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
index 3bab32485273..28b88542a4d0 100644
--- a/drivers/watchdog/watchdog_dev.c
+++ b/drivers/watchdog/watchdog_dev.c
@@ -835,6 +835,10 @@  static int watchdog_open(struct inode *inode, struct file *file)
 	bool hw_running;
 	int err;
 
+	/* Must be open for writing */
+	if (!(file->f_mode & FMODE_WRITE))
+		return -EINVAL;
+
 	/* Get the corresponding watchdog device */
 	if (imajor(inode) == MISC_MAJOR)
 		wd_data = old_wd_data;