-#include "squid.h"
+/*
+ * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
+ *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
+ */
/* UNIX SMBlib NetBIOS implementation
SMBlib Routines
Copyright (C) Richard Sharpe 1996
-
*/
/*
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include "squid.h"
+
int SMBlib_errno;
int SMBlib_SMB_Error;
#define SMBLIB_ERRNO
-#include "smblib/smblib.h"
-#include "smblib/smblib-priv.h"
#include "rfcnb/rfcnb.h"
+#include "smblib/smblib-priv.h"
+#include "smblib/smblib.h"
#include <signal.h>
#if HAVE_STRING_H
NULL
};
-
/* Initialize the SMBlib package */
int SMB_Init()
/* or anything else ... */
SMB_Handle_Type SMB_Connect_Server(SMB_Handle_Type Con_Handle,
- char *server, const char *NTdomain)
+ const char *server, const char *NTdomain)
{
SMB_Handle_Type con;
if ((con = (struct SMB_Connect_Def *)malloc(sizeof(struct SMB_Connect_Def))) == NULL) {
-
SMBlib_errno = SMBlibE_NoSpace;
return NULL;
}
strcpy(con -> password, "");
strcpy(con -> sock_options, "");
strcpy(con -> address, "");
- strcpy(con -> desthost, server);
- strcpy(con -> PDomain, NTdomain);
+ strncpy(con -> desthost, server, sizeof(con->desthost));
+ con->desthost[sizeof(con->desthost) - 1] = '\0';
+ strncpy(con -> PDomain, NTdomain, sizeof(con->PDomain));
+ con->PDomain[sizeof(con->PDomain) - 1] = '\0';
strcpy(con -> OSName, SMBLIB_DEFAULT_OSNAME);
strcpy(con -> LMType, SMBLIB_DEFAULT_LMTYPE);
con -> first_tree = con -> last_tree = NULL;
/* Now connect to the remote end, but first upper case the name of the
service we are going to call, sine some servers want it in uppercase */
- for (i=0; i < strlen(server); i++)
- called[i] = toupper(server[i]);
+ for (i=0; i < strlen(con -> desthost); i++)
+ called[i] = xtoupper(con -> desthost[i]);
- called[strlen(server)] = 0; /* Make it a string */
+ called[strlen(con -> desthost)] = 0; /* Make it a string */
for (i=0; i < strlen(con -> myname); i++)
- calling[i] = toupper(con -> myname[i]);
+ calling[i] = xtoupper(con -> myname[i]);
calling[strlen(con -> myname)] = 0; /* Make it a string */
- if (strcmp(con -> address, "") == 0)
+ if (strlen(con -> address) == 0)
address = con -> desthost;
else
address = con -> address;
NULL
};
-
SMB_Handle_Type SMB_Connect(SMB_Handle_Type Con_Handle,
SMB_Tree_Handle *tree,
char *service,
/* Init some things ... */
- strcpy(con -> service, service);
- strcpy(con -> username, username);
- strcpy(con -> password, password);
+ strncpy(con -> service, service, sizeof(con -> service));
+ con -> service[sizeof(con -> service) - 1] = '\0';
+ strncpy(con -> username, username, sizeof(con -> username));
+ con -> username[sizeof(con -> username) - 1] = '\0';
+ strncpy(con -> password, password, sizeof(con -> password));
+ con -> password[sizeof(con -> password) - 1] = '\0';
strcpy(con -> sock_options, "");
strcpy(con -> address, "");
strcpy(con -> PDomain, SMBLIB_DEFAULT_DOMAIN);
/* Now figure out the host portion of the service */
- strcpy(temp, service);
+ strncpy(temp, service, sizeof(temp));
+ temp[sizeof(temp) - 1] = '\0';
host = strtok(temp, "/\\"); /* Separate host name portion */
- strcpy(con -> desthost, host);
+ if (!host) {
+ if (Con_Handle == NULL) {
+ free(con);
+ Con_Handle = NULL;
+ }
+ SMBlib_errno = -SMBlibE_CallFailed;
+ return NULL;
+ }
+ strncpy(con->desthost, host, sizeof(con->desthost));
+ con->desthost[sizeof(con->desthost)-1]='\0';
/* Now connect to the remote end, but first upper case the name of the
service we are going to call, sine some servers want it in uppercase */
- for (i=0; i < strlen(host); i++)
- called[i] = toupper(host[i]);
+ for (i=0; i < strlen(con -> desthost); i++)
+ called[i] = xtoupper(con -> desthost[i]);
- called[strlen(host)] = 0; /* Make it a string */
+ called[strlen(con -> desthost)] = 0; /* Make it a string */
for (i=0; i < strlen(con -> myname); i++)
- calling[i] = toupper(con -> myname[i]);
+ calling[i] = xtoupper(con -> myname[i]);
calling[strlen(con -> myname)] = 0; /* Make it a string */
- if (strcmp(con -> address, "") == 0)
+ if (strlen(con -> address) == 0)
address = con -> desthost;
else
address = con -> address;
if (SMB_Negotiate(con, SMB_Prots_Restrict) < 0) {
- /* Hmmm what should we do here ... We have a connection, but could not
- negotiate ... */
-
+ if (Con_Handle == NULL) {
+ free(con);
+ }
+ SMBlib_errno = -SMBlibE_NegNoProt;
return NULL;
}
if ((*tree = SMB_TreeConnect(con, NULL, service, password, "A:")) == NULL) {
+ if (Con_Handle == NULL) {
+ free(con);
+ }
+ SMBlib_errno = -SMBlibE_BAD;
return NULL;
}
pass_len = 24;
memcpy(pword, PassWord, 24);
} else {
- strcpy(pword, PassWord);
+ strncpy(pword, PassWord, sizeof(pword));
+ pword[sizeof(pword) - 1] = '\0';
#ifdef PAM_SMB_ENC_PASS
if (Con_Handle->encrypt_passwords) {
pass_len = 24;
p = p + 1;
- if (NtDomain != NULL) {
+ if (NtDomain == NULL) {
strcpy(p, Con_Handle -> PDomain);
p = p + strlen(Con_Handle -> PDomain);
} else {
}
-
/* Disconnect from the server, and disconnect all tree connects */
int SMB_Discon(SMB_Handle_Type Con_Handle, BOOL KeepHandle)
return(0);
}
+