On Tue, Sep 24, 2013 at 4:37 PM, David Raynor <dray...@sourcefire.com>wrote:
> On Tue, Sep 24, 2013 at 2:05 AM, Tsutomu Oyamada > <oyam...@promark-inc.com>wrote: > >> Hi, >> >> I investigated the value using the following programs. >> >> ---- >> #include "stdlib.h" >> #include "bignum_fast.h" >> >> int main(int argc, char **argv) { >> >> printf("fp_digit: %d\n",sizeof(fp_digit)); >> printf("unsigned long: %d\n",sizeof(unsigned long)); >> >> #ifdef FP_64BIT >> printf("FP_64BIT: %d\n",FP_64BIT); >> #else >> printf("FP_64BIT not defined\n"); >> #endif >> >> #ifdef DIGIT_BIT >> printf("DIGIT_BIT: %d\n",DIGIT_BIT); >> #else >> printf("DIGIT_BIT not defined\n"); >> #endif >> >> #ifdef CHAR_BIT >> printf("CHAR_BIT: %d\n",CHAR_BIT); >> #else >> printf("CHAR_BIT not defined\n"); >> #endif >> >> #ifdef FP_MAX_SIZE >> printf("FP_MAX_SIZE: %d\n",FP_MAX_SIZE); >> #else >> printf("FP_MAX_SIZE not defined\n"); >> #endif >> >> #ifdef FP_SIZE >> printf("FP_SIZE: %d\n",FP_SIZE); >> #else >> printf("FP_SIZE not defined\n"); >> #endif >> >> #ifdef TFM_ASM >> printf("TFM_ASM: defined\n"); >> #else >> printf("TFM_ASM not defined\n"); >> #endif >> >> exit(0); >> } >> ---- >> >> The result was as follows. >> >> fp_digit: 8 >> unsigned long: 8 >> FP_64BIT not defined >> DIGIT_BIT: 64 >> CHAR_BIT: 8 >> FP_MAX_SIZE: 8704 >> FP_SIZE: 136 >> TFM_ASM not defined >> >> Can you find a problem by this result? >> >> Thanks. >> >> -- >> T.Oyamada >> >> _______________________________________________ >> http://lurker.clamav.net/list/clamav-devel.html >> Please submit your patches to our Bugzilla: http://bugs.clamav.net >> > > I do not have an immediate fix, but that information does give me some > leads. > > Basic issue: the tomsfastmath code must be falling through to the code > block on lines 280-302 of fp_mul_comba.c. > 1) The right shift causing the warning is DIGIT_BIT (64). > 2) The datatype being shifted is fp_word. > 3) fp_word defined as "typedef ulong64 fp_word;" from bignum_fast.h line > 253 > 4) ulong64 defined as "typedef unsigned long long ulong64;" from > bignum_fast.h line 248 > > I think the problem is one of three issues: > A) fp_word is not defined as a 64-bit datatype. > B) line 301 of tomsfastmath/mul/fp_mul_comba.c is mistakenly downcasting t > from fp_word to fp_digit before shifting. > C) s390 is not allowing use of all 64 bits of fp_word. > > Problems A or B are easier fixed than C. > > Please add these lines to your test and re-run: > > printf("fp_word: %d\n",sizeof(fp_word)); > printf("ulong64: %d\n",sizeof(ulong64)); > printf("unsigned long long: %d\n",sizeof(unsigned long long)); > #ifdef CRYPT > printf("CRYPT: defined\n"); > #else > printf("CRYPT not defined\n"); > #endif > > I would like to see the config.log file generated by running configure. It > would also be useful to have the full output from running make. The log > snip shows line 91, but I expect that it first warned about line 15. > > The easiest way to continue and share logfiles is via Bugzilla. Please > open a bug report on bugzilla.clamav.net on this issue. You can then > attach the files to that bug. > > Hope this helps, > > > Dave R. > > -- > --- > Dave Raynor > Sourcefire Vulnerability Research Team > dray...@sourcefire.com > I think I read something wrong, and I think I have an idea. It still needs to be confirmed by the additional test lines above. Re-reading the output, I think that the code is depending on fp_word being twice the size of fp_digit. Based on fp_digit size of 8 that means it would expect it to be 16. If sizeof(fp_word) is resolving to 8 and sizeof(fp_digit) is 8, that could be the problem. Then the fix would depend on whether fp_word can be made size 16 or must be constrained to size 8. Let me know what you find, Dave R. -- --- Dave Raynor Sourcefire Vulnerability Research Team dray...@sourcefire.com _______________________________________________ http://lurker.clamav.net/list/clamav-devel.html Please submit your patches to our Bugzilla: http://bugs.clamav.net