[haiku-commits] r38420 - haiku/trunk/src/add-ons/kernel/file_systems/udf

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 28 Aug 2010 18:46:18 +0200 (CEST)

Author: axeld
Date: 2010-08-28 18:46:18 +0200 (Sat, 28 Aug 2010)
New Revision: 38420
Changeset: http://dev.haiku-os.org/changeset/38420

Modified:
   haiku/trunk/src/add-ons/kernel/file_systems/udf/UdfString.cpp
Log:
* Fixed CID 1650: the "raw" buffer could be leaked.
* Automatic whitespace cleanup.


Modified: haiku/trunk/src/add-ons/kernel/file_systems/udf/UdfString.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/file_systems/udf/UdfString.cpp       
2010-08-28 16:07:59 UTC (rev 38419)
+++ haiku/trunk/src/add-ons/kernel/file_systems/udf/UdfString.cpp       
2010-08-28 16:46:18 UTC (rev 38420)
@@ -1,10 +1,12 @@
 #include "UdfString.h"
 
-#include "ByteOrder.h"
+#include <ByteOrder.h>
 
+#include <AutoDeleter.h>
 
+
 /*! \brief Converts the given unicode character to utf8.
-       
+
        \param c The unicode character.
        \param out Pointer to a C-string of at least 4 characters
                   long into which the output utf8 characters will
@@ -16,8 +18,7 @@
                   upon returning, out will point to a pointer to
                   the fifth character in \c str.
 */
-static
-void
+static void
 unicode_to_utf8(uint32 c, char **out)
 {
        char *s = *out;
@@ -46,12 +47,11 @@
                  will be read. *in will be incremented to reflect
                  the number of characters read, similarly to the
                  \c out parameter for unicode_to_utf8().
-                 
+
        \return The 4-byte unicode character, or **in if passed an
                invalid character, or 0 if passed any NULL pointers.
 */
-static
-uint32
+static uint32
 utf8_to_unicode(const char **in)
 {
        if (!in)
@@ -92,6 +92,9 @@
 }
 
 
+// #pragma mark -
+
+
 /*! \brief Creates an empty string object. */
 UdfString::UdfString()
        :
@@ -162,12 +165,14 @@
                return;
        }
 
+       ArrayDeleter<uint32> rawDeleter(raw);
+
        const char *in = utf8;
        uint32 rawLength = 0;
-       for (uint32 i = 0; i < length && uint32(in - utf8) < length; i++, 
rawLength++) 
+       for (uint32 i = 0; i < length && uint32(in - utf8) < length; i++, 
rawLength++)
                raw[i] = utf8_to_unicode(&in);
 
-       // Check for invalids. 
+       // Check for invalids.
        uint32 mask = 0xffff0000;
        for (uint32 i = 0; i < rawLength; i++) {
                if (raw[i] & mask) {
@@ -191,20 +196,20 @@
        if (canUse8bit) {
                fCs0Length = rawLength + 1;
                fCs0String = new(nothrow) char[fCs0Length];
-               if (fCs0String) {
+               if (fCs0String != NULL) {
                        fCs0String[0] = '\x08'; // 8-bit compressed unicode
                        for (uint32 i = 0; i < rawLength; i++)
                                fCs0String[i + 1] = raw[i] % 256;
                } else {
                        TRACE_ERROR(("UdfString::SetTo: fCs0String[%ld] 
allocation failed\n",
                                fCs0Length));
-                       _Clear();                       
+                       _Clear();
                        return;
                }
        } else {
-               fCs0Length = rawLength * 2 + 1; 
+               fCs0Length = rawLength * 2 + 1;
                fCs0String = new(nothrow) char[fCs0Length];
-               if (fCs0String) {
+               if (fCs0String != NULL) {
                        uint32 pos = 0;
                        fCs0String[pos++] = '\x10';     // 16-bit unicode
                        for (uint32 i = 0; i < rawLength; i++) {
@@ -222,9 +227,6 @@
                        return;
                }
        }
-       // Clean up
-       delete [] raw;
-       raw = NULL;     
 }
 
 
@@ -232,7 +234,7 @@
 void
 UdfString::SetTo(const char *cs0, uint32 length)
 {
-       DEBUG_INIT_ETC("UdfString", ("cs0: %p, length: %ld", cs0, length));     
+       DEBUG_INIT_ETC("UdfString", ("cs0: %p, length: %ld", cs0, length));
 
        _Clear();
        if (length == 0)
@@ -240,7 +242,7 @@
        if (!cs0) {
                PRINT(("passed NULL cs0 string\n"));
                return;
-       }               
+       }
 
        // First copy the Cs0 string and length
        fCs0String = new(nothrow) char[length];
@@ -253,7 +255,7 @@
        }
 
        // Now convert to utf8
-       
+
        // The first byte of the CS0 string is the compression ID.
        // - 8: 1 byte characters
        // - 16: 2 byte, big endian characters
@@ -261,16 +263,16 @@
        // - 255: "CS0 expansion is empty and unique", 2 byte, big endian 
characters
        PRINT(("compression ID: %d\n", cs0[0]));
        switch (reinterpret_cast<const uint8*>(cs0)[0]) {
-               case 8:                 
+               case 8:
                case 254:
                {
                        const uint8 *inputString = reinterpret_cast<const 
uint8*>(&(cs0[1]));
                        int32 maxLength = length-1;                             
// Max length of input string in uint8 characters
                        int32 allocationLength = maxLength*2+1; // Need at most 
2 utf8 chars per uint8 char
-                       fUtf8String = new(nothrow) char[allocationLength];      
+                       fUtf8String = new(nothrow) char[allocationLength];
                        if (fUtf8String) {
                                char *outputString = fUtf8String;
-       
+
                                for (int32 i = 0; i < maxLength && 
inputString[i]; i++) {
                                        unicode_to_utf8(inputString[i], 
&outputString);
                                }
@@ -278,7 +280,7 @@
                        } else {
                                PRINT(("new fUtf8String[%ld] allocation 
failed\n", allocationLength));
                        }
-                               
+
                        break;
                }
 
@@ -299,10 +301,10 @@
                        } else {
                                PRINT(("new fUtf8String[%ld] allocation 
failed\n", allocationLength));
                        }
-                       
+
                        break;
                }
-               
+
                default:
                        PRINT(("invalid compression id!\n"));
                        break;
@@ -312,7 +314,7 @@
 void
 UdfString::_Clear()
 {
-       DEBUG_INIT("UdfString");        
+       DEBUG_INIT("UdfString");
 
        delete [] fCs0String;
        fCs0String = NULL;


Other related posts:

  • » [haiku-commits] r38420 - haiku/trunk/src/add-ons/kernel/file_systems/udf - axeld