summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorDan McDonald <danmcd@mnx.io>2022-10-17 10:49:40 -0400
committerGitHub <noreply@github.com>2022-10-17 10:49:40 -0400
commita41cec58980057a54ffdf464a2b2d381d819b975 (patch)
tree047d5f9ad01a331052581120a3091e14d40164cb /usr/src
parent3dacc40217e9880a9cc6e0a3d2726bdd66545bbc (diff)
parentf77180d803041f05d074ba8f26604f9d77c88b45 (diff)
downloadillumos-joyent-a41cec58980057a54ffdf464a2b2d381d819b975.tar.gz
Merge branch 'master' into OS-8418
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/hal/hald/solaris/sysevent.c13
-rw-r--r--usr/src/lib/libc/port/print/doprnt.c77
-rw-r--r--usr/src/lib/libc/port/stdio/_endopen.c3
-rw-r--r--usr/src/lib/libc/port/stdio/doscan.c16
-rw-r--r--usr/src/lib/libc/port/stdio/open_memstream.c1
-rw-r--r--usr/src/lib/libc/port/stdio/open_wmemstream.c3
-rw-r--r--usr/src/lib/libc/port/threads/assfail.c2
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_dfs.c162
8 files changed, 204 insertions, 73 deletions
diff --git a/usr/src/cmd/hal/hald/solaris/sysevent.c b/usr/src/cmd/hal/hald/solaris/sysevent.c
index 771fd1acf0..9e1300853f 100644
--- a/usr/src/cmd/hal/hald/solaris/sysevent.c
+++ b/usr/src/cmd/hal/hald/solaris/sysevent.c
@@ -2,6 +2,7 @@
*
* sysevent.c : Solaris sysevents
*
+ * Copyright 2022 Carsten Grzemba <grzemba@contac-dt.de>
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
@@ -184,7 +185,7 @@ sysevent_dev_handler(sysevent_t *ev)
snprintf(s, sizeof (s), "%s %s %s\n",
class, subclass, phys_path);
- nwritten = write(sysevent_pipe_fds[1], s, strlen(s) + 1);
+ nwritten = write(sysevent_pipe_fds[1], s, strlen(s));
HAL_INFO (("sysevent_dev_handler: wrote %d bytes", nwritten));
goto out;
@@ -233,7 +234,7 @@ sysevent_dev_handler(sysevent_t *ev)
snprintf(s, sizeof (s), "%s %s %s %s %s %s %d\n",
class, subclass, phys_path, dev_name, dev_hid, dev_uid, dev_index);
- nwritten = write(sysevent_pipe_fds[1], s, strlen(s) + 1);
+ nwritten = write(sysevent_pipe_fds[1], s, strlen(s));
HAL_INFO (("sysevent_dev_handler: wrote %d bytes", nwritten));
@@ -295,7 +296,7 @@ sysevent_iochannel_data (GIOChannel *source,
sysevent_dev_branch(phys_path);
} else if (strcmp(class, EC_PWRCTL) == 0) {
sysevent_pwrctl(class, subclass, phys_path,
- dev_name, dev_hid, dev_uid, dev_index);
+ dev_name, dev_hid, dev_uid, dev_index);
} else if (strcmp(class, EC_DEVFS) == 0) {
if (strcmp(subclass, ESC_DEVFS_DEVI_ADD) == 0) {
sysevent_devfs_add(phys_path);
@@ -477,7 +478,7 @@ sysevent_devfs_add(gchar *devfs_path)
di_fini (node);
}
-static void
+static void
sysevent_pwrctl(gchar *class, gchar *subclass, gchar *phys_path,
gchar *dev_name, gchar *dev_hid, gchar *dev_uid, uint_t dev_index)
{
@@ -606,8 +607,8 @@ sysevent_dr_insert_cpu(di_node_t node, void *arg)
static void
sysevent_process_dr(gchar *ap_id, gchar *hint_val)
{
- cfga_err_t cfgerr;
- cfga_list_data_t *cfg_stat;
+ cfga_err_t cfgerr;
+ cfga_list_data_t *cfg_stat;
int nlist;
char *errstr;
di_node_t root_node;
diff --git a/usr/src/lib/libc/port/print/doprnt.c b/usr/src/lib/libc/port/print/doprnt.c
index 04f1e4ad0a..111591b5d9 100644
--- a/usr/src/lib/libc/port/print/doprnt.c
+++ b/usr/src/lib/libc/port/print/doprnt.c
@@ -167,8 +167,8 @@ static const wchar_t widenullstr[] = L"(null)";
#define PAD(s, n) { ssize_t nn; \
for (nn = n; nn > PAD_LEN; nn -= PAD_LEN) \
- if (!_dowrite(s, PAD_LEN, iop, &bufptr)) \
- return (EOF); \
+ if (!_dowrite(s, PAD_LEN, iop, &bufptr)) \
+ return (EOF); \
PUT(s, nn); \
}
@@ -298,8 +298,8 @@ _dowrite(const char *p, ssize_t n, FILE *iop, unsigned char **ptrptr)
#ifdef _WIDE
static int
put_wide(FILE *iop, unsigned char **bufptr,
- unsigned char *bufferend, wchar_t *p, size_t n,
- int sflag)
+ unsigned char *bufferend, wchar_t *p, size_t n,
+ int sflag)
{
unsigned char *newbufptr;
wchar_t *q;
@@ -357,8 +357,8 @@ put_wide(FILE *iop, unsigned char **bufptr,
static int
pad_wide(FILE *iop, unsigned char **bufptr,
- unsigned char *bufferend, const char *s, size_t n,
- int sflag)
+ unsigned char *bufferend, const char *s, size_t n,
+ int sflag)
{
unsigned char *newbufptr;
ssize_t nn;
@@ -454,19 +454,21 @@ _ndoprnt(const char *format, va_list in_args, FILE *iop, int prflag)
/* Starting and ending points for value to be printed */
char *bp;
char *p;
+
+ /* Field width and precision */
+ ssize_t preco;
+ char tmpbuf[10];
+ int retcode;
#endif /* _WIDE */
/* Field width and precision */
int prec = 0;
ssize_t width;
ssize_t num;
wchar_t *wp;
- ssize_t preco;
ssize_t wcount = 0;
- char tmpbuf[10];
char wflag;
char lflag;
int quote; /* ' */
- int retcode;
#ifdef _WIDE
/* Format code */
@@ -561,7 +563,7 @@ _ndoprnt(const char *format, va_list in_args, FILE *iop, int prflag)
int fpos = 1; /* 1 if first positional parameter */
stva_list args, /* used to step through the argument list */
- sargs; /* used to save the start of the arg list */
+ sargs; /* used to save the start of the arg list */
stva_list bargs; /* used to restore args if positional width */
/* or precision */
stva_list arglst[MAXARGS]; /* array giving appropriate values */
@@ -592,12 +594,14 @@ _ndoprnt(const char *format, va_list in_args, FILE *iop, int prflag)
/* if first I/O to the stream get a buffer */
/* Note that iop->_base should not equal 0 for sprintf and vsprintf */
if (iop->_base == 0) {
- if (_findbuf(iop) == 0)
- return (EOF);
- /* _findbuf leaves _cnt set to 0 which is the wrong thing to do */
- /* for fully buffered files */
- if (!(iop->_flag & (_IOLBF|_IONBF)))
- iop->_cnt = _bufend(iop) - iop->_base;
+ if (_findbuf(iop) == 0)
+ return (EOF);
+ /*
+ * _findbuf leaves _cnt set to 0 which is the wrong thing
+ * to do for fully buffered files
+ */
+ if (!(iop->_flag & (_IOLBF|_IONBF)))
+ iop->_cnt = _bufend(iop) - iop->_base;
}
#ifdef _WIDE
}
@@ -608,7 +612,7 @@ _ndoprnt(const char *format, va_list in_args, FILE *iop, int prflag)
if (sflag) {
maxcount = (size_t)iop->_cnt;
bufferend = (unsigned char *)(((wchar_t *)iop->_ptr) +
- maxcount);
+ maxcount);
} else {
bufferend = _bufend(iop);
}
@@ -833,7 +837,7 @@ _ndoprnt(const char *format, va_list in_args, FILE *iop, int prflag)
case '7':
case '8':
case '9':
- { num = fcode - '0';
+ num = fcode - '0';
while (_M_ISDIGIT(fcode = *format)) {
num = num * 10 + fcode - '0';
format++;
@@ -843,7 +847,6 @@ _ndoprnt(const char *format, va_list in_args, FILE *iop, int prflag)
else
width = num;
goto charswitch;
- }
/* Scan the length modifier */
case 'l':
@@ -1061,7 +1064,7 @@ _ndoprnt(const char *format, va_list in_args, FILE *iop, int prflag)
lll /= 10;
#ifdef _WIDE
*--bp = (wchar_t)
- (tll - lll * 10 + '0');
+ (tll - lll * 10 + '0');
#else /* _WIDE */
*--bp = (char) \
(tll - lll * 10 + '0');
@@ -1378,7 +1381,7 @@ _ndoprnt(const char *format, va_list in_args, FILE *iop, int prflag)
nn = exp;
if (nn < 0)
- nn = -nn;
+ nn = -nn;
for (; nn > 9; nn /= 10)
*--suffix = todigit(nn % 10);
*--suffix = todigit(nn);
@@ -1473,7 +1476,7 @@ _ndoprnt(const char *format, va_list in_args, FILE *iop, int prflag)
if (buf[0] != '0') {
int nn = decpt - 1;
if (nn < 0)
- nn = -nn;
+ nn = -nn;
for (; nn > 9; nn /= 10)
*--suffix = todigit(nn % 10);
*--suffix = todigit(nn);
@@ -1676,8 +1679,8 @@ wide_C:
wflag = 1;
#else /* _WIDE */
if (temp) {
- if ((retcode = wctomb(buf, temp))
- == -1) {
+ retcode = wctomb(buf, temp);
+ if (retcode == -1) {
errno = EILSEQ;
return (EOF);
} else {
@@ -1701,8 +1704,8 @@ wide_C:
temp = va_arg(args.ap, wchar_t);
if (temp) {
- if ((retcode = wctomb(buf, temp))
- == -1) {
+ retcode = wctomb(buf, temp);
+ if (retcode == -1) {
p = (bp = buf) + 1;
} else {
p = (bp = buf) + retcode;
@@ -1842,9 +1845,6 @@ wide_S:
bp = wstr;
p = wstr + nwc;
} else {
- size_t nnwc;
- int len;
- char *s;
wchar_t *wstr;
bpsize = sizeof (wchar_t) * prec;
@@ -1925,11 +1925,10 @@ wide_S:
}
wptr = wp;
}
- if ((sec_display = wcswidth(wptr, nwc))
- == -1) {
+ sec_display = wcswidth(wptr, nwc);
+ if (sec_display == -1) {
sec_display =
- _rec_scrswidth
- (wptr, nwc);
+ _rec_scrswidth(wptr, nwc);
}
mbs_err:
if (wp)
@@ -1986,14 +1985,13 @@ wide_S:
continue;
}
if ((nbytes = mbtowc(&wc, qp,
- MB_LEN_MAX)) == -1) {
+ MB_LEN_MAX)) == -1) {
/* print illegal char */
nbytes = 1;
ncol = 1;
} else {
- if ((ncol =
- _scrwidth(wc))
- == 0) {
+ ncol = _scrwidth(wc);
+ if (ncol == 0) {
ncol = 1;
}
}
@@ -2179,7 +2177,7 @@ wide_S:
char *bufp;
long printn;
printn = (wchar_t *)(uintptr_t)p -
- (wchar_t *)(uintptr_t)bp;
+ (wchar_t *)(uintptr_t)bp;
bufp = buf;
while (printn > 0) {
if ((cnt = wctomb(buf, *wp)) < 0)
@@ -2331,8 +2329,7 @@ _mkarglst(char *fmt, stva_list args, stva_list arglst[], int prflag)
case '*': /* int argument used for value */
/* check if there is a positional parameter */
#ifdef _WIDE
- if ((*fmt >= 0) && (*fmt < 256) &&
- isdigit(*fmt))
+ if ((*fmt >= 0) && (*fmt < 256) && isdigit(*fmt))
#else /* _WIDE */
if (isdigit(*fmt))
#endif /* _WIDE */
diff --git a/usr/src/lib/libc/port/stdio/_endopen.c b/usr/src/lib/libc/port/stdio/_endopen.c
index fa548f6385..ebcaa07439 100644
--- a/usr/src/lib/libc/port/stdio/_endopen.c
+++ b/usr/src/lib/libc/port/stdio/_endopen.c
@@ -55,8 +55,7 @@
FILE *
_endopen(const char *name, const char *type, FILE *iop, int largefile)
{
- int oflag, fd, fflag, eflag, plusflag, xflag;
- const char *echr;
+ int oflag, fd, fflag;
if (iop == NULL)
return (NULL);
diff --git a/usr/src/lib/libc/port/stdio/doscan.c b/usr/src/lib/libc/port/stdio/doscan.c
index fda4d5c2ea..7d49797578 100644
--- a/usr/src/lib/libc/port/stdio/doscan.c
+++ b/usr/src/lib/libc/port/stdio/doscan.c
@@ -596,7 +596,7 @@ charswitch: /* target of a goto 8-( */
/* ****************************************************************** */
static int
number(int *chcount, int *flag_eof, int stow, int type, int len, int size,
- FILE *iop, va_list *listp)
+ FILE *iop, va_list *listp)
{
char numbuf[64];
char *np = numbuf;
@@ -841,7 +841,7 @@ readchar(FILE *iop, int *chcount)
static int
string(int *chcount, int *flag_eof, int stow, int type, int len, char *tab,
- FILE *iop, va_list *listp)
+ FILE *iop, va_list *listp)
{
int ch;
char *ptr;
@@ -927,7 +927,6 @@ _mkarglst(const char *fmt, stva_list args, stva_list arglst[])
fmt += STRSPN(fmt, SPNSTR2);
if (*fmt == '[') {
- int i;
fmt++; /* has to be at least on item in scan list */
if (*fmt == ']') {
fmt++;
@@ -943,6 +942,8 @@ _mkarglst(const char *fmt, stva_list args, stva_list arglst[])
} else if (isascii(*fmt)) {
fmt++;
} else {
+ int i;
+
i = mblen((const char *)
fmt, MB_CUR_MAX);
if (i <= 0) {
@@ -972,12 +973,11 @@ _mkarglst(const char *fmt, stva_list args, stva_list arglst[])
#ifdef _WIDE
static int
wstring(int *chcount, int *flag_eof, int stow, int type,
- int len, FILE *iop, va_list *listp)
+ int len, FILE *iop, va_list *listp)
{
wint_t wch;
wchar_t *ptr;
wchar_t *wstart;
- int dummy;
wstart = ptr = stow ? va_arg(*listp, wchar_t *) : NULL;
@@ -1008,7 +1008,7 @@ wstring(int *chcount, int *flag_eof, int stow, int type,
#else /* _WIDE */
static int
wstring(int *chcount, int *flag_eof, int stow, int type, int len, FILE *iop,
- va_list *listp)
+ va_list *listp)
{
int wch;
wchar_t *ptr;
@@ -1118,7 +1118,7 @@ _watoi(wchar_t *fmt)
/* ARGSUSED3 */
static int
wbrstring(int *chcount, int *flag_eof, int stow, int type,
- int len, FILE *iop, unsigned char *brstr, va_list *listp)
+ int len, FILE *iop, unsigned char *brstr, va_list *listp)
{
wint_t wch;
int i;
@@ -1182,7 +1182,7 @@ wbrstring(int *chcount, int *flag_eof, int stow, int type,
#ifdef _WIDE
static int
brstring(int *chcount, int *flag_eof, int stow, int type,
- int len, FILE *iop, unsigned char *brstr, va_list *listp)
+ int len, FILE *iop, unsigned char *brstr, va_list *listp)
{
wint_t wch;
int i;
diff --git a/usr/src/lib/libc/port/stdio/open_memstream.c b/usr/src/lib/libc/port/stdio/open_memstream.c
index a841f44fb5..01d5af80ce 100644
--- a/usr/src/lib/libc/port/stdio/open_memstream.c
+++ b/usr/src/lib/libc/port/stdio/open_memstream.c
@@ -203,7 +203,6 @@ open_memstream_close(FILE *iop)
FILE *
open_memstream(char **bufp, size_t *sizep)
{
- int err;
FILE *iop;
memstream_t *memp;
diff --git a/usr/src/lib/libc/port/stdio/open_wmemstream.c b/usr/src/lib/libc/port/stdio/open_wmemstream.c
index d46c5e34ce..a3968328f2 100644
--- a/usr/src/lib/libc/port/stdio/open_wmemstream.c
+++ b/usr/src/lib/libc/port/stdio/open_wmemstream.c
@@ -54,7 +54,7 @@ static ssize_t
open_wmemstream_write(FILE *iop, const char *buf, size_t nbytes)
{
wmemstream_t *wmemp = _xdata(iop);
- size_t newsize, mbscount;
+ size_t newsize;
ssize_t nwritten = 0;
int ret;
@@ -165,7 +165,6 @@ open_wmemstream_close(FILE *iop)
FILE *
open_wmemstream(wchar_t **bufp, size_t *sizep)
{
- int err;
FILE *iop;
wmemstream_t *wmemp;
diff --git a/usr/src/lib/libc/port/threads/assfail.c b/usr/src/lib/libc/port/threads/assfail.c
index 4af2fc5664..40fe162b4a 100644
--- a/usr/src/lib/libc/port/threads/assfail.c
+++ b/usr/src/lib/libc/port/threads/assfail.c
@@ -65,8 +65,6 @@ static void
Abort(const char *msg, size_t buflen)
{
ulwp_t *self;
- struct sigaction act;
- sigset_t sigmask;
/* to help with core file debugging */
panicstr = msg;
diff --git a/usr/src/uts/common/fs/smbsrv/smb_dfs.c b/usr/src/uts/common/fs/smbsrv/smb_dfs.c
index a8a9817c24..80d4479e68 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_dfs.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_dfs.c
@@ -23,6 +23,7 @@
* Use is subject to license terms.
*
* Copyright 2018 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2021 RackTop Systems, Inc.
*/
#include <smbsrv/smb_kproto.h>
@@ -82,6 +83,7 @@ static uint32_t smb_dfs_referrals_get(smb_request_t *, char *, dfs_reftype_t,
dfs_referral_response_t *);
static void smb_dfs_referrals_free(dfs_referral_response_t *);
static uint16_t smb_dfs_referrals_unclen(dfs_info_t *, uint16_t);
+static uint32_t smb_dfs_get_referrals_ex(smb_request_t *, smb_fsctl_t *);
/*
* Handle device type FILE_DEVICE_DFS
@@ -95,19 +97,147 @@ smb_dfs_fsctl(smb_request_t *sr, smb_fsctl_t *fsctl)
if (!STYPE_ISIPC(sr->tid_tree->t_res_type))
return (NT_STATUS_INVALID_DEVICE_REQUEST);
+ /*
+ * If the connection is not DFS capable, we should return
+ * NT_STATUS_FS_DRIVER_REQUIRED for both of these DFS ioctls.
+ * See [MS-SMB2] 3.3.5.15.2.
+ */
+ if ((sr->session->srv_cap & SMB2_CAP_DFS) == 0)
+ return (NT_STATUS_FS_DRIVER_REQUIRED);
+
switch (fsctl->CtlCode) {
case FSCTL_DFS_GET_REFERRALS:
status = smb_dfs_get_referrals(sr, fsctl);
break;
- case FSCTL_DFS_GET_REFERRALS_EX: /* XXX - todo */
+ case FSCTL_DFS_GET_REFERRALS_EX:
+ status = smb_dfs_get_referrals_ex(sr, fsctl);
+ break;
default:
- status = NT_STATUS_NOT_SUPPORTED;
+ /*
+ * MS-SMB2 suggests INVALID_DEVICE_REQUEST
+ * for unknown control codes, but using that
+ * here makes Windows unhappy.
+ */
+ status = NT_STATUS_FS_DRIVER_REQUIRED;
}
return (status);
}
/*
+ * XXX Instead of decoding the referral request and encoding
+ * the response here (in-kernel) we could pass the given
+ * request buffer in our door call, and let that return the
+ * response buffer ready to stuff into out_mbc. That would
+ * allow all this decoding/encoding to happen at user-level.
+ * (and most of this file would go away. :-)
+ */
+
+/*
+ * See [MS-DFSC] for details about this command
+ * Handles FSCTL_DFS_GET_REFERRALS_EX (only)
+ */
+uint32_t
+smb_dfs_get_referrals_ex(smb_request_t *sr, smb_fsctl_t *fsctl)
+{
+ dfs_info_t *referrals;
+ dfs_referral_response_t refrsp;
+ dfs_reftype_t reftype;
+ char *path;
+ uint16_t maxver;
+ uint16_t flags;
+ uint16_t fnlen;
+ uint32_t datalen;
+ uint32_t status;
+ int rc;
+
+ /*
+ * The caller checks this, because the error reporting method
+ * varies across SMB versions.
+ */
+ ASSERT(STYPE_ISIPC(sr->tid_tree->t_res_type));
+
+ /*
+ * Decode fixed part.
+ * Input data is (w) MaxReferralLevel, (w) Flags,
+ * (l) RequestDataLength, ... variable data ...
+ */
+ rc = smb_mbc_decodef(fsctl->in_mbc, "wwl",
+ &maxver, &flags, &datalen);
+ if (rc != 0)
+ return (NT_STATUS_INVALID_PARAMETER);
+
+ /*
+ * Decode variable part:
+ * (w) file name length, (u) filename,
+ * ( if flags & 1 )
+ * (w) site name len, (u) site name
+ * We don't decode or use the site name
+ */
+ if (MBC_ROOM_FOR(fsctl->in_mbc, datalen) == 0)
+ return (NT_STATUS_INVALID_PARAMETER);
+ rc = smb_mbc_decodef(fsctl->in_mbc, "%wu",
+ sr, &fnlen, &path);
+ if (rc != 0)
+ return (NT_STATUS_INVALID_PARAMETER);
+
+ reftype = smb_dfs_get_reftype((const char *)path);
+ switch (reftype) {
+ case DFS_REFERRAL_INVALID:
+ /* Need to check the error for this case */
+ return (NT_STATUS_INVALID_PARAMETER);
+
+ case DFS_REFERRAL_DOMAIN:
+ case DFS_REFERRAL_DC:
+ /* MS-DFSC: this error is returned by non-DC root */
+ return (NT_STATUS_INVALID_PARAMETER);
+
+ case DFS_REFERRAL_SYSVOL:
+ /* MS-DFSC: this error is returned by non-DC root */
+ return (NT_STATUS_NO_SUCH_DEVICE);
+
+ default:
+ break;
+ }
+
+ status = smb_dfs_referrals_get(sr, path, reftype, &refrsp);
+ if (status != NT_STATUS_SUCCESS)
+ return (status);
+
+ referrals = &refrsp.rp_referrals;
+ smb_dfs_encode_hdr(fsctl->out_mbc, referrals);
+
+ /*
+ * Server may respond with any referral version at or below
+ * the maximum specified in the request.
+ */
+ switch (maxver) {
+ case DFS_REFERRAL_V1:
+ status = smb_dfs_encode_refv1(sr, fsctl->out_mbc, referrals);
+ break;
+
+ case DFS_REFERRAL_V2:
+ status = smb_dfs_encode_refv2(sr, fsctl->out_mbc, referrals);
+ break;
+
+ case DFS_REFERRAL_V3:
+ status = smb_dfs_encode_refv3x(sr, fsctl->out_mbc, referrals,
+ DFS_REFERRAL_V3);
+ break;
+
+ case DFS_REFERRAL_V4:
+ default:
+ status = smb_dfs_encode_refv3x(sr, fsctl->out_mbc, referrals,
+ DFS_REFERRAL_V4);
+ break;
+ }
+
+ smb_dfs_referrals_free(&refrsp);
+
+ return (status);
+}
+
+/*
* Note: SMB1 callers in smb_trans2_dfs.c
* smb_com_trans2_report_dfs_inconsistency
* smb_com_trans2_get_dfs_referral
@@ -135,15 +265,6 @@ smb_dfs_get_referrals(smb_request_t *sr, smb_fsctl_t *fsctl)
ASSERT(STYPE_ISIPC(sr->tid_tree->t_res_type));
/*
- * XXX Instead of decoding the referral request and encoding
- * the response here (in-kernel) we could pass the given
- * request buffer in our door call, and let that return the
- * response buffer ready to stuff into out_mbc. That would
- * allow all this decoding/encoding to happen at user-level.
- * (and most of this file would go away. :-)
- */
-
- /*
* Input data is (w) MaxReferralLevel, (U) path
*/
rc = smb_mbc_decodef(fsctl->in_mbc, "%wu",
@@ -520,8 +641,25 @@ smb_dfs_referrals_get(smb_request_t *sr, char *dfs_path, dfs_reftype_t reftype,
rc = smb_kdoor_upcall(sr->sr_server, SMB_DR_DFS_GET_REFERRALS,
&req, dfs_referral_query_xdr, refrsp, dfs_referral_response_xdr);
- if (rc != 0 || refrsp->rp_status != ERROR_SUCCESS) {
+ if (rc != 0)
return (NT_STATUS_FS_DRIVER_REQUIRED);
+
+ /*
+ * Map the Win error to one of the NT status codes
+ * documented in MS-DFSC. The most common, when we
+ * have no DFS root configured, is NOT_FOUND.
+ */
+ switch (refrsp->rp_status) {
+ case ERROR_SUCCESS:
+ break;
+ case ERROR_INVALID_PARAMETER:
+ return (NT_STATUS_INVALID_PARAMETER);
+ case ERROR_NOT_ENOUGH_MEMORY:
+ return (NT_STATUS_INSUFFICIENT_RESOURCES);
+ case ERROR_NOT_FOUND:
+ return (NT_STATUS_NOT_FOUND);
+ default:
+ return (NT_STATUS_UNEXPECTED_NETWORK_ERROR);
}
(void) strsubst(refrsp->rp_referrals.i_uncpath, '/', '\\');