|
From: Jiri J. <jja...@re...> - 2014-09-23 09:45:13
|
Signed-off-by: Jiri Jaburek <jja...@re...>
---
audit-test/syscalls/syscall_functions.bash | 4 +--
audit-test/utils/bin/do_bind.c | 49 +++++++++++++++++++++---------
2 files changed, 37 insertions(+), 16 deletions(-)
diff --git a/audit-test/syscalls/syscall_functions.bash b/audit-test/syscalls/syscall_functions.bash
index 161331e..bd38b40 100644
--- a/audit-test/syscalls/syscall_functions.bash
+++ b/audit-test/syscalls/syscall_functions.bash
@@ -715,8 +715,8 @@ function create_io_objects_cap {
io_priv)
flag=1 ;; # process io privilege level
port_priv)
- target=24 # site-dependent mail handling, unused
- flag=0 # INADDR_ANY
+ target=0.0.0.0 # INADDR_ANY
+ flag=24 # site-dependent mail handling, unused
[[ -n $op ]] && augrokfunc=augrok_op ;;
fio_fibmap)
create_file target mode="a+rwx"
diff --git a/audit-test/utils/bin/do_bind.c b/audit-test/utils/bin/do_bind.c
index 1e77bd6..f6bfe75 100644
--- a/audit-test/utils/bin/do_bind.c
+++ b/audit-test/utils/bin/do_bind.c
@@ -16,33 +16,54 @@
#include "includes.h"
#include <sys/socket.h>
#include <netinet/in.h>
-#include <linux/net.h>
+#include <arpa/inet.h>
+#include <linux/un.h> /* instead of <sys/un.h> for UNIX_PATH_MAX */
int main(int argc, char **argv)
{
int exitval, result;
int sockfd;
- struct sockaddr_in my_addr;
- socklen_t addrlen = sizeof(my_addr);
+ union {
+ struct sockaddr_in in;
+ struct sockaddr_un un;
+ } addr;
+ socklen_t addrlen;
+ int domain;
- if (argc != 3) {
- fprintf(stderr, "Usage:\n%s <port> <0|127>\n", argv[0]);
- return 1;
+ if (argc < 2) {
+ fprintf(stderr, "Usage:\n"
+ "%s <address> [port]\n"
+ "%s <unix_path>\n",
+ argv[0], argv[0]);
+ return 1;
}
- memset(&my_addr, 0, addrlen);
- my_addr.sin_family = AF_INET;
- my_addr.sin_port = htons(atoi(argv[1]));
- my_addr.sin_addr.s_addr = atoi(argv[2]);
+ /* try ipv4 addr first, fallback to unix domain sockets */
+ if (inet_aton(argv[1], NULL)) {
+ domain = PF_INET;
+ addrlen = sizeof(struct sockaddr_in);
+ memset(&addr, 0, addrlen);
+ addr.in.sin_family = AF_INET;
+ if (argc >= 3)
+ addr.in.sin_port = htons(atoi(argv[2]));
+ printf("%d\n", ntohs(addr.in.sin_port));
+ inet_aton(argv[1], &addr.in.sin_addr);
+ } else {
+ domain = PF_UNIX;
+ addrlen = sizeof(struct sockaddr_un);
+ memset(&addr, 0, addrlen);
+ addr.un.sun_family = AF_UNIX;
+ strncpy(addr.un.sun_path, argv[1], UNIX_PATH_MAX);
+ }
- sockfd = socket(PF_INET, SOCK_STREAM, 0);
+ sockfd = socket(domain, SOCK_STREAM, 0);
if (sockfd < 0) {
- perror("do_bind: open socket");
- return TEST_ERROR;
+ perror("do_bind: open socket");
+ return TEST_ERROR;
}
errno = 0;
- exitval = bind(sockfd, (struct sockaddr *)&my_addr, addrlen);
+ exitval = bind(sockfd, (struct sockaddr *)&addr, addrlen);
result = exitval < 0;
printf("%d %d %d\n", result, result ? errno : exitval, getpid());
--
1.8.3.1
|