mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
More pstring removal. This one was tricky. I had to add
one horror (pstring_clean_name()) which will have to
remain until I've removed all pstrings from the client code.
Jeremy.
(This used to be commit 1ea3ac8014
)
This commit is contained in:
parent
8e1b0f81c2
commit
68be9a8200
@ -283,7 +283,7 @@ static int do_cd(char *newdir)
|
||||
}
|
||||
}
|
||||
|
||||
clean_name(cur_dir);
|
||||
pstring_clean_name(cur_dir);
|
||||
pstrcpy( dname, cur_dir );
|
||||
|
||||
if ( !cli_resolve_path( "", cli, dname, &targetcli, targetpath ) ) {
|
||||
@ -313,7 +313,7 @@ static int do_cd(char *newdir)
|
||||
}
|
||||
} else {
|
||||
pstrcat( targetpath, CLI_DIRSEP_STR );
|
||||
clean_name( targetpath );
|
||||
pstring_clean_name( targetpath );
|
||||
|
||||
if ( !cli_chkpath(targetcli, targetpath) ) {
|
||||
d_printf("cd %s: %s\n", dname, cli_errstr(targetcli));
|
||||
@ -953,7 +953,7 @@ static int cmd_get(void)
|
||||
return 1;
|
||||
}
|
||||
pstrcpy(lname,p);
|
||||
clean_name(rname);
|
||||
pstring_clean_name(rname);
|
||||
|
||||
next_token_nr(NULL,lname,NULL,sizeof(lname));
|
||||
|
||||
@ -1054,7 +1054,7 @@ static int cmd_more(void)
|
||||
unlink(lname);
|
||||
return 1;
|
||||
}
|
||||
clean_name(rname);
|
||||
pstring_clean_name(rname);
|
||||
|
||||
rc = do_get(rname, lname, False);
|
||||
|
||||
@ -1393,7 +1393,7 @@ static int cmd_put(void)
|
||||
else
|
||||
pstrcat(rname,lname);
|
||||
|
||||
clean_name(rname);
|
||||
pstring_clean_name(rname);
|
||||
|
||||
{
|
||||
SMB_STRUCT_STAT st;
|
||||
@ -2949,7 +2949,7 @@ static int cmd_reget(void)
|
||||
return 1;
|
||||
}
|
||||
pstrcpy(local_name, p);
|
||||
clean_name(remote_name);
|
||||
pstring_clean_name(remote_name);
|
||||
|
||||
next_token_nr(NULL, local_name, NULL, sizeof(local_name));
|
||||
|
||||
@ -2987,7 +2987,7 @@ static int cmd_reput(void)
|
||||
else
|
||||
pstrcat(remote_name, local_name);
|
||||
|
||||
clean_name(remote_name);
|
||||
pstring_clean_name(remote_name);
|
||||
|
||||
return do_put(remote_name, local_name, True);
|
||||
}
|
||||
@ -3960,6 +3960,7 @@ static int do_message_op(void)
|
||||
POPT_COMMON_CREDENTIALS
|
||||
POPT_TABLEEND
|
||||
};
|
||||
TALLOC_CTX *frame = talloc_stackframe();
|
||||
|
||||
load_case_tables();
|
||||
|
||||
@ -4205,5 +4206,6 @@ static int do_message_op(void)
|
||||
}
|
||||
|
||||
talloc_destroy( ctx);
|
||||
talloc_destroy(frame);
|
||||
return rc;
|
||||
}
|
||||
|
@ -651,7 +651,7 @@ static void do_atar(char *rname,char *lname,file_info *finfo1)
|
||||
|
||||
fnum = cli_open(cli, rname, O_RDONLY, DENY_NONE);
|
||||
|
||||
clean_name(rname);
|
||||
pstring_clean_name(rname);
|
||||
|
||||
if (fnum == -1) {
|
||||
DEBUG(0,("%s opening remote file %s (%s)\n",
|
||||
|
@ -367,7 +367,7 @@ static int do_cd(char *newdir)
|
||||
all_string_sub(cur_dir, "/./", "/", 0);
|
||||
|
||||
/* Format the directory in a libmsmbclient friendly way */
|
||||
clean_name(cur_dir);
|
||||
pstring_clean_name(cur_dir);
|
||||
all_string_sub(cur_dir, "/./", "/", 0);
|
||||
pstrcpy(targetpath, "smb:");
|
||||
pstrcat(targetpath, service);
|
||||
@ -1129,7 +1129,7 @@ static int cmd_more(void)
|
||||
unlink(lname);
|
||||
return 1;
|
||||
}
|
||||
clean_name(rname);
|
||||
pstring_clean_name(rname);
|
||||
|
||||
rc = do_get(rname, lname, False);
|
||||
|
||||
@ -2677,7 +2677,7 @@ static int cmd_reget(void)
|
||||
return 1;
|
||||
}
|
||||
pstrcpy(local_name, p);
|
||||
clean_name(remote_name);
|
||||
pstring_clean_name(remote_name);
|
||||
|
||||
next_token_nr(NULL, local_name, NULL, sizeof(local_name));
|
||||
|
||||
@ -2715,7 +2715,7 @@ static int cmd_reput(void)
|
||||
else
|
||||
pstrcat(remote_name, local_name);
|
||||
|
||||
clean_name(remote_name);
|
||||
pstring_clean_name(remote_name);
|
||||
|
||||
return do_put(remote_name, local_name, True);
|
||||
}
|
||||
@ -3549,7 +3549,7 @@ static int do_message_op(void)
|
||||
POPT_COMMON_CREDENTIALS
|
||||
POPT_TABLEEND
|
||||
};
|
||||
|
||||
TALLOC_CTX *frame = talloc_stackframe();
|
||||
|
||||
#ifdef KANJI
|
||||
pstrcpy(term_code, KANJI);
|
||||
@ -3766,5 +3766,6 @@ static int do_message_op(void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
TALLOC_FREE(frame);
|
||||
return rc;
|
||||
}
|
||||
|
@ -49,7 +49,6 @@ bool dbghdr( int level, int cls, const char *file, const char *func, int line );
|
||||
#endif
|
||||
|
||||
extern XFILE *dbf;
|
||||
extern pstring debugf;
|
||||
|
||||
/* If we have these macros, we can add additional info to the header. */
|
||||
|
||||
|
@ -213,10 +213,10 @@ bool afs_login(connection_struct *conn)
|
||||
extern userdom_struct current_user_info;
|
||||
extern struct current_user current_user;
|
||||
DATA_BLOB ticket;
|
||||
pstring afs_username;
|
||||
char *cell;
|
||||
char *afs_username = NULL;
|
||||
char *cell = NULL;
|
||||
bool result;
|
||||
char *ticket_str;
|
||||
char *ticket_str = NULL;
|
||||
const DOM_SID *user_sid;
|
||||
|
||||
struct ClearToken ct;
|
||||
@ -229,7 +229,13 @@ bool afs_login(connection_struct *conn)
|
||||
afs_username, sizeof(afs_username));
|
||||
|
||||
user_sid = ¤t_user.nt_user_token->user_sids[0];
|
||||
pstring_sub(afs_username, "%s", sid_string_static(user_sid));
|
||||
afs_username = talloc_string_sub(talloc_tos(),
|
||||
lp_afs_username_map(),
|
||||
"%s",
|
||||
sid_string_static(user_sid));
|
||||
if (!afs_username) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* The pts command always generates completely lower-case user
|
||||
* names. */
|
||||
@ -240,13 +246,13 @@ bool afs_login(connection_struct *conn)
|
||||
if (cell == NULL) {
|
||||
DEBUG(1, ("AFS username doesn't contain a @, "
|
||||
"could not find cell\n"));
|
||||
return False;
|
||||
return false;
|
||||
}
|
||||
|
||||
*cell = '\0';
|
||||
cell += 1;
|
||||
|
||||
DEBUG(10, ("Trying to log into AFS for user %s@%s\n",
|
||||
DEBUG(10, ("Trying to log into AFS for user %s@%s\n",
|
||||
afs_username, cell));
|
||||
|
||||
if (!afs_createtoken(afs_username, cell, &ticket, &ct))
|
||||
|
@ -29,7 +29,8 @@
|
||||
* for a terminating null byte.
|
||||
*/
|
||||
|
||||
#define FORMAT_BUFR_MAX ( sizeof( format_bufr ) - 1 )
|
||||
#define FORMAT_BUFR_SIZE 1024
|
||||
#define FORMAT_BUFR_MAX (FORMAT_BUFR_SIZE - 1)
|
||||
|
||||
/* -------------------------------------------------------------------------- **
|
||||
* This module implements Samba's debugging utility.
|
||||
@ -78,16 +79,16 @@
|
||||
*/
|
||||
|
||||
XFILE *dbf = NULL;
|
||||
pstring debugf = "";
|
||||
static char *debugf = NULL;
|
||||
bool debug_warn_unknown_class = True;
|
||||
bool debug_auto_add_unknown_class = True;
|
||||
bool AllowDebugChange = True;
|
||||
|
||||
/*
|
||||
used to check if the user specified a
|
||||
logfile on the command line
|
||||
/*
|
||||
used to check if the user specified a
|
||||
logfile on the command line
|
||||
*/
|
||||
bool override_logfile;
|
||||
bool override_logfile;
|
||||
|
||||
|
||||
/*
|
||||
@ -137,7 +138,7 @@ static int debug_count = 0;
|
||||
#ifdef WITH_SYSLOG
|
||||
static int syslog_level = 0;
|
||||
#endif
|
||||
static pstring format_bufr = { '\0' };
|
||||
static char *format_bufr = NULL;
|
||||
static size_t format_pos = 0;
|
||||
static bool log_overflow = False;
|
||||
|
||||
@ -536,6 +537,10 @@ void debug_init(void)
|
||||
for(p = default_classname_table; *p; p++) {
|
||||
debug_add_class(*p);
|
||||
}
|
||||
format_bufr = SMB_MALLOC(FORMAT_BUFR_SIZE);
|
||||
if (!format_bufr) {
|
||||
smb_panic("debug_init: unable to create buffer");
|
||||
}
|
||||
}
|
||||
|
||||
void debug_register_msgs(struct messaging_context *msg_ctx)
|
||||
@ -583,6 +588,16 @@ void setup_logging(const char *pname, bool interactive)
|
||||
#endif
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
Set the logfile name.
|
||||
**************************************************************************/
|
||||
|
||||
void debug_set_logfile(const char *name)
|
||||
{
|
||||
SAFE_FREE(debugf);
|
||||
debugf = SMB_STRDUP(name);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
reopen the log files
|
||||
note that we now do this unconditionally
|
||||
@ -593,7 +608,7 @@ void setup_logging(const char *pname, bool interactive)
|
||||
|
||||
bool reopen_logs( void )
|
||||
{
|
||||
pstring fname;
|
||||
char *fname = NULL;
|
||||
mode_t oldumask;
|
||||
XFILE *new_dbf = NULL;
|
||||
XFILE *old_dbf = NULL;
|
||||
@ -603,19 +618,27 @@ bool reopen_logs( void )
|
||||
return True;
|
||||
|
||||
oldumask = umask( 022 );
|
||||
|
||||
pstrcpy(fname, debugf );
|
||||
debugf[0] = '\0';
|
||||
|
||||
fname = debugf;
|
||||
if (!fname) {
|
||||
return false;
|
||||
}
|
||||
debugf = NULL;
|
||||
|
||||
if (lp_loaded()) {
|
||||
char *logfname;
|
||||
|
||||
logfname = lp_logfile();
|
||||
if (*logfname)
|
||||
pstrcpy(fname, logfname);
|
||||
if (*logfname) {
|
||||
SAFE_FREE(fname);
|
||||
fname = SMB_STRDUP(logfname);
|
||||
if (!fname) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pstrcpy( debugf, fname );
|
||||
debugf = fname;
|
||||
new_dbf = x_fopen( debugf, O_WRONLY|O_APPEND|O_CREAT, 0644);
|
||||
|
||||
if (!new_dbf) {
|
||||
@ -702,15 +725,18 @@ void check_log_size( void )
|
||||
if( sys_fstat( x_fileno( dbf ), &st ) == 0 && st.st_size > maxlog ) {
|
||||
(void)reopen_logs();
|
||||
if( dbf && get_file_size( debugf ) > maxlog ) {
|
||||
pstring name;
|
||||
char *name = NULL;
|
||||
|
||||
if (asprintf(&name, "%s.old", debugf ) < 0) {
|
||||
return;
|
||||
}
|
||||
(void)rename(debugf, name);
|
||||
|
||||
slprintf( name, sizeof(name)-1, "%s.old", debugf );
|
||||
(void)rename( debugf, name );
|
||||
|
||||
if (!reopen_logs()) {
|
||||
/* We failed to reopen a log - continue using the old name. */
|
||||
(void)rename(name, debugf);
|
||||
}
|
||||
SAFE_FREE(name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -747,7 +773,7 @@ void check_log_size( void )
|
||||
|
||||
int Debug1( const char *format_str, ... )
|
||||
{
|
||||
va_list ap;
|
||||
va_list ap;
|
||||
int old_errno = errno;
|
||||
|
||||
debug_count++;
|
||||
@ -762,8 +788,8 @@ void check_log_size( void )
|
||||
}
|
||||
|
||||
/* prevent recursion by checking if reopen_logs() has temporaily
|
||||
set the debugf string to "" */
|
||||
if( debugf[0] == '\0')
|
||||
set the debugf string to NULL */
|
||||
if( debugf == NULL)
|
||||
return( 0 );
|
||||
|
||||
#ifdef WITH_SYSLOG
|
||||
@ -789,29 +815,31 @@ void check_log_size( void )
|
||||
/* map debug levels to syslog() priorities
|
||||
* note that not all DEBUG(0, ...) calls are
|
||||
* necessarily errors */
|
||||
static int priority_map[] = {
|
||||
static int priority_map[] = {
|
||||
LOG_ERR, /* 0 */
|
||||
LOG_WARNING, /* 1 */
|
||||
LOG_NOTICE, /* 2 */
|
||||
LOG_INFO, /* 3 */
|
||||
};
|
||||
int priority;
|
||||
pstring msgbuf;
|
||||
char *msgbuf = NULL;
|
||||
|
||||
if( syslog_level >= ( sizeof(priority_map) / sizeof(priority_map[0]) ) || syslog_level < 0)
|
||||
priority = LOG_DEBUG;
|
||||
else
|
||||
priority = priority_map[syslog_level];
|
||||
|
||||
va_start( ap, format_str );
|
||||
vslprintf( msgbuf, sizeof(msgbuf)-1, format_str, ap );
|
||||
va_end( ap );
|
||||
va_start(ap, format_str);
|
||||
vasprintf(&msgbuf, format_str, ap);
|
||||
va_end(ap);
|
||||
|
||||
msgbuf[255] = '\0';
|
||||
syslog( priority, "%s", msgbuf );
|
||||
if (msgbuf) {
|
||||
syslog(priority, "%s", msgbuf);
|
||||
}
|
||||
SAFE_FREE(msgbuf);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
check_log_size();
|
||||
|
||||
#ifdef WITH_SYSLOG
|
||||
@ -1018,13 +1046,18 @@ bool dbghdr(int level, int cls, const char *file, const char *func, int line)
|
||||
bool dbgtext( const char *format_str, ... )
|
||||
{
|
||||
va_list ap;
|
||||
pstring msgbuf;
|
||||
char *msgbuf = NULL;
|
||||
bool ret = true;
|
||||
|
||||
va_start( ap, format_str );
|
||||
vslprintf( msgbuf, sizeof(msgbuf)-1, format_str, ap );
|
||||
va_end( ap );
|
||||
va_start(ap, format_str);
|
||||
vasprintf(&msgbuf, format_str, ap);
|
||||
va_end(ap);
|
||||
|
||||
format_debug_text( msgbuf );
|
||||
|
||||
return( True );
|
||||
if (msgbuf) {
|
||||
format_debug_text(msgbuf);
|
||||
} else {
|
||||
ret = false;
|
||||
}
|
||||
SAFE_FREE(msgbuf);
|
||||
return ret;
|
||||
}
|
||||
|
@ -24,7 +24,7 @@
|
||||
#endif
|
||||
|
||||
static void (*cont_fn)(void *);
|
||||
static pstring corepath;
|
||||
static char *corepath;
|
||||
|
||||
/*******************************************************************
|
||||
report a fault
|
||||
@ -93,11 +93,13 @@ make all the preparations to safely dump a core file
|
||||
|
||||
void dump_core_setup(const char *progname)
|
||||
{
|
||||
pstring logbase;
|
||||
char * end;
|
||||
char *logbase = NULL;
|
||||
char *end = NULL;
|
||||
|
||||
if (lp_logfile() && *lp_logfile()) {
|
||||
snprintf(logbase, sizeof(logbase), "%s", lp_logfile());
|
||||
if (asprintf(&logbase, "%s", lp_logfile()) < 0) {
|
||||
return;
|
||||
}
|
||||
if ((end = strrchr_m(logbase, '/'))) {
|
||||
*end = '\0';
|
||||
}
|
||||
@ -106,21 +108,32 @@ void dump_core_setup(const char *progname)
|
||||
* line by the -l option but the "log file" option is not set
|
||||
* in smb.conf.
|
||||
*/
|
||||
snprintf(logbase, sizeof(logbase), "%s", dyn_LOGFILEBASE);
|
||||
if (asprintf(&logbase, "%s", dyn_LOGFILEBASE) < 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
SMB_ASSERT(progname != NULL);
|
||||
|
||||
snprintf(corepath, sizeof(corepath), "%s/cores", logbase);
|
||||
if (asprintf(&corepath, "%s/cores", logbase) < 0) {
|
||||
SAFE_FREE(logbase);
|
||||
return;
|
||||
}
|
||||
mkdir(corepath,0700);
|
||||
|
||||
snprintf(corepath, sizeof(corepath), "%s/cores/%s",
|
||||
logbase, progname);
|
||||
SAFE_FREE(corepath);
|
||||
if (asprintf(&corepath, "%s/cores/%s",
|
||||
logbase, progname) < 0) {
|
||||
SAFE_FREE(logbase);
|
||||
return;
|
||||
}
|
||||
mkdir(corepath,0700);
|
||||
|
||||
sys_chown(corepath,getuid(),getgid());
|
||||
chmod(corepath,0700);
|
||||
|
||||
SAFE_FREE(corepath);
|
||||
|
||||
#ifdef HAVE_GETRLIMIT
|
||||
#ifdef RLIMIT_CORE
|
||||
{
|
||||
|
@ -41,19 +41,22 @@ struct user_auth_info cmdline_auth_info;
|
||||
static void set_logfile(poptContext con, const char * arg)
|
||||
{
|
||||
|
||||
pstring logfile;
|
||||
char *logfile = NULL;
|
||||
const char *pname;
|
||||
|
||||
|
||||
/* Find out basename of current program */
|
||||
pname = strrchr_m(poptGetInvocationName(con),'/');
|
||||
|
||||
if (!pname)
|
||||
pname = poptGetInvocationName(con);
|
||||
else
|
||||
else
|
||||
pname++;
|
||||
|
||||
pstr_sprintf(logfile, "%s/log.%s", arg, pname);
|
||||
if (asprintf(&logfile, "%s/log.%s", arg, pname) < 0) {
|
||||
return;
|
||||
}
|
||||
lp_set_logfile(logfile);
|
||||
SAFE_FREE(logfile);
|
||||
}
|
||||
|
||||
static bool PrintSambaVersionString;
|
||||
@ -285,22 +288,24 @@ const struct poptOption popt_common_dynconfig[] = {
|
||||
* get a password from a a file or file descriptor
|
||||
* exit on failure
|
||||
* ****************************************************************************/
|
||||
|
||||
static void get_password_file(struct user_auth_info *a)
|
||||
{
|
||||
int fd = -1;
|
||||
char *p;
|
||||
bool close_it = False;
|
||||
pstring spec;
|
||||
char *spec = NULL;
|
||||
char pass[128];
|
||||
|
||||
if ((p = getenv("PASSWD_FD")) != NULL) {
|
||||
pstrcpy(spec, "descriptor ");
|
||||
pstrcat(spec, p);
|
||||
if (asprintf(&spec, "descriptor %s", p) < 0) {
|
||||
return;
|
||||
}
|
||||
sscanf(p, "%d", &fd);
|
||||
close_it = False;
|
||||
close_it = false;
|
||||
} else if ((p = getenv("PASSWD_FILE")) != NULL) {
|
||||
fd = sys_open(p, O_RDONLY, 0);
|
||||
pstrcpy(spec, p);
|
||||
spec = SMB_STRDUP(p);
|
||||
if (fd < 0) {
|
||||
fprintf(stderr, "Error opening PASSWD_FILE %s: %s\n",
|
||||
spec, strerror(errno));
|
||||
@ -325,15 +330,18 @@ static void get_password_file(struct user_auth_info *a)
|
||||
} else {
|
||||
fprintf(stderr, "Error reading password from file %s: %s\n",
|
||||
spec, "empty password\n");
|
||||
SAFE_FREE(spec);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
default:
|
||||
fprintf(stderr, "Error reading password from file %s: %s\n",
|
||||
spec, strerror(errno));
|
||||
SAFE_FREE(spec);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
SAFE_FREE(spec);
|
||||
pstrcpy(a->password, pass);
|
||||
if (close_it)
|
||||
close(fd);
|
||||
|
@ -53,7 +53,7 @@ static char *smb_readline_replacement(const char *prompt, void (*callback)(void)
|
||||
char **(completion_fn)(const char *text, int start, int end))
|
||||
{
|
||||
fd_set fds;
|
||||
static pstring line;
|
||||
static char *line;
|
||||
struct timeval timeout;
|
||||
int fd = x_fileno(x_stdin);
|
||||
char *ret;
|
||||
@ -64,15 +64,22 @@ static char *smb_readline_replacement(const char *prompt, void (*callback)(void)
|
||||
x_fflush(x_stdout);
|
||||
}
|
||||
|
||||
if (line == NULL) {
|
||||
line = SMB_MALLOC(BUFSIZ);
|
||||
if (!line) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
while (1) {
|
||||
timeout.tv_sec = 5;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(fd,&fds);
|
||||
|
||||
|
||||
if (sys_select_intr(fd+1,&fds,NULL,NULL,&timeout) == 1) {
|
||||
ret = x_fgets(line, sizeof(line), x_stdin);
|
||||
ret = x_fgets(line, BUFSIZ, x_stdin);
|
||||
return ret;
|
||||
}
|
||||
if (callback)
|
||||
|
@ -36,7 +36,7 @@ static NTSTATUS add_new_domain_account_policies(struct smbldap_state *ldap_state
|
||||
int i, rc;
|
||||
uint32 policy_default;
|
||||
const char *policy_attr = NULL;
|
||||
pstring dn;
|
||||
char *dn = NULL;
|
||||
LDAPMod **mods = NULL;
|
||||
char *escape_domain_name;
|
||||
|
||||
@ -48,15 +48,17 @@ static NTSTATUS add_new_domain_account_policies(struct smbldap_state *ldap_state
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
pstr_sprintf(dn, "%s=%s,%s",
|
||||
if (asprintf(&dn, "%s=%s,%s",
|
||||
get_attr_key2string(dominfo_attr_list, LDAP_ATTR_DOMAIN),
|
||||
escape_domain_name, lp_ldap_suffix());
|
||||
escape_domain_name, lp_ldap_suffix()) < 0) {
|
||||
SAFE_FREE(escape_domain_name);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
SAFE_FREE(escape_domain_name);
|
||||
|
||||
for (i=1; decode_account_policy_name(i) != NULL; i++) {
|
||||
|
||||
pstring val;
|
||||
char *val = NULL;
|
||||
|
||||
policy_attr = get_account_policy_attr(i);
|
||||
if (!policy_attr) {
|
||||
@ -66,17 +68,23 @@ static NTSTATUS add_new_domain_account_policies(struct smbldap_state *ldap_state
|
||||
|
||||
if (!account_policy_get_default(i, &policy_default)) {
|
||||
DEBUG(0,("add_new_domain_account_policies: failed to get default account policy\n"));
|
||||
SAFE_FREE(dn);
|
||||
return ntstatus;
|
||||
}
|
||||
|
||||
DEBUG(10,("add_new_domain_account_policies: adding \"%s\" with value: %d\n", policy_attr, policy_default));
|
||||
|
||||
pstr_sprintf(val, "%d", policy_default);
|
||||
if (asprintf(&val, "%d", policy_default) < 0) {
|
||||
SAFE_FREE(dn);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
smbldap_set_mod( &mods, LDAP_MOD_REPLACE, policy_attr, val);
|
||||
|
||||
rc = smbldap_modify(ldap_state, dn, mods);
|
||||
|
||||
SAFE_FREE(val);
|
||||
|
||||
if (rc!=LDAP_SUCCESS) {
|
||||
char *ld_error = NULL;
|
||||
ldap_get_option(ldap_state->ldap_struct, LDAP_OPT_ERROR_STRING, &ld_error);
|
||||
@ -84,11 +92,13 @@ static NTSTATUS add_new_domain_account_policies(struct smbldap_state *ldap_state
|
||||
dn, ldap_err2string(rc),
|
||||
ld_error ? ld_error : "unknown"));
|
||||
SAFE_FREE(ld_error);
|
||||
SAFE_FREE(dn);
|
||||
ldap_mods_free(mods, True);
|
||||
return ntstatus;
|
||||
}
|
||||
}
|
||||
|
||||
SAFE_FREE(dn);
|
||||
ldap_mods_free(mods, True);
|
||||
|
||||
return NT_STATUS_OK;
|
||||
@ -101,12 +111,13 @@ static NTSTATUS add_new_domain_account_policies(struct smbldap_state *ldap_state
|
||||
TODO: Add other attributes, and allow modification.
|
||||
*********************************************************************/
|
||||
|
||||
static NTSTATUS add_new_domain_info(struct smbldap_state *ldap_state,
|
||||
const char *domain_name)
|
||||
static NTSTATUS add_new_domain_info(struct smbldap_state *ldap_state,
|
||||
const char *domain_name)
|
||||
{
|
||||
fstring sid_string;
|
||||
fstring algorithmic_rid_base_string;
|
||||
pstring filter, dn;
|
||||
char *filter = NULL;
|
||||
char *dn = NULL;
|
||||
LDAPMod **mods = NULL;
|
||||
int rc;
|
||||
LDAPMessage *result = NULL;
|
||||
@ -121,29 +132,33 @@ static NTSTATUS add_new_domain_info(struct smbldap_state *ldap_state,
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
slprintf (filter, sizeof (filter) - 1, "(&(%s=%s)(objectclass=%s))",
|
||||
get_attr_key2string(dominfo_attr_list, LDAP_ATTR_DOMAIN),
|
||||
escape_domain_name, LDAP_OBJ_DOMINFO);
|
||||
if (asprintf(&filter, "(&(%s=%s)(objectclass=%s))",
|
||||
get_attr_key2string(dominfo_attr_list, LDAP_ATTR_DOMAIN),
|
||||
escape_domain_name, LDAP_OBJ_DOMINFO) < 0) {
|
||||
SAFE_FREE(escape_domain_name);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
SAFE_FREE(escape_domain_name);
|
||||
|
||||
attr_list = get_attr_list( NULL, dominfo_attr_list );
|
||||
attr_list = get_attr_list(NULL, dominfo_attr_list );
|
||||
rc = smbldap_search_suffix(ldap_state, filter, attr_list, &result);
|
||||
TALLOC_FREE( attr_list );
|
||||
SAFE_FREE(filter);
|
||||
|
||||
if (rc != LDAP_SUCCESS) {
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
num_result = ldap_count_entries(ldap_state->ldap_struct, result);
|
||||
|
||||
|
||||
if (num_result > 1) {
|
||||
DEBUG (0, ("add_new_domain_info: More than domain with that name exists: bailing "
|
||||
"out!\n"));
|
||||
ldap_msgfree(result);
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
|
||||
/* Check if we need to add an entry */
|
||||
DEBUG(3,("add_new_domain_info: Adding new domain\n"));
|
||||
|
||||
@ -154,9 +169,12 @@ static NTSTATUS add_new_domain_info(struct smbldap_state *ldap_state,
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
pstr_sprintf(dn, "%s=%s,%s",
|
||||
if (asprintf(&dn, "%s=%s,%s",
|
||||
get_attr_key2string(dominfo_attr_list, LDAP_ATTR_DOMAIN),
|
||||
escape_domain_name, lp_ldap_suffix());
|
||||
escape_domain_name, lp_ldap_suffix()) < 0) {
|
||||
SAFE_FREE(escape_domain_name);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
SAFE_FREE(escape_domain_name);
|
||||
|
||||
@ -168,7 +186,7 @@ static NTSTATUS add_new_domain_info(struct smbldap_state *ldap_state,
|
||||
|
||||
smbldap_set_mod(&mods, LDAP_MOD_ADD,
|
||||
get_attr_key2string(dominfo_attr_list,
|
||||
LDAP_ATTR_DOMAIN),
|
||||
LDAP_ATTR_DOMAIN),
|
||||
domain_name);
|
||||
|
||||
/* If we don't have an entry, then ask secrets.tdb for what it thinks.
|
||||
@ -185,21 +203,21 @@ static NTSTATUS add_new_domain_info(struct smbldap_state *ldap_state,
|
||||
algorithmic_rid_base());
|
||||
smbldap_set_mod(&mods, LDAP_MOD_ADD,
|
||||
get_attr_key2string(dominfo_attr_list,
|
||||
LDAP_ATTR_ALGORITHMIC_RID_BASE),
|
||||
LDAP_ATTR_ALGORITHMIC_RID_BASE),
|
||||
algorithmic_rid_base_string);
|
||||
smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectclass", LDAP_OBJ_DOMINFO);
|
||||
|
||||
|
||||
/* add the sambaNextUserRid attributes. */
|
||||
|
||||
|
||||
{
|
||||
uint32 rid = BASE_RID;
|
||||
fstring rid_str;
|
||||
|
||||
|
||||
fstr_sprintf( rid_str, "%i", rid );
|
||||
DEBUG(10,("add_new_domain_info: setting next available user rid [%s]\n", rid_str));
|
||||
smbldap_set_mod(&mods, LDAP_MOD_ADD,
|
||||
smbldap_set_mod(&mods, LDAP_MOD_ADD,
|
||||
get_attr_key2string(dominfo_attr_list,
|
||||
LDAP_ATTR_NEXT_USERRID),
|
||||
LDAP_ATTR_NEXT_USERRID),
|
||||
rid_str);
|
||||
}
|
||||
|
||||
@ -214,13 +232,14 @@ static NTSTATUS add_new_domain_info(struct smbldap_state *ldap_state,
|
||||
dn, ldap_err2string(rc),
|
||||
ld_error?ld_error:"unknown"));
|
||||
SAFE_FREE(ld_error);
|
||||
|
||||
SAFE_FREE(dn);
|
||||
ldap_mods_free(mods, True);
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
DEBUG(2,("add_new_domain_info: added: domain = %s in the LDAP database\n", domain_name));
|
||||
ldap_mods_free(mods, True);
|
||||
SAFE_FREE(dn);
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
@ -233,22 +252,25 @@ NTSTATUS smbldap_search_domain_info(struct smbldap_state *ldap_state,
|
||||
bool try_add)
|
||||
{
|
||||
NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
|
||||
pstring filter;
|
||||
char *filter = NULL;
|
||||
int rc;
|
||||
const char **attr_list;
|
||||
int count;
|
||||
char *escape_domain_name;
|
||||
|
||||
|
||||
escape_domain_name = escape_ldap_string_alloc(domain_name);
|
||||
if (!escape_domain_name) {
|
||||
DEBUG(0, ("Out of memory!\n"));
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
pstr_sprintf(filter, "(&(objectClass=%s)(%s=%s))",
|
||||
if (asprintf(&filter, "(&(objectClass=%s)(%s=%s))",
|
||||
LDAP_OBJ_DOMINFO,
|
||||
get_attr_key2string(dominfo_attr_list, LDAP_ATTR_DOMAIN),
|
||||
escape_domain_name);
|
||||
get_attr_key2string(dominfo_attr_list, LDAP_ATTR_DOMAIN),
|
||||
escape_domain_name) < 0) {
|
||||
SAFE_FREE(escape_domain_name);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
SAFE_FREE(escape_domain_name);
|
||||
|
||||
@ -264,14 +286,17 @@ NTSTATUS smbldap_search_domain_info(struct smbldap_state *ldap_state,
|
||||
goto failed;
|
||||
}
|
||||
|
||||
SAFE_FREE(filter);
|
||||
|
||||
count = ldap_count_entries(ldap_state->ldap_struct, *result);
|
||||
|
||||
if (count == 1)
|
||||
if (count == 1) {
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
ldap_msgfree(*result);
|
||||
*result = NULL;
|
||||
|
||||
|
||||
if (count < 1) {
|
||||
|
||||
DEBUG(3, ("smbldap_search_domain_info: Got no domain info entries for domain\n"));
|
||||
@ -285,7 +310,7 @@ NTSTATUS smbldap_search_domain_info(struct smbldap_state *ldap_state,
|
||||
domain_name, nt_errstr(status)));
|
||||
goto failed;
|
||||
}
|
||||
|
||||
|
||||
status = add_new_domain_account_policies(ldap_state, domain_name);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(0, ("smbldap_search_domain_info: Adding domain account policies for %s failed with %s\n",
|
||||
@ -294,7 +319,7 @@ NTSTATUS smbldap_search_domain_info(struct smbldap_state *ldap_state,
|
||||
}
|
||||
|
||||
return smbldap_search_domain_info(ldap_state, result, domain_name, False);
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (count > 1 ) {
|
||||
|
@ -177,19 +177,19 @@ static struct {
|
||||
#ifdef HAVE_XFS_QUOTAS
|
||||
{"xfs", sys_get_xfs_quota, sys_set_xfs_quota},
|
||||
#endif /* HAVE_XFS_QUOTAS */
|
||||
{NULL, NULL, NULL}
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
static int command_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dp)
|
||||
{
|
||||
const char *get_quota_command;
|
||||
char **lines = NULL;
|
||||
|
||||
|
||||
get_quota_command = lp_get_quota_command();
|
||||
if (get_quota_command && *get_quota_command) {
|
||||
const char *p;
|
||||
char *p2;
|
||||
pstring syscmd;
|
||||
char *syscmd = NULL;
|
||||
int _id = -1;
|
||||
|
||||
switch(qtype) {
|
||||
@ -206,13 +206,16 @@ static int command_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t
|
||||
return -1;
|
||||
}
|
||||
|
||||
slprintf(syscmd, sizeof(syscmd)-1,
|
||||
"%s \"%s\" %d %d",
|
||||
get_quota_command, path, qtype, _id);
|
||||
if (asprintf(&syscmd, "%s \"%s\" %d %d",
|
||||
get_quota_command, path, qtype, _id) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
DEBUG (3, ("get_quota: Running command %s\n", syscmd));
|
||||
|
||||
lines = file_lines_pload(syscmd, NULL);
|
||||
SAFE_FREE(syscmd);
|
||||
|
||||
if (lines) {
|
||||
char *line = lines[0];
|
||||
|
||||
@ -325,7 +328,7 @@ static int command_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t
|
||||
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
|
||||
|
||||
invalid_param:
|
||||
|
||||
file_lines_free(lines);
|
||||
@ -336,11 +339,11 @@ invalid_param:
|
||||
static int command_set_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dp)
|
||||
{
|
||||
const char *set_quota_command;
|
||||
|
||||
|
||||
set_quota_command = lp_set_quota_command();
|
||||
if (set_quota_command && *set_quota_command) {
|
||||
char **lines;
|
||||
pstring syscmd;
|
||||
char **lines = NULL;
|
||||
char *syscmd = NULL;
|
||||
int _id = -1;
|
||||
|
||||
switch(qtype) {
|
||||
@ -357,37 +360,40 @@ static int command_set_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t
|
||||
}
|
||||
|
||||
#ifdef LARGE_SMB_OFF_T
|
||||
slprintf(syscmd, sizeof(syscmd)-1,
|
||||
if (asprintf(&syscmd,
|
||||
"%s \"%s\" %d %d "
|
||||
"%u %llu %llu "
|
||||
"%llu %llu %llu ",
|
||||
"%llu %llu %llu ",
|
||||
set_quota_command, path, qtype, _id, dp->qflags,
|
||||
(long long unsigned)dp->softlimit,(long long unsigned)dp->hardlimit,
|
||||
(long long unsigned)dp->isoftlimit,(long long unsigned)dp->ihardlimit,
|
||||
(long long unsigned)dp->bsize);
|
||||
(long long unsigned)dp->bsize) < 0) {
|
||||
return -1;
|
||||
}
|
||||
#else /* LARGE_SMB_OFF_T */
|
||||
slprintf(syscmd, sizeof(syscmd)-1,
|
||||
if (asprintf(&syscmd,
|
||||
"%s \"%s\" %d %d "
|
||||
"%u %lu %lu "
|
||||
"%lu %lu %lu ",
|
||||
"%lu %lu %lu ",
|
||||
set_quota_command, path, qtype, _id, dp->qflags,
|
||||
(long unsigned)dp->softlimit,(long unsigned)dp->hardlimit,
|
||||
(long unsigned)dp->isoftlimit,(long unsigned)dp->ihardlimit,
|
||||
(long unsigned)dp->bsize);
|
||||
(long unsigned)dp->bsize) < 0) {
|
||||
return -1;
|
||||
}
|
||||
#endif /* LARGE_SMB_OFF_T */
|
||||
|
||||
|
||||
|
||||
DEBUG (3, ("get_quota: Running command %s\n", syscmd));
|
||||
|
||||
lines = file_lines_pload(syscmd, NULL);
|
||||
SAFE_FREE(syscmd);
|
||||
if (lines) {
|
||||
char *line = lines[0];
|
||||
|
||||
DEBUG (3, ("Read output from set_quota, \"%s\"\n", line));
|
||||
|
||||
file_lines_free(lines);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
DEBUG (0, ("set_quota_command failed!\n"));
|
||||
|
@ -583,80 +583,128 @@ ssize_t message_push_blob(uint8 **outbuf, DATA_BLOB blob)
|
||||
Reduce a file name, removing .. elements.
|
||||
********************************************************************/
|
||||
|
||||
void dos_clean_name(char *s)
|
||||
static char *dos_clean_name(TALLOC_CTX *ctx, const char *s)
|
||||
{
|
||||
char *p=NULL;
|
||||
char *p = NULL;
|
||||
char *str = NULL;
|
||||
|
||||
DEBUG(3,("dos_clean_name [%s]\n",s));
|
||||
|
||||
/* remove any double slashes */
|
||||
all_string_sub(s, "\\\\", "\\", 0);
|
||||
|
||||
/* Remove leading .\\ characters */
|
||||
if(strncmp(s, ".\\", 2) == 0) {
|
||||
trim_string(s, ".\\", NULL);
|
||||
if(*s == 0)
|
||||
pstrcpy(s,".\\");
|
||||
str = talloc_all_string_sub(ctx, s, "\\\\", "\\");
|
||||
if (!str) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while ((p = strstr_m(s,"\\..\\")) != NULL) {
|
||||
pstring s1;
|
||||
/* Remove leading .\\ characters */
|
||||
if(strncmp(str, ".\\", 2) == 0) {
|
||||
trim_string(str, ".\\", NULL);
|
||||
if(*str == 0) {
|
||||
str = talloc_strdup(ctx, ".\\");
|
||||
if (!str) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while ((p = strstr_m(str,"\\..\\")) != NULL) {
|
||||
char *s1;
|
||||
|
||||
*p = 0;
|
||||
pstrcpy(s1,p+3);
|
||||
s1 = p+3;
|
||||
|
||||
if ((p=strrchr_m(s,'\\')) != NULL)
|
||||
if ((p=strrchr_m(str,'\\')) != NULL) {
|
||||
*p = 0;
|
||||
else
|
||||
*s = 0;
|
||||
pstrcat(s,s1);
|
||||
}
|
||||
} else {
|
||||
*str = 0;
|
||||
}
|
||||
str = talloc_asprintf(ctx,
|
||||
"%s%s",
|
||||
str,
|
||||
s1);
|
||||
if (!str) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
trim_string(s,NULL,"\\..");
|
||||
all_string_sub(s, "\\.\\", "\\", 0);
|
||||
trim_string(str,NULL,"\\..");
|
||||
return talloc_all_string_sub(ctx, str, "\\.\\", "\\");
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Reduce a file name, removing .. elements.
|
||||
Reduce a file name, removing .. elements.
|
||||
********************************************************************/
|
||||
|
||||
void unix_clean_name(char *s)
|
||||
char *unix_clean_name(TALLOC_CTX *ctx, const char *s)
|
||||
{
|
||||
char *p=NULL;
|
||||
char *p = NULL;
|
||||
char *str = NULL;
|
||||
|
||||
DEBUG(3,("unix_clean_name [%s]\n",s));
|
||||
|
||||
/* remove any double slashes */
|
||||
all_string_sub(s, "//","/", 0);
|
||||
|
||||
/* Remove leading ./ characters */
|
||||
if(strncmp(s, "./", 2) == 0) {
|
||||
trim_string(s, "./", NULL);
|
||||
if(*s == 0)
|
||||
pstrcpy(s,"./");
|
||||
str = talloc_all_string_sub(ctx, s, "//","/");
|
||||
if (!str) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while ((p = strstr_m(s,"/../")) != NULL) {
|
||||
pstring s1;
|
||||
/* Remove leading ./ characters */
|
||||
if(strncmp(str, "./", 2) == 0) {
|
||||
trim_string(str, "./", NULL);
|
||||
if(*str == 0) {
|
||||
str = talloc_strdup(ctx, "./");
|
||||
if (!str) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while ((p = strstr_m(str,"/../")) != NULL) {
|
||||
char *s1;
|
||||
|
||||
*p = 0;
|
||||
pstrcpy(s1,p+3);
|
||||
s1 = p+3;
|
||||
|
||||
if ((p=strrchr_m(s,'/')) != NULL)
|
||||
if ((p=strrchr_m(str,'/')) != NULL) {
|
||||
*p = 0;
|
||||
else
|
||||
*s = 0;
|
||||
pstrcat(s,s1);
|
||||
}
|
||||
} else {
|
||||
*str = 0;
|
||||
}
|
||||
str = talloc_asprintf(ctx,
|
||||
"%s%s",
|
||||
str,
|
||||
s1);
|
||||
if (!str) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
trim_string(s,NULL,"/..");
|
||||
all_string_sub(s, "/./", "/", 0);
|
||||
trim_string(str,NULL,"/..");
|
||||
return talloc_all_string_sub(ctx, str, "/./", "/");
|
||||
}
|
||||
|
||||
void clean_name(char *s)
|
||||
char *clean_name(TALLOC_CTX *ctx, const char *s)
|
||||
{
|
||||
dos_clean_name(s);
|
||||
unix_clean_name(s);
|
||||
char *str = dos_clean_name(ctx, s);
|
||||
if (!str) {
|
||||
return NULL;
|
||||
}
|
||||
return unix_clean_name(ctx, str);
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Horrible temporary hack until pstring is dead.
|
||||
********************************************************************/
|
||||
|
||||
char *pstring_clean_name(pstring s)
|
||||
{
|
||||
char *str = clean_name(NULL,s);
|
||||
if (!str) {
|
||||
return NULL;
|
||||
}
|
||||
pstrcpy(s, str);
|
||||
TALLOC_FREE(str);
|
||||
return s;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
@ -911,9 +959,9 @@ void become_daemon(bool Fork, bool no_process_group)
|
||||
Put up a yes/no prompt.
|
||||
****************************************************************************/
|
||||
|
||||
bool yesno(char *p)
|
||||
bool yesno(const char *p)
|
||||
{
|
||||
pstring ans;
|
||||
char ans[20];
|
||||
printf("%s",p);
|
||||
|
||||
if (!fgets(ans,sizeof(ans)-1,stdin))
|
||||
@ -1250,23 +1298,22 @@ int interpret_protocol(const char *str,int def)
|
||||
/******************************************************************
|
||||
Remove any mount options such as -rsize=2048,wsize=2048 etc.
|
||||
Based on a fix from <Thomas.Hepper@icem.de>.
|
||||
Returns a malloc'ed string.
|
||||
*******************************************************************/
|
||||
|
||||
static void strip_mount_options( pstring *str)
|
||||
static char *strip_mount_options(const char *str)
|
||||
{
|
||||
if (**str == '-') {
|
||||
char *p = *str;
|
||||
if (*str == '-') {
|
||||
char *p = str;
|
||||
while(*p && !isspace(*p))
|
||||
p++;
|
||||
while(*p && isspace(*p))
|
||||
p++;
|
||||
if(*p) {
|
||||
pstring tmp_str;
|
||||
|
||||
pstrcpy(tmp_str, p);
|
||||
pstrcpy(*str, tmp_str);
|
||||
return SMB_STRDUP(p);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
@ -1288,6 +1335,7 @@ char *automount_lookup(const char *user_name)
|
||||
nis_result *result;
|
||||
nis_object *object;
|
||||
entry_obj *entry;
|
||||
char *tmpstr = NULL;
|
||||
|
||||
if (strcmp(user_name, last_key)) {
|
||||
slprintf(buffer, sizeof(buffer)-1, "[key=%s],%s", user_name, nis_map);
|
||||
@ -1313,7 +1361,11 @@ char *automount_lookup(const char *user_name)
|
||||
nis_freeresult(result);
|
||||
}
|
||||
|
||||
strip_mount_options(&last_value);
|
||||
tmpstr = strip_mount_options(last_value);
|
||||
if (tmpstr) {
|
||||
pstrcpy(last_value, tmpstr);
|
||||
SAFE_FREE(tmpstr);
|
||||
}
|
||||
|
||||
DEBUG(4, ("NIS+ Lookup: %s resulted in %s\n", user_name, last_value));
|
||||
return last_value;
|
||||
@ -1345,9 +1397,14 @@ char *automount_lookup(const char *user_name)
|
||||
} else {
|
||||
if ((nis_error = yp_match(nis_domain, nis_map, user_name, strlen(user_name),
|
||||
&nis_result, &nis_result_len)) == 0) {
|
||||
char *tmpstr = NULL;
|
||||
fstrcpy(last_key, user_name);
|
||||
pstrcpy(last_value, nis_result);
|
||||
strip_mount_options(&last_value);
|
||||
tmpstr = strip_mount_options(last_value);
|
||||
if (tmpstr) {
|
||||
pstrcpy(last_value, tmpstr);
|
||||
SAFE_FREE(tmpstr);
|
||||
}
|
||||
|
||||
} else if(nis_error == YPERR_KEY) {
|
||||
|
||||
@ -2103,8 +2160,13 @@ void dump_data_pw(const char *msg, const uchar * data, size_t len)
|
||||
char *tab_depth(int depth)
|
||||
{
|
||||
static pstring spaces;
|
||||
memset(spaces, ' ', depth * 4);
|
||||
spaces[depth * 4] = 0;
|
||||
size_t len = depth * 4;
|
||||
if (len > sizeof(pstring)-1) {
|
||||
len = sizeof(pstring)-1;
|
||||
}
|
||||
|
||||
memset(spaces, ' ', len);
|
||||
spaces[len] = 0;
|
||||
return spaces;
|
||||
}
|
||||
|
||||
@ -2815,46 +2877,6 @@ void *talloc_check_name_abort(const void *ptr, const char *name)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __INSURE__
|
||||
|
||||
/*******************************************************************
|
||||
This routine is a trick to immediately catch errors when debugging
|
||||
with insure. A xterm with a gdb is popped up when insure catches
|
||||
a error. It is Linux specific.
|
||||
********************************************************************/
|
||||
|
||||
int _Insure_trap_error(int a1, int a2, int a3, int a4, int a5, int a6)
|
||||
{
|
||||
static int (*fn)();
|
||||
int ret;
|
||||
char pidstr[10];
|
||||
/* you can get /usr/bin/backtrace from
|
||||
http://samba.org/ftp/unpacked/junkcode/backtrace */
|
||||
pstring cmd = "/usr/bin/backtrace %d";
|
||||
|
||||
slprintf(pidstr, sizeof(pidstr)-1, "%d", sys_getpid());
|
||||
pstring_sub(cmd, "%d", pidstr);
|
||||
|
||||
if (!fn) {
|
||||
static void *h;
|
||||
h = dlopen("/usr/local/parasoft/insure++lite/lib.linux2/libinsure.so", RTLD_LAZY);
|
||||
fn = dlsym(h, "_Insure_trap_error");
|
||||
|
||||
if (!h || h == _Insure_trap_error) {
|
||||
h = dlopen("/usr/local/parasoft/lib.linux2/libinsure.so", RTLD_LAZY);
|
||||
fn = dlsym(h, "_Insure_trap_error");
|
||||
}
|
||||
}
|
||||
|
||||
ret = fn(a1, a2, a3, a4, a5, a6);
|
||||
|
||||
system(cmd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options)
|
||||
{
|
||||
switch (share_access & ~FILE_SHARE_DELETE) {
|
||||
|
@ -105,9 +105,9 @@ static char *file_pload(char *syscmd, size_t *size)
|
||||
{
|
||||
int fd, n;
|
||||
char *p;
|
||||
pstring buf;
|
||||
char buf[1024];
|
||||
size_t total;
|
||||
|
||||
|
||||
fd = sys_popen(syscmd);
|
||||
if (fd == -1) {
|
||||
return NULL;
|
||||
|
@ -81,12 +81,15 @@ void load_case_tables(void)
|
||||
static int initialised;
|
||||
char *old_locale = NULL, *saved_locale = NULL;
|
||||
int i;
|
||||
TALLOC_CTX *frame = NULL;
|
||||
|
||||
if (initialised) {
|
||||
return;
|
||||
}
|
||||
initialised = 1;
|
||||
|
||||
frame = talloc_stackframe();
|
||||
|
||||
upcase_table = (smb_ucs2_t *)map_file(data_path("upcase.dat"),
|
||||
0x20000);
|
||||
upcase_table_use_unmap = ( upcase_table != NULL );
|
||||
@ -147,6 +150,7 @@ void load_case_tables(void)
|
||||
SAFE_FREE(saved_locale);
|
||||
}
|
||||
#endif
|
||||
TALLOC_FREE(frame);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -157,7 +161,7 @@ void load_case_tables(void)
|
||||
int check_dos_char(smb_ucs2_t c)
|
||||
{
|
||||
lazy_initialize_conv();
|
||||
|
||||
|
||||
/* Find the right byte, and right bit within the byte; return
|
||||
* 1 or 0 */
|
||||
return (doschar_table[(c & 0xffff) / 8] & (1 << (c & 7))) != 0;
|
||||
@ -329,26 +333,54 @@ int rpcstr_pull_unistr2_fstring(char *dest, UNISTR2 *src)
|
||||
* copy because I don't really know how pull_ucs2 and friends calculate the
|
||||
* target size. If this turns out to be a major bottleneck someone with deeper
|
||||
* multi-byte knowledge needs to revisit this.
|
||||
* I just did (JRA :-). No longer uses copy.
|
||||
* My (VL) use is dsr_getdcname, which returns 6 strings, the alternative would
|
||||
* have been to manually talloc_strdup them in rpc_client/cli_netlogon.c.
|
||||
*/
|
||||
|
||||
char *rpcstr_pull_unistr2_talloc(TALLOC_CTX *mem_ctx, const UNISTR2 *src)
|
||||
char *rpcstr_pull_unistr2_talloc(TALLOC_CTX *ctx, const UNISTR2 *src)
|
||||
{
|
||||
pstring tmp;
|
||||
size_t result;
|
||||
|
||||
result = pull_ucs2(NULL, tmp, src->buffer, sizeof(tmp),
|
||||
src->uni_str_len * 2, 0);
|
||||
if (result == (size_t)-1) {
|
||||
char *dest = NULL;
|
||||
size_t dest_len = convert_string_talloc(ctx,
|
||||
CH_UTF16LE,
|
||||
CH_UNIX,
|
||||
src->buffer,
|
||||
src->uni_str_len * 2,
|
||||
(void **)&dest,
|
||||
true);
|
||||
if (dest_len == (size_t)-1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return talloc_strdup(mem_ctx, tmp);
|
||||
/* Ensure we're returning a null terminated string. */
|
||||
if (dest_len) {
|
||||
/* Did we already process the terminating zero ? */
|
||||
if (dest[dest_len-1] != 0) {
|
||||
size_t size = talloc_get_size(dest);
|
||||
/* Have we got space to append the '\0' ? */
|
||||
if (size <= dest_len) {
|
||||
/* No, realloc. */
|
||||
dest = TALLOC_REALLOC_ARRAY(ctx, dest, char,
|
||||
dest_len+1);
|
||||
if (!dest) {
|
||||
/* talloc fail. */
|
||||
dest_len = (size_t)-1;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/* Yay - space ! */
|
||||
dest[dest_len] = '\0';
|
||||
dest_len++;
|
||||
}
|
||||
} else if (dest) {
|
||||
dest[0] = 0;
|
||||
}
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
/* Converts a string from internal samba format to unicode
|
||||
*/
|
||||
*/
|
||||
|
||||
int rpcstr_push(void *dest, const char *src, size_t dest_len, int flags)
|
||||
{
|
||||
|
@ -208,8 +208,12 @@ static void cli_cm_set_mntpoint( struct cli_state *c, const char *mnt )
|
||||
}
|
||||
|
||||
if ( p ) {
|
||||
pstrcpy( p->mount, mnt );
|
||||
clean_name(p->mount);
|
||||
char *name = clean_name(NULL, p->mount);
|
||||
if (!name) {
|
||||
return;
|
||||
}
|
||||
pstrcpy( p->mount, name );
|
||||
TALLOC_FREE(name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -733,6 +733,7 @@ static bool open_sockets(bool isdaemon, int port)
|
||||
POPT_COMMON_SAMBA
|
||||
{ NULL }
|
||||
};
|
||||
TALLOC_CTX *frame = talloc_stackframe(); /* Setup tos. */
|
||||
|
||||
load_case_tables();
|
||||
|
||||
@ -927,6 +928,7 @@ static bool open_sockets(bool isdaemon, int port)
|
||||
/* We can only take signals in the select. */
|
||||
BlockSignals( True, SIGTERM );
|
||||
|
||||
TALLOC_FREE(frame);
|
||||
process();
|
||||
|
||||
if (dbf)
|
||||
|
@ -6151,7 +6151,7 @@ const char *lp_printername(int snum)
|
||||
void lp_set_logfile(const char *name)
|
||||
{
|
||||
string_set(&Globals.szLogFile, name);
|
||||
pstrcpy(debugf, name);
|
||||
debug_set_logfile(name);
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
|
@ -659,18 +659,25 @@ bool nt_printing_init(struct messaging_context *msg_ctx)
|
||||
Function to allow filename parsing "the old way".
|
||||
********************************************************************/
|
||||
|
||||
static void driver_unix_convert(connection_struct *conn,
|
||||
pstring name,
|
||||
static char *driver_unix_convert(connection_struct *conn,
|
||||
const char *old_name,
|
||||
SMB_STRUCT_STAT *pst)
|
||||
{
|
||||
TALLOC_CTX *ctx = talloc_tos();
|
||||
char *name = talloc_strdup(ctx, old_name);
|
||||
char *new_name = NULL;
|
||||
unix_format(name);
|
||||
unix_clean_name(name);
|
||||
trim_string(name,"/","/");
|
||||
unix_convert(talloc_tos(),conn, name, False, &new_name, NULL, pst);
|
||||
if (new_name) {
|
||||
pstrcpy(name, new_name);
|
||||
|
||||
if (!name) {
|
||||
return NULL;
|
||||
}
|
||||
unix_format(name);
|
||||
name = unix_clean_name(ctx, name);
|
||||
if (!name) {
|
||||
return NULL;
|
||||
}
|
||||
trim_string(name,"/","/");
|
||||
unix_convert(ctx,conn, name, false, &new_name, NULL, pst);
|
||||
return new_name;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
@ -1149,7 +1156,7 @@ static int get_file_version(files_struct *fsp, char *fname,uint32 *major, uint32
|
||||
if (IVAL(buf,pos) == VS_MAGIC_VALUE) {
|
||||
*major = IVAL(buf,pos+VS_MAJOR_OFFSET);
|
||||
*minor = IVAL(buf,pos+VS_MINOR_OFFSET);
|
||||
|
||||
|
||||
DEBUG(6,("get_file_version: PE file [%s] Version = %08x:%08x (%d.%d.%d.%d)\n",
|
||||
fname, *major, *minor,
|
||||
(*major>>16)&0xffff, *major&0xffff,
|
||||
@ -1268,8 +1275,8 @@ the modification date). Otherwise chose the numerically larger version number.
|
||||
|
||||
static int file_version_is_newer(connection_struct *conn, fstring new_file, fstring old_file)
|
||||
{
|
||||
bool use_version = True;
|
||||
pstring filepath;
|
||||
bool use_version = true;
|
||||
char *filepath = NULL;
|
||||
|
||||
uint32 new_major;
|
||||
uint32 new_minor;
|
||||
@ -1291,9 +1298,10 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
|
||||
old_create_time = (time_t)0;
|
||||
|
||||
/* Get file version info (if available) for previous file (if it exists) */
|
||||
pstrcpy(filepath, old_file);
|
||||
|
||||
driver_unix_convert(conn,filepath,&stat_buf);
|
||||
filepath = driver_unix_convert(conn,old_file,&stat_buf);
|
||||
if (!filepath) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
status = open_file_ntcreate(conn, NULL, filepath, &stat_buf,
|
||||
FILE_GENERIC_READ,
|
||||
@ -1308,7 +1316,7 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
|
||||
/* Old file not found, so by definition new file is in fact newer */
|
||||
DEBUG(10,("file_version_is_newer: Can't open old file [%s], errno = %d\n",
|
||||
filepath, errno));
|
||||
return True;
|
||||
return 1;
|
||||
|
||||
} else {
|
||||
int ret = get_file_version(fsp, old_file, &old_major, &old_minor);
|
||||
@ -1319,8 +1327,10 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
|
||||
if (!ret) {
|
||||
DEBUG(6,("file_version_is_newer: Version info not found [%s], use mod time\n",
|
||||
old_file));
|
||||
use_version = False;
|
||||
if (SMB_VFS_FSTAT(fsp, fsp->fh->fd, &st) == -1) goto error_exit;
|
||||
use_version = false;
|
||||
if (SMB_VFS_FSTAT(fsp, fsp->fh->fd, &st) == -1) {
|
||||
goto error_exit;
|
||||
}
|
||||
old_create_time = st.st_mtime;
|
||||
DEBUGADD(6,("file_version_is_newer: mod time = %ld sec\n", old_create_time));
|
||||
}
|
||||
@ -1328,8 +1338,10 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
|
||||
close_file(fsp, NORMAL_CLOSE);
|
||||
|
||||
/* Get file version info (if available) for new file */
|
||||
pstrcpy(filepath, new_file);
|
||||
driver_unix_convert(conn,filepath,&stat_buf);
|
||||
filepath = driver_unix_convert(conn,new_file,&stat_buf);
|
||||
if (!filepath) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
status = open_file_ntcreate(conn, NULL, filepath, &stat_buf,
|
||||
FILE_GENERIC_READ,
|
||||
@ -1355,8 +1367,10 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
|
||||
if (!ret) {
|
||||
DEBUG(6,("file_version_is_newer: Version info not found [%s], use mod time\n",
|
||||
new_file));
|
||||
use_version = False;
|
||||
if (SMB_VFS_FSTAT(fsp, fsp->fh->fd, &st) == -1) goto error_exit;
|
||||
use_version = false;
|
||||
if (SMB_VFS_FSTAT(fsp, fsp->fh->fd, &st) == -1) {
|
||||
goto error_exit;
|
||||
}
|
||||
new_create_time = st.st_mtime;
|
||||
DEBUGADD(6,("file_version_is_newer: mod time = %ld sec\n", new_create_time));
|
||||
}
|
||||
@ -1367,24 +1381,24 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
|
||||
/* Compare versions and choose the larger version number */
|
||||
if (new_major > old_major ||
|
||||
(new_major == old_major && new_minor > old_minor)) {
|
||||
|
||||
|
||||
DEBUG(6,("file_version_is_newer: Replacing [%s] with [%s]\n", old_file, new_file));
|
||||
return True;
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
DEBUG(6,("file_version_is_newer: Leaving [%s] unchanged\n", old_file));
|
||||
return False;
|
||||
return 0;
|
||||
}
|
||||
|
||||
} else {
|
||||
/* Compare modification time/dates and choose the newest time/date */
|
||||
if (new_create_time > old_create_time) {
|
||||
DEBUG(6,("file_version_is_newer: Replacing [%s] with [%s]\n", old_file, new_file));
|
||||
return True;
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
DEBUG(6,("file_version_is_newer: Leaving [%s] unchanged\n", old_file));
|
||||
return False;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1402,7 +1416,7 @@ static uint32 get_correct_cversion(const char *architecture, fstring driverpath_
|
||||
{
|
||||
int cversion;
|
||||
NTSTATUS nt_status;
|
||||
pstring driverpath;
|
||||
char *driverpath = NULL;
|
||||
DATA_BLOB null_pw;
|
||||
fstring res_type;
|
||||
files_struct *fsp = NULL;
|
||||
@ -1455,11 +1469,22 @@ static uint32 get_correct_cversion(const char *architecture, fstring driverpath_
|
||||
|
||||
/* Open the driver file (Portable Executable format) and determine the
|
||||
* deriver the cversion. */
|
||||
slprintf(driverpath, sizeof(driverpath)-1, "%s/%s", architecture, driverpath_in);
|
||||
driverpath = talloc_asprintf(talloc_tos(),
|
||||
"%s/%s",
|
||||
architecture,
|
||||
driverpath_in);
|
||||
if (!driverpath) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
driver_unix_convert(conn,driverpath,&st);
|
||||
driverpath = driver_unix_convert(conn,driverpath,&st);
|
||||
if (!driverpath) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
if ( !vfs_file_exist( conn, driverpath, &st ) ) {
|
||||
if (!vfs_file_exist(conn, driverpath, &st)) {
|
||||
*perr = WERR_BADFILE;
|
||||
goto error_exit;
|
||||
}
|
||||
@ -1734,22 +1759,18 @@ WERROR move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract
|
||||
NT_PRINTER_DRIVER_INFO_LEVEL_3 *driver;
|
||||
NT_PRINTER_DRIVER_INFO_LEVEL_3 converted_driver;
|
||||
const char *architecture;
|
||||
pstring new_dir;
|
||||
pstring old_name;
|
||||
pstring new_name;
|
||||
char *new_dir = NULL;
|
||||
char *old_name = NULL;
|
||||
char *new_name = NULL;
|
||||
DATA_BLOB null_pw;
|
||||
connection_struct *conn;
|
||||
NTSTATUS nt_status;
|
||||
pstring inbuf;
|
||||
pstring outbuf;
|
||||
fstring res_type;
|
||||
SMB_STRUCT_STAT st;
|
||||
int ver = 0;
|
||||
int i;
|
||||
TALLOC_CTX *ctx = talloc_tos();
|
||||
int ver = 0;
|
||||
|
||||
memset(inbuf, '\0', sizeof(inbuf));
|
||||
memset(outbuf, '\0', sizeof(outbuf));
|
||||
*perr = WERR_OK;
|
||||
|
||||
if (level==3)
|
||||
@ -1793,13 +1814,27 @@ WERROR move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract
|
||||
return WERR_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
/* WE ARE NOW RUNNING AS USER conn->vuid !!!!! */
|
||||
|
||||
/*
|
||||
* make the directories version and version\driver_name
|
||||
* under the architecture directory.
|
||||
*/
|
||||
DEBUG(5,("Creating first directory\n"));
|
||||
slprintf(new_dir, sizeof(new_dir)-1, "%s/%d", architecture, driver->cversion);
|
||||
driver_unix_convert(conn,new_dir,&st);
|
||||
new_dir = talloc_asprintf(ctx,
|
||||
"%s/%d",
|
||||
architecture,
|
||||
driver->cversion);
|
||||
if (!new_dir) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
new_dir = driver_unix_convert(conn,new_dir,&st);
|
||||
if (!new_dir) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
|
||||
create_directory(conn, new_dir);
|
||||
|
||||
/* For each driver file, archi\filexxx.yyy, if there is a duplicate file
|
||||
@ -1822,10 +1857,29 @@ WERROR move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract
|
||||
DEBUG(5,("Moving files now !\n"));
|
||||
|
||||
if (driver->driverpath && strlen(driver->driverpath)) {
|
||||
slprintf(new_name, sizeof(new_name)-1, "%s/%s", architecture, driver->driverpath);
|
||||
slprintf(old_name, sizeof(old_name)-1, "%s/%s", new_dir, driver->driverpath);
|
||||
new_name = talloc_asprintf(ctx,
|
||||
"%s/%s",
|
||||
architecture,
|
||||
driver->driverpath);
|
||||
if (!new_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
old_name = talloc_asprintf(ctx,
|
||||
"%s/%s",
|
||||
new_dir,
|
||||
driver->driverpath);
|
||||
if (!old_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
|
||||
if (ver != -1 && (ver=file_version_is_newer(conn, new_name, old_name)) > 0) {
|
||||
driver_unix_convert(conn,new_name,&st);
|
||||
new_name = driver_unix_convert(conn,new_name,&st);
|
||||
if (!new_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
if ( !NT_STATUS_IS_OK(copy_file(ctx,conn, new_name, old_name, OPENX_FILE_EXISTS_TRUNCATE|
|
||||
OPENX_FILE_CREATE_IF_NOT_EXIST, 0, False))) {
|
||||
DEBUG(0,("move_driver_to_download_area: Unable to rename [%s] to [%s]\n",
|
||||
@ -1833,15 +1887,33 @@ WERROR move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract
|
||||
*perr = WERR_ACCESS_DENIED;
|
||||
ver = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (driver->datafile && strlen(driver->datafile)) {
|
||||
if (!strequal(driver->datafile, driver->driverpath)) {
|
||||
slprintf(new_name, sizeof(new_name)-1, "%s/%s", architecture, driver->datafile);
|
||||
slprintf(old_name, sizeof(old_name)-1, "%s/%s", new_dir, driver->datafile);
|
||||
new_name = talloc_asprintf(ctx,
|
||||
"%s/%s",
|
||||
architecture,
|
||||
driver->datafile);
|
||||
if (!new_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
old_name = talloc_asprintf(ctx,
|
||||
"%s/%s",
|
||||
new_dir,
|
||||
driver->datafile);
|
||||
if (!old_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
if (ver != -1 && (ver=file_version_is_newer(conn, new_name, old_name)) > 0) {
|
||||
driver_unix_convert(conn,new_name,&st);
|
||||
new_name = driver_unix_convert(conn,new_name,&st);
|
||||
if (!new_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
if ( !NT_STATUS_IS_OK(copy_file(ctx,conn, new_name, old_name, OPENX_FILE_EXISTS_TRUNCATE|
|
||||
OPENX_FILE_CREATE_IF_NOT_EXIST, 0, False))) {
|
||||
DEBUG(0,("move_driver_to_download_area: Unable to rename [%s] to [%s]\n",
|
||||
@ -1856,10 +1928,28 @@ WERROR move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract
|
||||
if (driver->configfile && strlen(driver->configfile)) {
|
||||
if (!strequal(driver->configfile, driver->driverpath) &&
|
||||
!strequal(driver->configfile, driver->datafile)) {
|
||||
slprintf(new_name, sizeof(new_name)-1, "%s/%s", architecture, driver->configfile);
|
||||
slprintf(old_name, sizeof(old_name)-1, "%s/%s", new_dir, driver->configfile);
|
||||
new_name = talloc_asprintf(ctx,
|
||||
"%s/%s",
|
||||
architecture,
|
||||
driver->configfile);
|
||||
if (!new_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
old_name = talloc_asprintf(ctx,
|
||||
"%s/%s",
|
||||
new_dir,
|
||||
driver->configfile);
|
||||
if (!old_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
if (ver != -1 && (ver=file_version_is_newer(conn, new_name, old_name)) > 0) {
|
||||
driver_unix_convert(conn,new_name,&st);
|
||||
new_name = driver_unix_convert(conn,new_name,&st);
|
||||
if (!new_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
if ( !NT_STATUS_IS_OK(copy_file(ctx,conn, new_name, old_name, OPENX_FILE_EXISTS_TRUNCATE|
|
||||
OPENX_FILE_CREATE_IF_NOT_EXIST, 0, False))) {
|
||||
DEBUG(0,("move_driver_to_download_area: Unable to rename [%s] to [%s]\n",
|
||||
@ -1875,10 +1965,28 @@ WERROR move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract
|
||||
if (!strequal(driver->helpfile, driver->driverpath) &&
|
||||
!strequal(driver->helpfile, driver->datafile) &&
|
||||
!strequal(driver->helpfile, driver->configfile)) {
|
||||
slprintf(new_name, sizeof(new_name)-1, "%s/%s", architecture, driver->helpfile);
|
||||
slprintf(old_name, sizeof(old_name)-1, "%s/%s", new_dir, driver->helpfile);
|
||||
new_name = talloc_asprintf(ctx,
|
||||
"%s/%s",
|
||||
architecture,
|
||||
driver->helpfile);
|
||||
if (!new_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
old_name = talloc_asprintf(ctx,
|
||||
"%s/%s",
|
||||
new_dir,
|
||||
driver->helpfile);
|
||||
if (!old_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
if (ver != -1 && (ver=file_version_is_newer(conn, new_name, old_name)) > 0) {
|
||||
driver_unix_convert(conn,new_name,&st);
|
||||
new_name = driver_unix_convert(conn,new_name,&st);
|
||||
if (!new_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
if ( !NT_STATUS_IS_OK(copy_file(ctx,conn, new_name, old_name, OPENX_FILE_EXISTS_TRUNCATE|
|
||||
OPENX_FILE_CREATE_IF_NOT_EXIST, 0, False))) {
|
||||
DEBUG(0,("move_driver_to_download_area: Unable to rename [%s] to [%s]\n",
|
||||
@ -1903,10 +2011,28 @@ WERROR move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract
|
||||
}
|
||||
}
|
||||
|
||||
slprintf(new_name, sizeof(new_name)-1, "%s/%s", architecture, driver->dependentfiles[i]);
|
||||
slprintf(old_name, sizeof(old_name)-1, "%s/%s", new_dir, driver->dependentfiles[i]);
|
||||
new_name = talloc_asprintf(ctx,
|
||||
"%s/%s",
|
||||
architecture,
|
||||
driver->dependentfiles[i]);
|
||||
if (!new_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
old_name = talloc_asprintf(ctx,
|
||||
"%s/%s",
|
||||
new_dir,
|
||||
driver->dependentfiles[i]);
|
||||
if (!old_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
if (ver != -1 && (ver=file_version_is_newer(conn, new_name, old_name)) > 0) {
|
||||
driver_unix_convert(conn,new_name,&st);
|
||||
new_name = driver_unix_convert(conn,new_name,&st);
|
||||
if (!new_name) {
|
||||
*perr = WERR_NOMEM;
|
||||
goto err_exit;
|
||||
}
|
||||
if ( !NT_STATUS_IS_OK(copy_file(ctx,conn, new_name, old_name,
|
||||
OPENX_FILE_EXISTS_TRUNCATE|
|
||||
OPENX_FILE_CREATE_IF_NOT_EXIST, 0, False))) {
|
||||
@ -1921,10 +2047,18 @@ WERROR move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract
|
||||
}
|
||||
}
|
||||
|
||||
err_exit:
|
||||
|
||||
close_cnum(conn, user->vuid);
|
||||
unbecome_user();
|
||||
|
||||
return ver != -1 ? WERR_OK : WERR_UNKNOWN_PRINTER_DRIVER;
|
||||
if (W_ERROR_EQUAL(*perr, WERR_OK)) {
|
||||
return WERR_OK;
|
||||
}
|
||||
if (ver == -1) {
|
||||
return WERR_UNKNOWN_PRINTER_DRIVER;
|
||||
}
|
||||
return (*perr);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -1463,17 +1463,22 @@ WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S
|
||||
Check a given DOS pathname is valid for a share.
|
||||
********************************************************************/
|
||||
|
||||
char *valid_share_pathname(char *dos_pathname)
|
||||
char *valid_share_pathname(TALLOC_CTX *ctx, const char *dos_pathname)
|
||||
{
|
||||
char *ptr;
|
||||
char *ptr = talloc_strdup(ctx, dos_pathname);
|
||||
|
||||
if (!ptr) {
|
||||
return NULL;
|
||||
}
|
||||
/* Convert any '\' paths to '/' */
|
||||
unix_format(dos_pathname);
|
||||
unix_clean_name(dos_pathname);
|
||||
unix_format(ptr);
|
||||
ptr = unix_clean_name(talloc_tos(), ptr);
|
||||
if (!ptr) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */
|
||||
ptr = dos_pathname;
|
||||
if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/')
|
||||
if (strlen(ptr) > 2 && ptr[1] == ':' && ptr[0] != '/')
|
||||
ptr += 2;
|
||||
|
||||
/* Only absolute paths allowed. */
|
||||
@ -1602,7 +1607,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S
|
||||
return WERR_ACCESS_DENIED;
|
||||
|
||||
/* Check if the pathname is valid. */
|
||||
if (!(path = valid_share_pathname( pathname )))
|
||||
if (!(path = valid_share_pathname(p->mem_ctx, pathname )))
|
||||
return WERR_OBJECT_PATH_INVALID;
|
||||
|
||||
/* Ensure share name, pathname and comment don't contain '"' characters. */
|
||||
@ -1774,7 +1779,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S
|
||||
return WERR_ACCESS_DENIED;
|
||||
|
||||
/* Check if the pathname is valid. */
|
||||
if (!(path = valid_share_pathname( pathname )))
|
||||
if (!(path = valid_share_pathname(p->mem_ctx, pathname )))
|
||||
return WERR_OBJECT_PATH_INVALID;
|
||||
|
||||
/* Ensure share name, pathname and comment don't contain '"' characters. */
|
||||
|
@ -580,17 +580,16 @@ WERROR _winreg_AbortSystemShutdown(pipes_struct *p, struct winreg_AbortSystemShu
|
||||
|
||||
if ( can_shutdown )
|
||||
become_root();
|
||||
|
||||
|
||||
ret = smbrun( abort_shutdown_script, NULL );
|
||||
|
||||
|
||||
if ( can_shutdown )
|
||||
unbecome_root();
|
||||
|
||||
|
||||
/********** END SeRemoteShutdownPrivilege BLOCK **********/
|
||||
|
||||
DEBUG(3,("_reg_abort_shutdown: Running the command `%s' gave %d\n",
|
||||
abort_shutdown_script, ret));
|
||||
|
||||
|
||||
return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED;
|
||||
}
|
||||
@ -605,19 +604,19 @@ static int validate_reg_filename( pstring fname )
|
||||
int snum;
|
||||
pstring share_path;
|
||||
pstring unix_fname;
|
||||
|
||||
|
||||
/* convert to a unix path, stripping the C:\ along the way */
|
||||
|
||||
if ( !(p = valid_share_pathname( fname ) ))
|
||||
|
||||
if ( !(p = valid_share_pathname(NULL, fname)))
|
||||
return -1;
|
||||
|
||||
/* has to exist within a valid file share */
|
||||
|
||||
|
||||
for ( snum=0; snum<num_services; snum++ ) {
|
||||
|
||||
|
||||
if ( !lp_snum_ok(snum) || lp_print_ok(snum) )
|
||||
continue;
|
||||
|
||||
|
||||
pstrcpy( share_path, lp_pathname(snum) );
|
||||
|
||||
/* make sure we have a path (e.g. [homes] ) */
|
||||
@ -628,12 +627,14 @@ static int validate_reg_filename( pstring fname )
|
||||
if ( strncmp( share_path, p, strlen( share_path )) == 0 )
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/* p and fname are overlapping memory so copy out and back in again */
|
||||
|
||||
|
||||
pstrcpy( unix_fname, p );
|
||||
pstrcpy( fname, unix_fname );
|
||||
|
||||
|
||||
TALLOC_FREE(p);
|
||||
|
||||
return (snum < num_services) ? snum : -1;
|
||||
}
|
||||
|
||||
|
@ -954,6 +954,7 @@ extern void build_options(bool screen);
|
||||
POPT_COMMON_DYNCONFIG
|
||||
POPT_TABLEEND
|
||||
};
|
||||
TALLOC_CTX *frame = talloc_stackframe(); /* Setup tos. */
|
||||
|
||||
load_case_tables();
|
||||
|
||||
@ -1231,7 +1232,7 @@ extern void build_options(bool screen);
|
||||
/* Setup oplocks */
|
||||
if (!init_oplocks(smbd_messaging_context()))
|
||||
exit(1);
|
||||
|
||||
|
||||
/* Setup aio signal handler. */
|
||||
initialize_async_io_handler();
|
||||
|
||||
@ -1262,6 +1263,8 @@ extern void build_options(bool screen);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
TALLOC_FREE(frame);
|
||||
|
||||
smbd_process();
|
||||
|
||||
namecache_shutdown();
|
||||
|
@ -867,7 +867,7 @@ static struct cli_state *connect_one(const char *server, const char *share)
|
||||
};
|
||||
|
||||
struct cli_state *cli;
|
||||
TALLOC_CTX *frame;
|
||||
TALLOC_CTX *frame = talloc_stackframe();
|
||||
pstring owner_username;
|
||||
fstring server;
|
||||
|
||||
@ -875,7 +875,6 @@ static struct cli_state *connect_one(const char *server, const char *share)
|
||||
|
||||
load_case_tables();
|
||||
|
||||
frame = talloc_stackframe();
|
||||
|
||||
/* set default debug level to 1 regardless of what smb.conf sets */
|
||||
setup_logging( "smbcacls", True );
|
||||
|
@ -1368,6 +1368,7 @@ const char *lang_msg_rotate(const char *msgid)
|
||||
POPT_COMMON_SAMBA
|
||||
POPT_TABLEEND
|
||||
};
|
||||
TALLOC_CTX *frame = talloc_stackframe();
|
||||
|
||||
fault_setup(NULL);
|
||||
umask(S_IWGRP | S_IWOTH);
|
||||
@ -1454,6 +1455,8 @@ const char *lang_msg_rotate(const char *msgid)
|
||||
}
|
||||
|
||||
print_footer();
|
||||
|
||||
TALLOC_FREE(frame);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1007,6 +1007,7 @@ int main(int argc, char **argv, char **envp)
|
||||
};
|
||||
poptContext pc;
|
||||
int opt;
|
||||
TALLOC_CTX *frame = talloc_stackframe();
|
||||
|
||||
/* glibc (?) likes to print "User defined signal 1" and exit if a
|
||||
SIGUSR[12] is received before a handler is installed */
|
||||
@ -1232,8 +1233,9 @@ int main(int argc, char **argv, char **envp)
|
||||
|
||||
/* Loop waiting for requests */
|
||||
|
||||
TALLOC_FREE(frame);
|
||||
while (1) {
|
||||
TALLOC_CTX *frame = talloc_stackframe();
|
||||
frame = talloc_stackframe();
|
||||
process_loop();
|
||||
TALLOC_FREE(frame);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user