rendered paste body#define SUID printf("uid==%d euid==%d\n",getuid(),geteuid())
#define error(MSG) _error(MSG,__LINE__,__FILE__)
void _error(const char*msg,int line,const char* file){
printf("%s:%d %s\n",file,line,msg);
exit(1);
}
int main(int argc,char *argv[],char* envp[]){
signed int feedoutfd=-1,feedinfd=-1;
struct sockaddr_in adrs[2];
char arga[512],argb[512];
char*args[7];
int ret;
args[0]="/usr/bin/valgrind";
args[1]="-v";
args[2]="./feedmain";
args[3]="-proper";
args[4]=arga;
args[5]=argb;
args[6]=0;
printf("starting feed program\n");
SUID;
feedoutfd=socket(PF_INET,SOCK_STREAM,0);
feedinfd=socket(PF_INET,SOCK_STREAM,0);
if ((feedoutfd <0) | (feedinfd <0)) {
printf("error 1 %d %d\n",feedoutfd,feedinfd);
return(1);
}
bzero((char *) &adrs[0],sizeof(adrs[0]));
adrs[0].sin_family = AF_INET;
adrs[1].sin_family = AF_INET;
adrs[0].sin_port = htons(98);
adrs[1].sin_port = htons(104);
adrs[0].sin_addr.s_addr = INADDR_ANY;
adrs[1].sin_addr.s_addr = INADDR_ANY;
if (bind(feedoutfd, (struct sockaddr *) &adrs[0],sizeof(adrs[0])) < 0) error("ERROR on bindingA");
if (bind(feedinfd, (struct sockaddr *) &adrs[1],sizeof(adrs[1])) < 0) error("ERROR on bindingB");
snprintf(arga,500,"%d",feedoutfd);
snprintf(argb,500,"%d",feedinfd);
seteuid(getuid());
SUID;
ret=execve("/usr/bin/valgrind",args,envp);
if (ret){
printf("ERROR %d on execve\n",ret);
return -1;
}
}