|
|
1.1 root 1: /*
2: * $Source: /usr/src/kerberosIV/krb/RCS/tf_shm.c,v $
3: * $Author: kfall $
4: *
5: * Copyright 1988 by the Massachusetts Institute of Technology.
6: *
7: * For copying and distribution information, please see the file
8: * <mit-copyright.h>.
9: *
10: * Shared memory segment functions for session keys. Derived from code
11: * contributed by Dan Kolkowitz ([email protected]).
12: */
13:
14: #ifndef lint
15: static char rcsid_tf_shm_c[] =
16: "$Id: tf_shm.c,v 4.3 90/06/25 20:57:30 kfall Exp $";
17: #endif lint
18:
19: #include <mit-copyright.h>
20:
21: #include <stdio.h>
22: #include <sys/types.h>
23: #include <sys/ipc.h>
24: #include <sys/shm.h>
25: #include <des.h>
26: #include <krb.h>
27: #include <sys/stat.h>
28: #include <fcntl.h>
29:
30: #define MAX_BUFF sizeof(des_cblock)*1000 /* room for 1k keys */
31:
32: extern int errno;
33: extern int krb_debug;
34:
35: /*
36: * krb_create_shmtkt:
37: *
38: * create a shared memory segment for session keys, leaving its id
39: * in the specified filename.
40: */
41:
42: int
43: krb_shm_create(file_name)
44: char *file_name;
45: {
46: int retval;
47: int shmid;
48: struct shmid_ds shm_buf;
49: FILE *sfile;
50: uid_t me, metoo, getuid(), geteuid();
51:
52: (void) krb_shm_dest(file_name); /* nuke it if it exists...
53: this cleans up to make sure we
54: don't slowly lose memory. */
55:
56: shmid = shmget((long)IPC_PRIVATE,MAX_BUFF, IPC_CREAT);
57: if (shmid == -1) {
58: if (krb_debug)
59: perror("krb_shm_create shmget");
60: return(KFAILURE); /* XXX */
61: }
62: me = getuid();
63: metoo = geteuid();
64: /*
65: * now set up the buffer so that we can modify it
66: */
67: shm_buf.shm_perm.uid = me;
68: shm_buf.shm_perm.gid = getgid();
69: shm_buf.shm_perm.mode = 0600;
70: if (shmctl(shmid,IPC_SET,&shm_buf) < 0) { /*can now map it */
71: if (krb_debug)
72: perror("krb_shm_create shmctl");
73: (void) shmctl(shmid, IPC_RMID, 0);
74: return(KFAILURE); /* XXX */
75: }
76: (void) shmctl(shmid, SHM_LOCK, 0); /* attempt to lock-in-core */
77: /* arrange so the file is owned by the ruid
78: (swap real & effective uid if necessary). */
79: if (me != metoo) {
80: if (setreuid(metoo, me) < 0) {
81: /* can't switch??? barf! */
82: if (krb_debug)
83: perror("krb_shm_create: setreuid");
84: (void) shmctl(shmid, IPC_RMID, 0);
85: return(KFAILURE);
86: } else
87: if (krb_debug)
88: printf("swapped UID's %d and %d\n",metoo,me);
89: }
90: if ((sfile = fopen(file_name,"w")) == 0) {
91: if (krb_debug)
92: perror("krb_shm_create file");
93: (void) shmctl(shmid, IPC_RMID, 0);
94: return(KFAILURE); /* XXX */
95: }
96: if (fchmod(fileno(sfile),0600) < 0) {
97: if (krb_debug)
98: perror("krb_shm_create fchmod");
99: (void) shmctl(shmid, IPC_RMID, 0);
100: return(KFAILURE); /* XXX */
101: }
102: if (me != metoo) {
103: if (setreuid(me, metoo) < 0) {
104: /* can't switch??? barf! */
105: if (krb_debug)
106: perror("krb_shm_create: setreuid2");
107: (void) shmctl(shmid, IPC_RMID, 0);
108: return(KFAILURE);
109: } else
110: if (krb_debug)
111: printf("swapped UID's %d and %d\n",me,metoo);
112: }
113:
114: (void) fprintf(sfile,"%d",shmid);
115: (void) fflush(sfile);
116: (void) fclose(sfile);
117: return(KSUCCESS);
118: }
119:
120:
121: /*
122: * krb_is_diskless:
123: *
124: * check / to see if file .diskless exists. If so it is diskless.
125: * Do it this way now to avoid dependencies on a particular routine.
126: * Choose root file system since that will be private to the client.
127: */
128:
129: int krb_is_diskless()
130: {
131: struct stat buf;
132: if (stat("/.diskless",&buf) < 0)
133: return(0);
134: else return(1);
135: }
136:
137: /*
138: * krb_shm_dest: destroy shared memory segment with session keys, and remove
139: * file pointing to it.
140: */
141:
142: int krb_shm_dest(file)
143: char *file;
144: {
145: int shmid;
146: FILE *sfile;
147: struct stat st_buf;
148:
149: if (stat(file,&st_buf) == 0) {
150: /* successful stat */
151: if ((sfile = fopen(file,"r")) == 0) {
152: if (krb_debug)
153: perror("cannot open shared memory file");
154: return(KFAILURE); /* XXX */
155: }
156: if (fscanf(sfile,"%d",&shmid) == 1) {
157: if (shmctl(shmid,IPC_RMID,0) != 0) {
158: if (krb_debug)
159: perror("krb_shm_dest: cannot delete shm segment");
160: (void) fclose(sfile);
161: return(KFAILURE); /* XXX */
162: }
163: } else {
164: if (krb_debug)
165: fprintf(stderr, "bad format in shmid file\n");
166: (void) fclose(sfile);
167: return(KFAILURE); /* XXX */
168: }
169: (void) fclose(sfile);
170: (void) unlink(file);
171: return(KSUCCESS);
172: } else
173: return(RET_TKFIL); /* XXX */
174: }
175:
176:
177:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.