From d921200e75e90fbda2cf7ba7950ae71e09c50468 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 6 Jul 2011 18:57:27 +0200 Subject: s3:libsmb: use clistr_pull_talloc() for short_name in interpret_long_filename() metze --- source3/include/client.h | 2 +- source3/libsmb/clilist.c | 20 ++++++++++++++------ source3/torture/masktest.c | 3 ++- source3/torture/torture.c | 4 ++-- 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); -- cgit