Fix bug #6186 - map readonly does not work
[ira/wip.git] / source3 / nmbd / nmbd_nameregister.c
index d781e0d89f2d7f9e30be7d65c9713061b505eac9..d4359aab37d44153881e836231be3dbe2f4e8fc0 100644 (file)
@@ -40,8 +40,8 @@ static void register_name_response(struct subnet_record *subrec,
         */
 
        struct nmb_packet *nmb = &p->packet.nmb;
-       BOOL bcast = nmb->header.nm_flags.bcast;
-       BOOL success = True;
+       bool bcast = nmb->header.nm_flags.bcast;
+       bool success = True;
        struct nmb_name *question_name = &rrec->packet->packet.nmb.question.question_name;
        struct nmb_name *answer_name = &nmb->answers->rr_name;
        struct nmb_packet *sent_nmb = &rrec->packet->packet.nmb;
@@ -104,6 +104,14 @@ static void register_name_response(struct subnet_record *subrec,
                         subrec->subnet_name, nmb->header.rcode, inet_ntoa(p->ip)));
                success = False;
        } else {
+               if (!ip_equal_v4(rrec->packet->ip, p->ip)) {
+                       DEBUG(5,("register_name_response: Ignoring WINS server response "
+                               "from IP %s, for name %s. We sent to IP %s\n",
+                               inet_ntoa(p->ip),
+                               nmb_namestr(answer_name),
+                               inet_ntoa(rrec->packet->ip)));
+                       return;
+               }
                /* Unicast - check to see if the response allows us to have the name. */
                if (nmb->header.opcode == NMB_WACK_OPCODE) {
                        /* WINS server is telling us to wait. Pretend we didn't get
@@ -152,10 +160,11 @@ static void register_name_response(struct subnet_record *subrec,
                if( rrec->success_fn)
                        (*(register_name_success_function)rrec->success_fn)(subrec, rrec->userdata, answer_name, nb_flags, ttl, register_ip);
        } else {
+               struct nmb_name qname = *question_name;
                if( rrec->fail_fn)
                        (*(register_name_fail_function)rrec->fail_fn)(subrec, rrec, question_name);
                /* Remove the name. */
-               standard_fail_register( subrec, rrec, question_name);
+               standard_fail_register( subrec, &qname);
        }
 
        /* Ensure we don't retry. */
@@ -248,8 +257,8 @@ static void register_name_timeout_response(struct subnet_record *subrec,
         */
 
        struct nmb_packet *sent_nmb = &rrec->packet->packet.nmb;
-       BOOL bcast = sent_nmb->header.nm_flags.bcast;
-       BOOL success = False;
+       bool bcast = sent_nmb->header.nm_flags.bcast;
+       bool success = False;
        struct nmb_name *question_name = &sent_nmb->question.question_name;
        uint16 nb_flags = 0;
        int ttl = 0;
@@ -280,10 +289,11 @@ static void register_name_timeout_response(struct subnet_record *subrec,
                if( rrec->success_fn)
                        (*(register_name_success_function)rrec->success_fn)(subrec, rrec->userdata, question_name, nb_flags, ttl, registered_ip);
        } else {
+               struct nmb_name qname = *question_name;
                if( rrec->fail_fn)
                        (*(register_name_fail_function)rrec->fail_fn)(subrec, rrec, question_name);
                /* Remove the name. */
-               standard_fail_register( subrec, rrec, question_name);
+               standard_fail_register( subrec, &qname);
        }
 
        /* Ensure we don't retry. */
@@ -361,7 +371,7 @@ static void wins_next_registration(struct response_record *rrec)
        tag = (const char *)userdata->data;
 
        for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
-               if (ip_equal(last_ip, subrec->myip)) {
+               if (ip_equal_v4(last_ip, subrec->myip)) {
                        subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec);
                        break;
                }