Correctly free config file names

We call xf86penConfigDirFiles twice, so we overwrite the configDirPath
variable, losing the pointer. If we move the pointer management to the
upper layer (the function callers), they will be able to call these
functions as many times as they want, but they'll have to free those
returned values.

v2: don't leak inside XWin

4,097 bytes in 1 blocks are definitely lost in loss record 625 of 632
   at 0x4C2779D: malloc (in vgpreload_memcheck-amd64-linux.so)
   by 0x4D7899: DoSubstitution (scan.c:615)
   by 0x4D87B0: OpenConfigDir (scan.c:845)
   by 0x4D8A2D: xf86openConfigDirFiles (scan.c:955)
   by 0x49031F: xf86HandleConfigFile (xf86Config.c:2327)
   by 0x49A9BF: InitOutput (xf86Init.c:365)
   by 0x425A7A: main (main.c:204)

Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
This commit is contained in:
Paulo Zanoni 2011-10-30 18:04:59 -02:00
parent 0ae087e131
commit 3d635fe84d
4 changed files with 20 additions and 20 deletions

View File

@ -2300,7 +2300,7 @@ checkInput(serverLayoutPtr layout, Bool implicit_layout) {
ConfigStatus ConfigStatus
xf86HandleConfigFile(Bool autoconfig) xf86HandleConfigFile(Bool autoconfig)
{ {
const char *filename, *dirname, *sysdirname; char *filename, *dirname, *sysdirname;
const char *filesearch, *dirsearch; const char *filesearch, *dirsearch;
MessageType filefrom = X_DEFAULT; MessageType filefrom = X_DEFAULT;
MessageType dirfrom = X_DEFAULT; MessageType dirfrom = X_DEFAULT;
@ -2352,6 +2352,10 @@ xf86HandleConfigFile(Bool autoconfig)
return CONFIG_NOFILE; return CONFIG_NOFILE;
} }
free(filename);
free(dirname);
free(sysdirname);
if ((xf86configptr = xf86readConfigFile ()) == NULL) { if ((xf86configptr = xf86readConfigFile ()) == NULL) {
xf86Msg(X_ERROR, "Problem parsing the config file\n"); xf86Msg(X_ERROR, "Problem parsing the config file\n");
return CONFIG_PARSE_ERROR; return CONFIG_PARSE_ERROR;

View File

@ -101,8 +101,6 @@ static int builtinIndex = 0;
static int configPos = 0; /* current readers position */ static int configPos = 0; /* current readers position */
static int configLineNo = 0; /* linenumber */ static int configLineNo = 0; /* linenumber */
static char *configBuf, *configRBuf; /* buffer for lines */ static char *configBuf, *configRBuf; /* buffer for lines */
static char *configPath; /* path to config file */
static char *configDirPath; /* path to config dir */
static char *configSection = NULL; /* name of current section being parsed */ static char *configSection = NULL; /* name of current section being parsed */
static int numFiles = 0; /* number of config files */ static int numFiles = 0; /* number of config files */
static int curFileIndex = 0; /* index of current config file */ static int curFileIndex = 0; /* index of current config file */
@ -894,7 +892,8 @@ xf86initConfigFiles(void)
* of the located files. * of the located files.
* *
* The return value is a pointer to the actual name of the file that was * The return value is a pointer to the actual name of the file that was
* opened. When no file is found, the return value is NULL. * opened. When no file is found, the return value is NULL. The caller should
* free() the returned value.
* *
* The escape sequences allowed in the search path are defined above. * The escape sequences allowed in the search path are defined above.
* *
@ -916,7 +915,7 @@ xf86initConfigFiles(void)
"%P/lib/X11/%X" "%P/lib/X11/%X"
#endif #endif
const char * char *
xf86openConfigFile(const char *path, const char *cmdline, const char *projroot) xf86openConfigFile(const char *path, const char *cmdline, const char *projroot)
{ {
if (!path || !path[0]) if (!path || !path[0])
@ -925,8 +924,7 @@ xf86openConfigFile(const char *path, const char *cmdline, const char *projroot)
projroot = PROJECTROOT; projroot = PROJECTROOT;
/* Search for a config file */ /* Search for a config file */
configPath = OpenConfigFile(path, cmdline, projroot, XCONFIGFILE); return OpenConfigFile(path, cmdline, projroot, XCONFIGFILE);
return configPath;
} }
/* /*
@ -939,12 +937,13 @@ xf86openConfigFile(const char *path, const char *cmdline, const char *projroot)
* fails if it is not found. * fails if it is not found.
* *
* The return value is a pointer to the actual name of the direcoty that was * The return value is a pointer to the actual name of the direcoty that was
* opened. When no directory is found, the return value is NULL. * opened. When no directory is found, the return value is NULL. The caller
* should free() the returned value.
* *
* The escape sequences allowed in the search path are defined above. * The escape sequences allowed in the search path are defined above.
* *
*/ */
const char * char *
xf86openConfigDirFiles(const char *path, const char *cmdline, xf86openConfigDirFiles(const char *path, const char *cmdline,
const char *projroot) const char *projroot)
{ {
@ -954,8 +953,7 @@ xf86openConfigDirFiles(const char *path, const char *cmdline,
projroot = PROJECTROOT; projroot = PROJECTROOT;
/* Search for the multiconf directory */ /* Search for the multiconf directory */
configDirPath = OpenConfigDir(path, cmdline, projroot, XCONFIGDIR); return OpenConfigDir(path, cmdline, projroot, XCONFIGDIR);
return configDirPath;
} }
void void
@ -963,10 +961,6 @@ xf86closeConfigFile (void)
{ {
int i; int i;
free (configPath);
configPath = NULL;
free (configDirPath);
configDirPath = NULL;
free (configRBuf); free (configRBuf);
configRBuf = NULL; configRBuf = NULL;
free (configBuf); free (configBuf);

View File

@ -487,10 +487,10 @@ xf86ConfigSymTabRec, *xf86ConfigSymTabPtr;
* prototypes for public functions * prototypes for public functions
*/ */
extern void xf86initConfigFiles(void); extern void xf86initConfigFiles(void);
extern const char *xf86openConfigFile(const char *path, const char *cmdline, extern char *xf86openConfigFile(const char *path, const char *cmdline,
const char *projroot); const char *projroot);
extern const char *xf86openConfigDirFiles(const char *path, const char *cmdline, extern char *xf86openConfigDirFiles(const char *path, const char *cmdline,
const char *projroot); const char *projroot);
extern void xf86setBuiltinConfig(const char *config[]); extern void xf86setBuiltinConfig(const char *config[]);
extern XF86ConfigPtr xf86readConfigFile(void); extern XF86ConfigPtr xf86readConfigFile(void);
extern void xf86closeConfigFile(void); extern void xf86closeConfigFile(void);

View File

@ -117,7 +117,7 @@ Bool
winReadConfigfile () winReadConfigfile ()
{ {
Bool retval = TRUE; Bool retval = TRUE;
const char *filename, *dirname; char *filename, *dirname;
MessageType filefrom = X_DEFAULT; MessageType filefrom = X_DEFAULT;
MessageType dirfrom = X_DEFAULT; MessageType dirfrom = X_DEFAULT;
char *xf86ConfigFile = NULL; char *xf86ConfigFile = NULL;
@ -169,6 +169,8 @@ winReadConfigfile ()
{ {
return FALSE; return FALSE;
} }
free(filename);
free(dirname);
if ((g_xf86configptr = xf86readConfigFile ()) == NULL) if ((g_xf86configptr = xf86readConfigFile ()) == NULL)
{ {
winMsg (X_ERROR, "Problem parsing the config file\n"); winMsg (X_ERROR, "Problem parsing the config file\n");