Skip to contentSkip to conversation

char:misc minor is overflowing

PATCH In review Nitin Gupta 2 participants 2 messages Dec 9, 2015 Char and misc drivers

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 char:misc minor is overflowing

Hi,

Is there any modification / improvement needed in this patch ?

------- Original Message -------
Sender : Shivnandan Kumar<[email protected]> Engineer/SRI-Noida-Advance Solutions - System 1 R&D Group/Samsung Electronics Date : Nov 20, 2015 15:35 (GMT+05:30)
Title : [PATCH] char:misc minor is overflowing

When a driver register as a misc driver and
it tries to allocate minor number dynamically.
Then there is a chance of minor number overflow.
The problem is that 64(DYNAMIC_MINORS) is not enough for dynamic minor number and if kernel defines 0-63 for dynamic minor number, it should be reserved. But,0-10 was used for other devices, for example 1 is reserved for PSMOUSE. I got the issue that misc_minors is 0x3FFFFFFFFFFFFFFF and so, value of variable 'i' in function misc_register becomes 62 and so misc_minors become 1.(Which was already reserved for PSMOUSE). This patch help to avoid the
above problem.

Signed-off-by shivnandan kumar

---

drivers/char/misc.c        |    5 ++---
include/linux/miscdevice.h |    1 +
2 files changed, 3 insertions(+), 3 deletions(-)
drivers/char/misc.c +0 -0
index 8069b36..1a6a640 100644
@@ -198,7 +198,7 @@ int misc_register(struct miscdevice * misc)

err = -EBUSY;
goto out;
}
- misc->minor = DYNAMIC_MINORS - i - 1;
+ misc->minor = DYNAMIC_MINORS - i - 1 + DYNAMIC_MINOR_START; set_bit(i, misc_minors);
} else {
struct miscdevice *c;
@@ -218,8 +218,7 @@ int misc_register(struct miscdevice * misc)
misc, misc->groups, "%s", misc->name);
if (IS_ERR(misc->this_device)) {
if (is_dynamic) {
- int i = DYNAMIC_MINORS - misc->minor - 1;
+ int i = DYNAMIC_MINORS - misc->minor - 1 + DYNAMIC_MINOR_START; if (i < DYNAMIC_MINORS && i >= 0)
clear_bit(i, misc_minors);
misc->minor = MISC_DYNAMIC_MINOR;

include/linux/miscdevice.h +0 -0
index 81f6e42..7aa931e 100644
@@ -19,6 +19,7 @@

#define APOLLO_MOUSE_MINOR 7 /* unused */
#define PC110PAD_MINOR 9 /* unused */
/*#define ADB_MOUSE_MINOR 10 FIXME OBSOLETE */
+#define DYNAMIC_MINOR_START 11
#define WATCHDOG_MINOR 130 /* Watchdog timer */
#define TEMP_MINOR 131 /* Temperature Sensor */
#define RTC_MINOR 135

Signature · 9 lines
1.7.9.5



 Nitin Gupta
 
Logix Cyber Park • Plot No. C 28-29, Tower D - Ground to 10th Floor, Tower C - 8th to  10th Floor, Sector 62 • Noida(U.P.)  201301 • INDIA 

                                                                                                                                                                         ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ¥Šwÿº{.nÇ+‰·¥Š{±þG«�éÿŠ{ayºʇڙë,j­¢f£¢·hš�ï�êÿ‘êçz_è®(­éšŽŠÝ¢j"�ú¶m§ÿÿ¾«þG«�éÿ¢¸?™¨è­Ú&£ø§~�á¶iO•æ¬z·švØ^¶m§ÿÿÃÿ¶ìÿ¢¸?–I¥
#1 lore raw
Quoted 9 lines · On Wed, 09 Dec 2015 12:51:33 +0000 (GMT) Nitin Gupta <[email protected]>…

Hi,

Is there any modification / improvement needed in this patch ?

------- Original Message -------
Sender : Shivnandan Kumar<[email protected]> Engineer/SRI-Noida-Advance Solutions - System 1 R&D Group/Samsung Electronics Date : Nov 20, 2015 15:35 (GMT+05:30)
Title : [PATCH] char:misc minor is overflowing

Quoted 4 lines

When a driver register as a misc driver and it tries to allocate minor number dynamically. Then there is a chance of minor number overflow. The problem is that 64(DYNAMIC_MINORS) is not enough

If you are allocating more than the odd minor number you shouldn't be using misc devices in the first place but should be using cdev_init/cdev_add/register_chrdev_region and friends.

So 64 really should never be "not enough". miscdevice is more historical than useful and really goes back to the days long before all the region allocators existed.

Alan