Print this page
NEX-19225 SMB client 2.1 hits redzone panic
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
NEX-14666 Need to provide SMB 2.1 Client
NEX-17187 panic in smbfs_acl_store
NEX-17231 smbfs create xattr files finds wrong file
NEX-17224 smbfs lookup EINVAL should be ENOENT
NEX-17260 SMB1 client fails to list directory after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
and: (cleanup)

*** 31,43 **** * * $FreeBSD: src/sys/kern/subr_mchain.c,v 1.1 2001/02/24 15:44:29 bp Exp $ */ /* - * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #include <sys/param.h> #include <sys/systm.h> #include <sys/errno.h> --- 31,44 ---- * * $FreeBSD: src/sys/kern/subr_mchain.c,v 1.1 2001/02/24 15:44:29 bp Exp $ */ /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * + * Copyright 2018 Nexenta Systems, Inc. All rights reserved. */ #include <sys/param.h> #include <sys/systm.h> #include <sys/errno.h>
*** 111,120 **** --- 112,124 ---- * 4K fits nicely in 3 Ethernet frames (3 * 1500) * leaving about 500 bytes for protocol headers. */ #define MLEN 4096 + #if (MLEN < SMB2_HDRLEN) + #error "MLEN can't fit a contiguous SMB2 header" + #endif /* * Some UIO routines. * Taken from Darwin Sourcecs. */
*** 418,428 **** --- 422,448 ---- } return (0); } + /* + * Adds padding to 8 byte boundary + */ int + mb_put_align8(struct mbchain *mbp) + { + static const char zeros[8] = { 0 }; + int pad_len = 0; + + if ((mbp->mb_count % 8) != 0) { + pad_len = 8 - (mbp->mb_count % 8); + MB_PUT_INLINE(mbp, zeros, pad_len); + } + return (0); + } + + int mb_put_uint8(struct mbchain *mbp, u_int8_t x) { u_int8_t v = x; MB_PUT_INLINE(mbp, &v, sizeof (v)); }
*** 535,544 **** --- 555,565 ---- return (0); } /* * Append an mblk to the chain. + * Note: The mblk_t *m is consumed. */ int mb_put_mbuf(struct mbchain *mbp, mblk_t *m) { mblk_t *nm, *tail_mb;
*** 574,583 **** --- 595,627 ---- return (0); } /* + * Put an mbchain into another mbchain + * Leave sub_mbp untouched. + */ + int + mb_put_mbchain(struct mbchain *mbp, struct mbchain *sub_mbp) + { + mblk_t *m; + + if (sub_mbp == NULL) + return (0); + + m = sub_mbp->mb_top; + if (m == NULL) + return (0); + + m = dupmsg(m); + if (m == NULL) + return (ENOSR); + + return (mb_put_mbuf(mbp, m)); + } + + /* * copies a uio scatter/gather list to an mbuf chain. */ int mb_put_uio(struct mbchain *mbp, uio_t *uiop, size_t size) {
*** 873,882 **** --- 917,927 ---- return (0); } /* * Get the next SIZE bytes as a separate mblk. + * Advances position in mdp by SIZE. */ int md_get_mbuf(struct mdchain *mdp, int size, mblk_t **ret) { mblk_t *m, *rm;
*** 896,905 **** --- 941,951 ---- off = (int)diff; rm = m_copym(m, off, size, M_WAITOK); if (rm == NULL) return (EBADRPC); + (void) md_get_mem(mdp, NULL, size, MB_MSYSTEM); *ret = rm; return (0); }