On Wed, Sep 25, 2013 at 2:55 PM, David Raynor <dray...@sourcefire.com>wrote:

>
> On Tue, Sep 24, 2013 at 9:47 PM, Tsutomu Oyamada 
> <oyam...@promark-inc.com>wrote:
>
>> Hi, Dave.
>>
>> Thanks for your advice and quick respons.
>> I tried it.
>>
>> ----
>> 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
>> fp_word: 8
>> ulong64: 8
>> unsigned long long: 8
>> CRYPT not defined
>> ----
>>
>> What should I just do in order to fix this problem?
>> Please teach me how to set size of fp_word to 16.
>>
>> T.Oyamada
>>
>> On Tue, 24 Sep 2013 18:16:26 -0400
>> David Raynor <dray...@sourcefire.com> wrote:
>>
>> > 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
>> >
>>
>>
>> _______________________________________________
>> http://lurker.clamav.net/list/clamav-devel.html
>> Please submit your patches to our Bugzilla: http://bugs.clamav.net
>>
>
> From what I have read, gcc on s390 has a compiler option for setting the
> size of "long double" type (64 or 128), but not "long long int". I expect
> what we have to do instead is leave fp_word as 64 and tune down the
> fp_digit to 32. That code block in bignum_fast.h is taken from tomsfastmath
> and looks like it is aimed at 32-bit support anyway. This changes the
> maximum ranges of the math calculations, but should be sufficient for our
> needs (again, similar code runs on 32-bit).
>
> Please try changing this line: (bignum_fast.h:line 252)
>    typedef unsigned long      fp_digit;
> to this line:
>    typedef unsigned int      fp_digit;
>
> If this is successful for you, we can determine the appropriate defines to
> use to make this more portable.
>
> Dave R.
>
> --
> ---
> Dave Raynor
> Sourcefire Vulnerability Research Team
> dray...@sourcefire.com
>

Ideally, you should get these results from the test program after the
change:

fp_digit: 4
unsigned long: 8
FP_64BIT not defined
DIGIT_BIT: 32
CHAR_BIT: 8
FP_MAX_SIZE: 8448
FP_SIZE: 264
TFM_ASM not defined
fp_word: 8
ulong64: 8
unsigned long long: 8
CRYPT not defined

Except for the sizeof(unsigned long), this would match the values I see on
a 32-bit test box.

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

Reply via email to