1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
$NetBSD: patch-ac,v 1.2 1999/06/01 21:15:02 tron Exp $
--- floppyd.cpp.orig Mon May 31 14:46:31 1999
+++ floppyd.cpp Tue Jun 1 10:53:28 1999
@@ -24,6 +24,7 @@
#endif
#define FLOPPYD_DEFAULT_PORT 5703
+#define NOBODY "nobody"
extern int errno;
// #########################################################################
@@ -395,6 +396,8 @@
/*
* Find the userid of the specified user.
+ * Use 'nobody' if not specified and revert to 65535 only if
+ * 'nobody' cannot be determined.
*/
static uid_t getuserid(char *user)
{
@@ -411,7 +414,10 @@
}
else
{
- uid = 65535;
+ if((pw = getpwnam(NOBODY)) != NULL)
+ uid = pw->pw_uid;
+ else
+ uid = 65535;
}
#ifdef DEBUG
@@ -527,12 +533,12 @@
{
int new_sock;
struct sockaddr_in addr;
- int len;
+ socklen_t len;
/*
* Ignore dead servers so no zombies should be left hanging.
*/
- signal(SIGCLD, SIG_IGN);
+ signal(SIGCHLD, SIG_IGN);
for (;;)
{
@@ -613,11 +619,13 @@
int run_as_server = 0;
ipaddr_t bind_ip = INADDR_ANY;
short bind_port = FLOPPYD_DEFAULT_PORT;
- uid_t run_uid = 65535;
- gid_t run_gid = 65535;
+ uid_t run_uid;
+ gid_t run_gid;
+ pid_t run_pid;
int sock;
int port_is_supplied = 0;
int no_local = 0;
+ int ug_given = 0;
char *server_hostname=NULL;
char* device_name = NULL;
@@ -644,6 +652,7 @@
break;
case 'r':
+ ug_given = 1;
run_uid = getuserid(optarg);
run_gid = getgroupid(run_uid);
break;
@@ -663,9 +672,15 @@
break;
}
}
+
+ if(!ug_given) {
+ run_uid = getuserid(NOBODY);
+ run_gid = getgroupid(run_uid);
+ }
+
if(!run_as_server) {
struct sockaddr_in addr;
- int len = sizeof(addr);
+ socklen_t len = sizeof(addr);
/* try to find out port that we are connected to */
if(getsockname(0, (sockaddr*) &addr, &len) >= 0 &&
@@ -836,8 +851,8 @@
/*
* Start a new session and group.
*/
- setsid();
- setpgrp();
+ run_pid = setsid();
+ setpgrp(0, run_pid);
close(2);
open("/dev/null", O_WRONLY);
|