Skip to content

Instantly share code, notes, and snippets.

@PeterCxy
Created March 4, 2018 10:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PeterCxy/452cef38e51521dda3b35df86f70a939 to your computer and use it in GitHub Desktop.
Save PeterCxy/452cef38e51521dda3b35df86f70a939 to your computer and use it in GitHub Desktop.
echo_deadlock.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/netfilter_ipv4.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
#define on_error(...) { fprintf(stderr, __VA_ARGS__); fflush(stderr); exit(1); }
int main (int argc, char *argv[]) {
if (argc < 2) on_error("Usage: %s [port]\n", argv[0]);
int port = atoi(argv[1]);
int server_fd, client_fd, err;
struct sockaddr_in server, client;
char buf[BUFFER_SIZE];
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) on_error("Could not create socket\n");
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = htonl(INADDR_ANY);
int opt_val = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof opt_val);
err = bind(server_fd, (struct sockaddr *) &server, sizeof(server));
if (err < 0) on_error("Could not bind socket\n");
err = listen(server_fd, 128);
if (err < 0) on_error("Could not listen on socket\n");
printf("Server is listening on %d\n", port);
while (1) {
socklen_t client_len = sizeof(client);
client_fd = accept(server_fd, (struct sockaddr *) &client, &client_len);
/* BUG BUG BUG */
struct sockaddr_storage dst;
int s = sizeof(dst);
int error = getsockopt(client_fd, SOL_IP, SO_ORIGINAL_DST, &dst, &s);
if (error) {
return 1;
}
/* BUG BUG BUG */
if (client_fd < 0) on_error("Could not establish new connection\n");
while (1) {
int read = recv(client_fd, buf, BUFFER_SIZE, 0);
if (!read) break; // done reading
if (read < 0) on_error("Client read failed\n");
err = send(client_fd, buf, read, 0);
if (err < 0) on_error("Client write failed\n");
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment