On Sat, 10 Oct 2015, Michael McConville wrote:
> FWIW, this is a perfect use case for Coccinelle. Below is what I dredged
> up in src/usr.sbin (diff not yet carefully audited, but apparently
> sane).

The ypserv chunks show your Coccinelle script could use an enhancement...

> --- ypserv/ypserv/acl.c
> +++ /tmp/cocci-output-2270-df68c1-acl.c
> @@ -161,7 +161,7 @@ acl_init(char *file)
>               k = p;                  /* save start of verb */
>               i = 0;
>               while (*p != '\0' &&
> -                 !isspace((*p = tolower(*p)))) {
> +                 !isspace((unsigned char)(*p = tolower(*p)))) {

tolower() and toupper() follow the same rules as is*(), so the above is 
still wrong: if a cast is needed for isspace() then it's also needed for 
tolower().  Can you enhance your Coccinelle script to apply the same rules 
to them?

This is also a case where changing the type of the variable is the cleaner 
solution, IMO.

Finally, this code also has an incorrect/unnecessary use of '& of array'.  
Given these declarations:
       char data_line[1024], *p;

this line is bogus:
               p = (char *) &data_line;

It should be either:
               p = data_line;
or
               p = &data_line[0];

(With the type change to 'p', however, the cast will still be needed in 
the revised diff below)

Does the diff below pass your Coccinelle script?

oks?


Philip Guenther


Index: usr.sbin/ypserv/ypserv/acl.c
===================================================================
RCS file: /cvs/src/usr.sbin/ypserv/ypserv/acl.c,v
retrieving revision 1.15
diff -u -p -r1.15 acl.c
--- usr.sbin/ypserv/ypserv/acl.c        4 Dec 2013 02:18:05 -0000       1.15
+++ usr.sbin/ypserv/ypserv/acl.c        11 Oct 2015 02:46:11 -0000
@@ -133,7 +133,8 @@ acl_add_host(int allow, struct in_addr *
 int
 acl_init(char *file)
 {
-       char data_line[1024], *p, *k;
+       char data_line[1024], *k;
+       unsigned char *p;
        int line_no = 0, len, i, state;
        int allow = TRUE, error_cnt = 0;
        struct in_addr addr, mask, *host_addr;
@@ -151,7 +152,7 @@ acl_init(char *file)
                len = strlen(data_line);
                if (len == 0)
                        continue;
-               p = (char *) &data_line;
+               p = (unsigned char *)data_line;
 
                /* State 1: Initial State */
 
@@ -420,7 +421,8 @@ acl_init(char *file)
 int
 acl_securenet(char *file)
 {
-       char data_line[1024], *p, *k;
+       char data_line[1024], *k;
+       unsigned char *p;
        int line_no = 0, len, i, allow = TRUE, state;
        int error_cnt = 0;
        struct in_addr addr, mask;
@@ -442,7 +444,7 @@ acl_securenet(char *file)
                len = strlen(data_line);
                if (len == 0)
                        continue;
-               p = (char *) &data_line;
+               p = (unsigned char *)data_line;
 
                /* State 1: Initial State */
                state = ACLS_INIT;

Reply via email to