mirror of
https://github.com/opnsense/src.git
synced 2026-06-08 16:22:46 -04:00
Bugfixes :
- in mount_portal.c: included catching of SIGHUP to get portald to re-read the config file. - in mount_portal.c: in SIGCHLD handler the return values checked from waitpid were wrong. Note. this routine was written correclty according to the manual page for 4.4BSD, but waitpid does not exhibit this behaviour. It is not returning 0 when WNOHANG is specified. I havent checked this properly. - in mount_portal.c: initialized the fdset for the select properly. - in mount_portal.c: corrected poor casting in the select. - in mount_portal.c: changed a break; to exit (0); so that the children die after doing the hard work, this stops the select: bad file descriptor messages. - in pt_file.c: the kernel passes kernel style open flags to the portal code which aren't compatible with "normal" O_ flags. I have adjusted these in pt_file.c. In general I think the portal fs code and portal_cred structure need changing to pass to the portald the right style of flags _and_ the permissions. - in pt_tcp.c: a few mistakes in typing of the socket structures, getservbyname returns the port number as an int but sockaddr wants the port number as an u_short. - in pt_tcp.c: someone wrote this on a VAX/Sun whatever and forget about byte ordering!! I've included a few htons about the place. - in all the above I have sprinkled a few more debugging printf's. Submitted by: "Duncan McL Barclay" <dmlb@ohm.york.ac.uk
This commit is contained in:
parent
aba8f38eb9
commit
a07c2891bf
9 changed files with 99 additions and 27 deletions
|
|
@ -46,6 +46,7 @@ static char sccsid[] = "@(#)mount_portal.c 8.4 (Berkeley) 3/27/94";
|
|||
|
||||
#include <sys/param.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <sys/syslog.h>
|
||||
|
|
@ -72,6 +73,12 @@ static void usage __P((void));
|
|||
|
||||
static sig_atomic_t readcf; /* Set when SIGHUP received */
|
||||
|
||||
static void sighup(sig)
|
||||
int sig;
|
||||
{
|
||||
readcf ++;
|
||||
}
|
||||
|
||||
static void sigchld(sig)
|
||||
int sig;
|
||||
{
|
||||
|
|
@ -79,8 +86,11 @@ int sig;
|
|||
|
||||
while ((pid = waitpid((pid_t) -1, (int *) 0, WNOHANG)) > 0)
|
||||
;
|
||||
/* wrtp - waitpid _doesn't_ return 0 when no children! */
|
||||
#ifdef notdef
|
||||
if (pid < 0)
|
||||
syslog(LOG_WARNING, "waitpid: %s", strerror(errno));
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
|
|
@ -149,6 +159,7 @@ main(argc, argv)
|
|||
(void) unlink(un.sun_path);
|
||||
if (bind(so, (struct sockaddr *) &un, sizeof(un)) < 0)
|
||||
err(1, NULL);
|
||||
|
||||
(void) unlink(un.sun_path);
|
||||
|
||||
(void) listen(so, 5);
|
||||
|
|
@ -185,6 +196,7 @@ main(argc, argv)
|
|||
readcf = 1;
|
||||
|
||||
signal(SIGCHLD, sigchld);
|
||||
signal(SIGHUP, sighup);
|
||||
|
||||
/*
|
||||
* Just loop waiting for new connections and activating them
|
||||
|
|
@ -201,6 +213,9 @@ main(argc, argv)
|
|||
* Check whether we need to re-read the configuration file
|
||||
*/
|
||||
if (readcf) {
|
||||
#ifdef DEBUG
|
||||
printf ("re-reading configuration file\n");
|
||||
#endif
|
||||
readcf = 0;
|
||||
conf_read(&q, conf);
|
||||
continue;
|
||||
|
|
@ -211,8 +226,9 @@ main(argc, argv)
|
|||
* Will get EINTR if a signal has arrived, so just
|
||||
* ignore that error code
|
||||
*/
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(so, &fdset);
|
||||
rc = select(so+1, &fdset, (void *) 0, (void *) 0, (void *) 0);
|
||||
rc = select(so+1, &fdset, (fd_set *) 0, (fd_set *) 0, (struct timeval *) 0);
|
||||
if (rc < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
|
|
@ -251,7 +267,7 @@ main(argc, argv)
|
|||
case 0:
|
||||
(void) close(so);
|
||||
activate(&q, so2);
|
||||
break;
|
||||
exit(0); /* stupid errors.... tidied up... wrtp*/
|
||||
default:
|
||||
(void) close(so2);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
*
|
||||
* @(#)pt_file.c 8.2 (Berkeley) 3/27/94
|
||||
*
|
||||
* $Id: pt_file.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp $
|
||||
* $Id: pt_file.c,v 1.2 1994/09/19 13:52:38 ache Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
|
@ -69,6 +69,7 @@ int *fdp;
|
|||
|
||||
#ifdef DEBUG
|
||||
printf("path = %s, uid = %d, gid = %d\n", pbuf, pcr->pcr_uid, pcr->pcr_groups[0]);
|
||||
printf ("fflag = %x, oflag = %x\n", pcr->pcr_flag, (pcr->pcr_flag)-1);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < pcr->pcr_ngroups; i++)
|
||||
|
|
@ -80,7 +81,8 @@ int *fdp;
|
|||
if (seteuid(pcr->pcr_uid) < 0)
|
||||
return (errno);
|
||||
|
||||
fd = open(pbuf, O_RDWR|O_CREAT, 0666);
|
||||
/* dmb convert kernel flags to oflags, see <fcntl.h> */
|
||||
fd = open(pbuf, (pcr->pcr_flag)-1, 0777);
|
||||
if (fd < 0)
|
||||
error = errno;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
*
|
||||
* @(#)pt_tcp.c 8.3 (Berkeley) 3/27/94
|
||||
*
|
||||
* $Id: pt_tcp.c,v 1.1 1992/05/25 21:43:09 jsp Exp jsp $
|
||||
* $Id: pt_tcp.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
|
@ -77,7 +77,7 @@ int *fdp;
|
|||
struct in_addr **ipp;
|
||||
struct in_addr *ip[2];
|
||||
struct in_addr ina;
|
||||
int s_port;
|
||||
u_short s_port;
|
||||
int priv = 0;
|
||||
struct sockaddr_in sain;
|
||||
|
||||
|
|
@ -117,15 +117,21 @@ int *fdp;
|
|||
ip[1] = 0;
|
||||
ipp = ip;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
printf ("inet address for %s is %s\n", host, inet_ntoa(*ipp[0]));
|
||||
#endif
|
||||
|
||||
sp = getservbyname(port, "tcp");
|
||||
if (sp != 0)
|
||||
s_port = sp->s_port;
|
||||
if (sp != NULL)
|
||||
s_port = (u_short)sp->s_port;
|
||||
else {
|
||||
s_port = atoi(port);
|
||||
s_port = htons ((u_short)strtol (port, (char**)NULL, 10));
|
||||
if (s_port == 0)
|
||||
return (EINVAL);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
printf ("port number for %s is %d\n", port, s_port);
|
||||
#endif
|
||||
|
||||
bzero(&sain, sizeof(sain));
|
||||
sain.sin_len = sizeof(sain);
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ static char sccsid[] = "@(#)mount_portal.c 8.4 (Berkeley) 3/27/94";
|
|||
|
||||
#include <sys/param.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <sys/syslog.h>
|
||||
|
|
@ -72,6 +73,12 @@ static void usage __P((void));
|
|||
|
||||
static sig_atomic_t readcf; /* Set when SIGHUP received */
|
||||
|
||||
static void sighup(sig)
|
||||
int sig;
|
||||
{
|
||||
readcf ++;
|
||||
}
|
||||
|
||||
static void sigchld(sig)
|
||||
int sig;
|
||||
{
|
||||
|
|
@ -79,8 +86,11 @@ int sig;
|
|||
|
||||
while ((pid = waitpid((pid_t) -1, (int *) 0, WNOHANG)) > 0)
|
||||
;
|
||||
/* wrtp - waitpid _doesn't_ return 0 when no children! */
|
||||
#ifdef notdef
|
||||
if (pid < 0)
|
||||
syslog(LOG_WARNING, "waitpid: %s", strerror(errno));
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
|
|
@ -149,6 +159,7 @@ main(argc, argv)
|
|||
(void) unlink(un.sun_path);
|
||||
if (bind(so, (struct sockaddr *) &un, sizeof(un)) < 0)
|
||||
err(1, NULL);
|
||||
|
||||
(void) unlink(un.sun_path);
|
||||
|
||||
(void) listen(so, 5);
|
||||
|
|
@ -185,6 +196,7 @@ main(argc, argv)
|
|||
readcf = 1;
|
||||
|
||||
signal(SIGCHLD, sigchld);
|
||||
signal(SIGHUP, sighup);
|
||||
|
||||
/*
|
||||
* Just loop waiting for new connections and activating them
|
||||
|
|
@ -201,6 +213,9 @@ main(argc, argv)
|
|||
* Check whether we need to re-read the configuration file
|
||||
*/
|
||||
if (readcf) {
|
||||
#ifdef DEBUG
|
||||
printf ("re-reading configuration file\n");
|
||||
#endif
|
||||
readcf = 0;
|
||||
conf_read(&q, conf);
|
||||
continue;
|
||||
|
|
@ -211,8 +226,9 @@ main(argc, argv)
|
|||
* Will get EINTR if a signal has arrived, so just
|
||||
* ignore that error code
|
||||
*/
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(so, &fdset);
|
||||
rc = select(so+1, &fdset, (void *) 0, (void *) 0, (void *) 0);
|
||||
rc = select(so+1, &fdset, (fd_set *) 0, (fd_set *) 0, (struct timeval *) 0);
|
||||
if (rc < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
|
|
@ -251,7 +267,7 @@ main(argc, argv)
|
|||
case 0:
|
||||
(void) close(so);
|
||||
activate(&q, so2);
|
||||
break;
|
||||
exit(0); /* stupid errors.... tidied up... wrtp*/
|
||||
default:
|
||||
(void) close(so2);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
*
|
||||
* @(#)pt_file.c 8.2 (Berkeley) 3/27/94
|
||||
*
|
||||
* $Id: pt_file.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp $
|
||||
* $Id: pt_file.c,v 1.2 1994/09/19 13:52:38 ache Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
|
@ -69,6 +69,7 @@ int *fdp;
|
|||
|
||||
#ifdef DEBUG
|
||||
printf("path = %s, uid = %d, gid = %d\n", pbuf, pcr->pcr_uid, pcr->pcr_groups[0]);
|
||||
printf ("fflag = %x, oflag = %x\n", pcr->pcr_flag, (pcr->pcr_flag)-1);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < pcr->pcr_ngroups; i++)
|
||||
|
|
@ -80,7 +81,8 @@ int *fdp;
|
|||
if (seteuid(pcr->pcr_uid) < 0)
|
||||
return (errno);
|
||||
|
||||
fd = open(pbuf, O_RDWR|O_CREAT, 0666);
|
||||
/* dmb convert kernel flags to oflags, see <fcntl.h> */
|
||||
fd = open(pbuf, (pcr->pcr_flag)-1, 0777);
|
||||
if (fd < 0)
|
||||
error = errno;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
*
|
||||
* @(#)pt_tcp.c 8.3 (Berkeley) 3/27/94
|
||||
*
|
||||
* $Id: pt_tcp.c,v 1.1 1992/05/25 21:43:09 jsp Exp jsp $
|
||||
* $Id: pt_tcp.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
|
@ -77,7 +77,7 @@ int *fdp;
|
|||
struct in_addr **ipp;
|
||||
struct in_addr *ip[2];
|
||||
struct in_addr ina;
|
||||
int s_port;
|
||||
u_short s_port;
|
||||
int priv = 0;
|
||||
struct sockaddr_in sain;
|
||||
|
||||
|
|
@ -117,15 +117,21 @@ int *fdp;
|
|||
ip[1] = 0;
|
||||
ipp = ip;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
printf ("inet address for %s is %s\n", host, inet_ntoa(*ipp[0]));
|
||||
#endif
|
||||
|
||||
sp = getservbyname(port, "tcp");
|
||||
if (sp != 0)
|
||||
s_port = sp->s_port;
|
||||
if (sp != NULL)
|
||||
s_port = (u_short)sp->s_port;
|
||||
else {
|
||||
s_port = atoi(port);
|
||||
s_port = htons ((u_short)strtol (port, (char**)NULL, 10));
|
||||
if (s_port == 0)
|
||||
return (EINVAL);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
printf ("port number for %s is %d\n", port, s_port);
|
||||
#endif
|
||||
|
||||
bzero(&sain, sizeof(sain));
|
||||
sain.sin_len = sizeof(sain);
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ static char sccsid[] = "@(#)mount_portal.c 8.4 (Berkeley) 3/27/94";
|
|||
|
||||
#include <sys/param.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <sys/syslog.h>
|
||||
|
|
@ -72,6 +73,12 @@ static void usage __P((void));
|
|||
|
||||
static sig_atomic_t readcf; /* Set when SIGHUP received */
|
||||
|
||||
static void sighup(sig)
|
||||
int sig;
|
||||
{
|
||||
readcf ++;
|
||||
}
|
||||
|
||||
static void sigchld(sig)
|
||||
int sig;
|
||||
{
|
||||
|
|
@ -79,8 +86,11 @@ int sig;
|
|||
|
||||
while ((pid = waitpid((pid_t) -1, (int *) 0, WNOHANG)) > 0)
|
||||
;
|
||||
/* wrtp - waitpid _doesn't_ return 0 when no children! */
|
||||
#ifdef notdef
|
||||
if (pid < 0)
|
||||
syslog(LOG_WARNING, "waitpid: %s", strerror(errno));
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
|
|
@ -149,6 +159,7 @@ main(argc, argv)
|
|||
(void) unlink(un.sun_path);
|
||||
if (bind(so, (struct sockaddr *) &un, sizeof(un)) < 0)
|
||||
err(1, NULL);
|
||||
|
||||
(void) unlink(un.sun_path);
|
||||
|
||||
(void) listen(so, 5);
|
||||
|
|
@ -185,6 +196,7 @@ main(argc, argv)
|
|||
readcf = 1;
|
||||
|
||||
signal(SIGCHLD, sigchld);
|
||||
signal(SIGHUP, sighup);
|
||||
|
||||
/*
|
||||
* Just loop waiting for new connections and activating them
|
||||
|
|
@ -201,6 +213,9 @@ main(argc, argv)
|
|||
* Check whether we need to re-read the configuration file
|
||||
*/
|
||||
if (readcf) {
|
||||
#ifdef DEBUG
|
||||
printf ("re-reading configuration file\n");
|
||||
#endif
|
||||
readcf = 0;
|
||||
conf_read(&q, conf);
|
||||
continue;
|
||||
|
|
@ -211,8 +226,9 @@ main(argc, argv)
|
|||
* Will get EINTR if a signal has arrived, so just
|
||||
* ignore that error code
|
||||
*/
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(so, &fdset);
|
||||
rc = select(so+1, &fdset, (void *) 0, (void *) 0, (void *) 0);
|
||||
rc = select(so+1, &fdset, (fd_set *) 0, (fd_set *) 0, (struct timeval *) 0);
|
||||
if (rc < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
|
|
@ -251,7 +267,7 @@ main(argc, argv)
|
|||
case 0:
|
||||
(void) close(so);
|
||||
activate(&q, so2);
|
||||
break;
|
||||
exit(0); /* stupid errors.... tidied up... wrtp*/
|
||||
default:
|
||||
(void) close(so2);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
*
|
||||
* @(#)pt_file.c 8.2 (Berkeley) 3/27/94
|
||||
*
|
||||
* $Id: pt_file.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp $
|
||||
* $Id: pt_file.c,v 1.2 1994/09/19 13:52:38 ache Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
|
@ -69,6 +69,7 @@ int *fdp;
|
|||
|
||||
#ifdef DEBUG
|
||||
printf("path = %s, uid = %d, gid = %d\n", pbuf, pcr->pcr_uid, pcr->pcr_groups[0]);
|
||||
printf ("fflag = %x, oflag = %x\n", pcr->pcr_flag, (pcr->pcr_flag)-1);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < pcr->pcr_ngroups; i++)
|
||||
|
|
@ -80,7 +81,8 @@ int *fdp;
|
|||
if (seteuid(pcr->pcr_uid) < 0)
|
||||
return (errno);
|
||||
|
||||
fd = open(pbuf, O_RDWR|O_CREAT, 0666);
|
||||
/* dmb convert kernel flags to oflags, see <fcntl.h> */
|
||||
fd = open(pbuf, (pcr->pcr_flag)-1, 0777);
|
||||
if (fd < 0)
|
||||
error = errno;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
*
|
||||
* @(#)pt_tcp.c 8.3 (Berkeley) 3/27/94
|
||||
*
|
||||
* $Id: pt_tcp.c,v 1.1 1992/05/25 21:43:09 jsp Exp jsp $
|
||||
* $Id: pt_tcp.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
|
@ -77,7 +77,7 @@ int *fdp;
|
|||
struct in_addr **ipp;
|
||||
struct in_addr *ip[2];
|
||||
struct in_addr ina;
|
||||
int s_port;
|
||||
u_short s_port;
|
||||
int priv = 0;
|
||||
struct sockaddr_in sain;
|
||||
|
||||
|
|
@ -117,15 +117,21 @@ int *fdp;
|
|||
ip[1] = 0;
|
||||
ipp = ip;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
printf ("inet address for %s is %s\n", host, inet_ntoa(*ipp[0]));
|
||||
#endif
|
||||
|
||||
sp = getservbyname(port, "tcp");
|
||||
if (sp != 0)
|
||||
s_port = sp->s_port;
|
||||
if (sp != NULL)
|
||||
s_port = (u_short)sp->s_port;
|
||||
else {
|
||||
s_port = atoi(port);
|
||||
s_port = htons ((u_short)strtol (port, (char**)NULL, 10));
|
||||
if (s_port == 0)
|
||||
return (EINVAL);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
printf ("port number for %s is %d\n", port, s_port);
|
||||
#endif
|
||||
|
||||
bzero(&sain, sizeof(sain));
|
||||
sain.sin_len = sizeof(sain);
|
||||
|
|
|
|||
Loading…
Reference in a new issue