Sir Mordred The Traitor <[EMAIL PROTECTED]> writes:
> Upon invoking a polygon(integer, circle) function a
> src/backend/utils/adt/geo_ops.c:circle_poly() function will gets
> called, which suffers from a buffer overflow.
> 
> 2) A src/backend/adt/utils/geo_ops.c:path_encode() fails to detect a
> buffer overrun condition. It is called in multiple places, the most
> interesting are path_out() and poly_out() functions.

> 5) A src/backend/utils/adt/geo_ops.c:path_add() also fails to detect
> a simple buffer overrun.

I've attached a patch which should fix these problems.

> 3) Upon converting a char string to a path object, a
> src/backend/utils/adt/geo_ops.c:path_in() function will gets called,
> which suffers from a buffer overrun, caused by a very long argument.

> 4) A src/backend/utils/adt/geo_ops.c:poly_in() function fails to
> detect a buffer overrun condition caused by a very long argument.

I wasn't able to reproduce either of these (wouldn't it require an
input string with several hundred thousand commas?), can you give me a
test-case?

Cheers,

Neil

-- 
Neil Conway <[EMAIL PROTECTED]> || PGP Key ID: DB3C29FC
Index: src/backend/utils/adt/geo_ops.c
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/backend/utils/adt/geo_ops.c,v
retrieving revision 1.63
diff -c -r1.63 geo_ops.c
*** src/backend/utils/adt/geo_ops.c	16 Jul 2002 03:30:27 -0000	1.63
--- src/backend/utils/adt/geo_ops.c	28 Aug 2002 19:07:01 -0000
***************
*** 269,279 ****
  static char *
  path_encode(bool closed, int npts, Point *pt)
  {
! 	char	   *result = palloc(npts * (P_MAXLEN + 3) + 2);
! 
  	char	   *cp;
  	int			i;
  
  	cp = result;
  	switch (closed)
  	{
--- 269,285 ----
  static char *
  path_encode(bool closed, int npts, Point *pt)
  {
! 	int			size = npts * (P_MAXLEN + 3) + 2;
! 	char	   *result;
  	char	   *cp;
  	int			i;
  
+ 	/* Check for integer overflow */
+ 	if ((size - 2) / npts != (P_MAXLEN + 3))
+ 		elog(ERROR, "Too many points requested");
+ 
+ 	result = palloc(size);
+ 
  	cp = result;
  	switch (closed)
  	{
***************
*** 1230,1236 ****
  		depth++;
  	}
  
! 	size = offsetof(PATH, p[0]) +sizeof(path->p[0]) * npts;
  	path = (PATH *) palloc(size);
  
  	path->size = size;
--- 1236,1242 ----
  		depth++;
  	}
  
! 	size = offsetof(PATH, p[0]) + sizeof(path->p[0]) * npts;
  	path = (PATH *) palloc(size);
  
  	path->size = size;
***************
*** 3596,3608 ****
  	PATH	   *p1 = PG_GETARG_PATH_P(0);
  	PATH	   *p2 = PG_GETARG_PATH_P(1);
  	PATH	   *result;
! 	int			size;
  	int			i;
  
  	if (p1->closed || p2->closed)
  		PG_RETURN_NULL();
  
! 	size = offsetof(PATH, p[0]) +sizeof(p1->p[0]) * (p1->npts + p2->npts);
  	result = (PATH *) palloc(size);
  
  	result->size = size;
--- 3602,3622 ----
  	PATH	   *p1 = PG_GETARG_PATH_P(0);
  	PATH	   *p2 = PG_GETARG_PATH_P(1);
  	PATH	   *result;
! 	int			size,
! 				base_size;
  	int			i;
  
  	if (p1->closed || p2->closed)
  		PG_RETURN_NULL();
  
! 	base_size = sizeof(p1->p[0]) * (p1->npts + p2->npts);
! 	size = offsetof(PATH, p[0]) + base_size;
! 
! 	/* Check for integer overflow */
! 	if (base_size / sizeof(p1->p[0]) != (p1->npts + p2->npts) ||
! 		size <= base_size)
! 		elog(ERROR, "too many points requested.");
! 
  	result = (PATH *) palloc(size);
  
  	result->size = size;
***************
*** 4413,4429 ****
  	int32		npts = PG_GETARG_INT32(0);
  	CIRCLE	   *circle = PG_GETARG_CIRCLE_P(1);
  	POLYGON    *poly;
! 	int			size;
  	int			i;
  	double		angle;
  
  	if (FPzero(circle->radius) || (npts < 2))
  		elog(ERROR, "Unable to convert circle to polygon");
  
! 	size = offsetof(POLYGON, p[0]) +(sizeof(poly->p[0]) * npts);
  	poly = (POLYGON *) palloc(size);
  
! 	MemSet((char *) poly, 0, size);		/* zero any holes */
  	poly->size = size;
  	poly->npts = npts;
  
--- 4427,4450 ----
  	int32		npts = PG_GETARG_INT32(0);
  	CIRCLE	   *circle = PG_GETARG_CIRCLE_P(1);
  	POLYGON    *poly;
! 	int			base_size,
! 				size;
  	int			i;
  	double		angle;
  
  	if (FPzero(circle->radius) || (npts < 2))
  		elog(ERROR, "Unable to convert circle to polygon");
  
! 	base_size = sizeof(poly->p[0]) * npts;
! 	size = offsetof(POLYGON, p[0]) + base_size;
! 
! 	/* Check for integer overflow */
! 	if (base_size / npts != sizeof(poly->p[0]) || size <= base_size)
! 		elog(ERROR, "too many points requested");
! 
  	poly = (POLYGON *) palloc(size);
  
! 	MemSet(poly, 0, size);		/* zero any holes */
  	poly->size = size;
  	poly->npts = npts;
  

---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

http://archives.postgresql.org

Reply via email to