[Spice-devel] [PATCH spice-server v5 02/18] Avoids %m in formatting for Windows
Frediano Ziglio
fziglio at redhat.com
Fri Mar 29 08:59:58 UTC 2019
Not supported, %m is a GNU extension of sscanf.
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
server/reds.c | 29 ++++++++++++++---------------
1 file changed, 14 insertions(+), 15 deletions(-)
diff --git a/server/reds.c b/server/reds.c
index 28542bd09..302da5858 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -3741,8 +3741,7 @@ static const int video_codec_caps[] = {
* @codec: a location to return the parsed codec
* @return the position of the next codec in the string
*/
-static const char* parse_next_video_codec(const char *codecs, char **encoder,
- char **codec)
+static char* parse_next_video_codec(char *codecs, char **encoder, char **codec)
{
if (!codecs) {
return NULL;
@@ -3751,14 +3750,15 @@ static const char* parse_next_video_codec(const char *codecs, char **encoder,
if (!*codecs) {
return NULL;
}
- int n;
+ int end_encoder, end_codec = -1;
*encoder = *codec = NULL;
- if (sscanf(codecs, "%m[0-9a-zA-Z_]:%m[0-9a-zA-Z_]%n", encoder, codec, &n) == 2) {
- // this avoids accepting "encoder:codec" followed by garbage like "$%*"
- if (codecs[n] != ';' && codecs[n] != '\0') {
- free(*codec);
- *codec = NULL;
- }
+ if (sscanf(codecs, "%*[0-9a-zA-Z_]:%n%*[0-9a-zA-Z_];%n", &end_encoder, &end_codec) == 0
+ && end_codec > 0) {
+ codecs[end_encoder - 1] = '\0';
+ codecs[end_codec - 1] = '\0';
+ *encoder = codecs;
+ *codec = codecs + end_encoder;
+ return codecs + end_codec;
}
return codecs + strcspn(codecs, ";");
}
@@ -3775,7 +3775,8 @@ static void reds_set_video_codecs_from_string(RedsState *reds, const char *codec
}
video_codecs = g_array_new(FALSE, FALSE, sizeof(RedVideoCodec));
- const char *c = codecs;
+ char *codecs_copy = g_strdup_printf("%s;", codecs);
+ char *c = codecs_copy;
while ( (c = parse_next_video_codec(c, &encoder_name, &codec_name)) ) {
uint32_t encoder_index, codec_index;
if (!encoder_name || !codec_name) {
@@ -3798,19 +3799,17 @@ static void reds_set_video_codecs_from_string(RedsState *reds, const char *codec
g_array_append_val(video_codecs, new_codec);
}
- /* these are allocated by sscanf, do not use g_free */
- free(encoder_name);
- free(codec_name);
codecs = c;
}
if (video_codecs->len == 0) {
spice_warning("Failed to set video codecs, input string: '%s'", codecs);
g_array_unref(video_codecs);
- return;
+ } else {
+ reds_set_video_codecs(reds, video_codecs);
}
- reds_set_video_codecs(reds, video_codecs);
+ g_free(codecs_copy);
}
SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *reds, SpiceCoreInterface *core)
--
2.20.1
More information about the Spice-devel
mailing list