Kristian Nielsen wrote:
Monty Taylor <[email protected]> writes:
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;
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)?
Actually... off_t is the appropriate type for file reading/writing. It
is not necessarily just typedef'd to long. It depends on some
pre-processor macros and some other things... but for proper
large-file support, it is correct to use off_t and let the standard
library do the things it needs to do to accomplish this. (On 32-bit
linux it should _not_ be typedef'd to long, for instance- if it is,
please let me know so we can re-define things we need to as part of
configure)
Actually... it seems this code is for reading events from a binary log. So
I assume this file format is supposed to be portable between different
architectures (replication from x86 32-bit to sparc 64-bit eg.)?
If so, reading and writing the raw bytes out of variable length, regardless of
type, is just wrong. It's not portable among different machines (eg big-
vs. little-endian).
Sorry if I misunderstood what is being discussed...
Ah, well, I might also have misunderstood what was being discussed. If
that's what is being discussed, then what you say is correct. However, I
wonder what we're even using this code for anymore then, since we're
now using the protobufs and should just be streaming them to and from
disk using the protobuf reader/writer classes. Where is this code again?
Monty
_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help : https://help.launchpad.net/ListHelp