[vlc-commits] [Git][videolan/vlc][3.0.x] ftp: properly parse MLST facts
Jean-Baptiste Kempf (@jbk)
gitlab at videolan.org
Sun May 29 22:19:43 UTC 2022
Jean-Baptiste Kempf pushed to branch 3.0.x at VideoLAN / VLC
Commits:
21952d52 by Marvin Scholz at 2022-05-29T22:04:01+00:00
ftp: properly parse MLST facts
Fix #26046
(cherry picked from commit c8713775c899ac4704e697021a0d6fb117fe4b54)
Signed-off-by: Marvin Scholz <epirat07 at gmail.com>
- - - - -
1 changed file:
- modules/access/ftp.c
Changes:
=====================================
modules/access/ftp.c
=====================================
@@ -46,6 +46,7 @@
#include <vlc_charset.h>
#include <vlc_interrupt.h>
#include <vlc_keystore.h>
+#include <vlc_strings.h>
#ifndef IPPORT_FTP
# define IPPORT_FTP 21u
@@ -916,6 +917,43 @@ static ssize_t Read( stream_t *p_access, void *p_buffer, size_t i_len )
return i_read;
}
+/**
+ * Parse MLST facts list
+ *
+ * Parses a MLST facts list (without the trailing space/filename)
+ * pointed to by linep and fills the key/value variables.
+ * If a not properly formatted fact is encountered, the
+ * whole fact value will be in key and val will be NULL.
+ *
+ * \note This function modifies the linep pointer, so
+ * the original value for it must be saved to free
+ * it once done.
+ * \retval false if at the end of the list
+ * \retval true if there are more list items to process
+ */
+static bool mlst_facts_iter(char **linep, const char **key, const char **val)
+{
+ // MLST format parsed here is 'key=val;key=val...;'
+ // Lack of trailing ; at the end is accepted too, even though
+ // not permitted by the standard.
+ char *fact = strsep(linep, ";");
+ *key = NULL;
+ *val = NULL;
+
+ if (fact == NULL || fact[0] == '\0')
+ return false;
+
+ // Separate key and value
+ char *sep = strchr(fact, '=');
+ if (sep) {
+ *sep++ = '\0';
+ }
+ *key = fact;
+ *val = sep;
+
+ return true;
+}
+
/*****************************************************************************
* DirRead:
*****************************************************************************/
@@ -941,22 +979,31 @@ static int DirRead (stream_t *p_access, input_item_node_t *p_current_node)
if( p_sys->features.b_mlst )
{
- /* MLST Format is key=val;key=val...; FILENAME */
- if( strstr( psz_line, "type=dir" ) )
- type = ITEM_TYPE_DIRECTORY;
- if( strstr( psz_line, "type=file" ) )
- type = ITEM_TYPE_FILE;
-
- /* Get the filename or fail */
- psz_file = strchr( psz_line, ' ' );
- if( psz_file )
- psz_file++;
- else
- {
- msg_Warn( p_access, "Empty filename in MLST list" );
+ const char *key, *val;
+ char *facts = psz_line;
+
+ // Separate MLST and filename
+ psz_file = strchr(psz_line, ' ');
+ if (likely(psz_file)) {
+ *psz_file++ = '\0';
+ } else {
+ msg_Warn( p_access, "No filename in MLST list found" );
free( psz_line );
continue;
}
+
+ while (mlst_facts_iter( &facts, &key, &val )) {
+ if (val == NULL) {
+ msg_Warn( p_access, "Skipping invalid MLST fact '%s'", key);
+ continue;
+ }
+ if (!vlc_ascii_strcasecmp( key, "type" )) {
+ if (!vlc_ascii_strcasecmp( val, "dir" ))
+ type = ITEM_TYPE_DIRECTORY;
+ else if (!vlc_ascii_strcasecmp( val, "file" ))
+ type = ITEM_TYPE_FILE;
+ }
+ }
}
else
psz_file = psz_line;
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/21952d524f25504d10f43089058a0ddf8ec9e67c
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/21952d524f25504d10f43089058a0ddf8ec9e67c
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