mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-04 00:02:52 -05:00 
			
		
		
		
	Fix bug with view locking code.
LockViewRecurese() obtains view relation using heap_open() and passes it to get_view_query() to get view info. It immediately closes the relation then uses the returned view info by calling LockViewRecurse_walker(). Since get_view_query() returns a pointer within the relcache, the relcache should be kept until LockViewRecurse_walker() returns. Otherwise the relation could point to a garbage memory area. Fix is moving the heap_close() call after LockViewRecurse_walker(). Problem reported by Tom Lane (buildfarm is unhappy, especially prion since it enables -DRELCACHE_FORCE_RELEASE cpp flag), fix by me.
This commit is contained in:
		
							parent
							
								
									3e256e5506
								
							
						
					
					
						commit
						1b26bd4089
					
				@ -263,7 +263,6 @@ LockViewRecurse(Oid reloid, Oid root_reloid, LOCKMODE lockmode, bool nowait)
 | 
			
		||||
 | 
			
		||||
	view = heap_open(reloid, NoLock);
 | 
			
		||||
	viewquery = get_view_query(view);
 | 
			
		||||
	heap_close(view, NoLock);
 | 
			
		||||
 | 
			
		||||
	context.root_reloid = root_reloid;
 | 
			
		||||
	context.lockmode = lockmode;
 | 
			
		||||
@ -272,6 +271,8 @@ LockViewRecurse(Oid reloid, Oid root_reloid, LOCKMODE lockmode, bool nowait)
 | 
			
		||||
	context.viewoid = reloid;
 | 
			
		||||
 | 
			
		||||
	LockViewRecurse_walker((Node *) viewquery, &context);
 | 
			
		||||
 | 
			
		||||
	heap_close(view, NoLock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user