Skip to content

Commit 15837ba

Browse files
committed
Fix #73893: A hidden danger of death cycle in a function of gd
We remove the unused, but potentially dangerous functions.
1 parent 6a9efa2 commit 15837ba

File tree

3 files changed

+3
-217
lines changed

3 files changed

+3
-217
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ PHP NEWS
66
. Fixed bug #73876 (Crash when exporting **= in expansion of assign op).
77
(Sara)
88

9+
- GD:
10+
. Fixed bug #73893 (A hidden danger of death cycle in a function of gd). (cmb)
11+
912
- FPM:
1013
. Fixed bug #67583 (double fastcgi_end_request on max_children limit).
1114
(Dmitry Saprykin)

ext/gd/libgd/gd.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -693,8 +693,6 @@ void gdImageCopyResampled(gdImagePtr dst, gdImagePtr src, int dstX, int dstY, in
693693
gdImagePtr gdImageRotate90(gdImagePtr src, int ignoretransparent);
694694
gdImagePtr gdImageRotate180(gdImagePtr src, int ignoretransparent);
695695
gdImagePtr gdImageRotate270(gdImagePtr src, int ignoretransparent);
696-
gdImagePtr gdImageRotate45(gdImagePtr src, double dAngle, int clrBack, int ignoretransparent);
697-
gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack, int ignoretransparent);
698696
gdImagePtr gdImageRotateInterpolated(const gdImagePtr src, const float angle, int bgcolor);
699697

700698
void gdImageSetBrush(gdImagePtr im, gdImagePtr brush);

ext/gd/libgd/gd_rotate.c

Lines changed: 0 additions & 215 deletions
Original file line numberDiff line numberDiff line change
@@ -343,218 +343,3 @@ gdImagePtr gdImageRotate270 (gdImagePtr src, int ignoretransparent)
343343

