[Spice-devel] [vdagent-win PATCH] file-xfer: handle_start: use snprintf instead of sprintf_s

Frediano Ziglio fziglio at redhat.com
Thu Feb 28 13:12:21 UTC 2019


> On 2/25/19 4:12 PM, Frediano Ziglio wrote:
> >>
> >> When building with older mingw, sprintf_s does not
> >> always work as expected, but snprintf does.
> >>
> >> Also it's more consistent in the file.
> >>
> >> Note that when building with VS, snprintf becomes sprintf_s
> >>
> > 
> > I think this could be a bug, from documentation:
> > 
> > "If the buffer is too small for the formatted text, including the
> > terminating null, then the buffer is set to an empty string by placing a
> > null character at buffer[0], and the invalid parameter handler is invoked"
> > 
> > which is different from snprintf behaviour, _snprintf is probably what do
> > we want.
> 
> Actually, I think we do want snprintf's behavior, not _snprintf.
> _snprintf does not guarantee null termination of the string.
> 

Yes, you are right, sorry for the confusion.

> We should probably check the return value.

Well, yes, and in call to snprintf, even on Linux. Or continue to
ignore as we do.

> Also we can add a check that there is enough space and fail early.
> 

This does not make sense, better to check later, it's easier.
But usually you just call snprintf and ignore if truncated,
I don't see why in this case we should make an exception.

> Uri.
> 
> > 
> >> Related: rhbz#1410181
> >>
> >> Signed-off-by: Uri Lublin <uril at redhat.com>
> >> ---
> >>   vdagent/file_xfer.cpp | 2 +-
> >>   1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/vdagent/file_xfer.cpp b/vdagent/file_xfer.cpp
> >> index ada3b47..c456bbe 100644
> >> --- a/vdagent/file_xfer.cpp
> >> +++ b/vdagent/file_xfer.cpp
> >> @@ -113,7 +113,7 @@ void
> >> FileXfer::handle_start(VDAgentFileXferStartMessage*
> >> start,
> >>           if (attempt == 0) {
> >>               strcpy(dest_filename, file_name);
> >>           } else {
> >> -            sprintf_s(dest_filename, SPICE_N_ELEMENTS(dest_filename),
> >> +            snprintf(dest_filename, sizeof(dest_filename),
> >>                         "%.*s (%d)%s", int(extension - file_name),
> >>                         file_name,
> >>                         attempt, extension);
> >>           }
> >>           if ((MultiByteToWideChar(CP_UTF8, 0, dest_filename, -1,
> >>           file_path +
> >>           wlen, MAX_PATH - wlen)) == 0) {
> > 
> > Frediano
> > 
> 
> 


More information about the Spice-devel mailing list