#include //#include //#include //#include #include "test.h" #include "tests.h" typedef struct priv PRIV; struct priv { int lfd; int cfd; } ; #define UID_L_R 10001 #define UID_L_E 10002 #define UID_C_R 10003 #define UID_C_E 10004 static void run_peer_ids_run_l(void *pv) { PRIV *p; pid_t mypid; int cpid; int fd; int fd2; char c; int peer_pid; int peer_ruid; int peer_euid; int failed; setreuid(UID_L_R,UID_L_E); p = pv; close(p->cfd); mypid = getpid(); printf("peer-ids: listener is %d\n",(int)mypid); printf("peer-ids: listener establishing connection\n"); mustwrite(p->lfd,&mypid,sizeof(pid_t)); mustread(p->lfd,&cpid,sizeof(pid_t)); sleep(1); SET_PIDCONN(fd,PIDCONN_LISTEN,0,0); mustwrite(p->lfd,"",1); SET_PIDCONN(fd2,PIDCONN_ACCEPT,fd,0); mustwrite(p->lfd,"",1); mustread(p->lfd,&c,1); sleep(1); SET_PIDCONN(peer_pid,PIDCONN_PEERPID,fd2,0); SET_PIDCONN(peer_ruid,PIDCONN_PEERRUID,fd2,0); SET_PIDCONN(peer_euid,PIDCONN_PEEREUID,fd2,0); sleep(1); mustwrite(p->lfd,"",1); mustread(p->lfd,&c,1); mustwrite(p->lfd,"",1); mustread(p->lfd,&c,1); failed = 0; if (peer_pid != cpid) { printf("peer-ids: got peer pid %d, actual value is %d\n",peer_pid,cpid); failed = 1; } if (peer_ruid != UID_C_R) { printf("peer-ids: got peer ruid %d, actual value is %d\n",peer_ruid,UID_C_R); failed = 1; } if (peer_euid != UID_C_E) { printf("peer-ids: got peer euid %d, actual value is %d\n",peer_euid,UID_C_E); failed = 1; } if (failed) test_fail(); printf("peer-ids: listener done\n"); sleep(1); } static void run_peer_ids_run_c(void *pv) { PRIV *p; pid_t mypid; int lpid; int fd; char c; int peer_pid; int peer_ruid; int peer_euid; int failed; setreuid(UID_C_R,UID_C_E); p = pv; close(p->lfd); mypid = getpid(); printf("peer-ids: connecter is %d\n",(int)getpid()); printf("peer-ids: connecter establishing connection\n"); mustread(p->cfd,&lpid,sizeof(pid_t)); mustwrite(p->cfd,&mypid,sizeof(pid_t)); sleep(1); mustread(p->cfd,&c,1); SET_PIDCONN(fd,PIDCONN_CONNECT,0,lpid); mustread(p->cfd,&c,1); mustwrite(p->cfd,"",1); mustwrite(p->cfd,"",1); mustread(p->cfd,&c,1); sleep(1); SET_PIDCONN(peer_pid,PIDCONN_PEERPID,fd,0); SET_PIDCONN(peer_ruid,PIDCONN_PEERRUID,fd,0); SET_PIDCONN(peer_euid,PIDCONN_PEEREUID,fd,0); sleep(1); mustwrite(p->cfd,"",1); mustread(p->cfd,&c,1); failed = 0; if (peer_pid != lpid) { printf("peer-ids: got peer pid %d, actual value is %d\n",peer_pid,lpid); failed = 1; } if (peer_ruid != UID_L_R) { printf("peer-ids: got peer ruid %d, actual value is %d\n",peer_ruid,UID_L_R); failed = 1; } if (peer_euid != UID_L_E) { printf("peer-ids: got peer euid %d, actual value is %d\n",peer_euid,UID_L_E); failed = 1; } printf("peer-ids: connecter done\n"); sleep(1); } static void run_peer_ids(void) { PRIV p; KID *kl; KID *kc; local_socketpair(&p.lfd,&p.cfd); kl = fork_kid(&run_peer_ids_run_l,&p); kc = fork_kid(&run_peer_ids_run_c,&p); close(p.lfd); close(p.cfd); reap_kid(kl); reap_kid(kc); printf("peer-ids: done\n"); } const TEST test_peer_ids = { &run_peer_ids };