Matteo Bruni : wpp: Handle remaining memory allocation failures.

Alexandre Julliard julliard at winehq.org
Tue Oct 6 10:35:51 CDT 2009


Module: wine
Branch: master
Commit: 9086c59d3265e160b1f935ac0578790231e0e398
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9086c59d3265e160b1f935ac0578790231e0e398

Author: Matteo Bruni <matteo.mystral at gmail.com>
Date:   Mon Sep 28 21:32:39 2009 +0200

wpp: Handle remaining memory allocation failures.

---

 include/wine/wpp.h     |    7 +++--
 libs/wpp/preproc.c     |   51 ++++++++++++++++++++++++++++++++++++++++-------
 libs/wpp/wpp.c         |   44 +++++++++++++++++++++++++++++++++-------
 libs/wpp/wpp_private.h |    2 +-
 4 files changed, 84 insertions(+), 20 deletions(-)

diff --git a/include/wine/wpp.h b/include/wine/wpp.h
index 10b71e0..86575b1 100644
--- a/include/wine/wpp.h
+++ b/include/wine/wpp.h
@@ -23,12 +23,13 @@
 
 #include <stdio.h>
 
-extern void wpp_add_define( const char *name, const char *value );
+/* Return value == 0 means successful execution */
+extern int wpp_add_define( const char *name, const char *value );
 extern void wpp_del_define( const char *name );
-extern void wpp_add_cmdline_define( const char *value );
+extern int wpp_add_cmdline_define( const char *value );
 extern void wpp_set_debug( int lex_debug, int parser_debug, int msg_debug );
 extern void wpp_set_pedantic( int on );
-extern void wpp_add_include_path( const char *path );
+extern int wpp_add_include_path( const char *path );
 extern char *wpp_find_include( const char *name, const char *parent_name );
 extern int wpp_parse( const char *input, FILE *output );
 extern int wpp_parse_temp( const char *input, const char *output_base, char **output_name );
diff --git a/libs/wpp/preproc.c b/libs/wpp/preproc.c
index 1d9aed6..cd46fc2 100644
--- a/libs/wpp/preproc.c
+++ b/libs/wpp/preproc.c
@@ -82,8 +82,8 @@ void *pp_xmalloc(size_t size)
     res = malloc(size);
     if(res == NULL)
     {
-        fprintf(stderr, "Virtual memory exhausted.\n");
-        exit(2);
+        /* Set the error flag */
+        pp_status.state = 1;
     }
     return res;
 }
@@ -96,8 +96,8 @@ void *pp_xrealloc(void *p, size_t size)
     res = realloc(p, size);
     if(res == NULL)
     {
-        fprintf(stderr, "Virtual memory exhausted.\n");
-        exit(2);
+        /* Set the error flag */
+        pp_status.state = 1;
     }
     return res;
 }
@@ -177,13 +177,16 @@ static void free_pp_entry( pp_entry_t *ppp, int idx )
 }
 
 /* push a new (empty) define state */
-void pp_push_define_state(void)
+int pp_push_define_state(void)
 {
     pp_def_state_t *state = pp_xmalloc( sizeof(*state) );
+    if(!state)
+        return 1;
 
     memset( state->defines, 0, sizeof(state->defines) );
     state->next = pp_def_state;
     pp_def_state = state;
+    return 0;
 }
 
 /* pop the current define state */
@@ -349,10 +352,12 @@ pp_entry_t *pp_add_macro(char *id, marg_t *args[], int nargs, mtext_t *exp)
 static char **includepath;
 static int nincludepath = 0;
 
-void wpp_add_include_path(const char *path)
+int wpp_add_include_path(const char *path)
 {
 	char *tok;
 	char *cpy = pp_xstrdup(path);
+	if(!cpy)
+		return 1;
 
 	tok = strtok(cpy, INCLUDESEPARATOR);
 	while(tok)
@@ -360,7 +365,14 @@ void wpp_add_include_path(const char *path)
 		if(*tok) {
 			char *dir;
 			char *cptr;
+			char **new_path;
+
 			dir = pp_xstrdup(tok);
+			if(!dir)
+			{
+				free(cpy);
+				return 1;
+			}
 			for(cptr = dir; *cptr; cptr++)
 			{
 				/* Convert to forward slash */
@@ -372,13 +384,21 @@ void wpp_add_include_path(const char *path)
 				*cptr = '\0';
 
 			/* Add to list */
+			new_path = pp_xrealloc(includepath, (nincludepath+1) * sizeof(*includepath));
+			if(!new_path)
+			{
+				free(dir);
+				free(cpy);
+				return 1;
+			}
+			includepath = new_path;
+			includepath[nincludepath] = dir;
 			nincludepath++;
-			includepath = pp_xrealloc(includepath, nincludepath * sizeof(*includepath));
-			includepath[nincludepath-1] = dir;
 		}
 		tok = strtok(NULL, INCLUDESEPARATOR);
 	}
 	free(cpy);
+	return 0;
 }
 
 char *wpp_find_include(const char *name, const char *parent_name)
@@ -390,6 +410,8 @@ char *wpp_find_include(const char *name, const char *parent_name)
     int i, fd;
 
     cpy = pp_xmalloc(strlen(name)+1);
+    if(!cpy)
+        return NULL;
     cptr = cpy;
 
     for(ccptr = name; *ccptr; ccptr++)
