Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
L
LabComm
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Anders Blomdell
LabComm
Commits
c53c6ec3
Commit
c53c6ec3
authored
11 years ago
by
Sven Robertz
Browse files
Options
Downloads
Patches
Plain Diff
fixed(?) stack leak
parent
576f596c
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
lib/c/experimental/labcomm_sig_parser.c
+17
-7
17 additions, 7 deletions
lib/c/experimental/labcomm_sig_parser.c
lib/c/experimental/labcomm_sig_parser.h
+42
-41
42 additions, 41 deletions
lib/c/experimental/labcomm_sig_parser.h
with
59 additions
and
48 deletions
lib/c/experimental/labcomm_sig_parser.c
+
17
−
7
View file @
c53c6ec3
...
@@ -95,7 +95,9 @@ void dumpPtrStack(buffer *b) {
...
@@ -95,7 +95,9 @@ void dumpPtrStack(buffer *b) {
void
push_val
(
buffer
*
b
,
unsigned
int
e
)
{
void
push_val
(
buffer
*
b
,
unsigned
int
e
)
{
b
->
val_stack
[
b
->
val_top
]
=
e
;
b
->
val_stack
[
b
->
val_top
]
=
e
;
b
->
val_top
=
b
->
val_top
-
1
;
b
->
val_top
=
b
->
val_top
-
1
;
#ifdef DEBUG
dumpValStack
(
b
);
dumpValStack
(
b
);
#endif
}
}
unsigned
int
pop_val
(
buffer
*
b
)
{
unsigned
int
pop_val
(
buffer
*
b
)
{
b
->
val_top
=
b
->
val_top
+
1
;
b
->
val_top
=
b
->
val_top
+
1
;
...
@@ -104,7 +106,9 @@ unsigned int pop_val(buffer *b) {
...
@@ -104,7 +106,9 @@ unsigned int pop_val(buffer *b) {
void
push_ptr
(
buffer
*
b
,
void
*
e
)
{
void
push_ptr
(
buffer
*
b
,
void
*
e
)
{
b
->
ptr_stack
[
b
->
ptr_top
]
=
e
;
b
->
ptr_stack
[
b
->
ptr_top
]
=
e
;
b
->
ptr_top
=
b
->
ptr_top
-
1
;
b
->
ptr_top
=
b
->
ptr_top
-
1
;
#ifdef DEBUG
dumpPtrStack
(
b
);
dumpPtrStack
(
b
);
#endif
}
}
void
*
pop_ptr
(
buffer
*
b
)
{
void
*
pop_ptr
(
buffer
*
b
)
{
b
->
ptr_top
=
b
->
ptr_top
+
1
;
b
->
ptr_top
=
b
->
ptr_top
+
1
;
...
@@ -304,6 +308,7 @@ int accept_packet(buffer *d) {
...
@@ -304,6 +308,7 @@ int accept_packet(buffer *d) {
unsigned
int
type
=
peek_varint
(
d
,
&
nbytes
)
;
unsigned
int
type
=
peek_varint
(
d
,
&
nbytes
)
;
if
(
type
==
TYPE_DECL
)
{
if
(
type
==
TYPE_DECL
)
{
advancen
(
d
,
nbytes
);
advancen
(
d
,
nbytes
);
int
b
=
accept_user_id
(
d
);
if
(
accept_user_id
(
d
))
{
if
(
accept_user_id
(
d
))
{
unsigned
int
uid
=
pop_val
(
d
);
unsigned
int
uid
=
pop_val
(
d
);
VERBOSE_PRINTF
(
", name = "
);
VERBOSE_PRINTF
(
", name = "
);
...
@@ -419,6 +424,7 @@ static int accept_string(buffer *d){
...
@@ -419,6 +424,7 @@ static int accept_string(buffer *d){
push_val
(
d
,
len
);
push_val
(
d
,
len
);
return
TRUE
;
return
TRUE
;
}
}
/* pushes size and type id */
static
int
accept_type
(
buffer
*
d
){
static
int
accept_type
(
buffer
*
d
){
unsigned
char
nbytes
;
unsigned
char
nbytes
;
unsigned
int
type
=
peek_varint
(
d
,
&
nbytes
)
;
unsigned
int
type
=
peek_varint
(
d
,
&
nbytes
)
;
...
@@ -466,21 +472,24 @@ static int accept_type(buffer *d){
...
@@ -466,21 +472,24 @@ static int accept_type(buffer *d){
break
;
break
;
case
ARRAY_DECL
:
case
ARRAY_DECL
:
accept_array_decl
(
d
);
accept_array_decl
(
d
);
//push(d, pop(d)) == NOP
pop_val
(
d
);
// ignore element type
// push(d, pop(d) is a NOP --> leave size on stack
break
;
break
;
case
STRUCT_DECL
:
case
STRUCT_DECL
:
accept_struct_decl
(
d
);
accept_struct_decl
(
d
);
//push(d, pop(d)
) == NOP
//
push(d, pop(d)
is a NOP --> leave size on stack
break
;
break
;
default
:
default
:
printf
(
"accept_basic_type default (type==%x) should not happen
\n
"
,
type
);
printf
(
"accept_basic_type default (type==%x) should not happen
\n
"
,
type
);
push_val
(
d
,
0
);
push_val
(
d
,
0
);
push_val
(
d
,
type
);
return
FALSE
;
return
FALSE
;
}
}
push_val
(
d
,
type
);
push_val
(
d
,
type
);
return
TRUE
;
return
TRUE
;
}
}
/* pushes size and element type */
static
int
accept_array_decl
(
buffer
*
d
){
static
int
accept_array_decl
(
buffer
*
d
){
unsigned
char
nbytes
;
unsigned
char
nbytes
;
unsigned
int
tid
=
peek_varint
(
d
,
&
nbytes
)
;
unsigned
int
tid
=
peek_varint
(
d
,
&
nbytes
)
;
...
@@ -515,10 +524,10 @@ static int accept_array_decl(buffer *d){
...
@@ -515,10 +524,10 @@ static int accept_array_decl(buffer *d){
#endif
#endif
push_val
(
d
,
(
size
*
es
));
push_val
(
d
,
(
size
*
es
));
}
else
{
}
else
{
//HERE BE DRAGONS! shouldn't we push some (non-) size?
//HERE BE DRAGONS! push a (non-) size for variable size arrays?
push_val
(
d
,
0
);
}
}
//pop(d);
push_val
(
d
,
et
);
push_val
(
d
,
tid
);
return
TRUE
;
return
TRUE
;
}
else
{
}
else
{
printf
(
"accept_array_decl: type=%x, should not happen
\n
"
,
tid
);
printf
(
"accept_array_decl: type=%x, should not happen
\n
"
,
tid
);
...
@@ -554,7 +563,7 @@ static int accept_struct_decl(buffer *d){
...
@@ -554,7 +563,7 @@ static int accept_struct_decl(buffer *d){
}
}
}
}
/* pushes
name (if enabled) and
field size */
/* pushes field size */
static
int
accept_field
(
buffer
*
d
){
static
int
accept_field
(
buffer
*
d
){
VERBOSE_PRINTF
(
"field "
);
VERBOSE_PRINTF
(
"field "
);
accept_string
(
d
);
accept_string
(
d
);
...
@@ -566,7 +575,8 @@ static int accept_field(buffer *d){
...
@@ -566,7 +575,8 @@ static int accept_field(buffer *d){
VERBOSE_PRINTF
(
" : "
);
VERBOSE_PRINTF
(
" : "
);
accept_type
(
d
);
accept_type
(
d
);
pop_val
(
d
);
// ignore type, for now
pop_val
(
d
);
// ignore type, for now
//push(d, pop(d) == NOP , leave size on the stack
// push(pop() is really a NOP , leave size on the stack when debugging done
VERBOSE_PRINTF
(
" : "
);
VERBOSE_PRINTF
(
"
\n
"
);
VERBOSE_PRINTF
(
"
\n
"
);
}
}
static
int
accept_sample_data
(
buffer
*
d
){
static
int
accept_sample_data
(
buffer
*
d
){
...
...
This diff is collapsed.
Click to expand it.
lib/c/experimental/labcomm_sig_parser.h
+
42
−
41
View file @
c53c6ec3
...
@@ -11,11 +11,51 @@
...
@@ -11,11 +11,51 @@
#include
"../labcomm_private.h"
#include
"../labcomm_private.h"
#undef DEBUG
#undef DEBUG
#
un
def DEBUG_STACK
#def
ine
DEBUG_STACK
#undef QUIET //just print type and size when skipping data
#undef QUIET //just print type and size when skipping data
#undef VERBOSE // print in great detail
#undef VERBOSE // print in great detail
//XXX experimental settings, should probably be dynamic
#define MAX_SIGNATURES 10
#define MAX_NAME_LEN 32
#define MAX_SIG_LEN 128
#define STACK_SIZE 16
/* internal type: stack for the parser */
typedef
struct
{
unsigned
char
*
c
;
size_t
size
;
size_t
capacity
;
unsigned
int
idx
;
unsigned
int
val_top
;
int
*
val_stack
;
unsigned
int
ptr_top
;
void
**
ptr_stack
;
size_t
stacksize
;
int
current_decl_is_varsize
;
}
buffer
;
int
init_buffer
(
buffer
*
b
,
size_t
size
,
size_t
stacksize
)
;
int
read_file
(
FILE
*
f
,
buffer
*
b
);
int
accept_packet
(
buffer
*
d
);
labcomm_signature_t
*
get_sig_t
(
unsigned
int
uid
);
unsigned
int
get_signature_len
(
unsigned
int
uid
);
unsigned
char
*
get_signature_name
(
unsigned
int
uid
);
unsigned
char
*
get_signature
(
unsigned
int
uid
);
void
dump_signature
(
unsigned
int
uid
);
/* parse signature and skip the corresponding bytes in the buffer
*/
int
skip_packed_sample_data
(
buffer
*
d
,
labcomm_signature_t
*
sig
);
#ifdef QUIET
#ifdef QUIET
#define INFO_PRINTF(format, args...)
#define INFO_PRINTF(format, args...)
#undef VERBOSE
#undef VERBOSE
...
@@ -33,7 +73,7 @@
...
@@ -33,7 +73,7 @@
#undef EXIT_WHEN_RECEIVING_DATA
#undef EXIT_WHEN_RECEIVING_DATA
#def
ine
RETURN_STRINGS // not really tested
#
un
def RETURN_STRINGS // not really tested
#ifndef TRUE
#ifndef TRUE
...
@@ -58,43 +98,4 @@ typedef enum{
...
@@ -58,43 +98,4 @@ typedef enum{
TYPE_DOUBLE
=
LABCOMM_DOUBLE
,
TYPE_DOUBLE
=
LABCOMM_DOUBLE
,
TYPE_STRING
=
LABCOMM_STRING
TYPE_STRING
=
LABCOMM_STRING
}
labcomm_type
;
}
labcomm_type
;
/* internal type: stack for the parser */
typedef
struct
{
unsigned
char
*
c
;
size_t
size
;
size_t
capacity
;
unsigned
int
idx
;
unsigned
int
val_top
;
int
*
val_stack
;
unsigned
int
ptr_top
;
void
**
ptr_stack
;
size_t
stacksize
;
int
current_decl_is_varsize
;
}
buffer
;
int
init_buffer
(
buffer
*
b
,
size_t
size
,
size_t
stacksize
)
;
int
read_file
(
FILE
*
f
,
buffer
*
b
);
int
accept_packet
(
buffer
*
d
);
//XXX experimental
#define MAX_SIGNATURES 10
#define MAX_NAME_LEN 32
#define MAX_SIG_LEN 128
#define STACK_SIZE 16
labcomm_signature_t
*
get_sig_t
(
unsigned
int
uid
);
unsigned
int
get_signature_len
(
unsigned
int
uid
);
unsigned
char
*
get_signature_name
(
unsigned
int
uid
);
unsigned
char
*
get_signature
(
unsigned
int
uid
);
void
dump_signature
(
unsigned
int
uid
);
/* parse signature and skip the corresponding bytes in the buffer
*/
int
skip_packed_sample_data
(
buffer
*
d
,
labcomm_signature_t
*
sig
);
#endif
#endif
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment