Skip to contentSkip to conversation

strtok --> strsep in framebuffer drivers (part 2)

PATCH In review René Scharfe 4 participants 7 messages Oct 24, 2001 – Oct 29, 2001 Framebuffer layer

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 strtok --> strsep in framebuffer drivers (part 2)

Hello,

I just noticed two framebuffer drivers with strtok calls that somehow passed below my radar (cscope). Patch below converts them, too. And it re-adds "ignore empty tokens" functionalty, which I forgot about the last time. Please apply.

René

drivers/video/amifb.c renamed from linux-2.4.13-pre6/drivers/video/amifb.c +2 -0
diff -Nur ../linux-2.4.13-pre6/drivers/video/amifb.c ./drivers/video/amifb.c
@@ -1193,6 +1193,8 @@
 		return 0;
 
 	while (this_opt = strsep(&options, ",")) {
+		if (!*this_opt)
+			continue;
 		if (!strcmp(this_opt, "inverse")) {
 			amifb_inverse = 1;
 			fb_invert_cmaps();
drivers/video/atafb.c renamed from linux-2.4.13-pre6/drivers/video/atafb.c +1 -1
diff -Nur ../linux-2.4.13-pre6/drivers/video/atafb.c ./drivers/video/atafb.c
@@ -2899,7 +2899,7 @@
     if (!options || !*options)
 		return 0;
      
-    for(this_opt=strtok(options,","); this_opt; this_opt=strtok(NULL,",")) {
+    while (this_opt = strsep(&options, ",")) {
 	if (!*this_opt) continue;
 	if ((temp=get_video_mode(this_opt)))
 		default_par=temp;
drivers/video/aty/atyfb_base.c renamed from linux-2.4.13-pre6/drivers/video/aty/atyfb_base.c +2 -0
diff -Nur ../linux-2.4.13-pre6/drivers/video/aty/atyfb_base.c ./drivers/video/aty/atyfb_base.c
@@ -2522,6 +2522,8 @@
 	return 0;
 
     while (this_opt = strsep(&options, ",")) {
+	if (!*this_opt)
+		continue;
 	if (!strncmp(this_opt, "font:", 5)) {
 		char *p;
 		int i;
drivers/video/aty128fb.c renamed from linux-2.4.13-pre6/drivers/video/aty128fb.c +2 -0
diff -Nur ../linux-2.4.13-pre6/drivers/video/aty128fb.c ./drivers/video/aty128fb.c
@@ -1614,6 +1614,8 @@
 	return 0;
 
     while (this_opt = strsep(&options, ",")) {
+	if (!*this_opt)
+	    continue;
 	if (!strncmp(this_opt, "font:", 5)) {
 	    char *p;
 	    int i;
drivers/video/clgenfb.c renamed from linux-2.4.13-pre6/drivers/video/clgenfb.c +1 -2
diff -Nur ../linux-2.4.13-pre6/drivers/video/clgenfb.c ./drivers/video/clgenfb.c
@@ -2817,8 +2817,7 @@
 	if (!options || !*options)
 		return 0;
 
-	for (this_opt = strtok (options, ","); this_opt != NULL;
-	     this_opt = strtok (NULL, ",")) {
+	while (this_opt = strsep (&options, ",")) {
 		if (!*this_opt) continue;
 
 		DPRINTK("clgenfb_setup: option '%s'\n", this_opt);
drivers/video/cyberfb.c renamed from linux-2.4.13-pre6/drivers/video/cyberfb.c +2 -0
diff -Nur ../linux-2.4.13-pre6/drivers/video/cyberfb.c ./drivers/video/cyberfb.c
@@ -1023,6 +1023,8 @@
 	}
 
 	while (this_opt = strsep(&options, ",")) {
+		if (!*this_opt)
+			continue;
 		if (!strcmp(this_opt, "inverse")) {
 			Cyberfb_inverse = 1;
 			fb_invert_cmaps();
drivers/video/radeonfb.c renamed from linux-2.4.13-pre6/drivers/video/radeonfb.c +2 -0
diff -Nur ../linux-2.4.13-pre6/drivers/video/radeonfb.c ./drivers/video/radeonfb.c
@@ -538,6 +538,8 @@
                 return 0;
  
 	while (this_opt = strsep (&options, ",")) {
+		if (!*this_opt)
+			continue;
                 if (!strncmp (this_opt, "font:", 5)) {
                         char *p;
                         int i;
drivers/video/retz3fb.c renamed from linux-2.4.13-pre6/drivers/video/retz3fb.c +2 -0
diff -Nur ../linux-2.4.13-pre6/drivers/video/retz3fb.c ./drivers/video/retz3fb.c
@@ -1349,6 +1349,8 @@
 		return 0;
 
 	while (this_opt = strsep(&options, ",")) {
+		if (!*this_opt)
+			continue;
 		if (!strcmp(this_opt, "inverse")) {
 			z3fb_inverse = 1;
 			fb_invert_cmaps();
drivers/video/riva/fbdev.c renamed from linux-2.4.13-pre6/drivers/video/riva/fbdev.c +2 -0
diff -Nur ../linux-2.4.13-pre6/drivers/video/riva/fbdev.c ./drivers/video/riva/fbdev.c
@@ -2046,6 +2046,8 @@
 		return 0;
 
 	while (this_opt = strsep(&options, ",")) {
+		if (!*this_opt)
+			continue;
 		if (!strncmp(this_opt, "font:", 5)) {
 			char *p;
 			int i;
drivers/video/tdfxfb.c renamed from linux-2.4.13-pre6/drivers/video/tdfxfb.c +2 -0
diff -Nur ../linux-2.4.13-pre6/drivers/video/tdfxfb.c ./drivers/video/tdfxfb.c
@@ -2087,6 +2087,8 @@
     return;
 
   while(this_opt = strsep(&options, ",")) {
+    if(!*this_opt)
+      continue;
     if(!strcmp(this_opt, "inverse")) {
       inverse = 1;
       fb_invert_cmaps();
drivers/video/virgefb.c renamed from linux-2.4.13-pre6/drivers/video/virgefb.c +2 -0
diff -Nur ../linux-2.4.13-pre6/drivers/video/virgefb.c ./drivers/video/virgefb.c
@@ -1086,6 +1086,8 @@
 		return 0;
 
 	while (this_opt = strsep(&options, ",")) {
+		if (!*this_opt)
+			continue;
 		if (!strcmp(this_opt, "inverse")) {
 			Cyberfb_inverse = 1;
 			fb_invert_cmaps();
#1 lore raw
Quoted 111 lines · René Scharfe

Hello,

I just noticed two framebuffer drivers with strtok calls that somehow passed below my radar (cscope). Patch below converts them, too. And it re-adds "ignore empty tokens" functionalty, which I forgot about the last time. Please apply.

René

diff -Nur ../linux-2.4.13-pre6/drivers/video/amifb.c ./drivers/video/amifb.c

drivers/video/amifb.c Tue Oct 23 23:04:03 2001 renamed from linux-2.4.13-pre6/drivers/video/amifb.c Tue Oct 23 22:13:43 2001 +2 -0
@@ -1193,6 +1193,8 @@
                return 0;
 
        while (this_opt = strsep(&options, ",")) {
+               if (!*this_opt)
+                       continue;
                if (!strcmp(this_opt, "inverse")) {
                        amifb_inverse = 1;
                        fb_invert_cmaps();

diff -Nur ../linux-2.4.13-pre6/drivers/video/atafb.c ./drivers/video/atafb.c

drivers/video/atafb.c Tue Oct 23 23:00:59 2001 renamed from linux-2.4.13-pre6/drivers/video/atafb.c Fri Sep 14 01:04:43 2001 +1 -1
@@ -2899,7 +2899,7 @@
     if (!options || !*options)
                return 0;
 
-    for(this_opt=strtok(options,","); this_opt; this_opt=strtok(NULL,",")) {
+    while (this_opt = strsep(&options, ",")) {
        if (!*this_opt) continue;
        if ((temp=get_video_mode(this_opt)))
                default_par=temp;

diff -Nur ../linux-2.4.13-pre6/drivers/video/aty/atyfb_base.c ./drivers/video/aty/atyfb_base.c

drivers/video/aty/atyfb_base.c Tue Oct 23 23:05:24 2001 renamed from linux-2.4.13-pre6/drivers/video/aty/atyfb_base.c Tue Oct 23 22:13:43 2001 +2 -0
@@ -2522,6 +2522,8 @@
        return 0;
 
     while (this_opt = strsep(&options, ",")) {
+       if (!*this_opt)
+               continue;
        if (!strncmp(this_opt, "font:", 5)) {
                char *p;
                int i;

diff -Nur ../linux-2.4.13-pre6/drivers/video/aty128fb.c ./drivers/video/aty128fb.c

drivers/video/aty128fb.c Tue Oct 23 23:06:17 2001 renamed from linux-2.4.13-pre6/drivers/video/aty128fb.c Tue Oct 23 22:13:43 2001 +2 -0
@@ -1614,6 +1614,8 @@
        return 0;
 
     while (this_opt = strsep(&options, ",")) {
+       if (!*this_opt)
+           continue;
        if (!strncmp(this_opt, "font:", 5)) {
            char *p;
            int i;

diff -Nur ../linux-2.4.13-pre6/drivers/video/clgenfb.c ./drivers/video/clgenfb.c

drivers/video/clgenfb.c Tue Oct 23 22:59:38 2001 renamed from linux-2.4.13-pre6/drivers/video/clgenfb.c Wed Oct 10 00:13:02 2001 +1 -2
@@ -2817,8 +2817,7 @@
        if (!options || !*options)
                return 0;
 
-       for (this_opt = strtok (options, ","); this_opt != NULL;
-            this_opt = strtok (NULL, ",")) {
+       while (this_opt = strsep (&options, ",")) {
                if (!*this_opt) continue;
 
                DPRINTK("clgenfb_setup: option '%s'\n", this_opt);

diff -Nur ../linux-2.4.13-pre6/drivers/video/cyberfb.c ./drivers/video/cyberfb.c

drivers/video/cyberfb.c Tue Oct 23 23:07:42 2001 renamed from linux-2.4.13-pre6/drivers/video/cyberfb.c Tue Oct 23 22:13:43 2001 +2 -0
@@ -1023,6 +1023,8 @@
        }
 
        while (this_opt = strsep(&options, ",")) {
+               if (!*this_opt)
+                       continue;
                if (!strcmp(this_opt, "inverse")) {
                        Cyberfb_inverse = 1;
                        fb_invert_cmaps();

diff -Nur ../linux-2.4.13-pre6/drivers/video/radeonfb.c ./drivers/video/radeonfb.c

drivers/video/radeonfb.c Tue Oct 23 23:09:58 2001 renamed from linux-2.4.13-pre6/drivers/video/radeonfb.c Tue Oct 23 22:13:43 2001 +2 -0
@@ -538,6 +538,8 @@
                 return 0;
 
        while (this_opt = strsep (&options, ",")) {
+               if (!*this_opt)
+                       continue;
                 if (!strncmp (this_opt, "font:", 5)) {
                         char *p;
                         int i;

diff -Nur ../linux-2.4.13-pre6/drivers/video/retz3fb.c ./drivers/video/retz3fb.c

drivers/video/retz3fb.c Tue Oct 23 23:30:56 2001 renamed from linux-2.4.13-pre6/drivers/video/retz3fb.c Tue Oct 23 22:13:43 2001 +2 -0
@@ -1349,6 +1349,8 @@
                return 0;
 
        while (this_opt = strsep(&options, ",")) {
+               if (!*this_opt)
+                       continue;
                if (!strcmp(this_opt, "inverse")) {
                        z3fb_inverse = 1;
                        fb_invert_cmaps();

diff -Nur ../linux-2.4.13-pre6/drivers/video/riva/fbdev.c ./drivers/video/riva/fbdev.c

drivers/video/riva/fbdev.c Tue Oct 23 23:31:33 2001 line 2050

Quoted 5 lines
drivers/video/riva/fbdev.c Tue Oct 23 23:31:33 2001 renamed from linux-2.4.13-pre6/drivers/video/riva/fbdev.c Tue Oct 23 22:13:43 2001 +2 -0
@@ -2046,6 +2046,8 @@
                return 0;
 
        while (this_opt = strsep(&options, ",")) {
+               if (!*this_opt)
+                       continue;

NAME
strsep - extract token from string
[...]
RETURN VALUE
The strsep() function returns a pointer to the token, or NULL if delim is not found in stringp.

If strsep returns NULL, and you dereference it -> Oops.

! if (!this_opt)

	continue;
#2 lore raw
Quoted 9 lines

René Scharfe wrote:

NAME
strsep - extract token from string
[...]
RETURN VALUE
The strsep() function returns a pointer to the token, or NULL if delim is not found in stringp.

Quoted 5 lines

If strsep returns NULL, and you dereference it -> Oops.

! if (!this_opt)

	continue;

Is that manual page incorrect?

I would think that

strsep() returns NULL when *stringp points to '\0' character

and that if delim is not found in stringp then stringp is just advanced to '\0' character of string (and original *stringp value is returned)

If that is not true, then these all patches are incorrect. Namely last token will be skipped.

Signature · 4 lines
          /"\                           |  Kari 
          \ /     ASCII Ribbon Campaign |    Hurtta
           X      Against HTML Mail     |
          / \                           |
#3 lore raw
Quoted 19 lines
Quoted 9 lines

René Scharfe wrote:

NAME
strsep - extract token from string
[...]
RETURN VALUE
The strsep() function returns a pointer to the token, or NULL if delim is not found in stringp.

Quoted 5 lines

If strsep returns NULL, and you dereference it -> Oops.

! if (!this_opt)

	continue;

Is that manual page incorrect?

I would think that

Quoted 8 lines

strsep() returns NULL when *stringp points to '\0' character

and that if delim is not found in stringp then stringp is just advanced to '\0' character of string (and original *stringp value is returned)

If that is not true, then these all patches are incorrect. Namely last token will be skipped.

Seems that I have also good to talk to mayself....

lib/string.c tells truth.

strsep() returns NULL when *stringp is NULL.

if delim is not found *stringp is set to NULL (and original *stringp value is returned).

Because kernel code claims that

* It returns empty tokens, too, behaving exactly like the libc function
* of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
* Same semantics, slimmer shape. ;)

quoted manual page IS incorrect (at least if it describes glibc2 function.)

Signature · 4 lines
          /"\                           |  Kari 
          \ /     ASCII Ribbon Campaign |    Hurtta
           X      Against HTML Mail     |
          / \                           |
#5 lore raw
Quoted 6 lines · Kari Hurtta
Quoted 2 lines

manual page IS incorrect (at least if it describes glibc2 function.)

If you think anything is wrong, write to the manpage maintainer ([email protected]) what you think is wrong and why.

I do not know from where that manual page text was quoted.

According of Ren_ Scharfe, man page text is correct on Mandrake 8.

Well, same error is on man page on this system
(Linux Mandrake release 7.1 (helium)).

So is that fixed by distributor (of Mandrake) or is it fixed by manpage maintainer ?

Signature · 4 lines
          /"\                           |  Kari 
          \ /     ASCII Ribbon Campaign |    Hurtta
           X      Against HTML Mail     |
          / \                           |
#6 lore raw
In reply to Guest section DW
Quoted 2 lines · Kari Hurtta

Well, same error is on man page on this system
(Linux Mandrake release 7.1 (helium)).

I have no idea what you mean by "same error", but let me repeat: if you think that anything is wrong, then write to the manpage maintainer ([email protected]) and tell him precisely what you think is wrong and why. Vague mutterings on a list like linux-kernel are unlikely to improve anything, if, indeed, improvement is needed.