~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/create_field.cc

Replace MAX_(DATE|TIME).*_WIDTH defines in definitions.h with real (and correct) static const members to Temporal types.

This fixes the buffer overflow in https://bugs.launchpad.net/drizzle/+bug/373468

It also removes a handwritten snprintf in field/datetime.cc
However... this caused us to have to change Temporal to have a way to not
"convert" the int64_t value (so 20090101 becomes 20090101000000 etc) as it
has already been converted and we just want the Temporal type to do the
to_string conversion.

This still causes a failure in 'metadata' test due to size of timestamp type. I need feedback from Jay on when the usecond code comes into play to know the correct fix for this.

Show diffs side-by-side

added added

removed removed

Lines of Context:
42
42
#include "drizzled/field/timestamp.h"
43
43
#include "drizzled/field/datetime.h"
44
44
#include "drizzled/field/varstring.h"
 
45
#include "drizzled/temporal.h"
45
46
 
46
47
/** Create a field suitable for create of table. */
47
48
CreateField::CreateField(Field *old_field, Field *orig_field)
290
291
    case DRIZZLE_TYPE_TIMESTAMP:
291
292
      if (!fld_length)
292
293
      {
293
 
        /* Compressed date YYYYMMDDHHMMSS */
294
 
        length= MAX_DATETIME_COMPRESSED_WIDTH;
295
 
      }
296
 
      else if (length != MAX_DATETIME_WIDTH)
297
 
      {
298
 
        /*
299
 
          We support only even TIMESTAMP lengths less or equal than 14
300
 
          and 19 as length of 4.1 compatible representation.
301
 
        */
302
 
        length= ((length+1)/2)*2; /* purecov: inspected */
303
 
        length= cmin(length, (uint32_t)MAX_DATETIME_COMPRESSED_WIDTH); /* purecov: inspected */
304
 
      }
 
294
        length= drizzled::DateTime::MAX_STRING_LENGTH;
 
295
      }
 
296
 
 
297
      /* This assert() should be correct due to absence of length
 
298
         specifiers for timestamp. Previous manipulation also wasn't
 
299
         ever called (from examining lcov)
 
300
      */
 
301
      assert(length == (uint32_t)drizzled::DateTime::MAX_STRING_LENGTH);
 
302
 
305
303
      flags|= UNSIGNED_FLAG;
306
304
      if (fld_default_value)
307
305
      {
342
340
      }
343
341
      break;
344
342
    case DRIZZLE_TYPE_DATE:
345
 
      length= 10;
 
343
      length= drizzled::Date::MAX_STRING_LENGTH;
346
344
      break;
347
345
    case DRIZZLE_TYPE_DATETIME:
348
 
      length= MAX_DATETIME_WIDTH;
 
346
      length= drizzled::DateTime::MAX_STRING_LENGTH;
349
347
      break;
350
348
    case DRIZZLE_TYPE_ENUM:
351
349
      {