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