Commit 2f0bdf77 authored by Alexander Gottwald's avatar Alexander Gottwald

xc/programs/Xserver/xkb/ddxLoad.c

Bugzilla #2245 (https://bugs.freedesktop.org/show_bug.cgi?id=2245)
    attachment #1649 (https://bugs.freedesktop.org/attachment.cgi?id=1649):
    cleanup the generation of xkbcomp command lines. Allocate them
    dynamicly and remove unmaintainable length calculation.
parent d3ca1320
......@@ -131,7 +131,7 @@ XkbDDXListComponent( DeviceIntPtr dev,
XkbSrvListInfoPtr list,
ClientPtr client)
{
char *file,*map,*tmp,buf[PATH_MAX*4];
char *file,*map,*tmp,*buf=NULL;
FILE *in;
Status status;
int rval;
......@@ -162,19 +162,15 @@ char tmpname[PATH_MAX];
(void) mktemp(tmpname);
#endif
if (XkbBaseDirectory!=NULL) {
if (strlen(XkbBaseDirectory)+strlen(componentDirs[what])+6 > PATH_MAX)
return BadImplementation;
if ((list->pattern[what][0]=='*')&&(list->pattern[what][1]=='\0')) {
sprintf(buf,"%s/%s.dir",XkbBaseDirectory,componentDirs[what]);
buf = Xprintf("%s/%s.dir",XkbBaseDirectory,componentDirs[what]);
in= fopen(buf,"r");
xfree (buf);
buf = NULL;
}
if (!in) {
haveDir= False;
if (strlen(XkbBaseDirectory)*2+strlen(componentDirs[what])
+W32_tmplen
+(xkbDebugFlags>9?2:1)+strlen(file)+35 > PATH_MAX)
return BadImplementation;
sprintf(buf,
buf = Xprintf(
"'%s/xkbcomp' '-R%s/%s' -w %ld -l -vlfhpR '%s'" W32_tmparg,
XkbBaseDirectory,XkbBaseDirectory,componentDirs[what],(long)
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)),
......@@ -183,18 +179,15 @@ char tmpname[PATH_MAX];
}
}
else {
if (strlen(XkbBaseDirectory)+strlen(componentDirs[what])+6 > PATH_MAX)
return BadImplementation;
if ((list->pattern[what][0]=='*')&&(list->pattern[what][1]=='\0')) {
sprintf(buf,"%s.dir",componentDirs[what]);
buf = Xprintf("%s.dir",componentDirs[what]);
in= fopen(buf,"r");
xfree (buf);
buf = NULL;
}
if (!in) {
haveDir= False;
if (strlen(componentDirs[what]) + W32_tmplen
+(xkbDebugFlags>9?2:1)+strlen(file)+29 > PATH_MAX)
return BadImplementation;
sprintf(buf,
buf = Xprintf(
"xkbcomp -R%s -w %ld -l -vlfhpR '%s'" W32_tmparg,
componentDirs[what],(long)
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)),
......@@ -218,7 +211,14 @@ char tmpname[PATH_MAX];
#endif
}
if (!in)
{
if (buf != NULL)
xfree (buf);
#ifdef WIN32
unlink(tmpname);
#endif
return BadImplementation;
}
list->nFound[what]= 0;
while ((status==Success)&&((tmp=fgets(buf,PATH_MAX,in))!=NULL)) {
unsigned flags;
......@@ -272,6 +272,8 @@ char tmpname[PATH_MAX];
fclose(in);
unlink(tmpname);
#endif
if (buf != NULL)
xfree (buf);
return status;
}
......
......@@ -193,7 +193,7 @@ XkbDDXCompileNamedKeymap( XkbDescPtr xkb,
char * nameRtrn,
int nameRtrnLen)
{
char cmd[PATH_MAX*4],file[PATH_MAX],xkm_output_dir[PATH_MAX],*map,*outFile;
char *cmd = NULL,file[PATH_MAX],xkm_output_dir[PATH_MAX],*map,*outFile;
if (names->keymap==NULL)
return False;
......@@ -225,17 +225,7 @@ char cmd[PATH_MAX*4],file[PATH_MAX],xkm_output_dir[PATH_MAX],*map,*outFile;
if (xkbbasedir[i]=='/') xkbbasedir[i]='\\';
#endif
if (strlen(xkbbasedir)*2+(xkbDebugFlags>9?2:1)
+(map?strlen(map)+3:0)+strlen(PRE_ERROR_MSG)
+strlen(ERROR_PREFIX)+strlen(POST_ERROR_MSG1)
+strlen(file)+strlen(xkm_output_dir)
+strlen(outFile)+59 > PATH_MAX)
{
ErrorF("compiler command for keymap (%s) exceeds max length\n",
names->keymap);
return False;
}
sprintf(cmd,"\"%s" PATHSEPARATOR "xkbcomp\" -w %d \"-R%s\" -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s \"%s%s.xkm\"",
cmd = Xprintf("\"%s" PATHSEPARATOR "xkbcomp\" -w %d \"-R%s\" -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s \"%s%s.xkm\"",
xkbbasedir,
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
xkbbasedir,(map?"-m ":""),(map?map:""),
......@@ -243,16 +233,7 @@ char cmd[PATH_MAX*4],file[PATH_MAX],xkm_output_dir[PATH_MAX],*map,*outFile;
xkm_output_dir,outFile);
}
else {
if ((xkbDebugFlags>9?2:1)+(map?strlen(map)+3:0)+strlen(PRE_ERROR_MSG)
+strlen(ERROR_PREFIX)+strlen(POST_ERROR_MSG1)
+strlen(file)+strlen(xkm_output_dir)
+strlen(outFile)+51 > PATH_MAX)
{
ErrorF("compiler command for keymap (%s) exceeds max length\n",
names->keymap);
return False;
}
sprintf(cmd,"xkbcomp -w %d -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s \"%s%s.xkm\"",
cmd = Xprintf("xkbcomp -w %d -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s \"%s%s.xkm\"",
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
(map?"-m ":""),(map?map:""),
PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,file,
......@@ -274,6 +255,8 @@ char cmd[PATH_MAX*4],file[PATH_MAX],xkm_output_dir[PATH_MAX],*map,*outFile;
}
if (outFile!=NULL)
_XkbFree(outFile);
if (cmd!=NULL)
xfree(cmd);
return True;
}
#ifdef DEBUG
......@@ -281,6 +264,8 @@ char cmd[PATH_MAX*4],file[PATH_MAX],xkm_output_dir[PATH_MAX],*map,*outFile;
#endif
if (outFile!=NULL)
_XkbFree(outFile);
if (cmd!=NULL)
xfree(cmd);
return False;
}
......@@ -293,7 +278,8 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb,
int nameRtrnLen)
{
FILE * out;
char buf[PATH_MAX*4],keymap[PATH_MAX],xkm_output_dir[PATH_MAX];
char *buf = NULL, keymap[PATH_MAX],xkm_output_dir[PATH_MAX];
#ifdef WIN32
char tmpname[PATH_MAX];
#endif
......@@ -332,17 +318,7 @@ char tmpname[PATH_MAX];
if (xkbbasedir[i]=='/') xkbbasedir[i]='\\';
#endif
if (strlen(xkbbasedir)*2+(xkbDebugFlags>9?2:1)
+strlen(PRE_ERROR_MSG)+strlen(ERROR_PREFIX)
+strlen(POST_ERROR_MSG1)+strlen(xkm_output_dir)
+strlen(xkmfile)
+strlen(keymap)+53 > PATH_MAX)
{
ErrorF("compiler command for keymap (%s) exceeds max length\n",
names->keymap);
return False;
}
sprintf(buf,
buf = Xprintf(
"\"%s" PATHSEPARATOR "xkbcomp\" -w %d \"-R%s\" -xkm \"%s\" -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
xkbbasedir,
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
......@@ -356,16 +332,7 @@ char tmpname[PATH_MAX];
#else
char *xkmfile = tmpname;
#endif
if ((xkbDebugFlags>9?2:1)+strlen(PRE_ERROR_MSG)
+strlen(ERROR_PREFIX)+strlen(POST_ERROR_MSG1)
+strlen(xkmfile)
+strlen(xkm_output_dir)+strlen(keymap)+45 > PATH_MAX)
{
ErrorF("compiler command for keymap (%s) exceeds max length\n",
names->keymap);
return False;
}
sprintf(buf,
buf = Xprintf(
"xkbcomp -w %d -xkm \"%s\" -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
xkmfile,
......@@ -427,6 +394,8 @@ char tmpname[PATH_MAX];
#endif
}
#endif
if (buf != NULL)
xfree (buf);
return True;
}
#ifdef DEBUG
......@@ -449,6 +418,8 @@ char tmpname[PATH_MAX];
#endif
if (nameRtrn)
nameRtrn[0]= '\0';
if (buf != NULL)
xfree (buf);
return False;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment