diff --git a/ChangeLog b/ChangeLog index 14fc9b8f1..e69d36e97 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-12-31 Fred Kiefer + + * Source/NSDecimalNumber.m (-initWithBytes:objCType:): Avoid + memory leak and memory corruption by retaining notANumber before + returning it. + 2008-12-29 Richard Frith-Macdonald * Makefile.postamble (before-all): Remove test for mingw on situation diff --git a/Source/NSDecimalNumber.m b/Source/NSDecimalNumber.m index 1e9b08998..0da08fd44 100644 --- a/Source/NSDecimalNumber.m +++ b/Source/NSDecimalNumber.m @@ -354,8 +354,16 @@ static NSDecimalNumber *one; { NSString *s; float v = *(float *)value; - if (GSIsNAN(v)) return notANumber; - if (GSIsInf(v)) return (v < 0.0) ? minNumber : maxNumber; + if (GSIsNAN(v)) + { + DESTROY(self); + return RETAIN(notANumber); + } + if (GSIsInf(v)) + { + DESTROY(self); + return (v < 0.0) ? RETAIN(minNumber) : RETAIN(maxNumber); + } s = [[NSString alloc] initWithFormat: @"%g" locale: GSPrivateDefaultLocale(), (double)v]; self = [self initWithString: s]; @@ -368,8 +376,16 @@ static NSDecimalNumber *one; { NSString *s; double v = *(double *)value; - if (GSIsNAN(v)) return notANumber; - if (GSIsInf(v)) return (v < 0.0) ? minNumber : maxNumber; + if (GSIsNAN(v)) + { + DESTROY(self); + return RETAIN(notANumber); + } + if (GSIsInf(v)) + { + DESTROY(self); + return (v < 0.0) ? RETAIN(minNumber) : RETAIN(maxNumber); + } s = [[NSString alloc] initWithFormat: @"%g" locale: GSPrivateDefaultLocale(), v]; self = [self initWithString: s];