summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/client.h2
-rw-r--r--source3/libsmb/clilist.c20
-rw-r--r--source3/torture/masktest.c3
-rw-r--r--source3/torture/torture.c4
4 files changed, 19 insertions, 10 deletions
diff --git a/source3/include/client.h b/source3/include/client.h
index a853e90af6..40040f4bdf 100644
--- a/source3/include/client.h
+++ b/source3/include/client.h
@@ -152,7 +152,7 @@ struct file_info {
struct timespec atime_ts;
struct timespec ctime_ts;
char *name;
- char short_name[13*3]; /* the *3 is to cope with multi-byte */
+ char *short_name;
};
#define CLI_FULL_CONNECTION_DONT_SPNEGO 0x0001
diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c
index 0792e4057b..a9270fbb35 100644
--- a/source3/libsmb/clilist.c
+++ b/source3/libsmb/clilist.c
@@ -189,9 +189,16 @@ static size_t interpret_long_filename(TALLOC_CTX *ctx,
return pdata_end - base;
}
p += 2;
- clistr_pull(base_ptr, finfo->short_name, p,
- sizeof(finfo->short_name),
- slen, STR_UNICODE);
+ ret = clistr_pull_talloc(ctx,
+ base_ptr,
+ recv_flags2,
+ &finfo->short_name,
+ p,
+ slen,
+ STR_UNICODE);
+ if (ret == (size_t)-1) {
+ return pdata_end - base;
+ }
p += 24; /* short name? */
if (p + namelen < p || p + namelen > pdata_end) {
return pdata_end - base;
@@ -258,9 +265,10 @@ static bool interpret_short_filename(TALLOC_CTX *ctx,
}
if (finfo->name) {
- strlcpy(finfo->short_name,
- finfo->name,
- sizeof(finfo->short_name));
+ finfo->short_name = talloc_strdup(ctx, finfo->name);
+ if (finfo->short_name == NULL) {
+ return false;
+ }
}
return true;
}
diff --git a/source3/torture/masktest.c b/source3/torture/masktest.c
index 9bb34dfe45..6b9c302aa3 100644
--- a/source3/torture/masktest.c
+++ b/source3/torture/masktest.c
@@ -267,7 +267,8 @@ static NTSTATUS listfn(const char *mnt, struct file_info *f, const char *s,
return NT_STATUS_OK;
}
- fstrcpy(state->short_name, f->short_name);
+
+ fstrcpy(state->short_name, f->short_name ? f->short_name : "");
strlower_m(state->short_name);
*state->pp_long_name = SMB_STRDUP(f->name);
if (!*state->pp_long_name) {
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index 64f8bf77b6..8f251b7f2b 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -7081,13 +7081,13 @@ static NTSTATUS shortname_list_fn(const char *mnt, struct file_info *finfo,
#endif
if (strchr(force_shortname_chars, i)) {
- if (!finfo->short_name[0]) {
+ if (!finfo->short_name) {
/* Shortname not created when it should be. */
d_printf("(%s) ERROR: Shortname was not created for file %s containing %d\n",
__location__, finfo->name, i);
s->val = true;
}
- } else if (finfo->short_name[0]){
+ } else if (finfo->short_name){
/* Shortname created when it should not be. */
d_printf("(%s) ERROR: Shortname %s was created for file %s\n",
__location__, finfo->short_name, finfo->name);