diff options
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/membuffer.c | 14 | ||||
-rw-r--r-- | source3/lib/msrpc-client.c | 11 | ||||
-rw-r--r-- | source3/lib/passcheck.c | 18 | ||||
-rw-r--r-- | source3/lib/util.c | 7 | ||||
-rw-r--r-- | source3/lib/vuser.c | 88 |
5 files changed, 85 insertions, 53 deletions
diff --git a/source3/lib/membuffer.c b/source3/lib/membuffer.c index 170433074f..e228503643 100644 --- a/source3/lib/membuffer.c +++ b/source3/lib/membuffer.c @@ -70,7 +70,7 @@ void mem_init(struct mem_buf *buf, int margin) buf->next = NULL; buf->offset.start = 0; - buf->offset.end = 0; + buf->offset.end = 0x0; } /******************************************************************* @@ -119,6 +119,7 @@ BOOL mem_alloc_data(struct mem_buf *buf, int size) } bzero(buf->data, buf->data_size); + buf->offset.end = buf->offset.start + size; return True; } @@ -229,6 +230,7 @@ void mem_free_data(struct mem_buf *buf) if (buf->data != NULL && buf->dynamic) { free(buf->data); /* delete data in this structure */ + buf->data = NULL; } mem_init(buf, buf->margin); } @@ -276,6 +278,10 @@ BOOL mem_realloc_data(struct mem_buf *buf, size_t new_size) return False; } + buf->offset.end = buf->offset.start + new_size; + + DEBUG(150,("mem_realloc_data: size: %d start: %d end: %d\n", + new_size, buf->offset.start, buf->offset.end)); return True; } @@ -286,13 +292,13 @@ BOOL mem_grow_data(struct mem_buf **buf, BOOL io, int new_size, BOOL force_grow) { if (new_size + (*buf)->margin >= (*buf)->data_size) { - if (io && !force_grow) + if (!io || force_grow) { - DEBUG(3,("mem_grow_data: cannot resize when reading from a data stream\n")); + /* writing or forge realloc */ + return mem_realloc_data((*buf), new_size); } else { - return mem_realloc_data((*buf), new_size); } } return True; diff --git a/source3/lib/msrpc-client.c b/source3/lib/msrpc-client.c index 6e80063862..e13850a9e2 100644 --- a/source3/lib/msrpc-client.c +++ b/source3/lib/msrpc-client.c @@ -41,6 +41,9 @@ BOOL msrpc_send_prs(struct msrpc_state *msrpc, prs_struct *ps) { size_t len = mem_buf_len(ps->data); + DEBUG(10,("msrpc_send_prs: len %d\n", len)); + dbgflush(); + _smb_setlen(msrpc->outbuf, len); mem_buf_copy(&msrpc->outbuf[4], ps->data, 0, len); @@ -176,14 +179,6 @@ static BOOL msrpc_authenticate(struct msrpc_state *msrpc, command = usr != NULL ? AGENT_CMD_CON : AGENT_CMD_CON_ANON; - if (usr != NULL) - { - usr->ptr_ntc = 1; - usr->ptr_uxc = 1; - usr->ptr_nts = 0; - usr->ptr_uxs = 0; - } - if (!create_user_creds(&ps, msrpc->pipe_name, 0x0, command, usr)) { DEBUG(0,("could not parse credentials\n")); diff --git a/source3/lib/passcheck.c b/source3/lib/passcheck.c index 195a404ff3..bec6455059 100644 --- a/source3/lib/passcheck.c +++ b/source3/lib/passcheck.c @@ -35,7 +35,7 @@ core of smb password checking routine. ****************************************************************************/ static BOOL smb_pwd_check_ntlmv1(char *password, unsigned char *part_passwd, unsigned char *c8, - uchar sess_key[16]) + uchar user_sess_key[16]) { /* Finish the encryption of part_passwd. */ unsigned char p24[24]; @@ -47,9 +47,9 @@ static BOOL smb_pwd_check_ntlmv1(char *password, unsigned char *part_passwd, return True; SMBOWFencrypt(part_passwd, c8, p24); - if (sess_key != NULL) + if (user_sess_key != NULL) { - SMBsesskeygen_ntv1(part_passwd, NULL, sess_key); + SMBsesskeygen_ntv1(part_passwd, NULL, user_sess_key); } #if DEBUG_PASSWORD @@ -72,7 +72,7 @@ static BOOL smb_pwd_check_ntlmv2(char *password, size_t pwd_len, unsigned char *part_passwd, unsigned char const *c8, const char *user, const char *domain, - char *sess_key) + char *user_sess_key) { /* Finish the encryption of part_passwd. */ unsigned char kr[16]; @@ -90,9 +90,9 @@ static BOOL smb_pwd_check_ntlmv2(char *password, size_t pwd_len, ntv2_owf_gen(part_passwd, user, domain, kr); SMBOWFencrypt_ntv2(kr, c8, 8, password+16, pwd_len-16, resp); - if (sess_key != NULL) + if (user_sess_key != NULL) { - SMBsesskeygen_ntv2(kr, resp, sess_key); + SMBsesskeygen_ntv2(kr, resp, user_sess_key); } #if DEBUG_PASSWORD @@ -117,7 +117,7 @@ BOOL smb_password_ok(struct smb_passwd *smb_pass, uchar challenge[8], const char *user, const char *domain, uchar *lm_pass, size_t lm_pwd_len, uchar *nt_pass, size_t nt_pwd_len, - uchar sess_key[16]) + uchar user_sess_key[16]) { if (smb_pass == NULL) { @@ -151,7 +151,7 @@ BOOL smb_password_ok(struct smb_passwd *smb_pass, uchar challenge[8], if (smb_pwd_check_ntlmv2(nt_pass, nt_pwd_len, (uchar *)smb_pass->smb_nt_passwd, challenge, user, domain, - sess_key)) + user_sess_key)) { return True; } @@ -162,7 +162,7 @@ BOOL smb_password_ok(struct smb_passwd *smb_pass, uchar challenge[8], if (smb_pwd_check_ntlmv1((char *)nt_pass, (uchar *)smb_pass->smb_nt_passwd, challenge, - sess_key)) + user_sess_key)) { DEBUG(4,("NT MD4 password check succeeded\n")); return True; diff --git a/source3/lib/util.c b/source3/lib/util.c index 65908ff19e..22adee49df 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -3012,7 +3012,12 @@ void dump_data(int level, const char *buf1, int len) { unsigned char const *buf = (unsigned char const *)buf1; int i=0; - if (len<=0) return; + if (len<0) return; + if (len == 0) + { + DEBUG(level,("\n")); + return; + } DEBUG(level,("[%03X] ",i)); for (i=0;i<len;) diff --git a/source3/lib/vuser.c b/source3/lib/vuser.c index dfad258152..09a553e4e6 100644 --- a/source3/lib/vuser.c +++ b/source3/lib/vuser.c @@ -55,18 +55,12 @@ void invalidate_vuid(uint16 vuid) vuser->uid = (uid_t)-1; vuser->gid = (gid_t)-1; - vuser->n_sids = 0; - /* same number of igroups as groups */ vuser->n_groups = 0; if (vuser->groups) free((char *)vuser->groups); - if (vuser->sids) - free((char *)vuser->sids); - - vuser->sids = NULL; vuser->groups = NULL; } @@ -89,9 +83,53 @@ register a uid/name pair as being valid and that a valid password has been given. vuid is biased by an offset. This allows us to tell random client vuid's (normally zero) from valid vuids. ****************************************************************************/ -uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name, BOOL guest, uchar user_sess_key[16]) +uint16 create_vuid(uid_t uid, gid_t gid, int n_groups, gid_t *groups, + char *unix_name, char *requested_name, + char *real_name, + BOOL guest, uchar user_sess_key[16]) { user_struct *vuser; + + validated_users = (user_struct *)Realloc(validated_users, + sizeof(user_struct)* + (num_validated_users+1)); + + if (!validated_users) + { + DEBUG(0,("Failed to realloc users struct!\n")); + num_validated_users = 0; + return UID_FIELD_INVALID; + } + + vuser = &validated_users[num_validated_users]; + num_validated_users++; + + vuser->uid = uid; + vuser->gid = gid; + vuser->guest = guest; + fstrcpy(vuser->name,unix_name); + fstrcpy(vuser->requested_name,requested_name); + fstrcpy(vuser->real_name,real_name); + memcpy(vuser->user_sess_key, user_sess_key, sizeof(vuser->user_sess_key)); + + vuser->n_groups = n_groups; + vuser->groups = groups; + + DEBUG(3,("uid %d registered to name %s\n",(int)uid,unix_name)); + + return (uint16)((num_validated_users - 1) + VUID_OFFSET); +} + +/**************************************************************************** +register a uid/name pair as being valid and that a valid password +has been given. vuid is biased by an offset. This allows us to +tell random client vuid's (normally zero) from valid vuids. +****************************************************************************/ +uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name, BOOL guest, uchar user_sess_key[16]) +{ + int n_groups; + gid_t *groups; + fstring real_name; struct passwd *pwfile; /* for getting real name from passwd file */ /* Ensure no vuid gets registered in share level security. */ @@ -130,40 +168,28 @@ uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name, return UID_FIELD_INVALID; } - vuser = &validated_users[num_validated_users]; - num_validated_users++; - - vuser->uid = uid; - vuser->gid = gid; - vuser->guest = guest; - fstrcpy(vuser->name,unix_name); - fstrcpy(vuser->requested_name,requested_name); - memcpy(vuser->dc.user_sess_key, user_sess_key, sizeof(vuser->dc.user_sess_key)); - - vuser->n_sids = 0; - vuser->sids = NULL; - - vuser->n_groups = 0; - vuser->groups = NULL; - /* Find all the groups this uid is in and store them. Used by become_user() */ get_unixgroups(unix_name,uid,gid, - &vuser->n_groups, - &vuser->groups); + &n_groups, + &groups); DEBUG(3,("uid %d registered to name %s\n",(int)uid,unix_name)); DEBUG(3, ("Clearing default real name\n")); - fstrcpy(vuser->real_name, "<Full Name>\0"); - if (lp_unix_realname()) { - if ((pwfile=hashed_getpwnam(vuser->name))!= NULL) + fstrcpy(real_name, "<Full Name>\0"); + if (lp_unix_realname()) + { + if ((pwfile=hashed_getpwnam(unix_name))!= NULL) { - DEBUG(3, ("User name: %s\tReal name: %s\n",vuser->name,pwfile->pw_gecos)); - fstrcpy(vuser->real_name, pwfile->pw_gecos); + DEBUG(3, ("User name: %s\tReal name: %s\n",unix_name,pwfile->pw_gecos)); + fstrcpy(real_name, pwfile->pw_gecos); } } - return (uint16)((num_validated_users - 1) + VUID_OFFSET); + return create_vuid(uid, gid, n_groups, groups, + unix_name, requested_name, + real_name, + guest, user_sess_key); } |