Fix derefrencing of NULL pointer
[platform/upstream/connman.git] / gdhcp / server.c
old mode 100644 (file)
new mode 100755 (executable)
index 728992d..85405f1
@@ -56,7 +56,7 @@ struct _GDHCPServer {
        char *interface;
        uint32_t start_ip;
        uint32_t end_ip;
-       uint32_t server_nip;
+       uint32_t server_nip;    /* our address in network byte order */
        uint32_t lease_seconds;
        int listener_sockfd;
        guint listener_watch;
@@ -65,6 +65,7 @@ struct _GDHCPServer {
        GHashTable *nip_lease_hash;
        GHashTable *option_hash; /* Options send to client */
        GDHCPSaveLeaseFunc save_lease_func;
+       GDHCPLeaseAddedCb lease_added_cb;
        GDHCPDebugFunc debug_func;
        gpointer debug_data;
 };
@@ -395,7 +396,7 @@ GDHCPServer *g_dhcp_server_new(GDHCPType type,
        dhcp_server->ref_count = 1;
        dhcp_server->ifindex = ifindex;
        dhcp_server->listener_sockfd = -1;
-       dhcp_server->listener_watch = -1;
+       dhcp_server->listener_watch = 0;
        dhcp_server->listener_channel = NULL;
        dhcp_server->save_lease_func = NULL;
        dhcp_server->debug_func = NULL;
@@ -450,7 +451,7 @@ static void init_packet(GDHCPServer *dhcp_server, struct dhcp_packet *packet,
        packet->gateway_nip = client_packet->gateway_nip;
        packet->ciaddr = client_packet->ciaddr;
        dhcp_add_option_uint32(packet, DHCP_SERVER_ID,
-                                               dhcp_server->server_nip);
+                                       ntohl(dhcp_server->server_nip));
 }
 
 static void add_option(gpointer key, gpointer value, gpointer user_data)
@@ -529,7 +530,7 @@ static void send_packet_to_client(GDHCPServer *dhcp_server,
        dhcp_send_raw_packet(dhcp_pkt,
                dhcp_server->server_nip, SERVER_PORT,
                ciaddr, CLIENT_PORT, chaddr,
-               dhcp_server->ifindex);
+               dhcp_server->ifindex, false);
 }
 
 static void send_offer(GDHCPServer *dhcp_server,
@@ -612,6 +613,9 @@ static void send_ACK(GDHCPServer *dhcp_server,
        send_packet_to_client(dhcp_server, &packet);
 
        add_lease(dhcp_server, 0, packet.chaddr, packet.yiaddr);
+
+       if (dhcp_server->lease_added_cb)
+               dhcp_server->lease_added_cb(packet.chaddr, packet.yiaddr);
 }
 
 static void send_NAK(GDHCPServer *dhcp_server,
@@ -626,7 +630,7 @@ static void send_NAK(GDHCPServer *dhcp_server,
        dhcp_send_raw_packet(&packet,
                        dhcp_server->server_nip, SERVER_PORT,
                        INADDR_BROADCAST, CLIENT_PORT, MAC_BCAST_ADDR,
-                       dhcp_server->ifindex);
+                       dhcp_server->ifindex, false);
 }
 
 static void send_inform(GDHCPServer *dhcp_server,
@@ -664,7 +668,8 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
 
        server_id_option = dhcp_get_option(&packet, DHCP_SERVER_ID);
        if (server_id_option) {
-               uint32_t server_nid = get_be32(server_id_option);
+               uint32_t server_nid =
+                       get_unaligned((const uint32_t *) server_id_option);
 
                if (server_nid != dhcp_server->server_nip)
                        return TRUE;
@@ -686,7 +691,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                debug(dhcp_server, "Received REQUEST NIP %d",
                                                        requested_nip);
                if (requested_nip == 0) {
-                       requested_nip = packet.ciaddr;
+                       requested_nip = ntohl(packet.ciaddr);
                        if (requested_nip == 0)
                                break;
                }
@@ -814,6 +819,15 @@ void g_dhcp_server_set_save_lease(GDHCPServer *dhcp_server,
        dhcp_server->save_lease_func = func;
 }
 
+void g_dhcp_server_set_lease_added_cb(GDHCPServer *dhcp_server,
+                                                       GDHCPLeaseAddedCb cb)
+{
+       if (!dhcp_server)
+               return;
+
+       dhcp_server->lease_added_cb = cb;
+}
+
 GDHCPServer *g_dhcp_server_ref(GDHCPServer *dhcp_server)
 {
        if (!dhcp_server)