@@ -87,6 +87,9 @@ ps_root_readerrorcb(void *arg, unsigned short events)
8787 ssize_t len ;
8888 int exit_code = EXIT_FAILURE ;
8989
90+ if (events & ELE_HANGUP )
91+ goto out ;
92+
9093 if (events != ELE_READ )
9194 logerrx ("%s: unexpected event 0x%04x" , __func__ , events );
9295
@@ -111,22 +114,17 @@ ps_root_readerrorcb(void *arg, unsigned short events)
111114ssize_t
112115ps_root_readerror (struct dhcpcd_ctx * ctx , void * data , size_t len )
113116{
114- struct psr_ctx psr_ctx = {
115- .psr_ctx = ctx ,
116- .psr_data = data , .psr_datalen = len ,
117- };
118- int fd = PS_ROOT_FD (ctx );
117+ struct psr_ctx * pc = ctx -> ps_root -> psp_data ;
118+ int err ;
119119
120- if (eloop_event_add (ctx -> ps_eloop , fd , ELE_READ ,
121- ps_root_readerrorcb , & psr_ctx ) == -1 )
122- return -1 ;
123-
124- eloop_enter (ctx -> ps_eloop );
125- eloop_start (ctx -> ps_eloop , & ctx -> sigset );
126- eloop_event_delete (ctx -> ps_eloop , fd );
120+ pc -> psr_data = data ;
121+ pc -> psr_datalen = len ;
122+ err = eloop_start (ctx -> ps_eloop );
123+ if (err < 0 )
124+ return err ;
127125
128- errno = psr_ctx . psr_error .psr_errno ;
129- return psr_ctx . psr_error .psr_result ;
126+ errno = pc -> psr_error .psr_errno ;
127+ return pc -> psr_error .psr_result ;
130128}
131129
132130#ifdef PRIVSEP_GETIFADDRS
@@ -180,15 +178,15 @@ ps_root_mreaderror(struct dhcpcd_ctx *ctx, void **data, size_t *len)
180178 struct psr_ctx psr_ctx = {
181179 .psr_ctx = ctx ,
182180 };
183- int fd = PS_ROOT_FD (ctx );
181+ int fd = PS_ROOT_FD (ctx ), err ;
184182
185183 if (eloop_event_add (ctx -> ps_eloop , fd , ELE_READ ,
186184 ps_root_mreaderrorcb , & psr_ctx ) == -1 )
187185 return -1 ;
188186
189- eloop_enter (ctx -> ps_eloop );
190- eloop_start ( ctx -> ps_eloop , & ctx -> sigset );
191- eloop_event_delete ( ctx -> ps_eloop , fd ) ;
187+ err = eloop_start (ctx -> ps_eloop , & ctx -> sigset );
188+ if ( err < 0 )
189+ return err ;
192190
193191 errno = psr_ctx .psr_error .psr_errno ;
194192 * data = psr_ctx .psr_data ;
@@ -873,8 +871,9 @@ ps_root_start(struct dhcpcd_ctx *ctx)
873871 .psi_cmd = PS_ROOT ,
874872 };
875873 struct ps_process * psp ;
876- int logfd [2 ], datafd [2 ];
874+ int logfd [2 ] = { -1 , -1 }, datafd [2 ] = { -1 , -1 } ;
877875 pid_t pid ;
876+ struct psr_ctx * pc ;
878877
879878 if (xsocketpair (AF_UNIX , SOCK_SEQPACKET | SOCK_CXNB , 0 , logfd ) == -1 )
880879 return -1 ;
@@ -892,10 +891,30 @@ ps_root_start(struct dhcpcd_ctx *ctx)
892891 return -1 ;
893892#endif
894893
894+
895+ pc = malloc (sizeof (* pc ));
896+ if (pc == NULL )
897+ return -1 ;
898+ pc -> psr_ctx = ctx ;
899+
895900 psp = ctx -> ps_root = ps_newprocess (ctx , & id );
901+ if (psp == NULL )
902+ {
903+ free (pc );
904+ return -1 ;
905+ }
896906 strlcpy (psp -> psp_name , "privileged proxy" , sizeof (psp -> psp_name ));
897907 pid = ps_startprocess (psp , ps_root_recvmsg , NULL ,
898- ps_root_startcb , ps_root_signalcb , PSF_ELOOP );
908+ ps_root_startcb , PSF_ELOOP );
909+ if (pid == -1 ) {
910+ free (pc );
911+ return -1 ;
912+ }
913+
914+ psp -> psp_data = pc ;
915+ if (eloop_event_add (ctx -> ps_eloop , psp -> psp_fd , ELE_READ ,
916+ ps_root_readerrorcb , pc ) == -1 )
917+ return -1 ;
899918
900919 if (pid == 0 ) {
901920 ctx -> ps_log_fd = logfd [0 ]; /* Keep open to pass to processes */
@@ -916,7 +935,7 @@ ps_root_start(struct dhcpcd_ctx *ctx)
916935 close (datafd [1 ]);
917936 if (eloop_event_add (ctx -> eloop , ctx -> ps_data_fd , ELE_READ ,
918937 ps_root_dispatch , ctx ) == -1 )
919- return 1 ;
938+ return - 1 ;
920939
921940 return pid ;
922941}
0 commit comments