[PATCH] Replace deliberate division by zero with raise(SIGFPE).
Xi Wang
xi.wang at gmail.com
Sat Jul 14 23:39:10 CEST 2012
* mpi/mpi-pow.c (gcry_mpi_powm): Replace 1 / msize.
* mpi/mpih-div.c (_gcry_mpih_divrem): Replace 1 / dsize.
1) Division by zero doesn't "provoke a signal" on architectures
like PowerPC.
2) C compilers like clang will optimize away these divisions, even
though the code tries "to make the compiler not remove" them.
---
mpi/mpi-pow.c | 6 +++++-
mpi/mpih-div.c | 6 +++---
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/mpi/mpi-pow.c b/mpi/mpi-pow.c
index 33bbebe..c1cd3ec 100644
--- a/mpi/mpi-pow.c
+++ b/mpi/mpi-pow.c
@@ -31,6 +31,7 @@
#include "mpi-internal.h"
#include "longlong.h"
+#include "g10lib.h"
/****************
@@ -76,7 +77,10 @@ gcry_mpi_powm (gcry_mpi_t res,
ep = expo->d;
if (!msize)
- msize = 1 / msize; /* Provoke a signal. */
+ {
+ raise(SIGFPE);
+ goto leave;
+ }
if (!esize)
{
diff --git a/mpi/mpih-div.c b/mpi/mpih-div.c
index 224b810..dda53ad 100644
--- a/mpi/mpih-div.c
+++ b/mpi/mpih-div.c
@@ -30,6 +30,7 @@
#include <stdlib.h>
#include "mpi-internal.h"
#include "longlong.h"
+#include "g10lib.h"
#ifndef UMUL_TIME
#define UMUL_TIME 1
@@ -212,9 +213,8 @@ _gcry_mpih_divrem( mpi_ptr_t qp, mpi_size_t qextra_limbs,
switch(dsize) {
case 0:
- /* We are asked to divide by zero, so go ahead and do it! (To make
- the compiler not remove this statement, return the value.) */
- return 1 / dsize;
+ raise(SIGFPE);
+ break;
case 1:
{
--
1.7.9.5
On 7/15/12 4:46 AM, Xi Wang wrote:
> Hi,
>
> There are two occurrences of intentional division by zero in mpi.
> Division by zero is undefined behavior in C, and it may not work
> as intended.
>
> 1) Division by zero doesn't "provoke a signal" on architectures
> like PowerPC.
>
> 2) C compilers like clang will optimize away these divisions, even
> though the code tries "to make the compiler not remove" them.
>
> gcry_mpi_powm() at mpi/mpi-pow.c:78
>
> if (!msize)
> msize = 1 / msize; /* Provoke a signal. */
>
> _gcry_mpih_divrem() at mpi/mpih-div.c:213
>
> switch(dsize) {
> case 0:
> /* We are asked to divide by zero, so go ahead and do it! (To make
> the compiler not remove this statement, return the value.) */
> return 1 / dsize;
>
> How about using something like signal(SIGFPE) instead?
>
> - xi
>
More information about the Gcrypt-devel
mailing list