Changeset 4226

Show
Ignore:
Timestamp:
07/25/08 10:37:35 (6 years ago)
Author:
douglask
Message:

With both the xmalloc and xfree calls for the args pointer array being performed in the forked child, the token argument is no longer being corrupted.

The bandaid xstrdup(token[i]) fix in the previous patch would fail misserably with a glib assembler backtrace on x86-64 linux (but not 32bit).

Using Valgrind, everything looks fine now.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • rat/trunk/process.c

    r4225 r4226  
    9696        /* Fork off the sub-process... */ 
    9797        *pid = fork(); 
    98         char **args = xmalloc((2 * num_tokens) + argc + 4); 
    99         int numargs=0; 
    10098        if (*pid == -1) { 
    10199                perror("Cannot fork"); 
    102100                abort(); 
    103101        } else if (*pid == 0) { 
    104                         args[numargs++] = proc_name; 
    105                         args[numargs++] = "-ctrl"; 
    106                         args[numargs++] = ctrl_addr; 
    107                         for(i=0;i<num_tokens;i++) { 
    108                                 args[numargs++] = "-token"; 
    109                                 args[numargs++] = xstrdup(token[i]); 
    110                         } 
    111                         for(i=0;i<argc;i++) { 
    112                                 args[numargs++] = argv[i]; 
    113                         } 
    114                         args[numargs++] = NULL; 
    115                         execvp( proc_name, args ); 
    116                  
    117             perror("Cannot execute subprocess"); 
    118             /* Note: this MUST NOT be exit() or abort(), since they affect the standard */ 
    119             /* IO channels in the parent process (fork duplicates file descriptors, but */ 
    120             /* they still point to the same underlying file).                           */ 
    121             _exit(1); 
     102                char **args = xmalloc((2 * num_tokens) + argc + 4); 
     103                int numargs=0; 
     104 
     105                args[numargs++] = proc_name; 
     106                args[numargs++] = "-ctrl"; 
     107                args[numargs++] = ctrl_addr; 
     108                for(i=0;i<num_tokens;i++) { 
     109                        args[numargs++] = "-token"; 
     110                        args[numargs++] = token[i]; 
     111                } 
     112                for(i=0;i<argc;i++) { 
     113                        args[numargs++] = argv[i]; 
     114                } 
     115                args[numargs++] = NULL; 
     116                execvp( proc_name, args ); 
     117         
     118                perror("Cannot execute subprocess"); 
     119                xfree(args); 
     120                /* Note: this MUST NOT be exit() or abort(), since they affect the standard */ 
     121                /* IO channels in the parent process (fork duplicates file descriptors, but */ 
     122                /* they still point to the same underlying file).                           */ 
     123                _exit(1); 
    122124        } 
    123         xfree(args); 
    124125#endif 
    125126#endif