From: Brett H. <br...@hu...> - 2008-07-24 14:15:17
|
OK, the problem seems to be if the memo field is longer than MDB_BIND_SIZE bytes in length (defined in mdbtools.h and currently 16384), then the mdb_memo_to_string function in data.c fails. Specifically the function mdb_unicode2ascii in iconv.c does a copy from the source buffer to the dest buffer using the source length instead of the minimum of the source length & the dest buffer length (in case the destination buffer is too small). I've attached a patch for data.c that should fix the problem. It increases the size of the "text" buffer if the memo is larger than MDB_BIND_SIZE bytes. I was wondering why the function always seems to allocate MDB_BIND_SIZE bytes though? It seems as though a little later in the function we actually read the size of the memo field, and we can then just allocate the right number of bytes directly. (Although I guess there is potentially a bit mask encoded in the length, which you'd need to mask out in order to get the actual length). The fix to mdb_memo_to_string in iconv.c seems to be worth doing purely in terms of stopping buffer overflow issues, but it might be easier if the function is refactored a bit. Basically code like the following only addresses the problem in one place in the function, whereas it also exists in the else block of code following this, and I haven't checked the block of code dealing with compressed Unicode strings, or the #ifdef HAVE_ICONV block: (Basically we strncpy the minimum of len_in and dlen): --- iconv.c 7 Sep 2005 23:27:43 -0000 1.15 +++ iconv.c 24 Jul 2008 14:04:24 -0000 @@ -82,8 +82,11 @@ dlen -= len_out; #else if (IS_JET3(mdb)) { - strncpy(out_ptr, in_ptr, len_in); - dlen = len_in; + size_t copy_len = len_in; + if (copy_len > dlen) + copy_len = dlen; + strncpy(out_ptr, in_ptr, copy_len); + dlen = copy_len; } else { /* rough UCS-2LE to ISO-8859-1 conversion */ unsigned int i; Regards, Brett  On 23 Jul 2008, at 01:25, Nigel Kendrick wrote: > I have one table where the user has pasted some notes from another > application into a 'comments' field of type 'memo' and mdb-export > segfaults > when it gets to these notes - they are quite long and contain tabs. > > I am not sure whether it's the length of the data or that it includes > non-ascii characters, but I just wondered if anyone had any ideas > tracking > down the problem - I have had a look at the source code for mdb- > export but I > don't know C very well so I'm not getting very far. I get the > feeling it's a > buffer overflow or character (tab?) handling issue somewhere? > > Any thoughts on where to look? > > Thanks > > > ---------------------------------------------------------------------- > --- > This SF.Net email is sponsored by the Moblin Your Move Developer's > challenge > Build the coolest Linux based applications with Moblin SDK & win > great prizes > Grand prize is a trip for two to an Open Source event anywhere in > the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > mdbtools-dev mailing list > mdb...@li... > https://lists.sourceforge.net/lists/listinfo/mdbtools-dev -- Brett Hutley [Head of Product Development, Stimuli Limited] [b] mailto:br...@st... http://www.stimuli.org/ [h] mailto:br...@hu... http://hutley.net/brett/ |