Fix assertion failure in nix-env
$ nix-env -f ~/Dev/nixops/ -iA foo nix-env: src/libexpr/eval.hh:57: void nix::Bindings::push_back(const nix::Attr&): Assertion `size_ < capacity' failed. Aborted
This commit is contained in:
		
							parent
							
								
									a5e2c8e560
								
							
						
					
					
						commit
						c2a8b5c42d
					
				
					 2 changed files with 8 additions and 4 deletions
				
			
		|  | @ -39,10 +39,10 @@ public: | |||
|     typedef uint32_t size_t; | ||||
| 
 | ||||
| private: | ||||
|     size_t size_, capacity; | ||||
|     size_t size_, capacity_; | ||||
|     Attr attrs[0]; | ||||
| 
 | ||||
|     Bindings(uint32_t capacity) : size_(0), capacity(capacity) { } | ||||
|     Bindings(size_t capacity) : size_(0), capacity_(capacity) { } | ||||
|     Bindings(const Bindings & bindings) = delete; | ||||
| 
 | ||||
| public: | ||||
|  | @ -54,7 +54,7 @@ public: | |||
| 
 | ||||
|     void push_back(const Attr & attr) | ||||
|     { | ||||
|         assert(size_ < capacity); | ||||
|         assert(size_ < capacity_); | ||||
|         attrs[size_++] = attr; | ||||
|     } | ||||
| 
 | ||||
|  | @ -76,6 +76,8 @@ public: | |||
| 
 | ||||
|     void sort(); | ||||
| 
 | ||||
|     size_t capacity() { return capacity_; } | ||||
| 
 | ||||
|     friend class EvalState; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -132,6 +132,8 @@ static void getAllExprs(EvalState & state, | |||
|             Value & vArg(*state.allocValue()); | ||||
|             state.getBuiltin("import", vFun); | ||||
|             mkString(vArg, path2); | ||||
|             if (v.attrs->size() == v.attrs->capacity()) | ||||
|                 throw Error(format("too many Nix expressions in directory ‘%1%’") % path); | ||||
|             mkApp(*state.allocAttr(v, state.symbols.create(attrName)), vFun, vArg); | ||||
|         } | ||||
|         else if (S_ISDIR(st.st_mode)) | ||||
|  | @ -160,7 +162,7 @@ static void loadSourceExpr(EvalState & state, const Path & path, Value & v) | |||
|        ~/.nix-defexpr directory that includes some system-wide | ||||
|        directory). */ | ||||
|     if (S_ISDIR(st.st_mode)) { | ||||
|         state.mkAttrs(v, 16); | ||||
|         state.mkAttrs(v, 1024); | ||||
|         state.mkList(*state.allocAttr(v, state.symbols.create("_combineChannels")), 0); | ||||
|         StringSet attrs; | ||||
|         getAllExprs(state, path, attrs, v); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue