File linux_pcnfsd2.dif of Package linux_pcnfsd2
Index: Makefile.linux
===================================================================
--- Makefile.linux.orig
+++ Makefile.linux
@@ -40,13 +40,14 @@ HDRS= pcnfsd.h common.h
LINTFLAGS= -hbax
# uncomment as appropriate for debugging
-CFLAGS = -DOSVER_BSD386
+CFLAGS = -O2 -fexpensive-optimizations -pipe -DOSVER_BSD386 $(RPM_OPT_FLAGS)
#CFLAGS = -g -DDEBUG -DOSVER_BSD386
-LIBS= #-lrpc
-LFLAGS =
+LIBS = #-lrpc
+LIBCRYPT = -lcrypt
+LFLAGS =
linux/rpc.pcnfsd: $(LINUX_OBJS) $(HDRS)
- $(CC) -o $@ $(CFLAGS) $(LFLAGS) $(LINUX_OBJS) $(LIBS)
+ $(CC) -o $@ $(CFLAGS) $(LFLAGS) $(LINUX_OBJS) $(LIBS) $(LIBCRYPT)
linux/pcnfsd_svc.o: $(HDRS) pcnfsd_svc.c
$(CC) -c $(CFLAGS) -o $@ pcnfsd_svc.c
Index: common.h
===================================================================
--- common.h.orig
+++ common.h
@@ -67,7 +67,7 @@
**---------------------------------------------------------------------
**/
-/* #define SHADOW_SUPPORT */
+#define SHADOW_SUPPORT
/*
**---------------------------------------------------------------------
Index: pcnfsd_misc.c
===================================================================
--- pcnfsd_misc.c.orig
+++ pcnfsd_misc.c
@@ -18,10 +18,15 @@
#include "pcnfsd.h"
#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
#include <pwd.h>
+#include <time.h>
#include <sys/file.h>
#include <signal.h>
#include <sys/time.h>
+#include <sys/types.h>
+#include <wait.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <netdb.h>
@@ -29,6 +34,7 @@
#include <string.h>
#include <memory.h>
#include <ctype.h>
+#include <paths.h>
#ifdef ISC_2_0
#include <sys/fcntl.h>
@@ -48,7 +54,7 @@ extern char *getusershell();
/*
**---------------------------------------------------------------------
-** Other #define's
+** Other #define's
**---------------------------------------------------------------------
*/
@@ -68,7 +74,7 @@ int uidrhi[NUMUIDS];
*/
/*
**---------------------------------------------------------------------
-** Support procedures
+** Support procedures
**---------------------------------------------------------------------
*/
@@ -114,8 +120,13 @@ char *r;
int suspicious (s)
char *s;
{
- if(strpbrk(s, ";|&<>`'#!?*()[]^/") != NULL)
- return 1;
+ /* Linux rpc.pcnfsd patch developed by Mark Zielinski of RSI.
+ Http://www.repsec.com */
+
+ if (strspn(s, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_=:+1234567890@%,.")
+ != strlen(s))
+ return 1;
+
return 0;
}
@@ -124,7 +135,7 @@ scramble(s1, s2)
char *s1;
char *s2;
{
- while (*s1)
+ while (*s1)
{
*s2++ = (*s1 ^ zchar) & 0x7f;
s1++;
@@ -212,6 +223,7 @@ long expday;
#endif
#ifdef SHADOW_SUPPORT
+#if 0
/*
**--------------------------------------------------------------
** Check the existence of SHADOW. If it is there, then we are
@@ -231,7 +243,7 @@ long expday;
(shadowfile && (sp = getspnam(usrnam)) == (struct spwd *)NULL))
return ((struct passwd *)NULL);
- if (shadowfile)
+ if (shadowfile)
{
/*
* New - check password expiry situation
@@ -271,10 +283,22 @@ long expday;
}
pswd = sp->sp_pwdp;
(void) endspent();
- }
+ }
else
pswd = p->pw_passwd;
+#endif
+ p = getpwnam(usrnam);
+ if (p == (struct passwd *)NULL)
+ return ((struct passwd *)NULL);
+ endpwent();
+ sp = getspnam(p->pw_name);
+ endspent();
+
+ if (sp)
+ pswd = sp->sp_pwdp;
+ else
+ pswd = p->pw_passwd;
#else
p = getpwnam(usrnam);
if (p == (struct passwd *)NULL)
@@ -283,12 +307,12 @@ long expday;
#endif
#ifdef ISC_2_0
- /*
+ /*
**-----------------------------------------------------------
** We may have an 'x' in which case look in /etc/shadow ..
**-----------------------------------------------------------
*/
- if (((strlen(pswd)) == 1) && pswd[0] == 'x')
+ if (((strlen(pswd)) == 1) && pswd[0] == 'x')
{
struct spwd *shadow = getspnam(usrnam);
@@ -340,7 +364,7 @@ long expday;
/*
**---------------------------------------------------------------------
-** Print support procedures
+** Print support procedures
**---------------------------------------------------------------------
*/
@@ -440,7 +464,7 @@ run_ps630(f, opts)
/*
**---------------------------------------------------------------------
-** WTMP update support
+** WTMP update support
**---------------------------------------------------------------------
*/
@@ -480,7 +504,8 @@ extern char *getcallername();
#else SVR4
#include <utmp.h>
-#define WTMP_PATH "/usr/adm/wtmp"
+#define WTMP_PATH _PATH_WTMP
+
void
wlogin(name)
@@ -509,7 +534,7 @@ extern char *getcallername();
/*
**---------------------------------------------------------------------
-** Run-process-as-user procedures
+** Run-process-as-user procedures
**---------------------------------------------------------------------
*/
@@ -644,8 +669,14 @@ su_popen(user, cmd, maxtime)
}
dup2(1, 2); /* let's get stderr as well */
- (void) setgid(cached_gid);
- (void) setuid(cached_uid);
+ if (-1 == setgid(cached_gid)) {
+ perror ("setgid");
+ exit(1);
+ }
+ if (-1 == setuid(cached_uid)) {
+ perror ("setuid");
+ exit(1);
+ }
(void) execl("/bin/sh", "sh", "-c", cmd, (char *) NULL);
_exit(255);
@@ -737,7 +768,7 @@ char *arg2;
wtmp_enabled = 0;;
continue;
}
-#endif
+#endif
if(!mystrcasecmp(kw, "printer")) {
arg1 = strtok(NULL, " \t");
arg2 = (arg1 == NULL ? NULL : strtok(NULL, ""));
Index: pcnfsd_print.c
===================================================================
--- pcnfsd_print.c.orig
+++ pcnfsd_print.c
@@ -17,6 +17,7 @@
*/
#include "pcnfsd.h"
#include <stdlib.h>
+#include <unistd.h>
#include <stdio.h>
#include <pwd.h>
#include <ctype.h>
@@ -96,7 +97,7 @@ struct stat statbuf;
char pathname[MAXPATHLEN];
char new_pathname[MAXPATHLEN];
char sp_name[MAXPATHLEN] = SPOOLDIR;
-char tempstr[256];
+static char tempstr[256];
char delims[] = " \t\r\n:()";
pr_list printers = NULL;
@@ -219,8 +220,11 @@ char *sys;
char *pr;
char**sp;
{
-int dir_mode = 0777;
-int rc;
+
+ /* Linux rpc.pcnfsd patch developed by Mark Zielinski of RSI.
+ Http://www.repsec.com */
+
+ int dir_mode = 0777, rc, oldumask;
*sp = &pathname[0];
pathname[0] = '\0';
@@ -230,12 +234,19 @@ int rc;
/* get pathname of current directory and return to client */
- (void)sprintf(pathname,"%s/%s",sp_name, sys);
+ oldumask = umask(0);
+ (void)sprintf(pathname,"%s/%s",sp_name, sys);
+ (void)mkdir(sp_name, dir_mode); /* ignore the return code */
+ rc = mkdir(pathname, dir_mode); /* DON'T ignore this return code */
+ umask(oldumask);
+
+ (void)snprintf(pathname, (sizeof(pathname)-1), "%s/%s",sp_name,
+ sys);
+
(void)mkdir(sp_name, dir_mode); /* ignore the return code */
- (void)chmod(sp_name, dir_mode);
rc = mkdir(pathname, dir_mode); /* DON'T ignore this return code */
+
if((rc < 0 && errno != EEXIST) ||
- (chmod(pathname, dir_mode) != 0) ||
(stat(pathname, &statbuf) != 0) ||
!(statbuf.st_mode & S_IFDIR)) {
(void)sprintf(tempstr,
@@ -395,7 +406,7 @@ int failed = 0;
*/
if(!xcmd) {
#ifdef BSD_STYLE_PRINT
-#ifdef BSD386
+#if defined ( BSD386 ) || defined ( linux )
sprintf(cmdbuf, "/usr/bin/lpr -P%s -C%s -J%s %s",
pr, system, user, new_pathname);
#else
@@ -1487,7 +1498,7 @@ struct {
char default_cmd[] = "lp $FILE";
#endif SVR4_STYLE_PRINT
#ifdef BSD_STYLE_PRINT
-#ifdef BSD386
+#if defined ( BSD386 ) || defined ( linux )
char default_cmd[] = "/usr/bin/lpr $FILE";
#else
char default_cmd[] = "/usr/ucb/lpr $FILE";
Index: pcnfsd_svc.c
===================================================================
--- pcnfsd_svc.c.orig
+++ pcnfsd_svc.c
@@ -10,10 +10,12 @@
#include "common.h"
#include <stdio.h>
+#include <unistd.h>
#include <rpc/rpc.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
+#include <fcntl.h>
/* The following changes for Ultrix 4.2 were suggested by various users */
#ifndef ULTRIX