[vlc-commits] [Git][videolan/vlc][master] 9 commits: modules: fix vlc_memstream_close success checks
Steve Lhomme (@robUx4)
gitlab at videolan.org
Tue Nov 28 06:58:19 UTC 2023
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
05761dd3 by Steve Lhomme at 2023-11-28T06:35:20+00:00
modules: fix vlc_memstream_close success checks
It doesn't return VLC_SUCCESS but 0 (even though it's the same thing).
- - - - -
b23c4e71 by Steve Lhomme at 2023-11-28T06:35:20+00:00
win32/spawn: use a regular string for application_name
We only need to free if it was not set to the path parameter.
- - - - -
18b08d1e by Steve Lhomme at 2023-11-28T06:35:20+00:00
win32/spawn: use a regular string for cmdline
We can handle the memstream locally and exit on error.
- - - - -
932a1c3e by Steve Lhomme at 2023-11-28T06:35:20+00:00
webvtt: don't reset empty memstream pointer
The content is later used with vlc_memstream_write. Passing NULL is undefined.
On Windows it uses fwrite which doesn't allow passing NULL [1].
[1] https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/fwrite
- - - - -
a3749aa6 by Steve Lhomme at 2023-11-28T06:35:20+00:00
memstream: do nothing when writing a length of 0
- - - - -
02b47bc2 by Steve Lhomme at 2023-11-28T06:35:20+00:00
core: set VLC_MALLOC on strings allocated by a memstream
After vlc_memstream_close() the memstream cannot be used anymore.
- - - - -
e52cc89f by Steve Lhomme at 2023-11-28T06:35:20+00:00
modules: set VLC_MALLOC on strings allocated by a memstream
After vlc_memstream_close() the memstream cannot be used anymore.
- - - - -
6c9543c4 by Steve Lhomme at 2023-11-28T06:35:20+00:00
mrl_helpers: return the escaped string in mrl_EscapeFragmentIdentifier
We don't need an error code.
- - - - -
2746c42e by Steve Lhomme at 2023-11-28T06:35:20+00:00
gl_util: free the source earlier
We don't need to wait when closing the memstream.
- - - - -
20 changed files:
- include/vlc_strings.h
- modules/access/http/message.h
- modules/access/smb2.c
- modules/codec/webvtt/subsvtt.c
- modules/demux/playlist/asx.c
- modules/demux/ttml.c
- modules/demux/webvtt.c
- modules/keystore/kwallet.c
- modules/stream_out/es.c
- modules/stream_out/hls/hls.c
- modules/video_output/opengl/gl_util.c
- src/input/es_out.c
- src/input/mrl_helpers.h
- src/input/stream_extractor.c
- src/input/vlmshell.c
- src/player/player.h
- src/test/mrl_helpers.c
- src/text/memstream.c
- src/text/url.c
- src/win32/spawn.c
Changes:
=====================================
include/vlc_strings.h
=====================================
@@ -223,7 +223,7 @@ VLC_API char *vlc_strftime( const char * );
* \return an allocated formatted string (must be free()'d), or NULL in case of error
*/
VLC_API char *vlc_strfplayer( vlc_player_t *player, input_item_t *item,
- const char *fmt );
+ const char *fmt ) VLC_MALLOC;
static inline char *str_format( vlc_player_t *player, input_item_t *item,
const char *fmt )
=====================================
modules/access/http/message.h
=====================================
@@ -459,7 +459,7 @@ static inline void vlc_http_stream_close(struct vlc_http_stream *s, bool abort)
* or NULL on error
*/
char *vlc_http_msg_format(const struct vlc_http_msg *m, size_t *restrict lenp,
- bool proxied, bool chunked) VLC_USED;
+ bool proxied, bool chunked) VLC_USED VLC_MALLOC;
/**
* Parses an HTTP 1.1 message header.
=====================================
modules/access/smb2.c
=====================================
@@ -383,7 +383,7 @@ FileControl(stream_t *access, int i_query, va_list args)
return VLC_SUCCESS;
}
-static char *
+VLC_MALLOC static char *
vlc_smb2_get_url(vlc_url_t *url, const char *file)
{
/* smb2://<psz_host><i_port><psz_path><file>?<psz_option> */
@@ -429,7 +429,7 @@ static int AddItem(stream_t *access, struct vlc_readdir_helper *rdh,
if (url == NULL)
return VLC_ENOMEM;
- input_item_t *p_item;
+ input_item_t *p_item;
int ret = vlc_readdir_helper_additem(rdh, url, NULL, name, i_type,
ITEM_NET, &p_item);
=====================================
modules/codec/webvtt/subsvtt.c
=====================================
@@ -2019,7 +2019,7 @@ static void ParserHeaderHandler( void *priv, enum webvtt_header_line_e s,
#ifdef HAVE_CSS
else if( ctx->b_css_memstream_opened )
{
- if( vlc_memstream_close( &ctx->css ) == VLC_SUCCESS )
+ if( vlc_memstream_close( &ctx->css ) == 0 )
{
vlc_css_parser_t p;
vlc_css_parser_Init(&p);
=====================================
modules/demux/playlist/asx.c
=====================================
@@ -437,7 +437,7 @@ static void memstream_puts_xmlencoded(struct vlc_memstream* p_stream, const char
* - make tags and attributes upercase
* - escape strings when required
*/
-static char* ASXToXML( char* psz_source )
+VLC_MALLOC static char* ASXToXML( char* psz_source )
{
bool b_in_string= false;
char *psz_source_cur = psz_source;
=====================================
modules/demux/ttml.c
=====================================
@@ -377,7 +377,7 @@ static int Demux( demux_t* p_demux )
tt_node_ToText( &stream, (tt_basenode_t *) p_sys->p_rootnode,
&p_sys->times.p_array[p_sys->times.i_current] );
- if( vlc_memstream_close( &stream ) == VLC_SUCCESS )
+ if( vlc_memstream_close( &stream ) == 0 )
{
block_t* p_block = block_heap_Alloc( stream.ptr, stream.length );
if( p_block )
@@ -523,7 +523,7 @@ int tt_OpenDemux( vlc_object_t* p_this )
vlc_memstream_putc( &stream, '\0' );
- if( vlc_memstream_close( &stream ) == VLC_SUCCESS )
+ if( vlc_memstream_close( &stream ) == 0 )
{
msg_Dbg( p_demux, "%s", stream.ptr );
free( stream.ptr );
=====================================
modules/demux/webvtt.c
=====================================
@@ -132,10 +132,9 @@ static block_t *ConvertWEBVTT( const webvtt_cue_t *p_cue, bool b_continued )
vlc_memstream_write( &stream, paylbox, 8 );
vlc_memstream_write( &stream, p_cue->psz_text, paylsize - 8 );
- if( vlc_memstream_close( &stream ) == VLC_SUCCESS )
+ if( vlc_memstream_close( &stream ) == 0 )
return block_heap_Alloc( stream.ptr, stream.length );
- else
- return NULL;
+ return NULL;
}
struct memstream_wrap
@@ -155,13 +154,8 @@ static void memstream_Append( struct memstream_wrap *mw, const char *psz )
static void memstream_Grab( struct memstream_wrap *mw, void **pp, size_t *pi )
{
- if( mw->b_opened && vlc_memstream_close( &mw->memstream ) == VLC_SUCCESS )
+ if( mw->b_opened && vlc_memstream_close( &mw->memstream ) == 0 )
{
- if( mw->memstream.length == 0 )
- {
- free( mw->memstream.ptr );
- mw->memstream.ptr = NULL;
- }
*pp = mw->memstream.ptr;
*pi = mw->memstream.length;
}
@@ -418,7 +412,7 @@ static void MakeExtradata( demux_sys_t *p_sys, void **p_extra, size_t *pi_extra
p_sys->regions_headers.i_data );
vlc_memstream_write( &extradata, p_sys->styles_headers.p_data,
p_sys->styles_headers.i_data );
- if( vlc_memstream_close( &extradata ) == VLC_SUCCESS )
+ if( vlc_memstream_close( &extradata ) == 0 )
{
if( extradata.length )
{
=====================================
modules/keystore/kwallet.c
=====================================
@@ -108,7 +108,7 @@ typedef struct vlc_keystore_sys
/* takes all values in the values of vlc_keystore_entry *
* and formats them in a url key */
-static char*
+VLC_MALLOC static char*
values2key( const char* const* ppsz_values, bool b_search )
{
char* psz_b64_realm = NULL;
=====================================
modules/stream_out/es.c
=====================================
@@ -62,8 +62,8 @@ typedef struct
bool synchronous;
} sout_stream_id_sys_t;
-static char * es_print_url( const char *psz_fmt, vlc_fourcc_t i_fourcc, int i_count,
- const char *psz_access, const char *psz_mux )
+VLC_MALLOC static char * es_print_url( const char *psz_fmt, vlc_fourcc_t i_fourcc, int i_count,
+ const char *psz_access, const char *psz_mux )
{
struct vlc_memstream stream;
unsigned char c;
=====================================
modules/stream_out/hls/hls.c
=====================================
@@ -213,8 +213,8 @@ static inline hls_track_t *MediaGetTrack(const hls_playlist_t *media_playlist)
return track;
}
-static char *GeneratePlaylistCodecInfo(const struct vlc_list *media_list,
- const hls_playlist_t *playlist)
+VLC_MALLOC static char *GeneratePlaylistCodecInfo(const struct vlc_list *media_list,
+ const hls_playlist_t *playlist)
{
es_format_vec_t already_described = VLC_VECTOR_INITIALIZER;
=====================================
modules/video_output/opengl/gl_util.c
=====================================
@@ -70,17 +70,16 @@ LogShader(vlc_object_t *obj, const char *prefix, const opengl_vtable_t *vt, GLui
}
line++;
}
+ free(sources);
ret = vlc_memstream_close(&stream);
if (ret != 0)
{
- free(sources);
return;
}
msg_Err(obj, "%s%s", prefix, stream.ptr);
free(stream.ptr);
- free(sources);
}
static void
=====================================
src/input/es_out.c
=====================================
@@ -1991,8 +1991,8 @@ static void EsOutFillEsFmt(es_out_t *out, es_format_t *fmt)
}
}
-static char *EsOutCreateStrId( es_out_id_t *es, bool stable, const char *id,
- es_out_id_t *p_master )
+VLC_MALLOC static char *EsOutCreateStrId( es_out_id_t *es, bool stable, const char *id,
+ es_out_id_t *p_master )
{
struct vlc_memstream ms;
if( vlc_memstream_open( &ms ) != 0 )
=====================================
src/input/mrl_helpers.h
=====================================
@@ -49,13 +49,11 @@
* See the \link mrl MRL-specification\endlink for a detailed
* explanation of how `payload` will be escaped.
*
- * \param[out] out `*out` will refer to the created string on success,
- * and an unspecified value on error.
* \param[in] payload the data to escape.
- * \return VLC_SUCCESS on success, an error-code on failure.
+ * \return he created string on success, and NULL on error.
**/
-static inline int
-mrl_EscapeFragmentIdentifier( char** out, char const* payload )
+VLC_MALLOC static inline char *
+mrl_EscapeFragmentIdentifier( char const* payload )
{
struct vlc_memstream mstream;
@@ -69,7 +67,7 @@ mrl_EscapeFragmentIdentifier( char** out, char const* payload )
#define RFC3986_FRAGMENT RFC3986_PCHAR "/" "?"
if( vlc_memstream_open( &mstream ) )
- return VLC_EGENERIC;
+ return NULL;
for( char const* p = payload; *p; ++p )
{
@@ -86,10 +84,9 @@ mrl_EscapeFragmentIdentifier( char** out, char const* payload )
#undef RFC3986_SUBDELIMS
if( vlc_memstream_close( &mstream ) )
- return VLC_EGENERIC;
+ return NULL;
- *out = mstream.ptr;
- return VLC_SUCCESS;
+ return mstream.ptr;
}
/**
=====================================
src/input/stream_extractor.c
=====================================
@@ -86,13 +86,14 @@ struct stream_extractor_private {
* within \p base, see \ref mrl_helpers for further information.
**/
-static char*
+VLC_MALLOC static char*
StreamExtractorCreateMRL( char const* base, char const* subentry )
{
struct vlc_memstream buffer;
char* escaped;
- if( mrl_EscapeFragmentIdentifier( &escaped, subentry ) )
+ escaped = mrl_EscapeFragmentIdentifier( subentry );
+ if ( escaped == NULL )
return NULL;
if( vlc_memstream_open( &buffer ) )
=====================================
src/input/vlmshell.c
=====================================
@@ -64,7 +64,7 @@ static vlm_message_t *vlm_Show( vlm_t *, vlm_media_sys_t *, vlm_schedule_sys_t *
static vlm_schedule_sys_t *vlm_ScheduleSearch( vlm_t *, const char * );
-static char *Save( vlm_t * );
+VLC_MALLOC static char *Save( vlm_t * );
static int Load( vlm_t *, char * );
static vlm_schedule_sys_t *vlm_ScheduleNew( vlm_t *vlm, const char *psz_name );
@@ -1573,7 +1573,7 @@ static int Load( vlm_t *vlm, char *file )
return 0;
}
-static char *Save( vlm_t *vlm )
+VLC_MALLOC static char *Save( vlm_t *vlm )
{
const char *psz_header = "\n"
"# VLC media player VLM command batch\n"
=====================================
src/player/player.h
=====================================
@@ -434,7 +434,7 @@ vlc_player_input_SelectTracksByStringIds(struct vlc_player_input *input,
char *
vlc_player_input_GetSelectedTrackStringIds(struct vlc_player_input *input,
- enum es_format_category_e cat);
+ enum es_format_category_e cat) VLC_MALLOC;
vlc_tick_t
vlc_player_input_GetTime(struct vlc_player_input *input);
=====================================
src/test/mrl_helpers.c
=====================================
@@ -91,9 +91,8 @@ int main (void)
assert(strcmp(testcase[i].results[j], res) == 0);
- char *res_escaped = NULL;
- ret = mrl_EscapeFragmentIdentifier(&res_escaped, res);
- assert(ret == VLC_SUCCESS && res_escaped != NULL);
+ char *res_escaped = mrl_EscapeFragmentIdentifier(res);
+ assert(res_escaped != NULL);
assert(strncmp(p, res_escaped, strlen(res_escaped)) == 0);
p += strlen(res_escaped) + 2;
=====================================
src/text/memstream.c
=====================================
@@ -71,6 +71,9 @@ size_t vlc_memstream_write(struct vlc_memstream *ms, const void *ptr,
if (unlikely(ms->stream == NULL))
return 0;
+ if (len == 0)
+ return 0;
+
return fwrite(ptr, 1, len, ms->stream);
}
@@ -129,6 +132,9 @@ size_t vlc_memstream_write(struct vlc_memstream *ms, const void *ptr,
{
size_t newlen;
+ if (len == 0)
+ return 0;
+
if (unlikely(add_overflow(ms->length, len, &newlen))
|| unlikely(add_overflow(newlen, 1, &newlen)))
goto error;
=====================================
src/text/url.c
=====================================
@@ -856,7 +856,7 @@ error:
return ret;
}
-static char *vlc_uri_fixup_inner(const char *str, const char *extras)
+VLC_MALLOC static char *vlc_uri_fixup_inner(const char *str, const char *extras)
{
assert(str && extras);
=====================================
src/win32/spawn.c
=====================================
@@ -112,15 +112,8 @@ static int vlc_spawn_inner(pid_t *restrict pid, const char *path,
}
};
- struct vlc_memstream application_name;
- struct vlc_memstream cmdline;
- {
- int error;
- error = vlc_memstream_open(&application_name);
- error |= vlc_memstream_open(&cmdline);
- if (unlikely(error))
- goto error;
- }
+ const char *application_name = NULL;
+ char *cmdline = NULL;
if (fdv[0] == -1 || fdv[1] == -1) {
nulfd = vlc_open("\\\\.\\NUL", O_RDWR);
@@ -175,20 +168,25 @@ static int vlc_spawn_inner(pid_t *restrict pid, const char *path,
goto error;
}
- vlc_memstream_printf(&application_name, "%s", application_path);
- free(application_path);
+ application_name = application_path;
} else {
- vlc_memstream_printf(&application_name, "%s", path);
+ application_name = path;
}
if (likely(argv[0])) {
- vlc_memstream_printf(&cmdline, "%s", argv[0]);
+ struct vlc_memstream cmdline_s;
+ if (unlikely(vlc_memstream_open(&cmdline_s) != 0))
+ goto error;
+ vlc_memstream_printf(&cmdline_s, "%s", argv[0]);
for (int argc = 1; argv[argc]; ++argc)
- vlc_memstream_printf(&cmdline, " %s", argv[argc]);
+ vlc_memstream_printf(&cmdline_s, " %s", argv[argc]);
+ if (vlc_memstream_close(&cmdline_s) != 0)
+ goto error;
+ cmdline = cmdline_s.ptr;
}
- BOOL bSuccess = CreateProcessA(application_name.ptr, cmdline.ptr, NULL,
+ BOOL bSuccess = CreateProcessA(application_name, cmdline, NULL,
NULL, TRUE, EXTENDED_STARTUPINFO_PRESENT,
NULL, NULL, &siEx.StartupInfo, &pi);
if (!bSuccess)
@@ -222,10 +220,9 @@ error:
free(siEx.lpAttributeList);
}
- if (!vlc_memstream_close(&application_name))
- free(application_name.ptr);
- if (!vlc_memstream_close(&cmdline))
- free(cmdline.ptr);
+ if (application_name != path)
+ free((char*)application_name);
+ free(cmdline);
return ret;
}
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/1fa7526be4e6b8d8e11a1be1a92a7573cbb45d22...2746c42e295dcf0ae333c3f26cd44ebbfff3218c
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/1fa7526be4e6b8d8e11a1be1a92a7573cbb45d22...2746c42e295dcf0ae333c3f26cd44ebbfff3218c
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list