This is an automated email from the git hooks/post-receive script.

nomad pushed a commit to branch master
in repository apps/xfdashboard.

commit dfd62458aa274ff394a412b87743415f84c8d5d7
Author: Stephan Haller <no...@froevel.de>
Date:   Wed Apr 12 10:57:28 2017 +0200

    Add detection of indefinite recursion while resolving an @-constant in CSS 
file.
    
    Finally fixes issue GH #143
---
 libxfdashboard/theme-css.c | 92 +++++++++++++++++++++++++++++++++++-----------
 1 file changed, 71 insertions(+), 21 deletions(-)

diff --git a/libxfdashboard/theme-css.c b/libxfdashboard/theme-css.c
index 822f4cb..2613388 100644
--- a/libxfdashboard/theme-css.c
+++ b/libxfdashboard/theme-css.c
@@ -124,12 +124,14 @@ static void 
_xfdashboard_theme_css_set_error(XfdashboardThemeCSS *self,
 static gchar* 
_xfdashboard_theme_css_resolve_at_identifier_internal(XfdashboardThemeCSS *self,
                                                                                
                                                        GScanner *inScanner,
                                                                                
                                                        GScanner 
*inScopeScanner,
-                                                                               
                                                        GList 
*inScopeSelectors);
+                                                                               
                                                        GList *inScopeSelectors,
+                                                                               
                                                        const gchar 
*inRecursionIdentifier);
 
 static gchar* 
_xfdashboard_theme_css_resolve_at_identifier_by_string(XfdashboardThemeCSS 
*self,
                                                                                
                                                                const gchar 
*inValue,
                                                                                
                                                                GScanner 
*inScopeScanner,
-                                                                               
                                                                GList 
*inScopeSelectors);
+                                                                               
                                                                GList 
*inScopeSelectors,
+                                                                               
                                                                const gchar 
