Browse code

enhance CLI_ISCONTAINED checks, reorder checks

git-svn: trunk@3586

Török Edvin authored on 2008/02/06 06:09:56
Showing 3 changed files
... ...
@@ -1,3 +1,7 @@
1
+Tue Feb  5 22:51:39 EET 2008 (edwin)
2
+------------------------------------
3
+  * configure.in, configure: enhance CLI_ISCONTAINED checks, reorder checks
4
+
1 5
 Tue Feb  5 20:06:28 EET 2008 (edwin)
2 6
 ------------------------------------
3 7
   * libclamav/lzma_iface.[ch], nsis/nulsft.c:
... ...
@@ -10404,8 +10404,8 @@ fi
10404 10404
 
10405 10405
 
10406 10406
 
10407
-{ echo "$as_me:$LINENO: checking for gcc bug PR28045" >&5
10408
-echo $ECHO_N "checking for gcc bug PR28045... $ECHO_C" >&6; }
10407
+{ echo "$as_me:$LINENO: checking for gcc bug PR26763-2" >&5
10408
+echo $ECHO_N "checking for gcc bug PR26763-2... $ECHO_C" >&6; }
10409 10409
 if test "$cross_compiling" = yes; then
10410 10410
   { echo "$as_me:$LINENO: result: cross-compiling, assumed ok" >&5
10411 10411
 echo "${ECHO_T}cross-compiling, assumed ok" >&6; }
... ...
@@ -10417,24 +10417,21 @@ cat confdefs.h >>conftest.$ac_ext
10417 10417
 cat >>conftest.$ac_ext <<_ACEOF
10418 10418
 /* end confdefs.h.  */
10419 10419
 
10420
-/* (C) Andrew Pinski */
10420
+/* (C) Richard Guenther */
10421 10421
 extern void abort(void);
10422
-struct a
10423
-{
10424
-   unsigned int bits : 1;
10425
-   signed long val : ((sizeof(long) * 8) - 1);
10426
-};
10427
-int Fnegate (struct a b)
10422
+
10423
+int try (char *a, int d)
10428 10424
 {
10429
-  if ((-((long)b.val)) <= ((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))
10430
-      && (-((long)b.val)) >= (-(((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))) - 1))
10431
-     return 0 ;
10432
-  abort ();
10425
+  return a + d > a;
10433 10426
 }
10434
-int main ()
10427
+
10428
+int main(void)
10435 10429
 {
10436
-  struct a b = {1, 1};
10437
-  Fnegate (b);
10430
+  char bla[100];
10431
+
10432
+  if (try (bla + 50, -1))
10433
+    abort ();
10434
+
10438 10435
   return 0;
10439 10436
 }
10440 10437
 
... ...
@@ -10467,8 +10464,8 @@ echo "$as_me: failed program was:" >&5
10467 10467
 sed 's/^/| /' conftest.$ac_ext >&5
10468 10468
 
10469 10469
 ( exit $ac_status )
