re PR target/53886 (Seg fault in sh_insn_length_adjustment)
authorOleg Endo <olegendo@gcc.gnu.org>
Tue, 10 Jul 2012 22:07:29 +0000 (22:07 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Tue, 10 Jul 2012 22:07:29 +0000 (22:07 +0000)
PR target/53886
* gcc.c-torture/compile/pr53886.c: New.

From-SVN: r189417

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr53886.c [new file with mode: 0644]

index ec072979525fa37f95c3dbfb27101cfa3019b480..3de157822f6de083c5c8e34f7609c9de56ecbff2 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-10  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/53886
+       * gcc.c-torture/compile/pr53886.c: New.
+
 2012-07-10  Dehao Chen  <dehao@google.com>
 
        * gcc.dg/debug_info_inline.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr53886.c b/gcc/testsuite/gcc.c-torture/compile/pr53886.c
new file mode 100644 (file)
index 0000000..89b6966
--- /dev/null
@@ -0,0 +1,68 @@
+/* PR target/53886  */
+typedef struct asn1_string_st ASN1_BIT_STRING;
+typedef struct bignum_st BIGNUM;
+typedef struct ec_group_st EC_GROUP;
+typedef struct ec_key_st EC_KEY;
+
+struct ec_key_st
+{
+  EC_GROUP *group;
+  BIGNUM *priv_key;
+  unsigned int enc_flag;
+}
+X9_62_PENTANOMIAL;
+typedef struct ec_privatekey_st
+{
+  ASN1_BIT_STRING *publicKey;
+}
+EC_PRIVATEKEY;
+
+extern EC_PRIVATEKEY* EC_PRIVATEKEY_new (void);
+extern void EC_PRIVATEKEY_free (EC_PRIVATEKEY*);
+extern unsigned char* CRYPTO_realloc (char*,int,const char*,int);
+
+int
+i2d_ECPrivateKey (EC_KEY * a, unsigned char **out)
+{
+  int ret = 0, ok = 0;
+  unsigned char *buffer = 0;
+  unsigned buf_len = 0, tmp_len;
+  EC_PRIVATEKEY *priv_key = 0;
+  if (a == 0 || a->group == 0 || a->priv_key == 0)
+    {
+      ERR_put_error (16, (192), ((3 | 64)),
+                    "",
+                    1234);
+      goto err;
+    }
+  if ((priv_key = EC_PRIVATEKEY_new ()) == 0)
+    {
+      ERR_put_error (16, (192), ((1 | 64)),
+                    "",
+                    1241);
+      goto err;
+    }
+  if (!(a->enc_flag & 0x002))
+    {
+      if (priv_key->publicKey == 0)
+       {
+         goto err;
+       }
+      if (tmp_len > buf_len)
+       {
+         unsigned char *tmp_buffer =
+           CRYPTO_realloc ((char *) buffer, (int) tmp_len, "", 1293);
+         buffer = tmp_buffer;
+       }
+    }
+  if ((ret = i2d_EC_PRIVATEKEY (priv_key, out)) == 0)
+    {
+    }
+  ok = 1;
+err:
+  if (buffer)
+    CRYPTO_free (buffer);
+  if (priv_key)
+    EC_PRIVATEKEY_free (priv_key);
+  return (ok ? ret : 0);
+}