diff options
author | hunt <hunt> | 2007-03-19 03:00:56 +0000 |
---|---|---|
committer | hunt <hunt> | 2007-03-19 03:00:56 +0000 |
commit | 99c3c059961e9abdf76b92e9ab22fe26b929ec20 (patch) | |
tree | faed2e82cc7dc3f0d9abd15721715819f9ce23b6 /runtime/staprun | |
parent | 0b0df798871e79949206c55a2a69cb44cd8930c5 (diff) | |
download | systemtap-steved-99c3c059961e9abdf76b92e9ab22fe26b929ec20.tar.gz systemtap-steved-99c3c059961e9abdf76b92e9ab22fe26b929ec20.tar.xz systemtap-steved-99c3c059961e9abdf76b92e9ab22fe26b929ec20.zip |
2007-03-18 Martin Hunt <hunt@redhat.com>
* staprun.h (err): Define.
* symbols.c (get_sections): More overflow checking.
Diffstat (limited to 'runtime/staprun')
-rw-r--r-- | runtime/staprun/ChangeLog | 4 | ||||
-rw-r--r-- | runtime/staprun/staprun.h | 2 | ||||
-rw-r--r-- | runtime/staprun/symbols.c | 19 |
3 files changed, 20 insertions, 5 deletions
diff --git a/runtime/staprun/ChangeLog b/runtime/staprun/ChangeLog index 899e1269..c55e8850 100644 --- a/runtime/staprun/ChangeLog +++ b/runtime/staprun/ChangeLog @@ -1,4 +1,8 @@ 2007-03-18 Martin Hunt <hunt@redhat.com> + * staprun.h (err): Define. + * symbols.c (get_sections): More overflow checking. + +2007-03-18 Martin Hunt <hunt@redhat.com> * symbols.c (get_sections): Filter out .gnu.linkonce.* sections except for .gnu.linkonce.this_module. diff --git a/runtime/staprun/staprun.h b/runtime/staprun/staprun.h index 7a3fd00c..57a78809 100644 --- a/runtime/staprun/staprun.h +++ b/runtime/staprun/staprun.h @@ -40,6 +40,8 @@ #define dbug(args...) ; #endif /* DEBUG */ +#define err(args...) {fprintf(stderr,"%s:%d ",__FUNCTION__, __LINE__); fprintf(stderr,args); } + /* we define this so we are compatible with old transport, but we don't have to use it. */ #define STP_OLD_TRANSPORT #include "../transport/transport_msgs.h" diff --git a/runtime/staprun/symbols.c b/runtime/staprun/symbols.c index ce435929..ca18a8ca 100644 --- a/runtime/staprun/symbols.c +++ b/runtime/staprun/symbols.c @@ -78,12 +78,16 @@ static int get_sections(char *name, char *data_start, int datalen) /* create next section */ sec = (struct _stp_symbol *)data; + if (data - data_start + (int)sizeof(struct _stp_symbol) > datalen) + goto err1; data += sizeof(struct _stp_symbol); sec->addr = strtoul(buf,NULL,16); sec->symbol = (char *)(strdata - strdata_start); mod->num_sections++; /* now create string data for the section */ + if (strdata - strdata_start + strlen(strdata) >= sizeof(strdata_start)) + goto err1; strcpy(strdata, secname); strdata += strlen(secname) + 1; @@ -102,16 +106,21 @@ static int get_sections(char *name, char *data_start, int datalen) /* consolidate buffers */ len = strdata - strdata_start; - if ((len + data - data_start) > datalen) { - fprintf(stderr, "ERROR: overflowed buffers in get_sections. Size needed = %d\n", - (int)(len + data - data_start)); - cleanup_and_exit(0); - } + if ((len + data - data_start) > datalen) + goto err0; strdata = strdata_start; while (len--) *data++ = *strdata++; return data - data_start; + +err1: + close(fd); + closedir(secdir); +err0: + err("overflowed buffers.\n"); + cleanup_and_exit(0); + return 0; /* not reached */ } #undef SECDIR |