Enlightenment CVS committal

Author  : sebastid
Project : e17
Module  : apps/e_modules

Dir     : e17/apps/e_modules/src/modules/weather


Modified Files:
        e_mod_main.c e_mod_main.h 


Log Message:
Fix segvfault (didn't set face->buffer to NULL after deletion).
Close server on deletion.
Don't realloc so often.

===================================================================
RCS file: 
/cvsroot/enlightenment/e17/apps/e_modules/src/modules/weather/e_mod_main.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- e_mod_main.c        12 Aug 2005 22:53:58 -0000      1.6
+++ e_mod_main.c        13 Aug 2005 06:58:39 -0000      1.7
@@ -11,7 +11,7 @@
  */
 
 static Weather *_weather_new();
-static void _weather_shutdown(Weather *weather);
+static void _weather_free(Weather *weather);
 static void _weather_config_menu_new(Weather *weather);
 
 static Weather_Face *_weather_face_new(Weather *weather, E_Container *con);
@@ -90,7 +90,7 @@
 
    weather = module->data;
    if (weather)
-     _weather_shutdown(weather);
+     _weather_free(weather);
 
    return 1;
 }
@@ -263,7 +263,7 @@
 }
 
 static void
-_weather_shutdown(Weather *weather)
+_weather_free(Weather *weather)
 {
    Evas_List *list;
 
@@ -723,8 +723,12 @@
        face = l->data;
        if (face->server) continue;
 
+       face->bufsize = 4096;
+       face->cursize = 0;
+       face->buffer = malloc(face->bufsize);
+       face->buffer[0] = 0;
        face->server = ecore_con_server_connect(ECORE_CON_REMOTE_SYSTEM,
-                                               weather->conf->host, 80, NULL);
+                                               weather->conf->host, 80, face);
      }
    return 1;
 }
@@ -773,9 +777,14 @@
      }
    if ((!face) || (e->server != face->server)) return 1;
 
-   face->buffer = realloc(face->buffer, face->bufsize + e->size);
-   memcpy(face->buffer + face->bufsize, e->data, e->size);
-   face->bufsize += e->size;
+   while ((face->cursize + e->size) >= face->bufsize)
+     {
+       face->buffer = realloc(face->buffer, face->bufsize + 4096);
+       face->bufsize += 4096;
+     }
+   memcpy(face->buffer + face->cursize, e->data, e->size);
+   face->cursize += e->size;
+   face->buffer[face->cursize] = 0;
    return 1;
 }
 
@@ -799,14 +808,18 @@
      }
    if ((!face) || (e->server != face->server)) return 1;
 
+   ecore_con_server_del(face->server);
+   face->server = NULL;
+
    info = _weather_parse(face);
    _weather_convert_degrees(weather, info);
    _weather_display_set(face, info, weather->conf->display);
    free(info);
 
-   face->server = NULL;
    face->bufsize = 0;
+   face->cursize = 0;
    free(face->buffer);
+   face->buffer = NULL;
    return 1;
 }
 
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/apps/e_modules/src/modules/weather/e_mod_main.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- e_mod_main.h        12 Aug 2005 22:12:03 -0000      1.2
+++ e_mod_main.h        13 Aug 2005 06:58:39 -0000      1.3
@@ -67,6 +67,7 @@
    Ecore_Con_Server *server;
    char *buffer;
    int bufsize;
+   int cursize;
 
    Evas_Object *weather_object;
    Evas_Object *icon_object;




-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to