On Sun, Feb 1, 2009 at 1:36 PM, Philip Herron
<[email protected]>wrote:

> Kristian Nielsen wrote:
>
>> Philip Herron <[email protected]> writes:
>>
>>
>>
>>> @@ -149,11 +149,11 @@
>>>> while (1)
>>>> {
>>>> off_t length;
>>>> - char *buffer= NULL;
>>>> + char *buffer=(char*)malloc(sizeof(char));
>>>> char *temp_buffer;
>>>>
>>>> /* Read the size */
>>>> - if (read(file, &length, sizeof(uint64_t)) != sizeof(uint64_t))
>>>> + if (read(file, &length, sizeof(uint32_t)) != sizeof(uint32_t))
>>>> break;
>>>>
>>>> temp_buffer= (char *)realloc(buffer, length);
>>>>
>>>>
>>>
>>
>>
>>> I guess its because the length is off_t which is just: typedef long off_t
>>> so its still 32bit and therefore too small to read a 64bit int into or
>>> something along those lines.
>>>
>>>
>>
>> Well, long is 32 bit on 32-bit Linux, but 64 bit on 64-bit linux. So this
>> is
>> going to fail on 64-bit (big-endian for sure, and probably also
>> little-endian).
>>
>> And surely the actual size of the number to read depends not on whatever
>> sizeof(off_t) is, but on what is actually in the file being read? So why
>> not
>> read the value into a tmp variable of correct size (uint32_t or uint64_t
>> depending on file format), and afterwards assign to length (checking for
>> overflow if needed)?
>>
>> Hope this helps,
>>
>>  - Kristian.
>>
>>
> Hey
>
> Ah yeah that makes more sense, i guess that would be a better idea! Read to
> figure out what 'endian' were in and read for that!
>
> Hmm.. even with that i am still having problems running drizzled with the
> error's i posted before!
>
> -Phil
>

Looking at the revision history for that file, I can see that the offending
lines used to be:

uint64_t length;
char *buffer= NULL;
char *temp_buffer;

/* Read the size */
if (read(file, &length, sizeof(uint64_t)) != sizeof(uint64_t))

You are getting the compilation error since length was changed from being of
type uint64_t to being of type off_t and you are compiling on a 32-bit
platform. I believe that the fix for this should be:

off_t length;
char *buffer= NULL;
char *temp_buffer;

/* Read the size */
if (read(file, &length, sizeof(off_t)) != sizeof(off_t))

This should then compile cleanly. Does that sound about right?


_______________________________________________
> Mailing list: 
> https://launchpad.net/~drizzle-discuss<https://launchpad.net/%7Edrizzle-discuss>
> Post to     : [email protected]
> Unsubscribe : 
> https://launchpad.net/~drizzle-discuss<https://launchpad.net/%7Edrizzle-discuss>
> More help   : https://help.launchpad.net/ListHelp
>
_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help   : https://help.launchpad.net/ListHelp

Reply via email to