[vlc-commits] modules: do not use non-portable union to store item flags in cache

Rémi Denis-Courmont git at videolan.org
Sun Jan 27 18:27:33 CET 2013


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jan 27 19:21:30 2013 +0200| [f71b33de230877ce27fa247e896979190f6d4f25] | committer: Rémi Denis-Courmont

modules: do not use non-portable union to store item flags in cache

 Pointed-out-by: Mario Speiß <1034-135 at online.de>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f71b33de230877ce27fa247e896979190f6d4f25
---

 include/vlc_configuration.h |   22 ++++++++--------------
 src/modules/cache.c         |   33 +++++++++++++++++++++++++++++----
 2 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/include/vlc_configuration.h b/include/vlc_configuration.h
index acd1f41..fe0aba5 100644
--- a/include/vlc_configuration.h
+++ b/include/vlc_configuration.h
@@ -59,20 +59,14 @@ typedef int (*vlc_integer_list_cb)(vlc_object_t *, const char *,
 
 struct module_config_t
 {
-    union
-    {
-        struct
-        {
-            uint8_t     i_type;                        /* Configuration type */
-            char        i_short;               /* Optional short option name */
-            unsigned    b_advanced:1;                     /* Advanced option */
-            unsigned    b_internal:1;          /* Hidden from prefs and help */
-            unsigned    b_unsaveable:1;       /* Not stored in configuration */
-            unsigned    b_safe:1;       /* Safe in web plugins and playlists */
-            unsigned    b_removed:1;                           /* Deprecated */
-        };
-        uint32_t flags;
-    };
+    uint8_t     i_type;                        /* Configuration type */
+    char        i_short;               /* Optional short option name */
+    unsigned    b_advanced:1;                     /* Advanced option */
+    unsigned    b_internal:1;          /* Hidden from prefs and help */
+    unsigned    b_unsaveable:1;       /* Not stored in configuration */
+    unsigned    b_safe:1;       /* Safe in web plugins and playlists */
+    unsigned    b_removed:1;                           /* Deprecated */
+
     char *psz_type;                                 /* Configuration subtype */
     char *psz_name;                                           /* Option name */
     char *psz_text;             /* Short comment on the configuration option */
diff --git a/src/modules/cache.c b/src/modules/cache.c
index d7aae1d..6129043 100644
--- a/src/modules/cache.c
+++ b/src/modules/cache.c
@@ -57,7 +57,7 @@
 #ifdef HAVE_DYNAMIC_PLUGINS
 /* Sub-version number
  * (only used to avoid breakage in dev version when cache structure changes) */
-#define CACHE_SUBVERSION_NUM 21
+#define CACHE_SUBVERSION_NUM 22
 
 /* Cache filename */
 #define CACHE_NAME "plugins.dat"
@@ -80,7 +80,15 @@ void CacheDelete( vlc_object_t *obj, const char *dir )
 
 #define LOAD_IMMEDIATE(a) \
     if (fread (&(a), sizeof (char), sizeof (a), file) != sizeof (a)) \
-       goto error
+        goto error
+#define LOAD_FLAG(a) \
+    do { \
+        unsigned char b; \
+        LOAD_IMMEDIATE(b); \
+        if (b > 1) \
+            goto error; \
+        (a) = b; \
+    } while (0)
 
 static int CacheLoadString (char **p, FILE *file)
 {
@@ -115,7 +123,13 @@ error:
 
 static int CacheLoadConfig (module_config_t *cfg, FILE *file)
 {
-    LOAD_IMMEDIATE (cfg->flags);
+    LOAD_IMMEDIATE (cfg->i_type);
+    LOAD_IMMEDIATE (cfg->i_short);
+    LOAD_FLAG (cfg->b_advanced);
+    LOAD_FLAG (cfg->b_internal);
+    LOAD_FLAG (cfg->b_unsaveable);
+    LOAD_FLAG (cfg->b_safe);
+    LOAD_FLAG (cfg->b_removed);
     LOAD_STRING (cfg->psz_type);
     LOAD_STRING (cfg->psz_name);
     LOAD_STRING (cfg->psz_text);
@@ -383,6 +397,11 @@ error:
 #define SAVE_IMMEDIATE( a ) \
     if (fwrite (&(a), sizeof(a), 1, file) != 1) \
         goto error
+#define SAVE_FLAG(a) \
+    do { \
+        char b = (a); \
+        LOAD_IMMEDIATE(b); \
+    } while (0)
 
 static int CacheSaveString (FILE *file, const char *str)
 {
@@ -403,7 +422,13 @@ error:
 
 static int CacheSaveConfig (FILE *file, const module_config_t *cfg)
 {
-    SAVE_IMMEDIATE (cfg->flags);
+    SAVE_IMMEDIATE (cfg->i_type);
+    SAVE_IMMEDIATE (cfg->i_short);
+    SAVE_FLAG (cfg->b_advanced);
+    SAVE_FLAG (cfg->b_internal);
+    SAVE_FLAG (cfg->b_unsaveable);
+    SAVE_FLAG (cfg->b_safe);
+    SAVE_FLAG (cfg->b_removed);
     SAVE_STRING (cfg->psz_type);
     SAVE_STRING (cfg->psz_name);
     SAVE_STRING (cfg->psz_text);



More information about the vlc-commits mailing list