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.
This commit is contained in:
parent
d3ca132061
commit
2f0bdf77dd
|
@ -131,7 +131,7 @@ XkbDDXListComponent( DeviceIntPtr dev,
|
||||||
XkbSrvListInfoPtr list,
|
XkbSrvListInfoPtr list,
|
||||||
ClientPtr client)
|
ClientPtr client)
|
||||||
{
|
{
|
||||||
char *file,*map,*tmp,buf[PATH_MAX*4];
|
char *file,*map,*tmp,*buf=NULL;
|
||||||
FILE *in;
|
FILE *in;
|
||||||
Status status;
|
Status status;
|
||||||
int rval;
|
int rval;
|
||||||
|
@ -162,19 +162,15 @@ char tmpname[PATH_MAX];
|
||||||
(void) mktemp(tmpname);
|
(void) mktemp(tmpname);
|
||||||
#endif
|
#endif
|
||||||
if (XkbBaseDirectory!=NULL) {
|
if (XkbBaseDirectory!=NULL) {
|
||||||
if (strlen(XkbBaseDirectory)+strlen(componentDirs[what])+6 > PATH_MAX)
|
|
||||||
return BadImplementation;
|
|
||||||
if ((list->pattern[what][0]=='*')&&(list->pattern[what][1]=='\0')) {
|
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");
|
in= fopen(buf,"r");
|
||||||
|
xfree (buf);
|
||||||
|
buf = NULL;
|
||||||
}
|
}
|
||||||
if (!in) {
|
if (!in) {
|
||||||
haveDir= False;
|
haveDir= False;
|
||||||
if (strlen(XkbBaseDirectory)*2+strlen(componentDirs[what])
|
buf = Xprintf(
|
||||||
+W32_tmplen
|
|
||||||
+(xkbDebugFlags>9?2:1)+strlen(file)+35 > PATH_MAX)
|
|
||||||
return BadImplementation;
|
|
||||||
sprintf(buf,
|
|
||||||
"'%s/xkbcomp' '-R%s/%s' -w %ld -l -vlfhpR '%s'" W32_tmparg,
|
"'%s/xkbcomp' '-R%s/%s' -w %ld -l -vlfhpR '%s'" W32_tmparg,
|
||||||
XkbBaseDirectory,XkbBaseDirectory,componentDirs[what],(long)
|
XkbBaseDirectory,XkbBaseDirectory,componentDirs[what],(long)
|
||||||
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)),
|
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)),
|
||||||
|
@ -183,18 +179,15 @@ char tmpname[PATH_MAX];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (strlen(XkbBaseDirectory)+strlen(componentDirs[what])+6 > PATH_MAX)
|
|
||||||
return BadImplementation;
|
|
||||||
if ((list->pattern[what][0]=='*')&&(list->pattern[what][1]=='\0')) {
|
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");
|
in= fopen(buf,"r");
|
||||||
|
xfree (buf);
|
||||||
|
buf = NULL;
|
||||||
}
|
}
|
||||||
if (!in) {
|
if (!in) {
|
||||||
haveDir= False;
|
haveDir= False;
|
||||||
if (strlen(componentDirs[what]) + W32_tmplen
|
buf = Xprintf(
|
||||||
+(xkbDebugFlags>9?2:1)+strlen(file)+29 > PATH_MAX)
|
|
||||||
return BadImplementation;
|
|
||||||
sprintf(buf,
|
|
||||||
"xkbcomp -R%s -w %ld -l -vlfhpR '%s'" W32_tmparg,
|
"xkbcomp -R%s -w %ld -l -vlfhpR '%s'" W32_tmparg,
|
||||||
componentDirs[what],(long)
|
componentDirs[what],(long)
|
||||||
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)),
|
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)),
|
||||||
|
@ -218,7 +211,14 @@ char tmpname[PATH_MAX];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (!in)
|
if (!in)
|
||||||
|
{
|
||||||
|
if (buf != NULL)
|
||||||
|
xfree (buf);
|
||||||
|
#ifdef WIN32
|
||||||
|
unlink(tmpname);
|
||||||
|
#endif
|
||||||
return BadImplementation;
|
return BadImplementation;
|
||||||
|
}
|
||||||
list->nFound[what]= 0;
|
list->nFound[what]= 0;
|
||||||
while ((status==Success)&&((tmp=fgets(buf,PATH_MAX,in))!=NULL)) {
|
while ((status==Success)&&((tmp=fgets(buf,PATH_MAX,in))!=NULL)) {
|
||||||
unsigned flags;
|
unsigned flags;
|
||||||
|
@ -272,6 +272,8 @@ char tmpname[PATH_MAX];
|
||||||
fclose(in);
|
fclose(in);
|
||||||
unlink(tmpname);
|
unlink(tmpname);
|
||||||
#endif
|
#endif
|
||||||
|
if (buf != NULL)
|
||||||
|
xfree (buf);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -193,7 +193,7 @@ XkbDDXCompileNamedKeymap( XkbDescPtr xkb,
|
||||||
char * nameRtrn,
|
char * nameRtrn,
|
||||||
int nameRtrnLen)
|
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)
|
if (names->keymap==NULL)
|
||||||
return False;
|
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]='\\';
|
if (xkbbasedir[i]=='/') xkbbasedir[i]='\\';
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (strlen(xkbbasedir)*2+(xkbDebugFlags>9?2:1)
|
cmd = Xprintf("\"%s" PATHSEPARATOR "xkbcomp\" -w %d \"-R%s\" -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s \"%s%s.xkm\"",
|
||||||
+(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\"",
|
|
||||||
xkbbasedir,
|
xkbbasedir,
|
||||||
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
||||||
xkbbasedir,(map?"-m ":""),(map?map:""),
|
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);
|
xkm_output_dir,outFile);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ((xkbDebugFlags>9?2:1)+(map?strlen(map)+3:0)+strlen(PRE_ERROR_MSG)
|
cmd = Xprintf("xkbcomp -w %d -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s \"%s%s.xkm\"",
|
||||||
+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\"",
|
|
||||||
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
||||||
(map?"-m ":""),(map?map:""),
|
(map?"-m ":""),(map?map:""),
|
||||||
PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,file,
|
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)
|
if (outFile!=NULL)
|
||||||
_XkbFree(outFile);
|
_XkbFree(outFile);
|
||||||
|
if (cmd!=NULL)
|
||||||
|
xfree(cmd);
|
||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -281,6 +264,8 @@ char cmd[PATH_MAX*4],file[PATH_MAX],xkm_output_dir[PATH_MAX],*map,*outFile;
|
||||||
#endif
|
#endif
|
||||||
if (outFile!=NULL)
|
if (outFile!=NULL)
|
||||||
_XkbFree(outFile);
|
_XkbFree(outFile);
|
||||||
|
if (cmd!=NULL)
|
||||||
|
xfree(cmd);
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -293,7 +278,8 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb,
|
||||||
int nameRtrnLen)
|
int nameRtrnLen)
|
||||||
{
|
{
|
||||||
FILE * out;
|
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
|
#ifdef WIN32
|
||||||
char tmpname[PATH_MAX];
|
char tmpname[PATH_MAX];
|
||||||
#endif
|
#endif
|
||||||
|
@ -332,17 +318,7 @@ char tmpname[PATH_MAX];
|
||||||
if (xkbbasedir[i]=='/') xkbbasedir[i]='\\';
|
if (xkbbasedir[i]=='/') xkbbasedir[i]='\\';
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (strlen(xkbbasedir)*2+(xkbDebugFlags>9?2:1)
|
buf = Xprintf(
|
||||||
+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,
|
|
||||||
"\"%s" PATHSEPARATOR "xkbcomp\" -w %d \"-R%s\" -xkm \"%s\" -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
|
"\"%s" PATHSEPARATOR "xkbcomp\" -w %d \"-R%s\" -xkm \"%s\" -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
|
||||||
xkbbasedir,
|
xkbbasedir,
|
||||||
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
||||||
|
@ -356,16 +332,7 @@ char tmpname[PATH_MAX];
|
||||||
#else
|
#else
|
||||||
char *xkmfile = tmpname;
|
char *xkmfile = tmpname;
|
||||||
#endif
|
#endif
|
||||||
if ((xkbDebugFlags>9?2:1)+strlen(PRE_ERROR_MSG)
|
buf = Xprintf(
|
||||||
+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,
|
|
||||||
"xkbcomp -w %d -xkm \"%s\" -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
|
"xkbcomp -w %d -xkm \"%s\" -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
|
||||||
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
||||||
xkmfile,
|
xkmfile,
|
||||||
|
@ -427,6 +394,8 @@ char tmpname[PATH_MAX];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if (buf != NULL)
|
||||||
|
xfree (buf);
|
||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -449,6 +418,8 @@ char tmpname[PATH_MAX];
|
||||||
#endif
|
#endif
|
||||||
if (nameRtrn)
|
if (nameRtrn)
|
||||||
nameRtrn[0]= '\0';
|
nameRtrn[0]= '\0';
|
||||||
|
if (buf != NULL)
|
||||||
|
xfree (buf);
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue