Enlightenment CVS committal

Author  : dj2
Project : e17
Module  : libs/efreet

Dir     : e17/libs/efreet/src/lib


Modified Files:
        efreet_mime.c 


Log Message:
- this is a hack but keeps it from segv'ing if the delimiter is split over a
  buffer read

===================================================================
RCS file: /cvs/e/e17/libs/efreet/src/lib/efreet_mime.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- efreet_mime.c       3 Jul 2007 13:59:40 -0000       1.9
+++ efreet_mime.c       3 Jul 2007 14:12:12 -0000       1.10
@@ -667,8 +667,6 @@
 {
     FILE *f = NULL;
     int priority = 0, i = 0;
-    enum {INDENT=0, OFFSET, VALUE, MASK, 
-          WORD_SIZE, RANGE_LEN} magic_state = 0;
     char buf[4096], mimetype[4096];
     Efreet_Mime_Magic *mime = NULL;
     Efreet_Mime_Magic_Entry *entry = NULL;
@@ -690,7 +688,9 @@
         {
             if (buf[i] == '[')
             {
-                if(entry)
+                char *val;
+
+                if (entry)
                 {
                     IF_FREE(entry->mask);
                     IF_FREE(entry->value);
@@ -699,65 +699,44 @@
                 
                 last_section = i;
                 i++;
-                priority = atoi(strtok(&(buf[i]), ":"));
-                strncpy(mimetype, strtok(NULL, "]"), sizeof(mimetype));
+                val = strtok(&(buf[i]), ":");
+                if (val)
+                {
+                    priority = atoi(val);
+
+                    val = strtok(NULL, "]");
+                    if (val)
+                    {
+                        strncpy(mimetype, val, sizeof(mimetype));
   
-                mime = NEW(Efreet_Mime_Magic, 1);
-                mime->mime = ecore_string_instance(mimetype);
-                mime->priority = priority;
-                mime->entries = ecore_list_new();
-                ecore_list_set_free_cb(mime->entries,
+                        mime = NEW(Efreet_Mime_Magic, 1);
+                        mime->mime = ecore_string_instance(mimetype);
+                        mime->priority = priority;
+                        mime->entries = ecore_list_new();
+                        ecore_list_set_free_cb(mime->entries,
                                           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
             {
                 if (!mime) continue;
                 
-                switch(buf[i])
+                i++;
+                switch(buf[i - 1])
                 {
                     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]);
                         i += efreet_mime_count_digits(entry->offset);
                         break;
 
-                    case VALUE:
+                    case '=':
                         if (efreet_mime_endianess == EFREET_ENDIAN_LITTLE)
                             entry->value_len = ntohs(buf[i + 1] << 8 | 
(short)(buf[i]));
                         else
@@ -770,13 +749,13 @@
                         i += entry->value_len;
                         break;
 
-                    case MASK:
+                    case '&':
                         entry->mask = NEW(1, entry->value_len);
                         memcpy(entry->mask, &(buf[i]), entry->value_len);
                         i += entry->value_len;
                         break;
 
-                    case WORD_SIZE:
+                    case '~':
                         entry->word_size = atoi(&(buf[i]));
                         if (((entry->word_size != 0) 
                                 && (entry->word_size != 1)
@@ -821,12 +800,18 @@
                         i += efreet_mime_count_digits(entry->word_size);
                         break;
 
-                    case RANGE_LEN:
+                    case '+':
                         entry->range_len = atoi(&(buf[i]));
                         i += efreet_mime_count_digits(entry->range_len);
                         break;
 
                     default:
+                        if (isdigit(buf[i]))
+                        {
+                            i--;
+                            entry->indent = atoi(&buf[i]);
+                            i += efreet_mime_count_digits(entry->indent);
+                        }
                         break;
                 }
             }            
@@ -864,7 +849,7 @@
                     FREE(entry);
                 }
                 
-                fseek(f, last_section-4096, SEEK_CUR);
+                fseek(f, last_section - 4096, SEEK_CUR);
                 break;
             }
             
@@ -887,12 +872,15 @@
                 entry->range_len = 1;
                 entry->mask = NULL;
                 entry->value = NULL;
-                ++i;
+                i++;
             }
             
             /* Append Mime to list of magics */
             if (mime && ((buf[i] == '[') || (i >= bytes_read)))
+            {
                 ecore_list_append(magics, mime);
+                mime = NULL;
+            }
         }
     }        
     if (entry)



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to