Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:12.2
gcc41
gcc41-strncat-chk.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File gcc41-strncat-chk.patch of Package gcc41
2006-09-18 Jakub Jelinek <jakub@redhat.com> * tree-ssa-propagate.c (set_rhs): Copy EXPR_LOCATION if needed. * builtins.c (expand_builtin, maybe_emit_chk_warning): Handle BUILT_IN_STRNCAT_CHK. * gcc.dg/builtin-strncat-chk-1.c: New test. Index: gcc/tree-ssa-propagate.c =================================================================== --- gcc/tree-ssa-propagate.c.orig 2006-03-14 11:32:38.000000000 +0100 +++ gcc/tree-ssa-propagate.c 2009-11-20 13:42:09.000000000 +0100 @@ -584,6 +584,13 @@ set_rhs (tree *stmt_p, tree expr) else if (code == COMPOUND_EXPR) return false; + if (EXPR_HAS_LOCATION (stmt) + && EXPR_P (expr) + && ! EXPR_HAS_LOCATION (expr) + && TREE_SIDE_EFFECTS (expr) + && TREE_CODE (expr) != LABEL_EXPR) + SET_EXPR_LOCATION (expr, EXPR_LOCATION (stmt)); + switch (TREE_CODE (stmt)) { case RETURN_EXPR: Index: gcc/builtins.c =================================================================== --- gcc/builtins.c.orig 2006-10-09 12:05:44.000000000 +0200 +++ gcc/builtins.c 2009-11-20 13:42:09.000000000 +0100 @@ -6519,6 +6519,7 @@ expand_builtin (tree exp, rtx target, rt case BUILT_IN_STPCPY_CHK: case BUILT_IN_STRNCPY_CHK: case BUILT_IN_STRCAT_CHK: + case BUILT_IN_STRNCAT_CHK: case BUILT_IN_SNPRINTF_CHK: case BUILT_IN_VSNPRINTF_CHK: maybe_emit_chk_warning (exp, fcode); @@ -10181,6 +10182,11 @@ maybe_emit_chk_warning (tree exp, enum b arg_mask = 6; is_strlen = 1; break; + case BUILT_IN_STRNCAT_CHK: + /* For __strncat_chk the warning will be emitted only if overflowing + by at least strlen (dest) + 1 bytes. */ + arg_mask = 12; + break; case BUILT_IN_STRNCPY_CHK: arg_mask = 12; break; @@ -10218,6 +10224,22 @@ maybe_emit_chk_warning (tree exp, enum b if (! len || ! host_integerp (len, 1) || tree_int_cst_lt (len, size)) return; } + else if (fcode == BUILT_IN_STRNCAT_CHK) + { + tree src = TREE_VALUE (TREE_CHAIN (arglist)); + if (! src || ! host_integerp (len, 1) || tree_int_cst_lt (len, size)) + return; + src = c_strlen (src, 1); + if (! src || ! host_integerp (src, 1)) + { + locus = EXPR_LOCATION (exp); + warning (0, "%Hcall to %D might overflow destination buffer", + &locus, get_callee_fndecl (exp)); + return; + } + else if (tree_int_cst_lt (src, size)) + return; + } else if (! host_integerp (len, 1) || ! tree_int_cst_lt (size, len)) return; Index: gcc/testsuite/gcc.dg/builtin-strncat-chk-1.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gcc/testsuite/gcc.dg/builtin-strncat-chk-1.c 2009-11-20 13:42:09.000000000 +0100 @@ -0,0 +1,38 @@ +/* Test whether buffer overflow warnings for __strncat_chk builtin + are emitted properly. */ +/* { dg-do compile } */ +/* { dg-options "-O2 -std=gnu99" } */ + +extern void abort (void); + +#include "../gcc.c-torture/execute/builtins/chk.h" + +char buf1[20]; +char *q; + +void +test (int arg, ...) +{ + char *p = &buf1[10]; + + *p = 0; + strncat (p, "abcdefg", 9); + *p = 0; + strncat (p, "abcdefghi", 9); + *p = 0; + strncat (p, "abcdefghij", 9); + *p = 0; + strncat (p, "abcdefghi", 10); + *p = 0; + strncat (p, "abcdefghij", 10); /* { dg-warning "will always overflow" } */ + *p = 0; + strncat (p, "abcdefgh", 11); + *p = 0; + strncat (p, "abcdefghijkl", 11); /* { dg-warning "will always overflow" } */ + *p = 0; + strncat (p, q, 9); + *p = 0; + strncat (p, q, 10); /* { dg-warning "might overflow" } */ + *p = 0; + strncat (p, q, 11); /* { dg-warning "might overflow" } */ +}
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor