/* * /usr/lib/InPerson/inpview wrapper * spd@daphne.cps.unizar.es * Fixes: http://www.securityfocus.com/bid/381 (ttsession) * Fixes: http://www.securityfocus.com/bid/1530 (in-race.c) ? */ #include #include #include #include #include #include #include #include #include main(int argc, char **argv, char **envp) { time_t timer; int error; char *user; struct passwd *pwd; /* char s[256];*/ char home[256]; char logname[256]; char shell[256]; int id; register char **p1, **p2; char *path="PATH=/usr/bin:/usr/sbin:/etc:/usr/bsd:/usr/lib/InPerson"; char *cmd="/usr/lib/InPerson/inpview.O"; extern char *optarg; extern int optind,opterr; int opt; char *file=NULL; time(&timer); if ( NULL == ( pwd = getpwuid ( id=getuid () ))) { fprintf(stderr, "getpw failed (%s) for %d at %s", strerror(errno), getuid(), ctime(&timer) ); exit(errno); } user = pwd->pw_name; for(p1 = p2 = envp; *p1; p1++) { if (strncmp(*p1, "LD_", 3) != 0 && strncmp(*p1, "_RLD", 4) != 0 && strncmp(*p1, "LIBPATH=", 8) != 0 && strncmp(*p1, "ELF_LD_", 7) != 0 && strncmp(*p1, "AOUT_LD_", 8) != 0 && strncmp(*p1, "IFS=", 4) != 0 && strncmp(*p1, "HOME=", 5) != 0 && strncmp(*p1, "LOGNAME=", 8) != 0 && strncmp(*p1, "SHELL=", 6) != 0 ) { *p2++ = *p1; } } *p2 = 0; if ( 0 != putenv ( path )) { fprintf( stderr, "putenv failed for %s (%s)\n", user, strerror(errno)); exit(1); } sprintf(home,"HOME=%s", pwd->pw_dir); *p2++ = home; sprintf(logname,"LOGNAME=%s", pwd->pw_name); *p2++ = logname; sprintf(shell,"SHELL=%s", pwd->pw_shell); *p2++ = shell; *p2 = 0; execve( cmd, &argv[0], envp); perror("exec"); exit(1); }