- this is a hack but keeps it from segv'ing if the delimiter is split over a

buffer read


SVN revision: 30571
This commit is contained in:
Dan Sinclair 2007-07-03 14:12:12 +00:00 committed by Dan Sinclair
parent 7176001239
commit 0cf64dd8fd
1 changed files with 41 additions and 53 deletions

View File

@ -667,8 +667,6 @@ efreet_mime_shared_mimeinfo_magic_load(const char *file)
{ {
FILE *f = NULL; FILE *f = NULL;
int priority = 0, i = 0; int priority = 0, i = 0;
enum {INDENT=0, OFFSET, VALUE, MASK,
WORD_SIZE, RANGE_LEN} magic_state = 0;
char buf[4096], mimetype[4096]; char buf[4096], mimetype[4096];
Efreet_Mime_Magic *mime = NULL; Efreet_Mime_Magic *mime = NULL;
Efreet_Mime_Magic_Entry *entry = NULL; Efreet_Mime_Magic_Entry *entry = NULL;
@ -690,7 +688,9 @@ efreet_mime_shared_mimeinfo_magic_load(const char *file)
{ {
if (buf[i] == '[') if (buf[i] == '[')
{ {
if(entry) char *val;
if (entry)
{ {
IF_FREE(entry->mask); IF_FREE(entry->mask);
IF_FREE(entry->value); IF_FREE(entry->value);
@ -699,65 +699,44 @@ efreet_mime_shared_mimeinfo_magic_load(const char *file)
last_section = i; last_section = i;
i++; i++;
priority = atoi(strtok(&(buf[i]), ":")); val = strtok(&(buf[i]), ":");
strncpy(mimetype, strtok(NULL, "]"), sizeof(mimetype)); if (val)
{
priority = atoi(val);
val = strtok(NULL, "]");
if (val)
{
strncpy(mimetype, val, sizeof(mimetype));
mime = NEW(Efreet_Mime_Magic, 1); mime = NEW(Efreet_Mime_Magic, 1);
mime->mime = ecore_string_instance(mimetype); mime->mime = ecore_string_instance(mimetype);
mime->priority = priority; mime->priority = priority;
mime->entries = ecore_list_new(); mime->entries = ecore_list_new();
ecore_list_set_free_cb(mime->entries, ecore_list_set_free_cb(mime->entries,
efreet_mime_magic_entry_free); efreet_mime_magic_entry_free);
while (i < bytes_read && buf[i] != '\n') ++i; while (i < bytes_read && buf[i] != '\n') ++i;
} else
i = 4096; /* forward to force buffer to get filled again */
}
else
i = 4096; /* forward to force buffer to get filled again */
} }
else else
{ {
if (!mime) continue; if (!mime) continue;
switch(buf[i]) i++;
switch(buf[i - 1])
{ {
case '>': case '>':
magic_state = OFFSET;
break;
case '=':
magic_state = VALUE;
break;
case '&':
magic_state = MASK;
break;
case '~':
magic_state = WORD_SIZE;
break;
case '+':
magic_state = RANGE_LEN;
break;
default:
if (isdigit(buf[i])) magic_state = INDENT;
break;
}
if (magic_state != INDENT)
++i;
switch(magic_state)
{
case INDENT:
entry->indent = atoi(&buf[i]);
i += efreet_mime_count_digits(entry->indent);
break;
case OFFSET:
entry->offset = atoi(&buf[i]); entry->offset = atoi(&buf[i]);
i += efreet_mime_count_digits(entry->offset); i += efreet_mime_count_digits(entry->offset);
break; break;
case VALUE: case '=':
if (efreet_mime_endianess == EFREET_ENDIAN_LITTLE) if (efreet_mime_endianess == EFREET_ENDIAN_LITTLE)
entry->value_len = ntohs(buf[i + 1] << 8 | (short)(buf[i])); entry->value_len = ntohs(buf[i + 1] << 8 | (short)(buf[i]));
else else
@ -770,13 +749,13 @@ efreet_mime_shared_mimeinfo_magic_load(const char *file)
i += entry->value_len; i += entry->value_len;
break; break;
case MASK: case '&':
entry->mask = NEW(1, entry->value_len); entry->mask = NEW(1, entry->value_len);
memcpy(entry->mask, &(buf[i]), entry->value_len); memcpy(entry->mask, &(buf[i]), entry->value_len);
i += entry->value_len; i += entry->value_len;
break; break;
case WORD_SIZE: case '~':
entry->word_size = atoi(&(buf[i])); entry->word_size = atoi(&(buf[i]));
if (((entry->word_size != 0) if (((entry->word_size != 0)
&& (entry->word_size != 1) && (entry->word_size != 1)
@ -821,12 +800,18 @@ efreet_mime_shared_mimeinfo_magic_load(const char *file)
i += efreet_mime_count_digits(entry->word_size); i += efreet_mime_count_digits(entry->word_size);
break; break;
case RANGE_LEN: case '+':
entry->range_len = atoi(&(buf[i])); entry->range_len = atoi(&(buf[i]));
i += efreet_mime_count_digits(entry->range_len); i += efreet_mime_count_digits(entry->range_len);
break; break;
default: default:
if (isdigit(buf[i]))
{
i--;
entry->indent = atoi(&buf[i]);
i += efreet_mime_count_digits(entry->indent);
}
break; break;
} }
} }
@ -864,7 +849,7 @@ efreet_mime_shared_mimeinfo_magic_load(const char *file)
FREE(entry); FREE(entry);
} }
fseek(f, last_section-4096, SEEK_CUR); fseek(f, last_section - 4096, SEEK_CUR);
break; break;
} }
@ -887,12 +872,15 @@ efreet_mime_shared_mimeinfo_magic_load(const char *file)
entry->range_len = 1; entry->range_len = 1;
entry->mask = NULL; entry->mask = NULL;
entry->value = NULL; entry->value = NULL;
++i; i++;
} }
/* Append Mime to list of magics */ /* Append Mime to list of magics */
if (mime && ((buf[i] == '[') || (i >= bytes_read))) if (mime && ((buf[i] == '[') || (i >= bytes_read)))
{
ecore_list_append(magics, mime); ecore_list_append(magics, mime);
mime = NULL;
}
} }
} }
if (entry) if (entry)