fix(feuille.c): better root privileges drop and debug mode handling
This commit is contained in:
		
							parent
							
								
									7b5d3e82d6
								
							
						
					
					
						commit
						47c337793d
					
				
					 1 changed files with 17 additions and 9 deletions
				
			
		
							
								
								
									
										26
									
								
								feuille.c
									
										
									
									
									
								
							
							
						
						
									
										26
									
								
								feuille.c
									
										
									
									
									
								
							| 
						 | 
					@ -16,6 +16,7 @@
 | 
				
			||||||
#include "feuille.h"
 | 
					#include "feuille.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <errno.h>     /* for errno, ERANGE, EAGAIN, EFBIG, ENOENT              */
 | 
					#include <errno.h>     /* for errno, ERANGE, EAGAIN, EFBIG, ENOENT              */
 | 
				
			||||||
 | 
					#include <grp.h>       /* for initgroups                                        */
 | 
				
			||||||
#include <limits.h>    /* for USHRT_MAX, ULONG_MAX, CHAR_MAX, PATH_MAX, UCHA... */
 | 
					#include <limits.h>    /* for USHRT_MAX, ULONG_MAX, CHAR_MAX, PATH_MAX, UCHA... */
 | 
				
			||||||
#include <locale.h>    /* for NULL, setlocale, LC_ALL                           */
 | 
					#include <locale.h>    /* for NULL, setlocale, LC_ALL                           */
 | 
				
			||||||
#include <pwd.h>       /* for getpwnam, passwd                                  */
 | 
					#include <pwd.h>       /* for getpwnam, passwd                                  */
 | 
				
			||||||
| 
						 | 
					@ -372,9 +373,17 @@ int main(int argc, char *argv[])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* privileges drop */
 | 
					        /* privileges drop */
 | 
				
			||||||
        verbose(2, "dropping root privileges...");
 | 
					        verbose(2, "dropping root privileges...");
 | 
				
			||||||
        setgid(gid);
 | 
					 | 
				
			||||||
        setuid(uid);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* switching groups */
 | 
				
			||||||
 | 
					        if (setgid(gid) != 0 || getgid() != gid)
 | 
				
			||||||
 | 
					            die(1, "Could not switch to group for user `%s'\n", settings.user);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (initgroups(settings.user, gid) != 0)
 | 
				
			||||||
 | 
					            die(1, "Could not initialize other groups for user `%s'\n", settings.user);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* switching user */
 | 
				
			||||||
 | 
					        if (setuid(uid) != 0 || getuid() != uid)
 | 
				
			||||||
 | 
					            die(1, "Could not switch to user `%s'\n", settings.user);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __OpenBSD__
 | 
					#ifdef __OpenBSD__
 | 
				
			||||||
| 
						 | 
					@ -383,7 +392,11 @@ int main(int argc, char *argv[])
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
					    /* do not create a thread pool if in DEBUG mode */
 | 
				
			||||||
 | 
					    verbose(1, "running in DEBUG mode, won't create a worker pool.");
 | 
				
			||||||
 | 
					    accept_loop(server);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
    /* create a thread pool for incoming connections */
 | 
					    /* create a thread pool for incoming connections */
 | 
				
			||||||
    verbose(1, "initializing worker pool...");
 | 
					    verbose(1, "initializing worker pool...");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -396,12 +409,6 @@ int main(int argc, char *argv[])
 | 
				
			||||||
        } else if (pid < 0)
 | 
					        } else if (pid < 0)
 | 
				
			||||||
            die(errno, "Could not initialize worker n. %d: %s\n", i, strerror(errno));
 | 
					            die(errno, "Could not initialize worker n. %d: %s\n", i, strerror(errno));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    /* do not create a thread pool if in DEBUG mode */
 | 
					 | 
				
			||||||
    verbose(1, "running in DEBUG mode, won't create a worker pool.");
 | 
					 | 
				
			||||||
    accept_loop(server);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sleep(1);
 | 
					    sleep(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -425,6 +432,7 @@ int main(int argc, char *argv[])
 | 
				
			||||||
        } else if (pid < 0)
 | 
					        } else if (pid < 0)
 | 
				
			||||||
            error("could not fork killed child again: ", strerror(errno));
 | 
					            error("could not fork killed child again: ", strerror(errno));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    close(server);
 | 
					    close(server);
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Reference in a new issue