ecore_x: Check if we have data

data could be NULL and size == 0, so check for this.

Fixes CID 1039264
This commit is contained in:
Sebastian Dransfeld 2013-12-07 17:43:46 +01:00
parent 04e0a6d95e
commit f22f861f61
1 changed files with 56 additions and 50 deletions

View File

@ -760,10 +760,7 @@ _ecore_x_selection_parser_files(const char *target,
int format EINA_UNUSED)
{
Ecore_X_Selection_Data_Files *sel;
char *t, *data = _data;
int i, is;
char *tmp;
char **t2;
char *data = _data;
if (strcmp(target, "text/uri-list") &&
strcmp(target, "_NETSCAPE_URL"))
@ -773,67 +770,76 @@ _ecore_x_selection_parser_files(const char *target,
if (!sel) return NULL;
ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_files_free;
if (data && data[size - 1])
if (data && (size > 0))
{
/* Isn't nul terminated */
size++;
t = realloc(data, size);
if (!t)
int i, is;
char *tmp;
char **t2;
if (data[size - 1])
{
char *t;
/* Isn't nul terminated */
size++;
t = realloc(data, size);
if (!t)
{
free(sel);
return NULL;
}
data = t;
data[size - 1] = 0;
}
tmp = malloc(size);
if (!tmp)
{
free(sel);
return NULL;
}
data = t;
data[size - 1] = 0;
}
tmp = malloc(size);
if (!tmp)
{
free(sel);
return NULL;
}
i = 0;
is = 0;
while ((is < size) && (data[is]))
{
if ((i == 0) && (data[is] == '#'))
for (; ((data[is]) && (data[is] != '\n')); is++) ;
else
i = 0;
is = 0;
while ((is < size) && (data[is]))
{
if ((data[is] != '\r') &&
(data[is] != '\n'))
tmp[i++] = data[is++];
if ((i == 0) && (data[is] == '#'))
for (; ((data[is]) && (data[is] != '\n')); is++) ;
else
{
while ((data[is] == '\r') || (data[is] == '\n'))
is++;
tmp[i] = 0;
sel->num_files++;
t2 = realloc(sel->files, sel->num_files * sizeof(char *));
if (t2)
if ((data[is] != '\r') &&
(data[is] != '\n'))
tmp[i++] = data[is++];
else
{
sel->files = t2;
sel->files[sel->num_files - 1] = strdup(tmp);
while ((data[is] == '\r') || (data[is] == '\n'))
is++;
tmp[i] = 0;
sel->num_files++;
t2 = realloc(sel->files, sel->num_files * sizeof(char *));
if (t2)
{
sel->files = t2;
sel->files[sel->num_files - 1] = strdup(tmp);
}
tmp[0] = 0;
i = 0;
}
tmp[0] = 0;
i = 0;
}
}
}
if (i > 0)
{
tmp[i] = 0;
sel->num_files++;
t2 = realloc(sel->files, sel->num_files * sizeof(char *));
if (t2)
if (i > 0)
{
sel->files = t2;
sel->files[sel->num_files - 1] = strdup(tmp);
tmp[i] = 0;
sel->num_files++;
t2 = realloc(sel->files, sel->num_files * sizeof(char *));
if (t2)
{
sel->files = t2;
sel->files[sel->num_files - 1] = strdup(tmp);
}
}
}
free(tmp);
free(tmp);
}
free(data);
ECORE_X_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_FILES;