|
|
researchv10 Norman
#include <stdio.h>
#include <dk.h>
/*
* program to run a command
* on another cpu on Datakit.
* Suitable for setuid to daemon, and checks for argument frogs
* and a restricted list of commands
*/
int rem; /* remote file descriptor */
int t;
char *bldargs();
char buf[BUFSIZ];
char *cmdfile = "/etc/server"; /* legal commands here */
char frogs[] = "\n&;^|`<>()";
#define MAXCHARS 8192
char args[MAXCHARS];
main(argc, argv)
char **argv;
{
if (argc < 3) {
fprintf(stderr, "usage: server <machine> <command>\n");
exit(1);
}
setuid(geteuid());
rem = tdkexec(argv[1], bldargs(argc-2, &argv[2]));
if (rem<0) {
extern char *dkerror;
fprintf(stderr, "server: %s: %s\n", argv[1], dkerror);
exit(1);
}
t = fork();
if (t < 0) {
fprintf(stderr,"server: can't fork\n");
exit(1);
}
if (t == 0)
to_proc();
else
from_proc();
exit(0);
}
to_proc()
{
register cc;
while ((cc = read(0, buf, sizeof buf)) > 0)
write(rem, buf, cc);
/*
* send some EOFs to
* make it go away.
*/
write(rem, 0, 0);
write(rem, 0, 0);
write(rem, 0, 0);
}
from_proc()
{
register cc;
while ((cc = read(rem, buf, sizeof buf)) > 0)
write(1, buf, cc);
kill(t, 9);
}
char *
bldargs(argc, argv)
register char *argv[];
{
register char *s, **t;
FILE *f;
char cmd[100];
int ok = 0;
if ((f = fopen(cmdfile, "r")) == NULL) {
fprintf(stderr, "server can't open %s\n", cmdfile);
exit(1);
}
while (fscanf(f, "%s", cmd) != EOF)
if (strcmp(cmd, argv[0]) == 0) {
ok = 1;
break;
}
if (!ok) {
fprintf(stderr, "server: disallowed command %s\n", argv[0]);
exit(1);
}
while (argc) {
if (strlen(args)+strlen(*argv)+3 >= MAXCHARS) {
fprintf(stderr, "server: arg list too long\n");
exit(1);
}
for (s = frogs; *s; s++) {
if (index(*argv, *s)) {
fprintf(stderr, "server: disallowed char %c\n",
*s);
exit(1);
}
}
strcat(args, *argv);
strcat(args, " ");
argc--;
argv++;
}
return(args);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.