Check return values from malloc/strdup
This commit is contained in:
		
							parent
							
								
									fa47279440
								
							
						
					
					
						commit
						da6b704b19
					
				
					 1 changed files with 34 additions and 11 deletions
				
			
		|  | @ -21,9 +21,6 @@ | ||||||
| 
 | 
 | ||||||
| #else | #else | ||||||
| 
 | 
 | ||||||
| #define GC_STRDUP strdup |  | ||||||
| #define GC_MALLOC malloc |  | ||||||
| 
 |  | ||||||
| #define NEW new | #define NEW new | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | @ -32,6 +29,32 @@ | ||||||
| namespace nix { | namespace nix { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | static char * dupString(const char * s) | ||||||
|  | { | ||||||
|  |     char * t; | ||||||
|  | #if HAVE_BOEHMGC | ||||||
|  |     t = GC_strdup(s); | ||||||
|  | #else | ||||||
|  |     t = strdup(s); | ||||||
|  | #endif | ||||||
|  |     if (!t) throw std::bad_alloc(); | ||||||
|  |     return t; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static void * allocBytes(size_t n) | ||||||
|  | { | ||||||
|  |     void * p; | ||||||
|  | #if HAVE_BOEHMGC | ||||||
|  |     p = GC_malloc(n); | ||||||
|  | #else | ||||||
|  |     p = malloc(n); | ||||||
|  | #endif | ||||||
|  |     if (!p) throw std::bad_alloc(); | ||||||
|  |     return p; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| void Bindings::sort() | void Bindings::sort() | ||||||
| { | { | ||||||
|     std::sort(begin(), end()); |     std::sort(begin(), end()); | ||||||
|  | @ -376,7 +399,7 @@ LocalNoInline(void addErrorPrefix(Error & e, const char * s, const string & s2, | ||||||
| 
 | 
 | ||||||
| void mkString(Value & v, const char * s) | void mkString(Value & v, const char * s) | ||||||
| { | { | ||||||
|     mkStringNoCopy(v, GC_STRDUP(s)); |     mkStringNoCopy(v, dupString(s)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -386,9 +409,9 @@ void mkString(Value & v, const string & s, const PathSet & context) | ||||||
|     if (!context.empty()) { |     if (!context.empty()) { | ||||||
|         unsigned int n = 0; |         unsigned int n = 0; | ||||||
|         v.string.context = (const char * *) |         v.string.context = (const char * *) | ||||||
|             GC_MALLOC((context.size() + 1) * sizeof(char *)); |             allocBytes((context.size() + 1) * sizeof(char *)); | ||||||
|         foreach (PathSet::const_iterator, i, context) |         foreach (PathSet::const_iterator, i, context) | ||||||
|             v.string.context[n++] = GC_STRDUP(i->c_str()); |             v.string.context[n++] = dupString(i->c_str()); | ||||||
|         v.string.context[n] = 0; |         v.string.context[n] = 0; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -396,7 +419,7 @@ void mkString(Value & v, const string & s, const PathSet & context) | ||||||
| 
 | 
 | ||||||
| void mkPath(Value & v, const char * s) | void mkPath(Value & v, const char * s) | ||||||
| { | { | ||||||
|     mkPathNoCopy(v, GC_STRDUP(s)); |     mkPathNoCopy(v, dupString(s)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -429,7 +452,7 @@ inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval) | ||||||
| Value * EvalState::allocValue() | Value * EvalState::allocValue() | ||||||
| { | { | ||||||
|     nrValues++; |     nrValues++; | ||||||
|     return (Value *) GC_MALLOC(sizeof(Value)); |     return (Value *) allocBytes(sizeof(Value)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -439,7 +462,7 @@ Env & EvalState::allocEnv(unsigned int size) | ||||||
| 
 | 
 | ||||||
|     nrEnvs++; |     nrEnvs++; | ||||||
|     nrValuesInEnvs += size; |     nrValuesInEnvs += size; | ||||||
|     Env * env = (Env *) GC_MALLOC(sizeof(Env) + size * sizeof(Value *)); |     Env * env = (Env *) allocBytes(sizeof(Env) + size * sizeof(Value *)); | ||||||
|     env->size = size; |     env->size = size; | ||||||
| 
 | 
 | ||||||
|     /* Clear the values because maybeThunk() and lookupVar fromWith expect this. */ |     /* Clear the values because maybeThunk() and lookupVar fromWith expect this. */ | ||||||
|  | @ -460,7 +483,7 @@ Value * EvalState::allocAttr(Value & vAttrs, const Symbol & name) | ||||||
| 
 | 
 | ||||||
| Bindings * EvalState::allocBindings(Bindings::size_t capacity) | Bindings * EvalState::allocBindings(Bindings::size_t capacity) | ||||||
| { | { | ||||||
|     return new (GC_MALLOC(sizeof(Bindings) + sizeof(Attr) * capacity)) Bindings(capacity); |     return new (allocBytes(sizeof(Bindings) + sizeof(Attr) * capacity)) Bindings(capacity); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -469,7 +492,7 @@ void EvalState::mkList(Value & v, unsigned int length) | ||||||
|     clearValue(v); |     clearValue(v); | ||||||
|     v.type = tList; |     v.type = tList; | ||||||
|     v.list.length = length; |     v.list.length = length; | ||||||
|     v.list.elems = length ? (Value * *) GC_MALLOC(length * sizeof(Value *)) : 0; |     v.list.elems = length ? (Value * *) allocBytes(length * sizeof(Value *)) : 0; | ||||||
|     nrListElems += length; |     nrListElems += length; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue