=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/dc/bcode.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- src/usr.bin/dc/bcode.c 2006/01/16 08:09:25 1.33 +++ src/usr.bin/dc/bcode.c 2006/01/19 20:06:55 1.34 @@ -1,4 +1,4 @@ -/* $OpenBSD: bcode.c,v 1.33 2006/01/16 08:09:25 otto Exp $ */ +/* $OpenBSD: bcode.c,v 1.34 2006/01/19 20:06:55 otto Exp $ */ /* * Copyright (c) 2003, Otto Moerbeek @@ -17,7 +17,7 @@ */ #ifndef lint -static const char rcsid[] = "$OpenBSD: bcode.c,v 1.33 2006/01/16 08:09:25 otto Exp $"; +static const char rcsid[] = "$OpenBSD: bcode.c,v 1.34 2006/01/19 20:06:55 otto Exp $"; #endif /* not lint */ #include @@ -577,8 +577,8 @@ warnx("scale must be a nonnegative number"); else { scale = get_ulong(n); - if (scale != BN_MASK2) - bmachine.scale = scale; + if (scale != BN_MASK2 && scale <= UINT_MAX) + bmachine.scale = (u_int)scale; else warnx("scale too large"); } @@ -605,8 +605,8 @@ n = pop_number(); if (n != NULL) { base = get_ulong(n); - if (base != BN_MASK2 && base > 1) - bmachine.obase = base; + if (base != BN_MASK2 && base > 1 && base <= UINT_MAX) + bmachine.obase = (u_int)base; else warnx("output base must be a number greater than 1"); free_number(n); @@ -633,7 +633,7 @@ if (n != NULL) { base = get_ulong(n); if (base != BN_MASK2 && 2 <= base && base <= 16) - bmachine.ibase = base; + bmachine.ibase = (u_int)base; else warnx("input base must be a number between 2 and 16 " "(inclusive)"); @@ -707,7 +707,7 @@ num_digits(void) { struct value *value; - u_int digits; + size_t digits; struct number *n = NULL; value = pop(); @@ -1196,8 +1196,9 @@ b = BN_get_word(p->number); m = max(a->scale, bmachine.scale); - scale = a->scale * b; - if (scale > m || b == BN_MASK2) + scale = a->scale * (u_int)b; + if (scale > m || (a->scale > 0 && (b == BN_MASK2 || + b > UINT_MAX))) scale = m; }