344344
return dst;
345345
}
346-
347-
gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack, int ignoretransparent)
348-
{
349-
typedef int (*FuncPtr)(gdImagePtr, int, int);
350-
gdImagePtr dst1,dst2,dst3;
351-
FuncPtr f;
352-
double dRadAngle, dSinE, dTan, dShear;
353-
double dOffset; /* Variable skew offset */
354-
int u, iShear, newx, newy;
355-
int clrBackR, clrBackG, clrBackB, clrBackA;
356-
357-
/* See GEMS I for the algorithm details */
358-
dRadAngle = dAngle * ROTATE_DEG2RAD; /* Angle in radians */
359-
dSinE = sin (dRadAngle);
360-
dTan = tan (dRadAngle / 2.0);
361-
362-
newx = (int)(src->sx + src->sy * fabs(dTan));
363-
newy = src->sy;
364-
365-
/* 1st shear */
366-
if (src->trueColor) {
367-
f = gdImageGetTrueColorPixel;
368-
} else {
369-
f = gdImageGetPixel;
370-
}
371-
372-
dst1 = gdImageCreateTrueColor(newx, newy);
373-
/******* Perform 1st shear (horizontal) ******/
374-
if (dst1 == NULL) {
375-
return NULL;
376-
}
377-
#ifdef HAVE_GD_BUNDLED
378-
dst1->alphaBlendingFlag = gdEffectReplace;
379-
#else
380-
gdImageAlphaBlending(dst1, 0);
381-
#endif
382-
if (dAngle == 0.0) {
383-
/* Returns copy of src */
384-
gdImageCopy (dst1, src,0,0,0,0,src->sx,src->sy);
385-
return dst1;
386-
}
387-
388-
gdImagePaletteCopy (dst1, src);
389-
390-
if (ignoretransparent) {
391-
if (gdImageTrueColor(src)) {
392-
dst1->transparent = src->transparent;
393-
} else {
394-
395-
dst1->transparent = gdTrueColorAlpha(gdImageRed(src, src->transparent), gdImageBlue(src, src->transparent), gdImageGreen(src, src->transparent), 127);
396-
}
397-
}
398-
399-
dRadAngle = dAngle * ROTATE_DEG2RAD; /* Angle in radians */
400-
dSinE = sin (dRadAngle);
401-
dTan = tan (dRadAngle / 2.0);
402-
403-
for (u = 0; u < dst1->sy; u++) {
404-
if (dTan >= 0.0) {
405-
dShear = ((double)(u + 0.5)) * dTan;
406-
} else {
407-
dShear = ((double)(u - dst1->sy) + 0.5) * dTan;
408-
}
409-
410-
iShear = (int)floor(dShear);
411-
gdImageSkewX(dst1, src, u, iShear, (dShear - iShear), clrBack, ignoretransparent);
412-
}
413-
414-
/*
415-
The 1st shear may use the original clrBack as color index
416-
Convert it once here
417-
*/
418-
if(!src->trueColor) {
419-
clrBackR = gdImageRed(src, clrBack);
420-
clrBackG = gdImageGreen(src, clrBack);
421-
clrBackB = gdImageBlue(src, clrBack);
422-
clrBackA = gdImageAlpha(src, clrBack);
423-
clrBack = gdTrueColorAlpha(clrBackR, clrBackG, clrBackB, clrBackA);
424-
}
425-
/* 2nd shear */
426-
newx = dst1->sx;
427-
428-
if (dSinE > 0.0) {
429-
dOffset = (src->sx-1) * dSinE;
430-
} else {
431-
dOffset = -dSinE * (src->sx - newx);
432-
}
433-
434-
newy = (int) ((double) src->sx * fabs( dSinE ) + (double) src->sy * cos (dRadAngle))+1;
435-
436-
if (src->trueColor) {
437-
f = gdImageGetTrueColorPixel;
438-
} else {
439-
f = gdImageGetPixel;
440-
}
441-
dst2 = gdImageCreateTrueColor(newx, newy);
442-
if (dst2 == NULL) {
443-
gdImageDestroy(dst1);
444-
return NULL;
445-
}
446-
447-
#ifdef HAVE_GD_BUNDLED
448-
dst2->alphaBlendingFlag = gdEffectReplace;
449-
#else
450-
gdImageAlphaBlending(dst2, 0);
451-
#endif
452-
453-
if (ignoretransparent) {
454-
dst2->transparent = dst1->transparent;
455-
}
456-
457-
for (u = 0; u < dst2->sx; u++, dOffset -= dSinE) {
458-
iShear = (int)floor (dOffset);
459-
gdImageSkewY(dst2, dst1, u, iShear, (dOffset - (double)iShear), clrBack, ignoretransparent);
460-
}
461-
462-
/* 3rd shear */
463-
gdImageDestroy(dst1);
464-
465-
newx = (int) ((double)src->sy * fabs (dSinE) + (double)src->sx * cos (dRadAngle)) + 1;
466-
newy = dst2->sy;
467-
468-
if (src->trueColor) {
469-
f = gdImageGetTrueColorPixel;
470-
} else {
471-
f = gdImageGetPixel;
472-
}
473-
dst3 = gdImageCreateTrueColor(newx, newy);
474-
if (dst3 == NULL) {
475-
gdImageDestroy(dst2);
476-
return NULL;
477-
}
478-
479-
#ifdef HAVE_GD_BUNDLED
480-
dst3->alphaBlendingFlag = gdEffectReplace;
481-
#else
482-
gdImageAlphaBlending(dst3, 0);
483-
#endif
484-
485-
if (ignoretransparent) {
486-
dst3->transparent = dst2->transparent;
487-
}
488-
489-
if (dSinE >= 0.0) {
490-
dOffset = (double)(src->sx - 1) * dSinE * -dTan;
491-
} else {
492-
dOffset = dTan * ((double)(src->sx - 1) * -dSinE + (double)(1 - newy));
493-
}
494-
495-
for (u = 0; u < dst3->sy; u++, dOffset += dTan) {
496-
int iShear = (int)floor(dOffset);
497-
gdImageSkewX(dst3, dst2, u, iShear, (dOffset - iShear), clrBack, ignoretransparent);
498-
}
499-
500-
gdImageDestroy(dst2);
501-
502-
return dst3;
503-
}
504-
505-
gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack, int ignoretransparent)
506-
{
507-
gdImagePtr pMidImg;
508-
gdImagePtr rotatedImg;
509-
510-
if (src == NULL) {
511-
return NULL;
512-
}
513-
514-
if (!gdImageTrueColor(src) && (clrBack < 0 || clrBack>=gdImageColorsTotal(src))) {
515-
return NULL;
516-
}
517-
518-
while (dAngle >= 360.0) {
519-
dAngle -= 360.0;
520-
}
521-
522-
while (dAngle < 0) {
523-
dAngle += 360.0;
524-
}
525-
526-
if (dAngle == 90.00) {
527-
return gdImageRotate90(src, ignoretransparent);
528-
}
529-
if (dAngle == 180.00) {
530-
return gdImageRotate180(src, ignoretransparent);
531-
}
532-
if(dAngle == 270.00) {
533-
return gdImageRotate270 (src, ignoretransparent);
534-
}
535-
536-
if ((dAngle > 45.0) && (dAngle <= 135.0)) {
537-
pMidImg = gdImageRotate90 (src, ignoretransparent);
538-
dAngle -= 90.0;
539-
} else if ((dAngle > 135.0) && (dAngle <= 225.0)) {
540-
pMidImg = gdImageRotate180 (src, ignoretransparent);
541-
dAngle -= 180.0;
542-
} else if ((dAngle > 225.0) && (dAngle <= 315.0)) {
543-
pMidImg = gdImageRotate270 (src, ignoretransparent);
544-
dAngle -= 270.0;
545-
} else {
546-
return gdImageRotate45 (src, dAngle, clrBack, ignoretransparent);
547-
}
548-
549-
if (pMidImg == NULL) {
550-
return NULL;
551-
}
552-
553-
rotatedImg = gdImageRotate45 (pMidImg, dAngle, clrBack, ignoretransparent);
554-
gdImageDestroy(pMidImg);
555-
556-
return rotatedImg;
557-
}
558-
/* End Rotate function */
559-
560-

0 commit comments

Comments
 (0)