mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix low-probability memory leak in regex execution.
After an internal failure in shortest() or longest() while pinning down the exact location of a match, find() forgot to free the DFA structure before returning. This is pretty unlikely to occur, since we just successfully ran the "search" variant of the DFA; but it could happen, and it would result in a session-lifespan memory leak since this code uses malloc() directly. Problem seems to have been aboriginal in Spencer's library, so back-patch all the way. In passing, correct a thinko in a comment I added awhile back about the meaning of the "ntree" field. I happened across these issues while comparing our code to Tcl's version of the library.
This commit is contained in:
		@@ -228,7 +228,7 @@ struct vars
 | 
				
			|||||||
	struct subre *tree;			/* subexpression tree */
 | 
						struct subre *tree;			/* subexpression tree */
 | 
				
			||||||
	struct subre *treechain;	/* all tree nodes allocated */
 | 
						struct subre *treechain;	/* all tree nodes allocated */
 | 
				
			||||||
	struct subre *treefree;		/* any free tree nodes */
 | 
						struct subre *treefree;		/* any free tree nodes */
 | 
				
			||||||
	int			ntree;			/* number of tree nodes */
 | 
						int			ntree;			/* number of tree nodes, plus one */
 | 
				
			||||||
	struct cvec *cv;			/* interface cvec */
 | 
						struct cvec *cv;			/* interface cvec */
 | 
				
			||||||
	struct cvec *cv2;			/* utility cvec */
 | 
						struct cvec *cv2;			/* utility cvec */
 | 
				
			||||||
	struct subre *lacons;		/* lookahead-constraint vector */
 | 
						struct subre *lacons;		/* lookahead-constraint vector */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -348,7 +348,11 @@ find(struct vars * v,
 | 
				
			|||||||
						   (chr **) NULL, &hitend);
 | 
											   (chr **) NULL, &hitend);
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			end = longest(v, d, begin, v->stop, &hitend);
 | 
								end = longest(v, d, begin, v->stop, &hitend);
 | 
				
			||||||
		NOERR();
 | 
							if (ISERR())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								freedfa(d);
 | 
				
			||||||
 | 
								return v->err;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (hitend && cold == NULL)
 | 
							if (hitend && cold == NULL)
 | 
				
			||||||
			cold = begin;
 | 
								cold = begin;
 | 
				
			||||||
		if (end != NULL)
 | 
							if (end != NULL)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -465,7 +465,7 @@ struct guts
 | 
				
			|||||||
	size_t		nsub;			/* copy of re_nsub */
 | 
						size_t		nsub;			/* copy of re_nsub */
 | 
				
			||||||
	struct subre *tree;
 | 
						struct subre *tree;
 | 
				
			||||||
	struct cnfa search;			/* for fast preliminary search */
 | 
						struct cnfa search;			/* for fast preliminary search */
 | 
				
			||||||
	int			ntree;			/* number of subre's, less one */
 | 
						int			ntree;			/* number of subre's, plus one */
 | 
				
			||||||
	struct colormap cmap;
 | 
						struct colormap cmap;
 | 
				
			||||||
	int			FUNCPTR(compare, (const chr *, const chr *, size_t));
 | 
						int			FUNCPTR(compare, (const chr *, const chr *, size_t));
 | 
				
			||||||
	struct subre *lacons;		/* lookahead-constraint vector */
 | 
						struct subre *lacons;		/* lookahead-constraint vector */
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user