Question some code in server/request.c

Kari Hurtta hurtta+gmane at siilo.fmi.fi
Tue Mar 6 07:45:55 CST 2007


"Paul Vriens" <paul.vriens.wine at gmail.com> writes
in gmane.comp.emulators.wine.devel:

> Hi,
> 
> while going through the Coverity reports I found CID-293 that mentions
> a possible NULL-RETURN. Marcus sent in a patch that wasn't applied.
> 
> If I look at the code (starting at line 537):
> 
> /* create the server directory and chdir to it */
> static void create_server_dir( const char *dir )
> {
>     char *p, *server_dir;
>     struct stat st, st2;
> 
>     if (!(server_dir = strdup( dir ))) fatal_error( "out of memory\n" );
> 
>     /* first create the base directory if needed */
> 
>     p = strrchr( server_dir, '/' );
>     *p = 0;
      =======
>     create_dir( server_dir, &st );
> 
>     /* now create the server directory */
> 
>     *p = '/';
       ========
>     create_dir( server_dir, &st );
> 
>     if (chdir( server_dir ) == -1) fatal_perror( "chdir %s", server_dir );
>     if (stat( ".", &st2 ) == -1) fatal_perror( "stat %s", server_dir );
>     if (st.st_dev != st2.st_dev || st.st_ino != st2.st_ino)
>         fatal_error( "chdir did not end up in %s\n", server_dir );
> 
>     free( server_dir );
> }
> 
> it looks to me that 'p' is not used at all (this is so since June
> 2002). Am I completely missing something?

'p' is used on underlined places.

Code assumes that 'dir' is for "/dir1/dir2"

1) Code crashes if there is no '/' on 'dir' at all.

and

2) Code does wrong thing if dir is just "/dir2"

Perhaps it should be:

     /* first create the base directory if needed */
 
     p = strrchr( server_dir, '/' );
     if (p && p > server_dir) {
        *p = 0;

        create_dir( server_dir, &st );

        /* now create the server directory */
 
        *p = '/';
     }

     create_dir( server_dir, &st );

> Cheers,
> 
> Paul.

/ Kari Hurtta




More information about the wine-devel mailing list