@@ -373,7 +373,17 @@ struct us_listen_socket_t *us_socket_group_listen(struct us_socket_group_t *grou
373373
374374 struct us_poll_t * p = us_create_poll (group -> loop , 0 , sizeof (struct us_listen_socket_t ));
375375 us_poll_init (p , listen_socket_fd , POLL_TYPE_SEMI_SOCKET );
376- us_poll_start (p , group -> loop , LIBUS_SOCKET_READABLE );
376+ if (us_poll_start_rc (p , group -> loop , LIBUS_SOCKET_READABLE ) != 0 ) {
377+ /* EPOLL_CTL_ADD failed (e.g. ENOSPC at fs.epoll.max_user_watches).
378+ * Report via both the out-param and thread-local errno: Bun.listen
379+ * reads *error, Bun.serve reads errno. */
380+ int saved_errno = errno ;
381+ bsd_close_socket (listen_socket_fd );
382+ us_poll_free (p , group -> loop );
383+ * error = saved_errno ;
384+ errno = saved_errno ;
385+ return 0 ;
386+ }
377387
378388 struct us_listen_socket_t * ls = (struct us_listen_socket_t * ) p ;
379389 us_internal_init_listen_socket (ls , group , kind , ssl_ctx , options , socket_ext_size );
@@ -395,7 +405,14 @@ struct us_listen_socket_t *us_socket_group_listen_unix(struct us_socket_group_t
395405
396406 struct us_poll_t * p = us_create_poll (group -> loop , 0 , sizeof (struct us_listen_socket_t ));
397407 us_poll_init (p , listen_socket_fd , POLL_TYPE_SEMI_SOCKET );
398- us_poll_start (p , group -> loop , LIBUS_SOCKET_READABLE );
408+ if (us_poll_start_rc (p , group -> loop , LIBUS_SOCKET_READABLE ) != 0 ) {
409+ int saved_errno = errno ;
410+ bsd_close_socket (listen_socket_fd );
411+ us_poll_free (p , group -> loop );
412+ * error = saved_errno ;
413+ errno = saved_errno ;
414+ return 0 ;
415+ }
399416
400417 struct us_listen_socket_t * ls = (struct us_listen_socket_t * ) p ;
401418 us_internal_init_listen_socket (ls , group , kind , ssl_ctx , options , socket_ext_size );
@@ -485,7 +502,13 @@ struct us_socket_t *us_socket_group_connect_resolved_dns(struct us_socket_group_
485502
486503 struct us_poll_t * p = us_create_poll (group -> loop , 0 , sizeof (struct us_socket_t ) + socket_ext_size );
487504 us_poll_init (p , connect_socket_fd , POLL_TYPE_SEMI_SOCKET );
488- us_poll_start (p , group -> loop , LIBUS_SOCKET_WRITABLE );
505+ if (us_poll_start_rc (p , group -> loop , LIBUS_SOCKET_WRITABLE ) != 0 ) {
506+ int saved_errno = errno ;
507+ bsd_close_socket (connect_socket_fd );
508+ us_poll_free (p , group -> loop );
509+ errno = saved_errno ;
510+ return NULL ;
511+ }
489512
490513 struct us_socket_t * socket = (struct us_socket_t * ) p ;
491514 us_internal_init_connect_socket (socket , group , kind , options );
@@ -616,7 +639,13 @@ struct us_socket_t *us_socket_group_connect_unix(struct us_socket_group_t *group
616639
617640 struct us_poll_t * p = us_create_poll (group -> loop , 0 , sizeof (struct us_socket_t ) + socket_ext_size );
618641 us_poll_init (p , connect_socket_fd , POLL_TYPE_SEMI_SOCKET );
619- us_poll_start (p , group -> loop , LIBUS_SOCKET_WRITABLE );
642+ if (us_poll_start_rc (p , group -> loop , LIBUS_SOCKET_WRITABLE ) != 0 ) {
643+ int saved_errno = errno ;
644+ bsd_close_socket (connect_socket_fd );
645+ us_poll_free (p , group -> loop );
646+ errno = saved_errno ;
647+ return 0 ;
648+ }
620649
621650 struct us_socket_t * connect_socket = (struct us_socket_t * ) p ;
622651 us_internal_init_connect_socket (connect_socket , group , kind , options );
@@ -641,9 +670,16 @@ int start_connections(struct us_connecting_socket_t *c, int count) {
641670 if (connect_socket_fd == LIBUS_SOCKET_ERROR ) {
642671 continue ;
643672 }
644- ++ opened ;
645673 bsd_socket_nodelay (connect_socket_fd , 1 );
646674 struct us_socket_t * s = (struct us_socket_t * )us_create_poll (loop , 0 , sizeof (struct us_socket_t ) + c -> socket_ext_size );
675+ struct us_poll_t * poll = & s -> p ;
676+ us_poll_init (poll , connect_socket_fd , POLL_TYPE_SEMI_SOCKET );
677+ if (us_poll_start_rc (poll , loop , LIBUS_SOCKET_WRITABLE ) != 0 ) {
678+ bsd_close_socket (connect_socket_fd );
679+ us_poll_free (poll , loop );
680+ continue ;
681+ }
682+ ++ opened ;
647683 us_internal_init_connect_socket (s , group , c -> kind , c -> options );
648684 s -> timeout = c -> timeout ;
649685 s -> long_timeout = c -> long_timeout ;
@@ -655,10 +691,6 @@ int start_connections(struct us_connecting_socket_t *c, int count) {
655691 s -> connect_next = c -> connecting_head ;
656692 c -> connecting_head = s ;
657693 s -> connect_state = c ;
658-
659- struct us_poll_t * poll = & s -> p ;
660- us_poll_init (poll , connect_socket_fd , POLL_TYPE_SEMI_SOCKET );
661- us_poll_start (poll , loop , LIBUS_SOCKET_WRITABLE );
662694 }
663695 return opened ;
664696}
0 commit comments