obmc-console: Address more instances of realloc() with size 0

There are some portability concerns around the behavior of passing
a zero size to realloc*() APIs. One instance caught by valgrind was
fixed in 2f1abc37384d ("Fix realloc() with size 0"). All invocations of
realloc*() APIs were evaluated, and those fixed here are the ones that
were at risk.

There's a broader problem of the code-base assuming realloc*() calls
don't return NULL (and malloc() also). The returned pointer is usually
written into the pointer object passed as the first argument, which
means the existing object would be leaked. Fixing that is a bigger
endeavor as the callers of the functions invoking realloc*() are often
written with the assumption that the result is not NULL. However, with
this change, at least one of the realloc*() concerns is put to rest.

Change-Id: I5dd6f4f8cc3164e400c87ea37afc350840a1865d
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
2 files changed
tree: 97a076a7a8b6ffe304ab03fb52b9d7a2592c7b3a
  1. conf/
  2. test/
  3. .clang-format
  4. .clang-tidy
  5. .gitignore
  6. .travis.yml
  7. CHANGELOG.md
  8. config.c
  9. console-client.c
  10. console-dbus.c
  11. console-server.c
  12. console-server.h
  13. console-socket.c
  14. LICENSE
  15. log-handler.c
  16. meson.build
  17. meson.options
  18. OWNERS
  19. README.md
  20. ringbuffer.c
  21. socket-handler.c
  22. tty-handler.c
  23. util.c
README.md

To Build

To build this project, run the following shell commands:

meson setup build
meson compile -C build

To test:

meson test -C build

To Run Server

Running the server requires a serial port (e.g. /dev/ttyS0):

touch obmc-console.conf
./obmc-console-server --config obmc-console.conf ttyS0

To Connect Client

To connect to the server, simply run the client:

./obmc-console-client

To disconnect the client, use the standard ~. combination.

Underlying design

This shows how the host UART connection is abstracted within the BMC as a Unix domain socket.

               +---------------------------------------------------------------------------------------------+
               |                                                                                             |
               |       obmc-console-client       unix domain socket         obmc-console-server              |
               |                                                                                             |
               |     +----------------------+                           +------------------------+           |
               |     |   client.2200.conf   |  +---------------------+  | server.ttyVUART0.conf  |           |
           +---+--+  +----------------------+  |                     |  +------------------------+  +--------+-------+
Network    | 2200 +-->                      +->+ @obmc-console.host0 +<-+                        <--+ /dev/ttyVUART0 |   UARTs
           +---+--+  | console-id = "host0" |  |                     |  |  console-id = "host0"  |  +--------+-------+
               |     |                      |  +---------------------+  |                        |           |
               |     +----------------------+                           +------------------------+           |
               |                                                                                             |
               |                                                                                             |
               |                                                                                             |
               +---------------------------------------------------------------------------------------------+

This supports multiple independent consoles. The console-id is a unique portion for the unix domain socket created by the obmc-console-server instance. The server needs to know this because it needs to know what to name the pipe; the client needs to know it as it needs to form the abstract socket name to which to connect.