google / google/packetdrill

No so_instance cleanup can be done if PacketDrill test fails

Open
#64 6 comments 0 reactions 0 assignees View on GitHub
Dominant language
C
Stars
975
Forks
238
PR merge metrics
No merged PRs in 30d

Description

Hi,

I am working with using PacketDrill to test some network stacks using a shared object file.
I just noticed that when a test line in the PacketDrill script fails, the application exits without calling the free() function in the shared object file.

At the conclusion of each test, state_free (defined in run.c:122) is called and this frees the netdev and packet buffers and calls the free function in the so_instance where subsequent buffers in the shared object file can be freed.
```
close_all_fds(state);

netdev_free(state->netdev);
packets_free(state->packets);
code_free(state->code);

if (state->wire_client)
wire_client_free(state->wire_client);

if (state->so_instance)
so_instance_free(state->so_instance);
```

In run_system_call.c:3338, If an error occurs, the die function is called
```
die("%s:%d: runtime error in %s call: %s\n",
state->config->script_path, event->line_number,
syscall->name, error);
free(error);
```

And in the implementation of die in logging.c, no function is called to free the state
```
extern void __attribute__((noreturn)) die(char *format, ...)
{
va_list ap;

va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);

run_cleanup_command();

exit(EXIT_FAILURE);
}
```

As a result, when an error occurs during a test, the cleanup is not done completely.

Is this an expected behavior? If I want to call a function on my shared object file at the failure of each test, does the current PacketDrill implementation provide any support?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.