1: /*
2: * enter a password in the password file
3: * this program should be suid with owner
4: * with an owner with write permission on /etc/passwd
5: */
6: char *tfile { "/tmp/ptmp" };
7: char *pfile { "/etc/passwd" };
8: int tbuf[259];
9: int pbuf[259];
10:
11: main(argc, argv)
12: char *argv[];
13: {
14: register u, c;
15: register char *p;
16:
17: if(argc != 3) {
18: write(2, "Usage: passwd user password\n", 28);
19: goto bex;
20: }
21: signal(1, 1);
22: signal(2, 1);
23: signal(3, 1);
24:
25: if(stat(tfile, tbuf+20) >= 0) {
26: write(2, "Temporary file busy -- try again\n", 33);
27: goto bex;
28: }
29: tbuf[0] = creat(tfile, 0600);
30: if(tbuf[0] < 0) {
31: write(2, "Cannot create temporary file\n", 29);
32: goto bex;
33: }
34: pbuf[0] = open(pfile, 0);
35: if(pbuf[0] < 0) {
36: write(2, "Cannot open /etc/passwd\n", 24);
37: goto out;
38: }
39: goto l1;
40:
41: /*
42: * skip to beginning of next line
43: */
44:
45: skip:
46: while(c != '\n') {
47: if(c < 0)
48: goto ill;
49: c = getc(pbuf);
50: putc(c, tbuf);
51: }
52:
53: /*
54: * compare user names
55: */
56:
57: l1:
58: c = getc(pbuf);
59: putc(c, tbuf);
60: if(c < 0) {
61: write(2, "User name not found in password file\n", 37);
62: goto out;
63: }
64: p = argv[1];
65: while(c != ':') {
66: if(*p++ != c)
67: goto skip;
68: c = getc(pbuf);
69: putc(c, tbuf);
70: }
71: if(*p)
72: goto skip;
73: /*
74: * skip old password
75: */
76: do {
77: c = getc(pbuf);
78: if(c < 0)
79: goto ill;
80: } while(c != ':');
81:
82: /*
83: * copy in new password
84: */
85: p = argv[2];
86: for(c=0; c<9; c++)
87: if(*p++ == 0)
88: break;
89: *--p = 0;
90: if(p != argv[2])
91: p = crypt(argv[2]);
92: while(*p)
93: putc(*p++, tbuf);
94: putc(':', tbuf);
95:
96: /*
97: * validate uid
98: */
99:
100: u = 0;
101: do {
102: c = getc(pbuf);
103: putc(c, tbuf);
104: if(c >= '0' && c <= '9')
105: u = u*10 + c-'0';
106: if(c < 0)
107: goto ill;
108: } while(c != ':');
109: c = getuid() & 0377;
110: if(c != 0 && c != u) {
111: write(2, "Permission denied\n", 18);
112: goto out;
113: }
114:
115: /*
116: * copy out and back
117: */
118:
119: for(;;) {
120: c = getc(pbuf);
121: if(c < 0) {
122: fflush(tbuf);
123: close(pbuf[0]);
124: close(tbuf[0]);
125: tbuf[0] = open(tfile, 0);
126: if(tbuf[0] < 0) {
127: write(2, "Urk\n", 4);
128: goto out;
129: }
130: pbuf[0] = creat(pfile, 0644);
131: if(pbuf[0] < 0) {
132: write(2, "Cannot create /etc/passwd\n", 26);
133: goto out;
134: }
135: while((c = read(tbuf[0], tbuf+1, 512)) > 0)
136: write(pbuf[0], tbuf+1, c);
137: unlink(tfile);
138: exit(0);
139: }
140: putc(c, tbuf);
141: }
142:
143: ill:
144: write(2, "Password file illformed\n", 24);
145:
146: out:
147: unlink(tfile);
148:
149: bex:
150: exit(1);
151: }
Defined functions
main
defined in line
11;
never used
Defined variables
pbuf
defined in line
9; used 12 times
pfile
defined in line
7; used 2 times
tbuf
defined in line
8; used 17 times
tfile
defined in line
6; used 5 times