On Thu, Sep 26, 2013 at 7:24 AM, Tsutomu Oyamada <[email protected]>wrote:

> Hi, Dave
>
> I've re-build of clamAV.
> As a result, confirmed that work just fine.
> Your advice was valid.
> Thank you very much.
>
> T.Oyamada
>
> On Thu, 26 Sep 2013 09:07:53 +0900
> Tsutomu Oyamada <[email protected]> wrote:
>
> > Hi, Dave.
> >
> > Thanks your advice.
> >
> > I changed type of fp_digit.
> > and I tried test program.
> >
> > 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
> >
> > It works good.
> > I will try re-compile clamav.
> > Later report the results.
> >
> > T.Oyamada
> >
> > On Wed, 25 Sep 2013 17:13:58 -0400
> > David Raynor <[email protected]> wrote:
> >
> > > On Wed, Sep 25, 2013 at 2:55 PM, David Raynor <[email protected]
> >wrote:
> > >
> > > >
> > > > On Tue, Sep 24, 2013 at 9:47 PM, Tsutomu Oyamada <
> [email protected]>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 <[email protected]> wrote:
> > > >>
> > > >> > On Tue, Sep 24, 2013 at 4:37 PM, David Raynor <
> [email protected]
> > > >> >wrote:
> > > >> >
> > > >> > > On Tue, Sep 24, 2013 at 2:05 AM, Tsutomu Oyamada <
> > > >> [email protected]>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
> > > >> > > [email protected]
> > > >> > >
> > > >> >
> > > >> > 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
> > > >> > [email protected]
> > > >> > _______________________________________________
> > > >> > 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
> > > > [email protected]
> > > >
> > >
> > > 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
> > > [email protected]
> > > _______________________________________________
> > > 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
> >
>
>
> _______________________________________________
> http://lurker.clamav.net/list/clamav-devel.html
> Please submit your patches to our Bugzilla: http://bugs.clamav.net
>


Great! I am glad it works. I have recorded all of this in Bugzilla for
reference as bug #9017, including the fix.

This issue should also occur for any use of the tomsfastmath code on your
platform, based on the code in tomsfastmath/src/headers/tfm.h. For ClamAV
purposes, we do have type size checks run by configure that create defined
values we can reference.

Dave R.

-- 
---
Dave Raynor
Sourcefire Vulnerability Research Team
[email protected]
_______________________________________________
http://lurker.clamav.net/list/clamav-devel.html
Please submit your patches to our Bugzilla: http://bugs.clamav.net

Reply via email to