From 8c34e366b595bcb7916b8323796ca2d7f12ff4d2 Mon Sep 17 00:00:00 2001 From: fredkiefer Date: Wed, 31 Dec 2008 00:42:10 +0000 Subject: [PATCH] * Source/NSDecimalNumber.m (-initWithBytes:objCType:): Avoid memory leak and memory corruption by retaining notANumber before returning it. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@27473 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 6 ++++++ Source/NSDecimalNumber.m | 24 ++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) 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];