10470
-{ { echo "$as_me:$LINENO: error: your compiler has gcc PR28045 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28045" >&5
10471
-echo "$as_me: error: your compiler has gcc PR28045 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28045" >&2;}
10470
+{ { echo "$as_me:$LINENO: error: your compiler has gcc PR26763-2 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26763" >&5
10471
+echo "$as_me: error: your compiler has gcc PR26763-2 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26763" >&2;}
10472 10472
    { (exit 1); exit 1; }; }
10473 10473
 fi
10474 10474
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
... ...
@@ -10476,8 +10473,8 @@ fi
10476 10476
 
10477 10477
 
10478 10478
 
10479
-{ echo "$as_me:$LINENO: checking for gcc bug PR26763-2" >&5
10480
-echo $ECHO_N "checking for gcc bug PR26763-2... $ECHO_C" >&6; }
10479
+{ echo "$as_me:$LINENO: checking for valid code generation of CLI_ISCONTAINED" >&5
10480
+echo $ECHO_N "checking for valid code generation of CLI_ISCONTAINED... $ECHO_C" >&6; }
10481 10481
 if test "$cross_compiling" = yes; then
10482 10482
   { echo "$as_me:$LINENO: result: cross-compiling, assumed ok" >&5
10483 10483
 echo "${ECHO_T}cross-compiling, assumed ok" >&6; }
... ...
@@ -10489,22 +10486,61 @@ cat confdefs.h >>conftest.$ac_ext
10489 10489
 cat >>conftest.$ac_ext <<_ACEOF
10490 10490
 /* end confdefs.h.  */
10491 10491
 
10492
-/* (C) Richard Guenther */
10492
+#include <stdio.h>
10493
+static struct v{
10494
+	char* dst;
10495
+	unsigned int dsize;
10496
+	unsigned int dcur;
10497
+	unsigned int backsize;
10498
+	signed int unp_offset;
10499
+} values[] = {
10500
+	{(char*)0xf78ab008, 0x2e000, 1, 4, -1594},
10501
+	{(char*)0xb7af1008, 0x2e000, 1, 4, -1594}
10502
+
10503
+};
10493 10504
 extern void abort(void);
10494 10505
 
10495
-int try (char *a, int d)
10506
+#define CLI_ISCONTAINED(bb, bb_size, sb, sb_size)	\
10507
+    (bb_size > 0 && sb_size > 0 && sb_size <= bb_size	\
10508
+     && sb >= bb && sb + sb_size <= bb + bb_size && sb + sb_size > bb)
10509
+
10510
+int crashtest()
10496 10511
 {
10497
-  return a + d > a;
10512
+	unsigned int backsize, dcur,i;
10513
+	int dval=0x12000, unp_offset;
10514
+	int* dsize = &dval;
10515
+	char* dst = (char*)0x12000;
10516
+	while(1) {
10517
+		backsize=4;
10518
+		dcur=0;
10519
+		unp_offset=0x800002c7;
10520
+
10521
+		if (!CLI_ISCONTAINED(dst, *dsize, dst+dcur+unp_offset, backsize) || !CLI_ISCONTAINED(dst, *dsize, dst+dcur, backsize) || unp_offset >=0)
10522
+			return -1;
10523
+		abort();
10524
+	}
10525
+	return 0;
10498 10526
 }
10499 10527
 
10500
-int main(void)
10528
+int main()
10501 10529
 {
10502
-  char bla[100];
10503
-
10504
-  if (try (bla + 50, -1))
10505
-    abort ();
10530
+	int i;
10531
+	for(i=0;i<sizeof(values)/sizeof(values[0]);i++) {
10532
+		struct v* v= &values[i];
10533
+		char* dst = v->dst;
10534
+		unsigned int* dsize = &v->dsize;
10535
+		unsigned int dcur = v->dcur;
10536
+		unsigned int backsize = v->backsize-1;
10537
+		signed int  unp_offset = v->unp_offset;
10506 10538
 
10507
-  return 0;
10539
+		if(!CLI_ISCONTAINED(dst, *dsize, dst+dcur+unp_offset, backsize) ||
10540
+				!CLI_ISCONTAINED(dst, *dsize,dst+dcur,backsize) || unp_offset >= 0)  {
10541
+			continue;
10542
+		}
10543
+		abort();
10544
+	}
10545
+	crashtest();
10546
+	return 0;
10508 10547
 }
10509 10548
 
10510 10549
 _ACEOF
... ...
@@ -10536,8 +10572,8 @@ echo "$as_me: failed program was:" >&5
10536 10536
 sed 's/^/| /' conftest.$ac_ext >&5
10537 10537
 
10538 10538
 ( exit $ac_status )
10539
-{ { echo "$as_me:$LINENO: error: your compiler has gcc PR26763-2 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26763" >&5
10540
-echo "$as_me: error: your compiler has gcc PR26763-2 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26763" >&2;}
10539
+{ { echo "$as_me:$LINENO: error: your compiler has a bug that causes clamav bug no. 670, use a different compiler, see http://bugs.clamav.net/bugzilla/show_bug.cgi?id=670" >&5
10540
+echo "$as_me: error: your compiler has a bug that causes clamav bug no. 670, use a different compiler, see http://bugs.clamav.net/bugzilla/show_bug.cgi?id=670" >&2;}
10541 10541
    { (exit 1); exit 1; }; }
10542 10542
 fi
10543 10543
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
... ...
@@ -10545,8 +10581,8 @@ fi
10545 10545
 
10546 10546
 
10547 10547
 
10548
-{ echo "$as_me:$LINENO: checking for valid code generation of CLI_ISCONTAINED" >&5
10549
-echo $ECHO_N "checking for valid code generation of CLI_ISCONTAINED... $ECHO_C" >&6; }
10548
+{ echo "$as_me:$LINENO: checking for gcc bug PR28045" >&5
10549
+echo $ECHO_N "checking for gcc bug PR28045... $ECHO_C" >&6; }
10550 10550
 if test "$cross_compiling" = yes; then
10551 10551
   { echo "$as_me:$LINENO: result: cross-compiling, assumed ok" >&5
10552 10552
 echo "${ECHO_T}cross-compiling, assumed ok" >&6; }
... ...
@@ -10558,42 +10594,25 @@ cat confdefs.h >>conftest.$ac_ext
10558 10558
 cat >>conftest.$ac_ext <<_ACEOF
10559 10559
 /* end confdefs.h.  */
10560 10560
 
10561
-#include <stdio.h>
10562
-static struct v{
10563
-	char* dst;
10564
-	unsigned long dsize;
10565
-	unsigned long dcur;
10566
-	unsigned long backsize;
10567
- 	signed long unp_offset;
10568
-} values[] = {
10569
-	{(char*)0xf78ab008, 0x2e000, 1, 4, 0xfffff9f3},
10570
-	{(char*)0xb7af1008, 0x2e000, 1, 4, 0xfffff9f3}
10571
-
10572
-};
10561
+/* (C) Andrew Pinski */
10573 10562
 extern void abort(void);
10574
-
10575
-#define CLI_ISCONTAINED(bb, bb_size, sb, sb_size)	\
10576
-    (bb_size > 0 && sb_size > 0 && sb_size <= bb_size	\
10577
-     && sb >= bb && sb + sb_size <= bb + bb_size && sb + sb_size > bb)
10578
-
10579
-int main()
10563
+struct a
10580 10564
 {
10581
-	int i;
10582
-	for(i=0;i<sizeof(values)/sizeof(values[0]);i++) {
10583
-		struct v* v= &values[i];
10584
-		char* dst = v->dst;
10585
-		unsigned long* dsize = &v->dsize;
10586
-		unsigned long dcur = v->dcur;
10587
-		unsigned long backsize = v->backsize-1;
10588
-		signed long  unp_offset = v->unp_offset;
10589
-
10590
-		if(!CLI_ISCONTAINED(dst, *dsize, dst+dcur+unp_offset, backsize) ||
10591
-				!CLI_ISCONTAINED(dst, *dsize,dst+dcur,backsize) || unp_offset >= 0)  {
10592
-			continue;
10593
-		}
10594
-		abort();
10595
-	}
10596
-	return 0;
10565
+   unsigned int bits : 1;
10566
+   signed long val : ((sizeof(long) * 8) - 1);
10567
+};
10568
+int Fnegate (struct a b)
10569
+{
10570
+  if ((-((long)b.val)) <= ((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))
10571
+      && (-((long)b.val)) >= (-(((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))) - 1))
10572
+     return 0 ;
10573
+  abort ();
10574
+}
10575
+int main ()
10576
+{
10577
+  struct a b = {1, 1};
10578
+  Fnegate (b);
10579
+  return 0;
10597 10580
 }
10598 10581
 
10599 10582
 _ACEOF
... ...
@@ -10625,8 +10644,8 @@ echo "$as_me: failed program was:" >&5
10625 10625
 sed 's/^/| /' conftest.$ac_ext >&5
10626 10626
 
10627 10627
 ( exit $ac_status )
10628
-{ { echo "$as_me:$LINENO: error: your compiler has a bug that causes clamav 670, use a different compiler, see http://bugs.clamav.net/bugzilla/show_bug.cgi?id=670" >&5
10629
-echo "$as_me: error: your compiler has a bug that causes clamav 670, use a different compiler, see http://bugs.clamav.net/bugzilla/show_bug.cgi?id=670" >&2;}
10628
+{ { echo "$as_me:$LINENO: error: your compiler has gcc PR28045 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28045" >&5
10629
+echo "$as_me: error: your compiler has gcc PR28045 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28045" >&2;}
10630 10630
    { (exit 1); exit 1; }; }
10631 10631
 fi
10632 10632
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
... ...
@@ -10658,6 +10677,7 @@ fi
10658 10658
 
10659 10659
 
10660 10660
 
10661
+
10661 10662
 for ac_header in stdint.h unistd.h sys/int_types.h dlfcn.h inttypes.h sys/inttypes.h memory.h ndir.h stdlib.h strings.h string.h sys/mman.h sys/param.h sys/stat.h sys/types.h malloc.h poll.h limits.h sys/filio.h sys/uio.h termios.h stdbool.h pwd.h grp.h
10662 10663
 do
10663 10664
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
... ...
@@ -116,34 +116,6 @@ int main()
116 116
 ], [AC_MSG_RESULT([ok, bug not present])],
117 117
 [AC_MSG_ERROR([your compiler has gcc PR27603 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27603])], [AC_MSG_RESULT([cross-compiling, assumed ok])])
118 118
 
119
-dnl Check if compiler produces invalid code on gcc PR28045 (affects upx.c)
120
-dnl testcase from gcc testsuite
121
-AC_MSG_CHECKING([for gcc bug PR28045])
122
-AC_TRY_RUN(
123
-	   [
124
-/* (C) Andrew Pinski */	   
125
-extern void abort(void);
126
-struct a
127
-{
128
-   unsigned int bits : 1;
129
-   signed long val : ((sizeof(long) * 8) - 1);
130
-};
131
-int Fnegate (struct a b)
132
-{
133
-  if ((-((long)b.val)) <= ((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))
134
-      && (-((long)b.val)) >= (-(((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))) - 1))
135
-     return 0 ;
136
-  abort ();
137
-}
138
-int main ()
139
-{
140
-  struct a b = {1, 1};
141
-  Fnegate (b);
142
-  return 0;
143
-}
144
-], [AC_MSG_RESULT([ok, bug not present])],
145
-[AC_MSG_ERROR([your compiler has gcc PR28045 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28045])], [AC_MSG_RESULT([cross-compiling, assumed ok])])
146
-
147 119
 dnl Check if compiler produces invalid code on gcc PR26763-2 (affects upx.c)
148 120
 dnl testcase from gcc testsuite
149 121
 AC_MSG_CHECKING([for gcc bug PR26763-2])
... ...
@@ -172,17 +144,17 @@ int main(void)
172 172
 dnl Check if compiler produces invalid code on own testcase based on upx.c
173 173
 AC_MSG_CHECKING([for valid code generation of CLI_ISCONTAINED])
174 174
 AC_TRY_RUN(
175
-	   [	   
175
+	   [
176 176
 #include <stdio.h>
177 177
 static struct v{
178 178
 	char* dst;
179
-	unsigned long dsize;
180
-	unsigned long dcur;
181
-	unsigned long backsize;
182
- 	signed long unp_offset;
179
+	unsigned int dsize;
180
+	unsigned int dcur;
181
+	unsigned int backsize;
182
+	signed int unp_offset;
183 183
 } values[] = {
184
-	{(char*)0xf78ab008, 0x2e000, 1, 4, 0xfffff9f3},
185
-	{(char*)0xb7af1008, 0x2e000, 1, 4, 0xfffff9f3}
184
+	{(char*)0xf78ab008, 0x2e000, 1, 4, -1594},
185
+	{(char*)0xb7af1008, 0x2e000, 1, 4, -1594}
186 186
 
187 187
 };
188 188
 extern void abort(void);
... ...
@@ -191,16 +163,34 @@ extern void abort(void);
191 191
     (bb_size > 0 && sb_size > 0 && sb_size <= bb_size	\
192 192
      && sb >= bb && sb + sb_size <= bb + bb_size && sb + sb_size > bb)
193 193
 
194
+int crashtest()
195
+{
196
+	unsigned int backsize, dcur,i;
197
+	int dval=0x12000, unp_offset;
198
+	int* dsize = &dval;
199
+	char* dst = (char*)0x12000;
200
+	while(1) {
201
+		backsize=4;
202
+		dcur=0;
203
+		unp_offset=0x800002c7;
204
+
205
+		if (!CLI_ISCONTAINED(dst, *dsize, dst+dcur+unp_offset, backsize) || !CLI_ISCONTAINED(dst, *dsize, dst+dcur, backsize) || unp_offset >=0)
206
+			return -1;
207
+		abort();
208
+	}
209
+	return 0;
210
+}
211
+
194 212
 int main()
195 213
 {
196 214
 	int i;
197 215
 	for(i=0;i<sizeof(values)/sizeof(values[0]);i++) {
198 216
 		struct v* v= &values[i];
199 217
 		char* dst = v->dst;
200
-		unsigned long* dsize = &v->dsize;
201
-		unsigned long dcur = v->dcur;
202
-		unsigned long backsize = v->backsize-1;
203
-		signed long  unp_offset = v->unp_offset;
218
+		unsigned int* dsize = &v->dsize;
219
+		unsigned int dcur = v->dcur;
220
+		unsigned int backsize = v->backsize-1;
221
+		signed int  unp_offset = v->unp_offset;
204 222
 
205 223
 		if(!CLI_ISCONTAINED(dst, *dsize, dst+dcur+unp_offset, backsize) ||
206 224
 				!CLI_ISCONTAINED(dst, *dsize,dst+dcur,backsize) || unp_offset >= 0)  {
... ...
@@ -208,10 +198,40 @@ int main()
208 208
 		}
209 209
 		abort();
210 210
 	}
211
+	crashtest();
211 212
 	return 0;
212 213
 }
213 214
 ], [AC_MSG_RESULT([ok, bug not present])],
214
-[AC_MSG_ERROR([your compiler has a bug that causes clamav 670, use a different compiler, see http://bugs.clamav.net/bugzilla/show_bug.cgi?id=670])], [AC_MSG_RESULT([cross-compiling, assumed ok])])
215
+[AC_MSG_ERROR([your compiler has a bug that causes clamav bug no. 670, use a different compiler, see http://bugs.clamav.net/bugzilla/show_bug.cgi?id=670])], [AC_MSG_RESULT([cross-compiling, assumed ok])])
216
+
217
+dnl Check if compiler produces invalid code on gcc PR28045 (affects upx.c)
218
+dnl testcase from gcc testsuite
219
+AC_MSG_CHECKING([for gcc bug PR28045])
220
+AC_TRY_RUN(
221
+	   [
222
+/* (C) Andrew Pinski */
223
+extern void abort(void);
224
+struct a
225
+{
226
+   unsigned int bits : 1;
227
+   signed long val : ((sizeof(long) * 8) - 1);
228
+};
229
+int Fnegate (struct a b)
230
+{
231
+  if ((-((long)b.val)) <= ((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))
232
+      && (-((long)b.val)) >= (-(((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))) - 1))
233
+     return 0 ;
234
+  abort ();
235
+}
236
+int main ()
237
+{
238
+  struct a b = {1, 1};
239
+  Fnegate (b);
240
+  return 0;
241
+}
242
+], [AC_MSG_RESULT([ok, bug not present])],
243
+[AC_MSG_ERROR([your compiler has gcc PR28045 bug, use a different compiler, see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28045])], [AC_MSG_RESULT([cross-compiling, assumed ok])])
244
+
215 245
 
216 246
 AC_CHECK_HEADERS(stdint.h unistd.h sys/int_types.h dlfcn.h inttypes.h sys/inttypes.h memory.h ndir.h stdlib.h strings.h string.h sys/mman.h sys/param.h sys/stat.h sys/types.h malloc.h poll.h limits.h sys/filio.h sys/uio.h termios.h stdbool.h pwd.h grp.h)
217 247
 AC_CHECK_HEADER(syslog.h,AC_DEFINE(USE_SYSLOG,1,[use syslog]),)