1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00

s4: torture: Show return value for smbc_getxattr() is incorrect (returns >0 for success, should return zero).

Add torture test to show smbc_getxattr() should return -1 on
failure, 0 on success.

Add knownfail.

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

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: David Mulder <dmulder@samba.org>
(cherry picked from commit 74636dfe24)
This commit is contained in:
Jeremy Allison 2022-10-28 15:28:41 -07:00 committed by Jule Anger
parent a1fa2c18e5
commit 628a1c3382
2 changed files with 95 additions and 0 deletions

View File

@ -0,0 +1 @@
^samba4.libsmbclient.getxattr.*

View File

@ -1473,6 +1473,98 @@ static bool torture_libsmbclient_getatr(struct torture_context *tctx)
return true;
}
static bool torture_libsmbclient_getxattr(struct torture_context *tctx)
{
const char *smburl = torture_setting_string(tctx, "smburl", NULL);
int fhandle = -1;
SMBCCTX *ctx = NULL;
char *getxattr_name = NULL;
char value[4096];
bool ok = false;
int ret = -1;
if (smburl == NULL) {
torture_fail(tctx,
"option --option=torture:smburl="
"smb://user:password@server missing\n");
}
ok = torture_libsmbclient_init_context(tctx, &ctx);
torture_assert(tctx, ok, "Failed to init context");
smbc_set_context(ctx);
getxattr_name = talloc_asprintf(tctx,
"%s/getxattr",
smburl);
if (getxattr_name == NULL) {
torture_result(tctx,
TORTURE_FAIL,
__location__": %s",
"talloc fail\n");
return false;
}
/* Ensure the file doesn't exist. */
smbc_unlink(getxattr_name);
/* Create testfile. */
fhandle = smbc_creat(getxattr_name, 0666);
if (fhandle < 0) {
torture_fail_goto(tctx,
done,
talloc_asprintf(tctx,
"failed to create file '%s': %s",
getxattr_name,
strerror(errno)));
}
ret = smbc_close(fhandle);
torture_assert_int_equal_goto(tctx,
ret,
0,
ok,
done,
talloc_asprintf(tctx,
"failed to close handle for '%s'",
getxattr_name));
/*
* Ensure getting a non-existent attribute returns -1.
*/
ret = smbc_getxattr(getxattr_name, "foobar", value, sizeof(value));
torture_assert_int_equal_goto(tctx,
ret,
-1,
ok,
done,
talloc_asprintf(tctx,
"smbc_getxattr(foobar) on '%s' should "
"get -1, got %d\n",
getxattr_name,
ret));
/*
* Ensure getting a valid attribute returns 0.
*/
ret = smbc_getxattr(getxattr_name, "system.*", value, sizeof(value));
torture_assert_int_equal_goto(tctx,
ret,
0,
ok,
done,
talloc_asprintf(tctx,
"smbc_getxattr(foobar) on '%s' should "
"get -1, got %d\n",
getxattr_name,
ret));
ok = true;
done:
smbc_unlink(getxattr_name);
smbc_free_context(ctx, 1);
return ok;
}
NTSTATUS torture_libsmbclient_init(TALLOC_CTX *ctx)
{
struct torture_suite *suite;
@ -1501,6 +1593,8 @@ NTSTATUS torture_libsmbclient_init(TALLOC_CTX *ctx)
torture_libsmbclient_rename);
torture_suite_add_simple_test(suite, "getatr",
torture_libsmbclient_getatr);
torture_suite_add_simple_test(suite, "getxattr",
torture_libsmbclient_getxattr);
suite->description = talloc_strdup(suite, "libsmbclient interface tests");