The branch, master has been updated via fab08854af3 libsmb: Pass neg contexts through sync smbXcli_negprot_recv() via b693b6accc5 libsmb: Make libsmb/clispnego.c static to libads/ via a0181938c1a libcli: Correct guard #define via cd2e6c45628 clifuse: Start implementing forget() via 27ae6bdbb15 clifuse: Use an empty array for holding the inode path via 94dcda1ee2c examples: Slightly modernize printfs in teststat via aef98c6356b libsmb: Remove two #defines just used once via 446a3b3e8ae smbd: Modernize a few DBG statements via 94433d1d019 examples: Use explicit SMBCCTX via 3b8cfda1c96 lib: Avoid a tdb handle leak via 46f710c95f4 lib: Modernize tdb_fetch_lifetime() via e6136139be9 libsmb: Remove unused cli_is_dos_error() via b0b1fc1974b libsmb: Remove unused cli_dos_error() via 05828c3e382 libsmb: Eliminate a reader of cli->raw_status via 3cfe1683ddd libsmb: Remove SMBC_errno() via 15ff9c18198 libsmb: Remove a call to SMBC_errno() via bb8ec333400 libsmb: Remove a call to SMBC_errno() via 9ec7245b1b4 libsmb: Remove a call to SMBC_errno() via 2399b105fe1 libsmb: Remove unused cli_is_nt_error() via aaf5821dac4 smbclient: Save lines with talloc_asprintf_addbuf() from 9c316623e5f libsmb: Extend cli_mknod to create NFS reparse points
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit fab08854af3843a5de42fefe209090a7563e7f11 Author: Volker Lendecke <v...@samba.org> Date: Tue Sep 19 11:10:12 2023 -0700 libsmb: Pass neg contexts through sync smbXcli_negprot_recv() Looks much larger than it is, there's a lot of callers too feed NULL to. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Mon Sep 25 19:59:17 UTC 2023 on atb-devel-224 commit b693b6accc5c889dd2ccb137b510282aff6ef619 Author: Volker Lendecke <v...@samba.org> Date: Thu Sep 14 19:00:06 2023 +0200 libsmb: Make libsmb/clispnego.c static to libads/ It's only called there. The "+" part of this patch might not conform to README.Coding because it's a literal cut&paste. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit a0181938c1a6073b4afaf7d395d6225afcbe9b4b Author: Volker Lendecke <v...@samba.org> Date: Sun Sep 10 07:05:04 2023 +0200 libcli: Correct guard #define Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit cd2e6c4562828b40edff3be49703cef5f09485f1 Author: Volker Lendecke <v...@samba.org> Date: Tue Aug 22 12:58:29 2023 +0200 clifuse: Start implementing forget() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 27ae6bdbb157c81f0e8a16dc03788dc930fa8b0f Author: Volker Lendecke <v...@samba.org> Date: Tue Aug 22 09:22:13 2023 +0200 clifuse: Use an empty array for holding the inode path Cleaner these days. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 94dcda1ee2c2d11bee0ad9cdfc0341d2a209c10a Author: Volker Lendecke <v...@samba.org> Date: Mon Aug 14 17:28:28 2023 +0200 examples: Slightly modernize printfs in teststat long long works, but it's a bit too specific now that we have intmax_t Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit aef98c6356b351f0fa8b7f1612384df865b4547f Author: Volker Lendecke <v...@samba.org> Date: Wed Aug 23 13:25:37 2023 +0200 libsmb: Remove two #defines just used once To me these two did not create clarity. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 446a3b3e8ae2c0603ac3c4d504b9d1b19e89f414 Author: Volker Lendecke <v...@samba.org> Date: Wed Aug 23 16:36:06 2023 +0200 smbd: Modernize a few DBG statements Changes on level from 4 to 3 in store_file_unix_basic(). Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 94433d1d0194ae78bb48cd24d09953a08c444390 Author: Volker Lendecke <v...@samba.org> Date: Wed Aug 23 16:46:56 2023 +0200 examples: Use explicit SMBCCTX Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 3b8cfda1c963d75ce95f6a7921691aa52a07df07 Author: Volker Lendecke <v...@samba.org> Date: Sat Sep 23 00:50:41 2023 -0700 lib: Avoid a tdb handle leak Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 46f710c95f4461c7ad2b6b757549ffb5e5c31d8c Author: Volker Lendecke <v...@samba.org> Date: Sat Sep 23 00:41:22 2023 -0700 lib: Modernize tdb_fetch_lifetime() Just came across this, avoid mallocs. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit e6136139be95203782db095ef4163be853461320 Author: Volker Lendecke <v...@samba.org> Date: Fri Sep 22 19:05:38 2023 -0700 libsmb: Remove unused cli_is_dos_error() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b0b1fc1974bd8d2d7ecf94e6ad09d068d3c0d29c Author: Volker Lendecke <v...@samba.org> Date: Fri Sep 22 18:56:58 2023 -0700 libsmb: Remove unused cli_dos_error() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 05828c3e38226385b8294c661c8ccd460aef97b1 Author: Volker Lendecke <v...@samba.org> Date: Fri Sep 22 18:47:21 2023 -0700 libsmb: Eliminate a reader of cli->raw_status At some point we should get rid of cli->raw_status. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 3cfe1683ddd0903aeefc791e4b77a8c925558dc5 Author: Volker Lendecke <v...@samba.org> Date: Fri Sep 22 18:44:14 2023 -0700 libsmb: Remove SMBC_errno() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 15ff9c1819826cf4ed5535fa20741adffbbe7281 Author: Volker Lendecke <v...@samba.org> Date: Fri Sep 22 18:42:24 2023 -0700 libsmb: Remove a call to SMBC_errno() This involves converting cli_printjob_del() to NTSTATUS and thus touches a few callers. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit bb8ec33340068dfeaa4cf588d9766dbf954be99e Author: Volker Lendecke <v...@samba.org> Date: Fri Sep 22 17:55:55 2023 -0700 libsmb: Remove a call to SMBC_errno() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 9ec7245b1b40da3fd1887c7131f92d267b08e254 Author: Volker Lendecke <v...@samba.org> Date: Fri Sep 22 17:50:58 2023 -0700 libsmb: Remove a call to SMBC_errno() All returns from cacl_get() now explicitly set the errno. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 2399b105fe158552fea62db8b90af87ad199bf7c Author: Volker Lendecke <v...@samba.org> Date: Fri Sep 22 17:50:19 2023 -0700 libsmb: Remove unused cli_is_nt_error() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit aaf5821dac4bd333ff78d0e2cbe75c72a53a1175 Author: Volker Lendecke <v...@samba.org> Date: Tue Sep 19 10:29:15 2023 -0700 smbclient: Save lines with talloc_asprintf_addbuf() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: examples/fuse/clifuse.c | 22 +++- examples/libsmbclient/teststat.c | 36 ++++-- lib/param/util.c | 60 ++++++---- libcli/smb/reparse.h | 4 +- libcli/smb/smbXcli_base.c | 9 +- libcli/smb/smbXcli_base.h | 5 +- source3/client/client.c | 59 +++------- source3/include/libsmb_internal.h | 7 -- source3/include/proto.h | 10 -- source3/libads/authdata.c | 43 +++++++ source3/libads/sasl.c | 139 ++++++++++++++++++++++ source3/libsmb/cli_smb2_fnum.c | 19 ++-- source3/libsmb/clidfs.c | 8 +- source3/libsmb/clierror.c | 47 -------- source3/libsmb/cliprint.c | 61 +++++++--- source3/libsmb/clispnego.c | 205 --------------------------------- source3/libsmb/libsmb_dir.c | 6 +- source3/libsmb/libsmb_misc.c | 31 ----- source3/libsmb/libsmb_printjob.c | 12 +- source3/libsmb/libsmb_server.c | 8 +- source3/libsmb/libsmb_stat.c | 4 +- source3/libsmb/libsmb_xattr.c | 7 +- source3/libsmb/passchange.c | 8 +- source3/libsmb/proto.h | 5 +- source3/nmbd/nmbd_synclists.c | 9 +- source3/smbd/smb2_trans2.c | 20 ++-- source3/torture/test_posix.c | 5 +- source3/torture/test_smb2.c | 234 +++++++++++++++++++++++++++----------- source3/torture/torture.c | 55 +++++++-- source3/utils/net_rap.c | 9 +- source3/utils/net_rpc.c | 8 +- source3/utils/net_time.c | 8 +- source3/winbindd/winbindd_cm.c | 8 +- source3/wscript_build | 1 - 34 files changed, 642 insertions(+), 530 deletions(-) delete mode 100644 source3/libsmb/clispnego.c Changeset truncated at 500 lines: diff --git a/examples/fuse/clifuse.c b/examples/fuse/clifuse.c index 890dae16307..533fe14c2d4 100644 --- a/examples/fuse/clifuse.c +++ b/examples/fuse/clifuse.c @@ -54,7 +54,7 @@ struct mount_state { struct inode_state { struct idr_context *ino_ctx; fuse_ino_t ino; - char path[1]; + char path[]; }; static int inode_state_destructor(struct inode_state *s); @@ -736,6 +736,25 @@ static void cli_ll_lookup_done(struct tevent_req *req) TALLOC_FREE(state); } +static void +cli_ll_forget(fuse_req_t freq, fuse_ino_t ino, unsigned long nlookup) +{ + struct mount_state *mstate = + talloc_get_type_abort(fuse_req_userdata(freq), + struct mount_state); + struct inode_state *istate = NULL; + + DBG_DEBUG("ino=%ju, nlookup=%lu\n", (uintmax_t)ino, nlookup); + + istate = idr_find(mstate->ino_ctx, ino); + if (istate == NULL) { + fuse_reply_err(freq, ENOENT); + return; + } + TALLOC_FREE(istate); + fuse_reply_none(freq); +} + struct ll_getattr_state { struct mount_state *mstate; fuse_req_t freq; @@ -1399,6 +1418,7 @@ static void cli_ll_releasedir_done(struct tevent_req *req) static struct fuse_lowlevel_ops cli_ll_ops = { .lookup = cli_ll_lookup, + .forget = cli_ll_forget, .getattr = cli_ll_getattr, .open = cli_ll_open, .create = cli_ll_create, diff --git a/examples/libsmbclient/teststat.c b/examples/libsmbclient/teststat.c index 593609bd9cf..c8973e6ad0d 100644 --- a/examples/libsmbclient/teststat.c +++ b/examples/libsmbclient/teststat.c @@ -8,6 +8,7 @@ int main(int argc, char * argv[]) { + SMBCCTX *ctx = NULL; int debug = 0; char m_time[32]; char c_time[32]; @@ -35,18 +36,30 @@ int main(int argc, char * argv[]) return 1; } - smbc_init(get_auth_data_fn, debug); + ctx = smbc_new_context(); + if (ctx == NULL) { + perror("smbc_new_context failed"); + return 1; + } + + smbc_setOptionDebugToStderr(ctx, 1); + smbc_setDebug(ctx, debug); + smbc_init_context(ctx); + smbc_setFunctionAuthData(ctx, get_auth_data_fn); - ret = smbc_stat(pSmbPath, &st); + ret = smbc_getFunctionStat(ctx)(ctx, pSmbPath, &st); if (ret < 0) { perror("smbc_stat"); return 1; } - printf("\nSAMBA\n mtime:%lld/%s ctime:%lld/%s atime:%lld/%s\n", - (long long)st.st_mtime, ctime_r(&st.st_mtime, m_time), - (long long)st.st_ctime, ctime_r(&st.st_ctime, c_time), - (long long)st.st_atime, ctime_r(&st.st_atime, a_time)); + printf("\nSAMBA\n mtime:%jd/%s ctime:%jd/%s atime:%jd/%s\n", + (intmax_t)st.st_mtime, + ctime_r(&st.st_mtime, m_time), + (intmax_t)st.st_ctime, + ctime_r(&st.st_ctime, c_time), + (intmax_t)st.st_atime, + ctime_r(&st.st_atime, a_time)); if (pLocalPath != NULL) { ret = stat(pLocalPath, &st); @@ -55,10 +68,13 @@ int main(int argc, char * argv[]) return 1; } - printf("LOCAL\n mtime:%lld/%s ctime:%lld/%s atime:%lld/%s\n", - (long long)st.st_mtime, ctime_r(&st.st_mtime, m_time), - (long long)st.st_ctime, ctime_r(&st.st_ctime, c_time), - (long long)st.st_atime, ctime_r(&st.st_atime, a_time)); + printf("LOCAL\n mtime:%jd/%s ctime:%jd/%s atime:%jd/%s\n", + (intmax_t)st.st_mtime, + ctime_r(&st.st_mtime, m_time), + (intmax_t)st.st_ctime, + ctime_r(&st.st_ctime, c_time), + (intmax_t)st.st_atime, + ctime_r(&st.st_atime, a_time)); } return 0; diff --git a/lib/param/util.c b/lib/param/util.c index b9055e86e9d..8d862ad6768 100644 --- a/lib/param/util.c +++ b/lib/param/util.c @@ -273,30 +273,37 @@ const char *lpcfg_sam_dnsname(struct loadparm_context *lp_ctx) } } -static long tdb_fetch_lifetime(TALLOC_CTX *mem_ctx, struct tdb_context *tdb, const char *keystr) +static int +tdb_fetch_lifetime_fn(TDB_DATA key, TDB_DATA data, void *private_data) { - TDB_DATA key; - TDB_DATA ret; - char *tmp = NULL; - long result; - - key.dptr = discard_const_p(unsigned char, keystr); - key.dsize = strlen(keystr); - - if (!key.dptr) - return -1; + if (data.dsize < 256) { + long *result = private_data; + char tmp[data.dsize + 1]; + memcpy(tmp, data.dptr, data.dsize); + tmp[data.dsize] = '\0'; + *result = atol(tmp); + return 0; + } + return -1; +} - ret = tdb_fetch(tdb, key); - if (ret.dsize == 0) +static long tdb_fetch_lifetime(struct tdb_context *tdb, + const char *keystr) +{ + long result = -1; + int ret; + + ret = tdb_parse_record( + tdb, + (TDB_DATA){ + .dptr = discard_const_p(uint8_t, keystr), + .dsize = strlen(keystr), + }, + tdb_fetch_lifetime_fn, + &result); + if (ret == -1) { return -1; - - tmp = talloc_realloc(mem_ctx, tmp, char, ret.dsize+1); - memset(tmp, 0, ret.dsize+1); - memcpy(tmp, ret.dptr, ret.dsize); - free(ret.dptr); - - result = atol(tmp); - talloc_free(tmp); + } return result; } @@ -314,15 +321,20 @@ void lpcfg_default_kdc_policy(TALLOC_CTX *mem_ctx, if (kdc_tdb) ctx = tdb_open(kdc_tdb, 0, TDB_DEFAULT, O_RDWR, 0600); - if (!ctx || ( val = tdb_fetch_lifetime(mem_ctx, ctx, "kdc:service_ticket_lifetime") ) == -1 ) + if (!ctx || ( val = tdb_fetch_lifetime(ctx, "kdc:service_ticket_lifetime") ) == -1 ) val = lpcfg_parm_long(lp_ctx, NULL, "kdc", "service ticket lifetime", 10); *svc_tkt_lifetime = val * 60 * 60; - if (!ctx || ( val = tdb_fetch_lifetime(mem_ctx, ctx, "kdc:user_ticket_lifetime") ) == -1 ) + if (!ctx || ( val = tdb_fetch_lifetime(ctx, "kdc:user_ticket_lifetime") ) == -1 ) val = lpcfg_parm_long(lp_ctx, NULL, "kdc", "user ticket lifetime", 10); *usr_tkt_lifetime = val * 60 * 60; - if (!ctx || ( val = tdb_fetch_lifetime(mem_ctx, ctx, "kdc:renewal_lifetime") ) == -1 ) + if (!ctx || ( val = tdb_fetch_lifetime(ctx, "kdc:renewal_lifetime") ) == -1 ) val = lpcfg_parm_long(lp_ctx, NULL, "kdc", "renewal lifetime", 24 * 7); *renewal_lifetime = val * 60 * 60; + + if (ctx != NULL) { + tdb_close(ctx); + ctx = NULL; + } } diff --git a/libcli/smb/reparse.h b/libcli/smb/reparse.h index 1e593272a66..23274bf3852 100644 --- a/libcli/smb/reparse.h +++ b/libcli/smb/reparse.h @@ -15,8 +15,8 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef __UTIL_REPARSE_H__ -#define __UTIL_REPARSE_H__ +#ifndef __LIBCLI_SMB_REPARSE_H__ +#define __LIBCLI_SMB_REPARSE_H__ #include <talloc.h> #include "replace.h" diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c index c3df2278618..d3a70cce85f 100644 --- a/libcli/smb/smbXcli_base.c +++ b/libcli/smb/smbXcli_base.c @@ -5595,7 +5595,10 @@ NTSTATUS smbXcli_negprot_recv( NTSTATUS smbXcli_negprot(struct smbXcli_conn *conn, uint32_t timeout_msec, enum protocol_types min_protocol, - enum protocol_types max_protocol) + enum protocol_types max_protocol, + struct smb2_negotiate_contexts *in_ctx, + TALLOC_CTX *mem_ctx, + struct smb2_negotiate_contexts **out_ctx) { TALLOC_CTX *frame = talloc_stackframe(); struct tevent_context *ev; @@ -5622,7 +5625,7 @@ NTSTATUS smbXcli_negprot(struct smbXcli_conn *conn, min_protocol, max_protocol, WINDOWS_CLIENT_PURE_SMB2_NEGPROT_INITIAL_CREDIT_ASK, - NULL); + in_ctx); if (req == NULL) { goto fail; } @@ -5630,7 +5633,7 @@ NTSTATUS smbXcli_negprot(struct smbXcli_conn *conn, if (!ok) { goto fail; } - status = smbXcli_negprot_recv(req, NULL, NULL); + status = smbXcli_negprot_recv(req, mem_ctx, out_ctx); fail: TALLOC_FREE(frame); return status; diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h index fef68b6b38d..f582cc9964c 100644 --- a/libcli/smb/smbXcli_base.h +++ b/libcli/smb/smbXcli_base.h @@ -481,7 +481,10 @@ NTSTATUS smbXcli_negprot_recv( NTSTATUS smbXcli_negprot(struct smbXcli_conn *conn, uint32_t timeout_msec, enum protocol_types min_protocol, - enum protocol_types max_protocol); + enum protocol_types max_protocol, + struct smb2_negotiate_contexts *in_ctx, + TALLOC_CTX *mem_ctx, + struct smb2_negotiate_contexts **out_ctx); struct tevent_req *smb2cli_validate_negotiate_info_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, diff --git a/source3/client/client.c b/source3/client/client.c index 7831e54f5cb..f14e3f4130e 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -2282,11 +2282,12 @@ static int cmd_mput(void) static int do_cancel(int job) { - if (cli_printjob_del(cli, job)) { + NTSTATUS status = cli_printjob_del(cli, job); + + if (NT_STATUS_IS_OK(status)) { d_printf("Job %d cancelled\n",job); return 0; } else { - NTSTATUS status = cli_nt_error(cli); d_printf("Error cancelling job %d : %s\n", job, nt_errstr(status)); return 1; @@ -3179,62 +3180,36 @@ static int cmd_posix(void) d_printf("Server supports CIFS extensions %u.%u\n", (unsigned int)major, (unsigned int)minor); caps = talloc_strdup(ctx, ""); - if (!caps) { - return 1; - } - if (caplow & CIFS_UNIX_FCNTL_LOCKS_CAP) { - caps = talloc_asprintf_append(caps, "locks "); - if (!caps) { - return 1; - } + if (caplow & CIFS_UNIX_FCNTL_LOCKS_CAP) { + talloc_asprintf_addbuf(&caps, "locks "); } if (caplow & CIFS_UNIX_POSIX_ACLS_CAP) { - caps = talloc_asprintf_append(caps, "acls "); - if (!caps) { - return 1; - } + talloc_asprintf_addbuf(&caps, "acls "); } if (caplow & CIFS_UNIX_XATTTR_CAP) { - caps = talloc_asprintf_append(caps, "eas "); - if (!caps) { - return 1; - } + talloc_asprintf_addbuf(&caps, "eas "); } if (caplow & CIFS_UNIX_POSIX_PATHNAMES_CAP) { - caps = talloc_asprintf_append(caps, "pathnames "); - if (!caps) { - return 1; - } + talloc_asprintf_addbuf(&caps, "pathnames "); } if (caplow & CIFS_UNIX_POSIX_PATH_OPERATIONS_CAP) { - caps = talloc_asprintf_append(caps, "posix_path_operations "); - if (!caps) { - return 1; - } + talloc_asprintf_addbuf(&caps, "posix_path_operations "); } if (caplow & CIFS_UNIX_LARGE_READ_CAP) { - caps = talloc_asprintf_append(caps, "large_read "); - if (!caps) { - return 1; - } + talloc_asprintf_addbuf(&caps, "large_read "); } if (caplow & CIFS_UNIX_LARGE_WRITE_CAP) { - caps = talloc_asprintf_append(caps, "large_write "); - if (!caps) { - return 1; - } + talloc_asprintf_addbuf(&caps, "large_write "); } if (caplow & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP) { - caps = talloc_asprintf_append(caps, "posix_encrypt "); - if (!caps) { - return 1; - } + talloc_asprintf_addbuf(&caps, "posix_encrypt "); } if (caplow & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP) { - caps = talloc_asprintf_append(caps, "mandatory_posix_encrypt "); - if (!caps) { - return 1; - } + talloc_asprintf_addbuf(&caps, "mandatory_posix_encrypt "); + } + + if (caps == NULL) { + return 1; } if (*caps && caps[strlen(caps)-1] == ' ') { diff --git a/source3/include/libsmb_internal.h b/source3/include/libsmb_internal.h index 6ca265ad38a..e30bfeb6690 100644 --- a/source3/include/libsmb_internal.h +++ b/source3/include/libsmb_internal.h @@ -32,8 +32,6 @@ #include "libsmb/clirap.h" #define SMBC_MAX_NAME 1023 -#define SMBC_FILE_MODE (S_IFREG | 0444) -#define SMBC_DIR_MODE (S_IFDIR | 0555) /* * DOS Attribute values (used internally) @@ -431,11 +429,6 @@ SMBC_ftruncate_ctx(SMBCCTX *context, /* Functions in libsmb_misc.c */ bool SMBC_dlist_contains(SMBCFILE * list, SMBCFILE *p); -int -SMBC_errno(SMBCCTX *context, - struct cli_state *c); - - /* Functions in libsmb_path.c */ int SMBC_parse_path(TALLOC_CTX *ctx, diff --git a/source3/include/proto.h b/source3/include/proto.h index bf6797514e3..5dd35c3c0df 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -578,16 +578,6 @@ bool wins_server_tag_ips(const char *tag, TALLOC_CTX *mem_ctx, struct in_addr **pservers, size_t *pnum_servers); unsigned wins_srv_count_tag(const char *tag); -#ifndef ASN1_MAX_OIDS -#define ASN1_MAX_OIDS 20 -#endif -bool spnego_parse_negTokenInit(TALLOC_CTX *ctx, - DATA_BLOB blob, - char *OIDs[ASN1_MAX_OIDS], - char **principal, - DATA_BLOB *secblob); -DATA_BLOB spnego_gen_krb5_wrap(TALLOC_CTX *ctx, const DATA_BLOB ticket, const uint8_t tok_id[2]); - /* The following definitions come from libsmb/conncache.c */ NTSTATUS check_negative_conn_cache( const char *domain, const char *server); diff --git a/source3/libads/authdata.c b/source3/libads/authdata.c index 4f58644f3ba..10adc3ee8a9 100644 --- a/source3/libads/authdata.c +++ b/source3/libads/authdata.c @@ -32,6 +32,7 @@ #include "auth/gensec/gensec.h" #include "auth/gensec/gensec_internal.h" /* TODO: remove this */ #include "../libcli/auth/spnego.h" +#include "lib/util/asn1.h" #ifdef HAVE_KRB5 @@ -39,6 +40,48 @@ struct smb_krb5_context; +/* + generate a krb5 GSS-API wrapper packet given a ticket +*/ +static DATA_BLOB spnego_gen_krb5_wrap( + TALLOC_CTX *ctx, const DATA_BLOB ticket, const uint8_t tok_id[2]) +{ + ASN1_DATA *data; + DATA_BLOB ret = data_blob_null; + + data = asn1_init(talloc_tos(), ASN1_MAX_TREE_DEPTH); + if (data == NULL) { + return data_blob_null; + } + + if (!asn1_push_tag(data, ASN1_APPLICATION(0))) goto err; + if (!asn1_write_OID(data, OID_KERBEROS5)) goto err; + + if (!asn1_write(data, tok_id, 2)) goto err; + if (!asn1_write(data, ticket.data, ticket.length)) goto err; + if (!asn1_pop_tag(data)) goto err; + + if (!asn1_extract_blob(data, ctx, &ret)) { + goto err; + } + + asn1_free(data); + data = NULL; + + err: + + if (data != NULL) { + if (asn1_has_error(data)) { + DEBUG(1, ("Failed to build krb5 wrapper at offset %d\n", + (int)asn1_current_ofs(data))); + } + + asn1_free(data); + } + + return ret; +} + /* * Given the username/password, do a kinit, store the ticket in * cache_name if specified, and return the PAC_LOGON_INFO (the diff --git a/source3/libads/sasl.c b/source3/libads/sasl.c index 1bcfe0490a8..5ae8b999e66 100644 --- a/source3/libads/sasl.c +++ b/source3/libads/sasl.c @@ -27,6 +27,7 @@ #include "system/gssapi.h" #include "lib/param/loadparm.h" #include "krb5_env.h" +#include "lib/util/asn1.h" #ifdef HAVE_LDAP @@ -496,6 +497,144 @@ static ADS_STATUS ads_generate_service_principal(ADS_STRUCT *ads, #endif /* HAVE_KRB5 */ +/* + parse a negTokenInit packet giving a GUID, a list of supported + OIDs (the mechanisms) and a principal name string +*/ +static bool spnego_parse_negTokenInit(TALLOC_CTX *ctx, + DATA_BLOB blob, + char *OIDs[ASN1_MAX_OIDS], + char **principal, + DATA_BLOB *secblob) +{ + int i; + bool ret = false; + ASN1_DATA *data; + + for (i = 0; i < ASN1_MAX_OIDS; i++) { -- Samba Shared Repository