diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/lib/util_sec.c | 4 | ||||
-rw-r--r-- | source3/lib/util_sock.c | 81 | ||||
-rw-r--r-- | source3/libsmb/cliconnect.c | 12 | ||||
-rw-r--r-- | source3/smbd/server.c | 2 |
4 files changed, 96 insertions, 3 deletions
diff --git a/source3/lib/util_sec.c b/source3/lib/util_sec.c index 068be684f3..164e6ab506 100644 --- a/source3/lib/util_sec.c +++ b/source3/lib/util_sec.c @@ -51,11 +51,13 @@ static void assert_uid(uid_t ruid, uid_t euid) { if ((euid != (uid_t)-1 && geteuid() != euid) || (ruid != (uid_t)-1 && getuid() != ruid)) { +#ifndef SMB_REGRESSION_TEST DEBUG(0,("Failed to set uid privileges to (%d,%d) now set to (%d,%d)\n", (int)ruid, (int)euid, (int)getuid(), (int)geteuid())); smb_panic("failed to set uid\n"); exit(1); +#endif } } @@ -66,12 +68,14 @@ static void assert_gid(gid_t rgid, gid_t egid) { if ((egid != (gid_t)-1 && getegid() != egid) || (rgid != (gid_t)-1 && getgid() != rgid)) { +#ifndef SMB_REGRESSION_TEST DEBUG(0,("Failed to set gid privileges to (%d,%d) now set to (%d,%d) uid=(%d,%d)\n", (int)rgid, (int)egid, (int)getgid(), (int)getegid(), (int)getuid(), (int)geteuid())); smb_panic("failed to set gid\n"); exit(1); +#endif } } diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c index b0426e3809..426d0572f1 100644 --- a/source3/lib/util_sock.c +++ b/source3/lib/util_sock.c @@ -1145,3 +1145,84 @@ int create_pipe_socket(char *dir, int dir_perms, return s; } + +#ifdef SMB_REGRESSION_TEST +/******************************************************************* +this is like socketpair but uses tcp. It is used by the Samba +user testing + ******************************************************************/ +static int socketpair_tcp(int fd[2]) +{ + int listener; + struct sockaddr sock; + socklen_t socklen = sizeof(sock); + int len = socklen; + int one = 1; + int connect_done = 0; + + fd[0] = fd[1] = listener = -1; + + memset(&sock, 0, sizeof(sock)); + + if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed; + + setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,(char *)&one,sizeof(one)); + + if (listen(listener, 1) != 0) goto failed; + + if (getsockname(listener, &sock, &socklen) != 0) goto failed; + + if ((fd[1] = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed; + + setsockopt(fd[1],SOL_SOCKET,SO_REUSEADDR,(char *)&one,sizeof(one)); + + set_blocking(fd[1], 0); + + if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) == -1) { + if (errno != EINPROGRESS) goto failed; + } else { + connect_done = 1; + } + + if ((fd[0] = accept(listener, &sock, &len)) == -1) goto failed; + + setsockopt(fd[0],SOL_SOCKET,SO_REUSEADDR,(char *)&one,sizeof(one)); + + close(listener); + if (connect_done == 0) { + if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) != 0) goto failed; + } + + set_blocking(fd[1], 1); + + /* all OK! */ + return 0; + + failed: + if (fd[0] != -1) close(fd[0]); + if (fd[1] != -1) close(fd[1]); + if (listener != -1) close(listener); + return -1; +} + + +/******************************************************************* +run a program on a local tcp socket, this is used to launch smbd +in the test code + ******************************************************************/ +int sock_exec(char *prog) +{ + int fd[2]; + if (socketpair_tcp(fd) != 0) return -1; + if (fork() == 0) { + close(fd[0]); + close(0); + close(1); + dup(fd[1]); + dup(fd[1]); + exit(system(prog)); + } + close(fd[1]); + return fd[0]; +} +#endif diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index 529aa0fef9..034208f3b2 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -558,7 +558,6 @@ retry: return(True); } - /**************************************************************************** open the client sockets ****************************************************************************/ @@ -580,8 +579,15 @@ BOOL cli_connect(struct cli_state *cli, const char *host, struct in_addr *ip) if (cli->port == 0) cli->port = 139; /* Set to default */ - cli->fd = open_socket_out(SOCK_STREAM, &cli->dest_ip, - cli->port, cli->timeout); +#ifdef SMB_REGRESSION_TEST + if (getenv("LIBSMB_PROG")) { + cli->fd = sock_exec(getenv("LIBSMB_PROG")); + } else +#endif + { + cli->fd = open_socket_out(SOCK_STREAM, &cli->dest_ip, + cli->port, cli->timeout); + } if (cli->fd == -1) return False; diff --git a/source3/smbd/server.c b/source3/smbd/server.c index fcee30d667..f4c82839bb 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -626,10 +626,12 @@ static void usage(char *pname) * dump if euid != 0. Ensure this is the case. */ +#ifndef SMB_REGRESSION_TEST if(geteuid() != (uid_t)0) { fprintf(stderr, "%s: Version %s : Must have effective user id of zero to run.\n", argv[0], VERSION); exit(1); } +#endif append_log = True; |