*inRecursionIdentifier);
 
 /* Helper function to set up GError object in this parser */
 static void _xfdashboard_theme_css_set_error(XfdashboardThemeCSS *self,
@@ -916,7 +918,8 @@ static void 
_xfdashboard_theme_css_register_function(XfdashboardThemeCSS *self,
 static gchar* _xfdashboard_theme_css_parse_at_identifier(XfdashboardThemeCSS 
*self,
                                                                                
                                        GScanner *ioScanner,
                                                                                
                                        GScanner *inScopeScanner,
-                                                                               
                                        GList *inScopeSelectors)
+                                                                               
                                        GList *inScopeSelectors,
+                                                                               
                                        const gchar *inRecursionIdentifier)
 {
        XfdashboardThemeCSSPrivate                              *priv;
        GTokenType                                                              
token;
@@ -929,6 +932,7 @@ static gchar* 
_xfdashboard_theme_css_parse_at_identifier(XfdashboardThemeCSS *se
 
        g_return_val_if_fail(XFDASHBOARD_IS_THEME_CSS(self), NULL);
        g_return_val_if_fail(ioScanner, NULL);
+       g_return_val_if_fail(!inRecursionIdentifier || *inRecursionIdentifier, 
NULL);
 
        priv=self->priv;
 
@@ -1005,7 +1009,8 @@ static gchar* 
_xfdashboard_theme_css_parse_at_identifier(XfdashboardThemeCSS *se
                                                        
resolvedValue=_xfdashboard_theme_css_parse_at_identifier(self,
                                                                                
                                                                                
                ioScanner,
                                                                                
                                                                                
                inScopeScanner,
-                                                                               
                                                                                
                inScopeSelectors);
+                                                                               
                                                                                
                inScopeSelectors,
+                                                                               
                                                                                
                inRecursionIdentifier);
 
                                                        /* Resolve resolved 
value to get final value */
                                                        if(resolvedValue)
@@ -1016,7 +1021,8 @@ static gchar* 
_xfdashboard_theme_css_parse_at_identifier(XfdashboardThemeCSS *se
                                                                
finalResolvedValue=_xfdashboard_theme_css_resolve_at_identifier_by_string(self,
                                                                                
                                                                                
                                                        resolvedValue,
                                                                                
                                                                                
                                                        inScopeScanner,
-                                                                               
                                                                                
                                                        inScopeSelectors);
+                                                                               
                                                                                
                                                        inScopeSelectors,
+                                                                               
                                                                                
                                                        inRecursionIdentifier);
 
                                                                /* Release old 
value and set new one */
                                                                
g_free(resolvedValue);
@@ -1290,6 +1296,31 @@ static gchar* 
_xfdashboard_theme_css_parse_at_identifier(XfdashboardThemeCSS *se
         * through these selectors backwards (first in selectors of current 
file/scope
         * then all previous ones) to let last definition win.
         */
+       if(inRecursionIdentifier &&
+               g_strcmp0(identifier, inRecursionIdentifier)==0)
+       {
+               /* Identifier was unresolvable because of indefinite recursion,
+                * so print error message and also a critical message.
+                */
+               g_critical("Indefinte recursion of @-constant '%s' detected - 
aborting parsing", inRecursionIdentifier);
+
+               errorMessage=g_strdup_printf(_("Cannot resolve identifier '@%s' 
because of indefinite recursion"), identifier);
+               g_scanner_unexp_token(inScopeScanner,
+                                                               G_TOKEN_ERROR,
+                                                               NULL,
+                                                               NULL,
+                                                               NULL,
+                                                               errorMessage,
+                                                               FALSE);
+               g_free(errorMessage);
+
+               /* Release allocated resources */
+               g_free(identifier);
+
+               /* Identifier was unresolvable so return NULL */
+               return(NULL);
+       }
+
        for(iter=g_list_last(inScopeSelectors); iter; 
iter=g_list_previous(iter))
        {
                selector=(XfdashboardThemeCSSSelector*)iter->data;
@@ -1347,18 +1378,20 @@ static gchar* 
_xfdashboard_theme_css_parse_at_identifier(XfdashboardThemeCSS *se
 static gchar* 
_xfdashboard_theme_css_resolve_at_identifier_internal(XfdashboardThemeCSS *self,
                                                                                
                                                        GScanner *inScanner,
                                                                                
                                                        GScanner 
*inScopeScanner,
-                                                                               
                                                        GList *inScopeSelectors)
+                                                                               
                                                        GList *inScopeSelectors,
+                                                                               
                                                        const gchar 
*inRecursionIdentifier)
 {
        GTokenType              token;
        gchar                   *value;
-       gboolean                haveResolvedAtIdentifier;
+       gchar                   *haveResolvedAtIdentifier;
 
        g_return_val_if_fail(XFDASHBOARD_IS_THEME_CSS(self), NULL);
        g_return_val_if_fail(inScanner, NULL);
        g_return_val_if_fail(inScopeScanner, NULL);
+       g_return_val_if_fail(!inRecursionIdentifier || *inRecursionIdentifier, 
NULL);
 
        /* Parse value and resolve '@' identifier */
-       haveResolvedAtIdentifier=FALSE;
+       haveResolvedAtIdentifier=NULL;
        value=NULL;
 
        token=g_scanner_get_next_token(inScanner);
@@ -1381,9 +1414,15 @@ static gchar* 
_xfdashboard_theme_css_resolve_at_identifier_internal(XfdashboardT
                                        gchar           *constantValue;
 
                                        /* Resolve value and append resolved 
value but stop parsing and return NULL
-                                        * if unresolvable.
+                                        * if unresolvable. Also remember '@' 
identifier we have resolved to get the
+                                        * new value resolved.
                                         */
-                                       
constantValue=_xfdashboard_theme_css_parse_at_identifier(self, inScanner, 
inScopeScanner, inScopeSelectors);
+                                       
token=g_scanner_peek_next_token(inScanner);
+                                       if(token!=G_TOKEN_IDENTIFIER) 
return(NULL);
+
+                                       
haveResolvedAtIdentifier=g_strdup(inScanner->next_value.v_identifier);
+
+                                       
constantValue=_xfdashboard_theme_css_parse_at_identifier(self, inScanner, 
inScopeScanner, inScopeSelectors, inRecursionIdentifier);
                                        if(!constantValue)
                                        {
                                                g_free(value);
@@ -1391,10 +1430,9 @@ static gchar* 
_xfdashboard_theme_css_resolve_at_identifier_internal(XfdashboardT
                                        }
 
                                        
value=_xfdashboard_theme_css_append_string(value, constantValue);
-                                       g_free(constantValue);
 
-                                       /* Set flag that we have resolved an 
'@' identifier to get the new value resolved */
-                                       haveResolvedAtIdentifier=TRUE;
+                                       /* Release allocated resources */
+                                       g_free(constantValue);
                                }
                                        /* ... otherwise just add character to 
value */
                                        else 
value=_xfdashboard_theme_css_append_char(value, inScanner->value.v_char);
@@ -1421,20 +1459,28 @@ static gchar* 
_xfdashboard_theme_css_resolve_at_identifier_internal(XfdashboardT
                 * to resolve any '@' identifier which might be in value 
resolved this time.
                 */
                XFDASHBOARD_DEBUG(self, THEME,
-                                                       "Resolving css value 
'%s'",
-                                                       value);
+                                                       "Resolving css value 
'%s' because of constant identifier '%s'",
+                                                       value,
+                                                       
haveResolvedAtIdentifier);
+
                
resolvedValue=_xfdashboard_theme_css_resolve_at_identifier_by_string(self,
                                                                                
                                                                                
value,
                                                                                
                                                                                
inScopeScanner,
-                                                                               
                                                                                
inScopeSelectors);
+                                                                               
                                                                                
inScopeSelectors,
+                                                                               
                                                                                
haveResolvedAtIdentifier);
+
                XFDASHBOARD_DEBUG(self, THEME,
-                                                       "Resolved css value 
'%s' to '%s' recursively",
+                                                       "Resolved css value 
'%s' to '%s' recursively because of constant identifier '%s'",
                                                        value,
-                                                       resolvedValue);
+                                                       resolvedValue,
+                                                       
haveResolvedAtIdentifier);
 
                /* Release old value and new one */
                g_free(value);
                value=resolvedValue;
+
+               /* Release allocated resources */
+               g_free(haveResolvedAtIdentifier);
        }
 
        /* Return resolved value */
@@ -1444,7 +1490,8 @@ static gchar* 
_xfdashboard_theme_css_resolve_at_identifier_internal(XfdashboardT
 static gchar* 
_xfdashboard_theme_css_resolve_at_identifier_by_string(XfdashboardThemeCSS 
*self,
                                                                                
                                                                const gchar 
*inText,
                                                                                
                                                                GScanner 
*inScopeScanner,
-                                                                               
                                                                GList 
*inScopeSelectors)
+                                                                               
                                                                GList 
*inScopeSelectors,
+                                                                               
                                                                const gchar 
*inRecursionIdentifier)
 {
        GScanner                *scanner;
        gchar                   *value;
@@ -1453,6 +1500,7 @@ static gchar* 
_xfdashboard_theme_css_resolve_at_identifier_by_string(Xfdashboard
        g_return_val_if_fail(XFDASHBOARD_IS_THEME_CSS(self), NULL);
        g_return_val_if_fail(inScopeScanner, NULL);
        g_return_val_if_fail(inText, NULL);
+       g_return_val_if_fail(!inRecursionIdentifier || *inRecursionIdentifier, 
NULL);
 
        /* Increment call depth and check if it is too deep now to avoid 
recursive
         * resolves of '@' identifier definitions.
@@ -1503,7 +1551,8 @@ static gchar* 
_xfdashboard_theme_css_resolve_at_identifier_by_string(Xfdashboard
        value=_xfdashboard_theme_css_resolve_at_identifier_internal(self,
                                                                                
                                                scanner,
                                                                                
                                                inScopeScanner,
-                                                                               
                                                inScopeSelectors);
+                                                                               
                                                inScopeSelectors,
+                                                                               
                                                inRecursionIdentifier);
 
        /* Destroy scanner */
        g_scanner_destroy(scanner);
@@ -1672,7 +1721,8 @@ static GTokenType 
_xfdashboard_theme_css_parse_css_key_value(XfdashboardThemeCSS
                
resolvedValue=_xfdashboard_theme_css_resolve_at_identifier_by_string(self,
                                                                                
                                                                                
*outValue,
                                                                                
                                                                                
inScanner,
-                                                                               
                                                                                
inScopeSelectors);
+                                                                               
                                                                                
inScopeSelectors,
+                                                                               
                                                                                
NULL);
                XFDASHBOARD_DEBUG(self, THEME,
                                                        "Resolved css value 
'%s' to '%s'",
                                                        *outValue,

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.
_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to