MFC r292337, r292552, r292553:

Build mount_smbfs for arm.  Also sort the subdirs.

  Avoid unaligned memory accesses when encoding netbios names in libsmb.

  The current code for encoding a netbios name converts each byte to a 16-bit
  value and stores the result by casting a char* to u_short*, resulting in
  alignment faults on strict-alignment platforms.

  This change reimplements the encoding routine using only byte accesses to
  memory. There is no particular reason to work with 16-bit values just
  because the encoding process creates two bytes of output for every byte of
  input. Working a byte at at time also avoids endian problems for big-endian
  platforms.

  Make the building of libsmb and mount_smbfs unconditional, now that r292552
  has eliminated alignment and endian problems that were making it fail on
  some platforms.

PR:           180438
PR:           189415
Relnotes:	Yes
This commit is contained in:
ian 2016-01-19 23:36:49 +00:00
parent 223081e0c8
commit 2651e6b1c6
9 changed files with 16 additions and 33 deletions

View File

@ -143,15 +143,13 @@ nb_encname_len(const char *str)
return len;
}
#define NBENCODE(c) (htole16((u_short)(((u_char)(c) >> 4) | \
(((u_char)(c) & 0xf) << 8)) + 0x4141))
static void
memsetw(char *dst, int n, u_short word)
static inline void
nb_char_encode(u_char **ptr, u_char c, int n)
{
while (n--) {
*(u_short*)dst = word;
dst += 2;
*(*ptr)++ = 0x41 + (c >> 4);
*(*ptr)++ = 0x41 + (c & 0x0f);
}
}
@ -165,19 +163,15 @@ nb_name_encode(struct nb_name *np, u_char *dst)
*cp++ = NB_ENCNAMELEN;
name = np->nn_name;
if (name[0] == '*' && name[1] == 0) {
*(u_short*)cp = NBENCODE('*');
memsetw(cp + 2, NB_NAMELEN - 1, NBENCODE(' '));
cp += NB_ENCNAMELEN;
nb_char_encode(&cp, '*', 1);
nb_char_encode(&cp, ' ', NB_NAMELEN - 1);
} else {
for (i = 0; *name && i < NB_NAMELEN - 1; i++, cp += 2, name++)
*(u_short*)cp = NBENCODE(toupper(*name));
i = NB_NAMELEN - i - 1;
if (i > 0) {
memsetw(cp, i, NBENCODE(' '));
cp += i * 2;
}
*(u_short*)cp = NBENCODE(np->nn_type);
cp += 2;
for (i = 0; i < NB_NAMELEN - 1; i++)
if (*name != 0)
nb_char_encode(&cp, toupper(*name++), 1);
else
nb_char_encode(&cp, ' ', 1);
nb_char_encode(&cp, np->nn_type, 1);
}
*cp = 0;
if (np->nn_scope == NULL)

View File

@ -84,7 +84,7 @@ SUBDIR= ${SUBDIR_ORDERED} \
libsbuf \
${_libsdp} \
${_libsm} \
${_libsmb} \
libsmb \
${_libsmdb} \
${_libsmutil} \
libstand \
@ -214,7 +214,6 @@ _libypclnt= libypclnt
.endif
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
_libsmb= libsmb
_libvgl= libvgl
_libproc= libproc
_librtld_db= librtld_db
@ -228,7 +227,6 @@ _libvmmapi= libvmmapi
.if ${MACHINE_CPUARCH} == "ia64"
_libefi= libefi
_libsmb= libsmb
.endif
.if ${MACHINE_CPUARCH} == "mips"
@ -239,11 +237,6 @@ _librtld_db= librtld_db
.if ${MACHINE_CPUARCH} == "powerpc"
_libproc= libproc
_librtld_db= librtld_db
_libsmb= libsmb
.endif
.if ${MACHINE_CPUARCH} == "sparc64"
_libsmb= libsmb
.endif
.if ${MK_OPENSSL} != "no"

View File

@ -44,6 +44,7 @@ SUBDIR= adduser \
mixer \
mlxcontrol \
mountd \
mount_smbfs \
mptutil \
mtest \
${_mtree} \

View File

@ -25,7 +25,6 @@ SUBDIR+= hyperv
.endif
SUBDIR+= kgmon
SUBDIR+= lptcontrol
SUBDIR+= mount_smbfs
SUBDIR+= mptable
.if ${MK_NDIS} != "no"
SUBDIR+= ndiscvt

View File

@ -1,4 +1,4 @@
# $FreeBSD$
SUBDIR+= ofwdump
SUBDIR+= kgmon
SUBDIR+= ofwdump

View File

@ -15,7 +15,6 @@ SUBDIR+= hyperv
SUBDIR+= kgmon
SUBDIR+= kgzip
SUBDIR+= lptcontrol
SUBDIR+= mount_smbfs
SUBDIR+= mptable
.if ${MK_NDIS} != "no"
SUBDIR+= ndiscvt

View File

@ -4,6 +4,5 @@
SUBDIR+= acpi
.endif
SUBDIR+= kgmon
SUBDIR+= mount_smbfs
SUBDIR:= ${SUBDIR:Nuathload}
SUBDIR+= zzz

View File

@ -1,5 +1,4 @@
# $FreeBSD$
SUBDIR+= mount_smbfs
SUBDIR+= nvram
SUBDIR+= ofwdump

View File

@ -1,5 +1,4 @@
# $FreeBSD$
SUBDIR+= eeprom
SUBDIR+= mount_smbfs
SUBDIR+= ofwdump