1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-23 09:57:40 +03:00

Add test suite for iconv conversion fail of bad names over SMB1/SMB3.

Bug 10775 - smbd crashes when accessing garbage filenames

https://bugzilla.samba.org/show_bug.cgi?id=10775

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: David Disseldorp <ddiss@samba.org>

Autobuild-User(master): David Disseldorp <ddiss@samba.org>
Autobuild-Date(master): Tue Sep 16 04:21:49 CEST 2014 on sn-devel-104
This commit is contained in:
Jeremy Allison 2014-08-27 13:15:29 -07:00 committed by David Disseldorp
parent 6d03aed15e
commit df800ea6fb
2 changed files with 181 additions and 0 deletions

View File

@ -873,6 +873,9 @@ sub provision($$$$$$)
my $msdfs_deeppath="$msdfs_shrdir/deeppath";
push(@dirs,$msdfs_deeppath);
my $badnames_shrdir="$shrdir/badnames";
push(@dirs,$badnames_shrdir);
# this gets autocreated by winbindd
my $wbsockdir="$prefix_abs/winbindd";
my $wbsockprivdir="$lockdir/winbindd_privileged";
@ -925,6 +928,36 @@ sub provision($$$$$$)
symlink "msdfs:$server_ip\\ro-tmp", "$msdfs_shrdir/msdfs-src1";
symlink "msdfs:$server_ipv6\\ro-tmp", "$msdfs_shrdir/deeppath/msdfs-src2";
##
## create bad names in $badnames_shrdir
##
## (An invalid name, would be mangled to 8.3).
my $badname_target = "$badnames_shrdir/\340|\231\216\377\177";
unless (open(BADNAME_TARGET, ">$badname_target")) {
warn("Unable to open $badname_target");
return undef;
}
close(BADNAME_TARGET);
chmod 0666, $badname_target;
## (A bad name, would not be mangled to 8.3).
my $badname_target = "$badnames_shrdir/\240\276\346\327\377\177";
unless (open(BADNAME_TARGET, ">$badname_target")) {
warn("Unable to open $badname_target");
return undef;
}
close(BADNAME_TARGET);
chmod 0666, $badname_target;
## (A bad good name).
my $badname_target = "$badnames_shrdir/blank.txt";
unless (open(BADNAME_TARGET, ">$badname_target")) {
warn("Unable to open $badname_target");
return undef;
}
close(BADNAME_TARGET);
chmod 0666, $badname_target;
my $conffile="$libdir/server.conf";
my $nss_wrapper_pl = "$ENV{PERL} $self->{srcdir}/lib/nss_wrapper/nss_wrapper.pl";
@ -1182,6 +1215,10 @@ sub provision($$$$$$)
fruit:metadata = netatalk
fruit:locking = netatalk
fruit:encoding = native
[badname-tmp]
path = $badnames_shrdir
guest ok = yes
";
close(CONF);

View File

@ -722,6 +722,146 @@ EOF
fi
}
# Test accessing an share with bad names (won't convert).
test_bad_names()
{
cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/badname-tmp -I $SERVER_IP $ADDARGS -c ls 2>&1'
eval echo "$cmd"
out=`eval $cmd`
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed accessing badname-tmp (SMB1) with error $ret"
false
return
fi
echo "$out" | wc -l 2>&1 | grep 6
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - grep of number of lines (1) failed with $ret"
false
fi
echo "$out" | grep 'Domain=.*OS=.*Server='
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - grep (1) failed with $ret"
false
fi
echo "$out" | grep '^ \. *D'
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - grep (2) failed with $ret"
false
fi
echo "$out" | grep '^ \.\. *D'
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - grep (3) failed with $ret"
false
fi
echo "$out" | grep '^ blank.txt *N'
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - grep (4) failed with $ret"
false
fi
echo "$out" | grep '^ *$'
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - grep (5) failed with $ret"
false
fi
echo "$out" | grep 'blocks of size.*blocks available'
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - grep (6) failed with $ret"
false
fi
# Now check again with -mSMB3
cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/badname-tmp -I $SERVER_IP -mSMB3 $ADDARGS -c ls 2>&1'
eval echo "$cmd"
out=`eval $cmd`
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed accessing badname-tmp (SMB3) with error $ret"
false
return
fi
echo "$out" | wc -l 2>&1 | grep 6
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - SMB3 grep of number of lines (1) failed with $ret"
false
fi
echo "$out" | grep 'Domain=.*OS=.*Server='
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - SMB3 grep (1) failed with $ret"
false
fi
echo "$out" | grep '^ \. *D'
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - SMB3 grep (2) failed with $ret"
false
fi
echo "$out" | grep '^ \.\. *D'
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - SMB3 grep (3) failed with $ret"
false
fi
echo "$out" | grep '^ blank.txt *N'
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - SMB3 grep (4) failed with $ret"
false
fi
echo "$out" | grep '^ *$'
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - SMB3 grep (5) failed with $ret"
false
fi
echo "$out" | grep 'blocks of size.*blocks available'
ret=$?
if [ $ret != 0 ] ; then
echo "$out"
echo "failed listing \\badname-tmp - SMB3 grep (6) failed with $ret"
false
fi
}
LOGDIR_PREFIX=test_smbclient_s3
@ -798,6 +938,10 @@ testit "list with backup privilege" \
test_backup_privilege_list || \
failed=`expr $failed + 1`
testit "list a share with bad names (won't convert)" \
test_bad_names || \
failed=`expr $failed + 1`
testit "rm -rf $LOGDIR" \
rm -rf $LOGDIR || \
failed=`expr $failed + 1`