[PATCH setxkbmap] Eliminate limitations on path length.

Alexandr Shadchin alexandr.shadchin at gmail.com
Tue Feb 15 14:33:12 PST 2011


Of course, I'm talking about it. The implementation is up to you. :-)

On Wed, Feb 16, 2011 at 01:23:06AM +0300, Van de Bugger wrote:
> No. I believe that is wrong approach. I suppose fopen does not crash if
> path too long but returns appropriate error, so we just should check
> result of fopen carefuly, and issue appropriate error message (using
> errno and strerror). 
> 
> On Wed, 2011-02-16 at 02:56 +0500, Alexandr Shadchin wrote:
> > Also fopen() can not open path greater than PATH_MAX.
> > Path still need to verify that it was less than PATH_MAX.
> > 
> > On Wed, Feb 16, 2011 at 12:15:52AM +0300, Van de Bugger wrote:
> > > From 0aaae5b3c0d6183e2791c30155bae40132a0c779 Mon Sep 17 00:00:00 2001
> > > From: Van de Bugger <van.de.bugger at gmail.com>
> > > Date: Tue, 15 Feb 2011 23:55:28 +0300
> > > Subject: [PATCH setxkbmap] Eliminate limitations on path length.
> > > 
> > > ...by using dynamically allocated buffers. No need in PATH_MAX,
> > > MAXPATHLEN. No more "Path too long" errors.
> > > ---
> > >  setxkbmap.c |   72 ++++++++++++++++++++++++++++++++++++----------------------
> > >  1 files changed, 45 insertions(+), 27 deletions(-)
> > > 
> > > diff --git a/setxkbmap.c b/setxkbmap.c
> > > index 3d3b7d8..6777b1b 100644
> > > --- a/setxkbmap.c
> > > +++ b/setxkbmap.c
> > > @@ -24,6 +24,7 @@
> > >  
> > >   ********************************************************/
> > >  
> > > +#include <stdarg.h>
> > >  #include <stdio.h>
> > >  #include <stdlib.h>
> > >  #include <locale.h>
> > > @@ -36,14 +37,6 @@
> > >  #include <X11/extensions/XKBconfig.h>
> > >  #include <X11/extensions/XKBrules.h>
> > >  
> > > -#ifndef PATH_MAX
> > > -#ifdef MAXPATHLEN
> > > -#define PATH_MAX MAXPATHLEN
> > > -#else
> > > -#define PATH_MAX 1024
> > > -#endif
> > > -#endif
> > > -
> > >  #ifndef DFLT_XKB_CONFIG_ROOT
> > >  #define DFLT_XKB_CONFIG_ROOT "/usr/share/X11/xkb"
> > >  #endif
> > > @@ -170,6 +163,7 @@ static int deviceSpec = XkbUseCoreKbd;
> > >  
> > >  /***====================================================================***/
> > >  
> > > +char * rprintf( char const * format, ... );
> > >  Bool addToList(list_t * list, char *newVal);
> > >  void usage(int argc, char **argv);
> > >  void dumpNames(Bool wantRules, Bool wantCNames);
> > > @@ -189,6 +183,42 @@ void printKeymap(void);
> > >  /***====================================================================***/
> > >  
> > >  /*
> > > +    Like sprintf, but returns freshly allocated string instead writing it to
> > > +    pre-allocated buffer. Do not forget to free returned strung.
> > > +*/
> > > +
> > > +char *
> > > +rprintf(char const * format, ...)
> > > +{
> > > +    va_list args;
> > > +    char * buffer = NULL;
> > > +    int allocated = 0;
> > > +    int required  = 100;
> > > +    do 
> > > +    {
> > > +        buffer = realloc(buffer, required + 1);
> > > +        if (buffer == NULL)
> > > +        {
> > > +            ERR("Out of memory.\n");
> > > +            abort();
> > > +        }
> > > +        allocated = required + 1;
> > > +        va_start(args, format);
> > > +        required = vsnprintf(buffer, allocated, format, args);
> > > +        va_end(args);
> > > +        if (required < 0)
> > > +        {
> > > +            ERR1("`vsnprintf' returned unexpected error (%d).\n", required);
> > > +            abort();
> > > +        }
> > > +    }
> > > +    while (required >= allocated);
> > > +    return buffer;
> > > +}
> > > +
> > > +/***====================================================================***/
> > > +
> > > +/*
> > >      If newVal is NULL or empty string, the list is cleared.
> > >      Otherwise newVal is added to the end of the list (if it is not present in the list yet).
> > >  */
> > > @@ -623,7 +653,6 @@ FILE *
> > >  findFileInPath(char *name, char *subdir)
> > >  {
> > >      register int i;
> > > -    char buf[PATH_MAX];
> > >      FILE *fp;
> > >  
> > >      if (name[0] == '/')
> > > @@ -635,16 +664,11 @@ findFileInPath(char *name, char *subdir)
> > >      }
> > >      for (i = 0; (i < inclPath.num); i++)
> > >      {
> > > -        if (snprintf(buf, PATH_MAX, "%s/%s%s", inclPath.item[i], subdir, name) >=
> > > -            PATH_MAX)
> > > -        {
> > > -            VMSG3(0, "Path too long (%s/%s%s). Ignored.\n", inclPath.item[i],
> > > -                  subdir, name);
> > > -            continue;
> > > -        }
> > > -        fp = fopen(buf, "r");
> > > +        char * path = rprintf("%s/%s%s", inclPath.item[i], subdir, name);
> > > +        fp = fopen(path, "r");
> > >          if ((verbose > 7) || ((!fp) && (verbose > 5)))
> > > -            MSG2("%s file %s\n", (fp ? "Found" : "Didn't find"), buf);
> > > +            MSG2("%s file %s\n", (fp ? "Found" : "Didn't find"), path);
> > > +        free(path);
> > >          if (fp != NULL)
> > >              return fp;
> > >      }
> > > @@ -824,7 +848,6 @@ applyRules(void)
> > >      if (settings.model.src || settings.layout.src || settings.variant.src
> > >          || options.item)
> > >      {
> > > -        char buf[PATH_MAX];
> > >          XkbComponentNamesRec rnames;
> > >  
> > >          if (settings.variant.src < settings.layout.src)
> > > @@ -852,14 +875,9 @@ applyRules(void)
> > >               * we succeed with */
> > >              for (i = 0; (i < inclPath.num) && (!rules); i++)
> > >              {
> > > -                if (snprintf(buf, PATH_MAX, "%s/rules/%s",
> > > -                             inclPath.item[i], rfName) >= PATH_MAX)
> > > -                {
> > > -                    VMSG2(0, "Path too long (%s/rules/%s). Ignored.\n",
> > > -                          inclPath.item[i], rfName);
> > > -                    continue;
> > > -                }
> > > -                rules = XkbRF_Load(buf, settings.locale.value, True, True);
> > > +                char * path = rprintf("%s/rules/%s", inclPath.item[i], rfName);
> > > +                rules = XkbRF_Load(path, settings.locale.value, True, True);
> > > +                free(path);
> > >              }
> > >          }
> > >          if (!rules)
> > > -- 
> > > 1.7.4
> > > 
> > > 
> > > 
> > > _______________________________________________
> > > xorg-devel at lists.x.org: X.Org development
> > > Archives: http://lists.x.org/archives/xorg-devel
> > > Info: http://lists.x.org/mailman/listinfo/xorg-devel
> > 
> 
> 

-- 
Alexandr Shadchin



More information about the xorg-devel mailing list