da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Use is subject to license terms.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Msgbuf buffer management implementation. The smb_msgbuf interface is
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * typically used to encode or decode SMB data using sprintf/scanf
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * style operations. It contains special handling for the SMB header.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * It can also be used for general purpose encoding and decoding.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <sys/types.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <sys/varargs.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <sys/byteorder.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#if !defined(_KERNEL) && !defined(_FAKE_KERNEL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <stdlib.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <syslog.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <string.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <strings.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <sys/sunddi.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <sys/kmem.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#endif
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/string.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/msgbuf.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/smb.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int buf_decode(smb_msgbuf_t *, char *, va_list ap);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int buf_encode(smb_msgbuf_t *, char *, va_list ap);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void *smb_msgbuf_malloc(smb_msgbuf_t *, size_t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int smb_msgbuf_chkerc(char *text, int erc);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Returns the offset or number of bytes used within the buffer.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsize_t
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_used(smb_msgbuf_t *mb)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*LINTED E_PTRDIFF_OVERFLOW*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (mb->scan - mb->base);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Returns the actual buffer size.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsize_t
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_size(smb_msgbuf_t *mb)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (mb->max);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwuint8_t *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_base(smb_msgbuf_t *mb)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (mb->base);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Ensure that the scan is aligned on a word (16-bit) boundary.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_word_align(smb_msgbuf_t *mb)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan = (uint8_t *)((uintptr_t)(mb->scan + 1) & ~1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Ensure that the scan is aligned on a dword (32-bit) boundary.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_dword_align(smb_msgbuf_t *mb)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan = (uint8_t *)((uintptr_t)(mb->scan + 3) & ~3);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Checks whether or not the buffer has space for the amount of data
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * specified. Returns 1 if there is space, otherwise returns 0.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_has_space(smb_msgbuf_t *mb, size_t size)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (size > mb->max || (mb->scan + size) > mb->end)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Set flags the smb_msgbuf.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_fset(smb_msgbuf_t *mb, uint32_t flags)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->flags |= flags;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Clear flags the smb_msgbuf.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_fclear(smb_msgbuf_t *mb, uint32_t flags)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->flags &= ~flags;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_msgbuf_init
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Initialize a smb_msgbuf_t structure based on the buffer and size
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * specified. Both scan and base initially point to the beginning
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * of the buffer and end points to the limit of the buffer. As
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * data is added scan should be incremented to point to the next
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * offset at which data will be written. Max and count are set
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * to the actual buffer size.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_init(smb_msgbuf_t *mb, uint8_t *buf, size_t size, uint32_t flags)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan = mb->base = buf;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->max = mb->count = size;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->end = &buf[size];
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->flags = flags;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->mlist.next = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_msgbuf_term
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Destruct a smb_msgbuf_t. Free any memory hanging off the mlist.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_term(smb_msgbuf_t *mb)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_msgbuf_mlist_t *item = mb->mlist.next;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_msgbuf_mlist_t *tmp;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (item) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tmp = item;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw item = item->next;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#if !defined(_KERNEL) && !defined(_FAKE_KERNEL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw free(tmp);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw kmem_free(tmp, tmp->size);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#endif
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_msgbuf_decode
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Decode a smb_msgbuf buffer as indicated by the format string into
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * the variable arg list. This is similar to a scanf operation.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * On success, returns the number of bytes encoded. Otherwise
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * returns a -ve error code.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_decode(smb_msgbuf_t *mb, char *fmt, ...)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int rc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t *orig_scan;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw va_list ap;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw va_start(ap, fmt);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw orig_scan = mb->scan;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw rc = buf_decode(mb, fmt, ap);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw va_end(ap);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (rc != SMB_MSGBUF_SUCCESS) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) smb_msgbuf_chkerc("smb_msgbuf_decode", rc);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan = orig_scan;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (rc);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*LINTED E_PTRDIFF_OVERFLOW*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (mb->scan - orig_scan);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * buf_decode
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Private decode function, where the real work of decoding the smb_msgbuf
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * is done. This function should only be called via smb_msgbuf_decode to
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ensure correct behaviour and error handling.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwbuf_decode(smb_msgbuf_t *mb, char *fmt, va_list ap)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t ival;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t c;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uint8_t *bvalp;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint16_t *wvalp;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t *lvalp;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint64_t *llvalp;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross char *cvalp;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross char **cvalpp;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_wchar_t wchar;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross boolean_t repc_specified;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int repc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int rc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while ((c = *fmt++) != 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc_specified = B_FALSE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw repc = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (c == ' ' || c == '\t')
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (c == '(') {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (((c = *fmt++) != 0) && c != ')')
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (!c)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_SUCCESS);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ('0' <= c && c <= '9') {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw repc = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw do {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw repc = repc * 10 + c - '0';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw c = *fmt++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } while ('0' <= c && c <= '9');
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc_specified = B_TRUE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else if (c == '#') {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw repc = va_arg(ap, int);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw c = *fmt++;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc_specified = B_TRUE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (c) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case '.':
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (smb_msgbuf_has_space(mb, repc) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_UNDERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan += repc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'c': /* get char */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (smb_msgbuf_has_space(mb, repc) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_UNDERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross bvalp = va_arg(ap, uint8_t *);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross bcopy(mb->scan, bvalp, repc);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan += repc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'b': /* get byte */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (smb_msgbuf_has_space(mb, repc) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_UNDERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross bvalp = va_arg(ap, uint8_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (repc-- > 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *bvalp++ = *mb->scan++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'w': /* get word */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw rc = smb_msgbuf_has_space(mb, repc * sizeof (uint16_t));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (rc == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_UNDERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw wvalp = va_arg(ap, uint16_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (repc-- > 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *wvalp++ = LE_IN16(mb->scan);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan += sizeof (uint16_t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'l': /* get long */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw rc = smb_msgbuf_has_space(mb, repc * sizeof (int32_t));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (rc == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_UNDERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw lvalp = va_arg(ap, uint32_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (repc-- > 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *lvalp++ = LE_IN32(mb->scan);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan += sizeof (int32_t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'q': /* get quad */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw rc = smb_msgbuf_has_space(mb, repc * sizeof (int64_t));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (rc == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_UNDERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw llvalp = va_arg(ap, uint64_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (repc-- > 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *llvalp++ = LE_IN64(mb->scan);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan += sizeof (int64_t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 'u': /* Convert from unicode if flags are set */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (mb->flags & SMB_MSGBUF_UNICODE)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto unicode_translation;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*FALLTHROUGH*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 's': /* get string */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (!repc_specified)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc = strlen((const char *)mb->scan) + 1;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (smb_msgbuf_has_space(mb, repc) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_UNDERFLOW);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if ((cvalp = smb_msgbuf_malloc(mb, repc * 2)) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_UNDERFLOW);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross cvalpp = va_arg(ap, char **);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *cvalpp = cvalp;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /* Translate OEM to mbs */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross while (repc > 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross wchar = *mb->scan++;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc--;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (wchar == 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross break;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross ival = smb_wctomb(cvalp, wchar);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross cvalp += ival;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *cvalp = '\0';
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (repc > 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross mb->scan += repc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'U': /* get unicode string */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwunicode_translation:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Unicode strings are always word aligned.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The malloc'd area is larger than the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * original string because the UTF-8 chars
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * may be longer than the wide-chars.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_msgbuf_word_align(mb);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (!repc_specified) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Count bytes, including the null.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uint8_t *tmp_scan = mb->scan;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc = 2; /* the null */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross while ((wchar = LE_IN16(tmp_scan)) != 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross tmp_scan += 2;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc += 2;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (smb_msgbuf_has_space(mb, repc) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_UNDERFLOW);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Get space for translated string
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Allocates worst-case size.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((cvalp = smb_msgbuf_malloc(mb, repc * 2)) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_UNDERFLOW);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross cvalpp = va_arg(ap, char **);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *cvalpp = cvalp;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Translate unicode to mbs, stopping after
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * null or repc limit.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross while (repc >= 2) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross wchar = LE_IN16(mb->scan);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross mb->scan += 2;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc -= 2;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (wchar == 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross break;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross ival = smb_wctomb(cvalp, wchar);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross cvalp += ival;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *cvalp = '\0';
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (repc > 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross mb->scan += repc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 'M':
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (smb_msgbuf_has_space(mb, 4) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_UNDERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (mb->scan[0] != 0xFF ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan[1] != 'S' ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan[2] != 'M' ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan[3] != 'B') {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_INVALID_HEADER);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan += 4;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw default:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_INVALID_FORMAT);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_SUCCESS);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_msgbuf_encode
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Encode a smb_msgbuf buffer as indicated by the format string using
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * the variable arg list. This is similar to a sprintf operation.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * On success, returns the number of bytes encoded. Otherwise
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * returns a -ve error code.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_encode(smb_msgbuf_t *mb, char *fmt, ...)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int rc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t *orig_scan;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw va_list ap;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw va_start(ap, fmt);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw orig_scan = mb->scan;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw rc = buf_encode(mb, fmt, ap);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw va_end(ap);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (rc != SMB_MSGBUF_SUCCESS) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) smb_msgbuf_chkerc("smb_msgbuf_encode", rc);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan = orig_scan;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (rc);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*LINTED E_PTRDIFF_OVERFLOW*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (mb->scan - orig_scan);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * buf_encode
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Private encode function, where the real work of encoding the smb_msgbuf
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * is done. This function should only be called via smb_msgbuf_encode to
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ensure correct behaviour and error handling.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwbuf_encode(smb_msgbuf_t *mb, char *fmt, va_list ap)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t cval;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint16_t wval;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t lval;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint64_t llval;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uint8_t *bvalp;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross char *cvalp;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t c;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smb_wchar_t wchar;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int count;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross boolean_t repc_specified;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross int repc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int rc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while ((c = *fmt++) != 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc_specified = B_FALSE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw repc = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (c == ' ' || c == '\t')
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (c == '(') {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (((c = *fmt++) != 0) && c != ')')
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (!c)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_SUCCESS);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ('0' <= c && c <= '9') {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw repc = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw do {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw repc = repc * 10 + c - '0';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw c = *fmt++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } while ('0' <= c && c <= '9');
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc_specified = B_TRUE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else if (c == '#') {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw repc = va_arg(ap, int);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw c = *fmt++;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc_specified = B_TRUE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (c) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case '.':
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (smb_msgbuf_has_space(mb, repc) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_OVERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (repc-- > 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *mb->scan++ = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'c': /* put char */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (smb_msgbuf_has_space(mb, repc) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_OVERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross bvalp = va_arg(ap, uint8_t *);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross bcopy(bvalp, mb->scan, repc);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan += repc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'b': /* put byte */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (smb_msgbuf_has_space(mb, repc) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_OVERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (repc-- > 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw cval = va_arg(ap, int);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *mb->scan++ = cval;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'w': /* put word */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw rc = smb_msgbuf_has_space(mb, repc * sizeof (uint16_t));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (rc == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_OVERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (repc-- > 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw wval = va_arg(ap, int);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw LE_OUT16(mb->scan, wval);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan += sizeof (uint16_t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'l': /* put long */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw rc = smb_msgbuf_has_space(mb, repc * sizeof (int32_t));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (rc == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_OVERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (repc-- > 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw lval = va_arg(ap, uint32_t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw LE_OUT32(mb->scan, lval);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan += sizeof (int32_t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'q': /* put quad */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw rc = smb_msgbuf_has_space(mb, repc * sizeof (int64_t));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (rc == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_OVERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (repc-- > 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw llval = va_arg(ap, uint64_t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw LE_OUT64(mb->scan, llval);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->scan += sizeof (uint64_t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 'u': /* conditional unicode */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (mb->flags & SMB_MSGBUF_UNICODE)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto unicode_translation;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* FALLTHROUGH */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 's': /* put string */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross cvalp = va_arg(ap, char *);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (!repc_specified) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc = smb_sbequiv_strlen(cvalp);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (repc == -1)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (SMB_MSGBUF_OVERFLOW);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (!(mb->flags & SMB_MSGBUF_NOTERM))
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc++;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (smb_msgbuf_has_space(mb, repc) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_OVERFLOW);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross while (repc > 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross count = smb_mbtowc(&wchar, cvalp,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross MTS_MB_CHAR_MAX);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (count < 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (SMB_MSGBUF_DATA_ERROR);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross cvalp += count;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (wchar == 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross break;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *mb->scan++ = (uint8_t)wchar;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc--;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (wchar & 0xff00) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *mb->scan++ = wchar >> 8;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc--;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (*cvalp == '\0' && repc > 0 &&
12b65585e720714b31036daaa2b30eb76014048eGordon Ross (mb->flags & SMB_MSGBUF_NOTERM) == 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *mb->scan++ = 0;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc--;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross while (repc > 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *mb->scan++ = 0;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc--;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case 'U': /* put unicode string */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwunicode_translation:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Unicode strings are always word aligned.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_msgbuf_word_align(mb);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross cvalp = va_arg(ap, char *);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (!repc_specified) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc = smb_wcequiv_strlen(cvalp);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (!(mb->flags & SMB_MSGBUF_NOTERM))
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc += 2;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (!smb_msgbuf_has_space(mb, repc))
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (SMB_MSGBUF_OVERFLOW);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross while (repc >= 2) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross count = smb_mbtowc(&wchar, cvalp,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw MTS_MB_CHAR_MAX);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (count < 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_DATA_ERROR);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross cvalp += count;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (wchar == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross LE_OUT16(mb->scan, wchar);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross mb->scan += 2;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc -= 2;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (*cvalp == '\0' && repc >= 2 &&
12b65585e720714b31036daaa2b30eb76014048eGordon Ross (mb->flags & SMB_MSGBUF_NOTERM) == 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross LE_OUT16(mb->scan, 0);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross mb->scan += 2;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc -= 2;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross while (repc > 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *mb->scan++ = 0;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross repc--;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 'M':
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (smb_msgbuf_has_space(mb, 4) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_OVERFLOW);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *mb->scan++ = 0xFF;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *mb->scan++ = 'S';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *mb->scan++ = 'M';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *mb->scan++ = 'B';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw default:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_INVALID_FORMAT);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMB_MSGBUF_SUCCESS);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_msgbuf_malloc
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Allocate some memory for use with this smb_msgbuf. We increase the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * requested size to hold the list pointer and return a pointer
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * to the area for use by the caller.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_malloc(smb_msgbuf_t *mb, size_t size)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_msgbuf_mlist_t *item;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw size += sizeof (smb_msgbuf_mlist_t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#if !defined(_KERNEL) && !defined(_FAKE_KERNEL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((item = malloc(size)) == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw item = kmem_alloc(size, KM_SLEEP);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#endif
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw item->next = mb->mlist.next;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw item->size = size;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mb->mlist.next = item;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The caller gets a pointer to the address
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * immediately after the smb_msgbuf_mlist_t.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return ((void *)(item + 1));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_msgbuf_chkerc
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Diagnostic function to write an appropriate message to the system log.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_msgbuf_chkerc(char *text, int erc)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw static struct {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int erc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *name;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } etable[] = {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw { SMB_MSGBUF_SUCCESS, "success" },
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw { SMB_MSGBUF_UNDERFLOW, "overflow/underflow" },
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw { SMB_MSGBUF_INVALID_FORMAT, "invalid format" },
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw { SMB_MSGBUF_INVALID_HEADER, "invalid header" },
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw { SMB_MSGBUF_DATA_ERROR, "data error" }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw };
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int i;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (i = 0; i < sizeof (etable)/sizeof (etable[0]); ++i) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (etable[i].erc == erc) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (text == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw text = "smb_msgbuf_chkerc";
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (erc);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}