opnsense-ports/comms/aprsd/files/patch-src_validate.cpp

157 lines
4.0 KiB
C++

--- src/validate.cpp.orig 2003-03-31 04:49:41 UTC
+++ src/validate.cpp
@@ -34,6 +34,10 @@
#include <iostream>
#include <strstream>
#include <iomanip>
+#include <netdb.h>
+#if (defined(__unix__) || defined(unix)) && !defined(USG)
+#include <sys/param.h>
+#endif
using namespace std;
@@ -47,11 +51,17 @@ struct user_info {
const string group;
};
#else
+#ifdef BSD
+#include <pwd.h>
+#include <grp.h>
+#define MAXGROUPSIZE 1024
+#else
#include <crypt.h>
#include <grp.h>
#include <pwd.h>
#include <shadow.h>
#endif
+#endif
#include "validate.h"
@@ -140,12 +150,21 @@ int checkSystemPass(const string szUser, const string
pam_end(pamh, PAM_SUCCESS);
return 0;
#else
+#ifdef BSD
passwd *ppw = NULL;
+ struct group *pgrp = NULL;
+ struct spwd *pspwd = NULL;
+ char *member = NULL;
+ struct group grp;
+ struct passwd pwd;
+#else
+ passwd *ppw = NULL;
group *pgrp = NULL;
spwd *pspwd = NULL;
char *member = NULL;
struct group grp;
struct passwd pwd;
+#endif
int i;
char salt[16];
int usrfound = 0 ;
@@ -158,7 +177,11 @@ int checkSystemPass(const string szUser, const string
#endif
+#ifdef BSD
+ size_t bufsize=MAXGROUPSIZE;
+#else
size_t bufsize = sysconf(_SC_GETGR_R_SIZE_MAX);
+#endif
char *buffer1 = new char[bufsize];
//Thread-Safe getgrnam()
getgrnam_r(szGroup.c_str(), /* Does group name szGroup exist? */
@@ -168,12 +191,14 @@ int checkSystemPass(const string szUser, const string
&pgrp);
if (pgrp == NULL) {
- delete buffer1;
+ delete[] buffer1;
return rc; /* return BADGROUP if not */
}
-
+#ifdef BSD
+ bufsize = MAXGROUPSIZE;
+#else
bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
-
+#endif
char *buffer2 = new char[bufsize];
//Thread-Safe getpwnam()
getpwnam_r(szUser.c_str(),
@@ -183,8 +208,8 @@ int checkSystemPass(const string szUser, const string
&ppw);
if (ppw == NULL){
- delete buffer2;
- delete buffer1;
+ delete[] buffer2;
+ delete[] buffer1;
return BADUSER ; /* return BADUSER if no such user */
}
@@ -200,8 +225,8 @@ int checkSystemPass(const string szUser, const string
}
if (usrfound == 0) {
- delete buffer1;
- delete buffer2;
+ delete[] buffer1;
+ delete[] buffer2;
return BADGROUP; /* return BADGROUP if user not in group */
}
@@ -214,6 +239,7 @@ int checkSystemPass(const string szUser, const string
pwLength = strlen(ppw->pw_passwd);
+#if 0
if (ppw->pw_passwd[0] != '$') {
/* DES salt */
strncpy(salt,ppw->pw_passwd,2);
@@ -230,15 +256,18 @@ int checkSystemPass(const string szUser, const string
salt[i++] = '$';
salt[i] = '\0';
}
+#endif
+
#ifdef DEBUG
cout << "salt=" << salt << endl;
#endif
- if (strcmp(crypt(szPass.c_str(), salt), ppw->pw_passwd) == 0 )
+ if (strcmp(crypt(szPass.c_str(), ppw->pw_passwd), ppw->pw_passwd) == 0 )
rc = 0;
else
rc = BADPASSWD;
+#ifndef BSD /* BSD passwords are always shadowed */
if ((rc == BADPASSWD) && (strcmp("x",ppw->pw_passwd) == 0)) {
#ifdef DEBUG
cout << "Shadow passwords enabled\n";
@@ -246,8 +275,8 @@ int checkSystemPass(const string szUser, const string
pspwd = getspnam(szUser.c_str()); //Get shadow password file data for user
if (pspwd == NULL) {
cout << "validate: Can't read shadowed password file. This program must run as root\n";
- delete buffer1;
- delete buffer2;
+ delete[] buffer1;
+ delete[] buffer2;
return MUSTRUNROOT;
}
pwLength = strlen(pspwd->sp_pwdp);
@@ -288,8 +317,9 @@ int checkSystemPass(const string szUser, const string
<< endl;
#endif
}
- delete buffer1;
- delete buffer2;
+#endif
+ delete[] buffer1;
+ delete[] buffer2;
return rc;
#endif
}