Don't become a fork bomb. Limit the number of processes by stopping to
poll for new jobs once the limit is reached. I set the limit to 16 which
is larger then the biggest concurrency I have seen during fetches.

OK?
-- 
:wq Claudio

Index: extern.h
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/extern.h,v
retrieving revision 1.89
diff -u -p -r1.89 extern.h
--- extern.h    3 Nov 2021 10:50:18 -0000       1.89
+++ extern.h    3 Nov 2021 14:25:53 -0000
@@ -618,4 +618,7 @@ int mkpath(const char *);
 /* Maximum depth of the RPKI tree. */
 #define        MAX_CERT_DEPTH  12
 
+/* Maximum number of concurrent rsync processes. */
+#define MAX_RSYNC_PROCESSES 16
+
 #endif /* ! EXTERN_H */
Index: rsync.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/rsync.c,v
retrieving revision 1.29
diff -u -p -r1.29 rsync.c
--- rsync.c     28 Oct 2021 13:50:29 -0000      1.29
+++ rsync.c     3 Nov 2021 14:25:00 -0000
@@ -119,7 +119,7 @@ proc_child(int signal)
 void
 proc_rsync(char *prog, char *bind_addr, int fd)
 {
-       size_t                   i, idsz = 0;
+       size_t                   i, idsz = 0, nprocs = 0;
        int                      rc = 0;
        struct pollfd            pfd;
        struct msgbuf            msgq;
@@ -186,7 +186,9 @@ proc_rsync(char *prog, char *bind_addr, 
                pid_t pid;
                int st;
 
-               pfd.events = POLLIN;
+               pfd.events = 0;
+               if (nprocs < MAX_RSYNC_PROCESSES)
+                       pfd.events |= POLLIN;
                if (msgq.queued)
                        pfd.events |= POLLOUT;
 
@@ -228,6 +230,7 @@ proc_rsync(char *prog, char *bind_addr, 
                                ids[i].uri = NULL;
                                ids[i].pid = 0;
                                ids[i].id = 0;
+                               nprocs--;
                        }
                        if (pid == -1 && errno != ECHILD)
                                err(1, "waitpid");
@@ -314,6 +317,7 @@ proc_rsync(char *prog, char *bind_addr, 
                ids[i].id = id;
                ids[i].pid = pid;
                ids[i].uri = uri;
+               nprocs++;
 
                /* Clean up temporary values. */
 

Reply via email to