@@ -415,6 +437,11 @@ char *wpp_find_include(const char *name, const char *parent_name)
         if ((p = strrchr( parent_name, '/' ))) p++;
         else p = parent_name;
         path = pp_xmalloc( (p - parent_name) + strlen(cpy) + 1 );
+        if(!path)
+        {
+            free(cpy);
+            return NULL;
+        }
         memcpy( path, parent_name, p - parent_name );
         strcpy( path + (p - parent_name), cpy );
         fd = open( path, O_RDONLY );
@@ -430,6 +457,11 @@ char *wpp_find_include(const char *name, const char *parent_name)
     for(i = 0; i < nincludepath; i++)
     {
         path = pp_xmalloc(strlen(includepath[i]) + strlen(cpy) + 2);
+        if(!path)
+        {
+            free(cpy);
+            return NULL;
+        }
         strcpy(path, includepath[i]);
         strcat(path, "/");
         strcat(path, cpy);
@@ -630,11 +662,14 @@ static void generic_msg(const char *s, const char *t, const char *n, va_list ap)
 		if(n)
 		{
 			cpy = pp_xstrdup(n);
+			if(!cpy)
+				goto end;
 			for (p = cpy; *p; p++) if(!isprint(*p)) *p = ' ';
 			fprintf(stderr, " near '%s'", cpy);
 			free(cpy);
 		}
 	}
+end:
 #endif
 	fprintf(stderr, "\n");
 }
diff --git a/libs/wpp/wpp.c b/libs/wpp/wpp.c
index a7597ec..e3541fe 100644
--- a/libs/wpp/wpp.c
+++ b/libs/wpp/wpp.c
@@ -62,15 +62,17 @@ static void add_special_defines(void)
     pp_add_define( pp_xstrdup("__TIME__"), pp_xstrdup(buf) );
 
     ppp = pp_add_define( pp_xstrdup("__FILE__"), pp_xstrdup("") );
-    ppp->type = def_special;
+    if(ppp)
+        ppp->type = def_special;
 
     ppp = pp_add_define( pp_xstrdup("__LINE__"), pp_xstrdup("") );
-    ppp->type = def_special;
+    if(ppp)
+        ppp->type = def_special;
 }
 
 
 /* add a define to the preprocessor list */
-void wpp_add_define( const char *name, const char *value )
+int wpp_add_define( const char *name, const char *value )
 {
     struct define *def;
 
@@ -80,17 +82,35 @@ void wpp_add_define( const char *name, const char *value )
     {
         if (!strcmp( def->name, name ))
         {
+            char *new_value = pp_xstrdup(value);
+            if(!new_value)
+                return 1;
             free( def->value );
-            def->value = pp_xstrdup(value);
-            return;
+            def->value = new_value;
+
+            return 0;
         }
     }
 
     def = pp_xmalloc( sizeof(*def) );
+    if(!def)
+        return 1;
     def->next  = cmdline_defines;
     def->name  = pp_xstrdup(name);
+    if(!def->name)
+    {
+        free(def);
+        return 1;
+    }
     def->value = pp_xstrdup(value);
+    if(!def->value)
+    {
+        free(def->name);
+        free(def);
+        return 1;
+    }
     cmdline_defines = def;
+    return 0;
 }
 
 
@@ -112,13 +132,17 @@ void wpp_del_define( const char *name )
 
 
 /* add a command-line define of the form NAME=VALUE */
-void wpp_add_cmdline_define( const char *value )
+int wpp_add_cmdline_define( const char *value )
 {
+    char *p;
     char *str = pp_xstrdup(value);
-    char *p = strchr( str, '=' );
+    if(!str)
+        return 1;
+    p = strchr( str, '=' );
     if (p) *p++ = 0;
     wpp_add_define( str, p );
     free( str );
+    return 0;
 }
 
 
@@ -146,7 +170,9 @@ int wpp_parse( const char *input, FILE *output )
     pp_status.input = NULL;
     pp_status.state = 0;
 
-    pp_push_define_state();
+    ret = pp_push_define_state();
+    if(ret)
+        return ret;
     add_cmdline_defines();
     add_special_defines();
 
@@ -182,6 +208,8 @@ int wpp_parse_temp( const char *input, const char *output_base, char **output_na
     if (!output_base || !output_base[0]) output_base = "wpptmp";
 
     temp_name = pp_xmalloc( strlen(output_base) + 8 );
+    if(!temp_name)
+        return 1;
     strcpy( temp_name, output_base );
     strcat( temp_name, ".XXXXXX" );
 
diff --git a/libs/wpp/wpp_private.h b/libs/wpp/wpp_private.h
index b485d70..c0b95a4 100644
--- a/libs/wpp/wpp_private.h
+++ b/libs/wpp/wpp_private.h
@@ -202,7 +202,7 @@ void *pp_xmalloc(size_t);
 void *pp_xrealloc(void *, size_t);
 char *pp_xstrdup(const char *str);
 pp_entry_t *pplookup(const char *ident);
-void pp_push_define_state(void);
+int pp_push_define_state(void);
 void pp_pop_define_state(void);
 pp_entry_t *pp_add_define(char *def, char *text);
 pp_entry_t *pp_add_macro(char *ident, marg_t *args[], int nargs, mtext_t *exp);




More information about the wine-cvs mailing list