diff options
-rw-r--r-- | source3/include/includes.h | 1 | ||||
-rw-r--r-- | source3/include/local.h | 5 | ||||
-rw-r--r-- | source3/include/proto.h | 3 | ||||
-rw-r--r-- | source3/include/smb.h | 5 | ||||
-rw-r--r-- | source3/nmbd/asyncdns.c | 12 | ||||
-rw-r--r-- | source3/nmbd/nmbd_mynames.c | 3 | ||||
-rw-r--r-- | source3/nmbd/nmbd_responserecordsdb.c | 25 | ||||
-rw-r--r-- | source3/nmbd/nmbd_winsserver.c | 14 | ||||
-rw-r--r-- | source3/smbd/chgpasswd.c | 4 |
9 files changed, 62 insertions, 10 deletions
diff --git a/source3/include/includes.h b/source3/include/includes.h index f021fa952e..218ce19955 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -554,6 +554,7 @@ char *mktemp(char *); /* No standard include */ #include <sys/priv.h> #include <netinet/tcp.h> #include <locale.h> +#include <arpa/inet.h> /* needed for inet_ntoa proto */ #define SYSV #define USE_WAITPID #define USE_SIGBLOCK diff --git a/source3/include/local.h b/source3/include/local.h index 10906d1ff1..0e2a927d2e 100644 --- a/source3/include/local.h +++ b/source3/include/local.h @@ -39,6 +39,11 @@ #define MAX_CONNECTIONS 127 #define MAX_OPEN_FILES 100 +/* Default size of shared memory used for share mode locking */ +#ifndef SHMEM_SIZE +#define SHMEM_SIZE (1024*MAX_OPEN_FILES) +#endif + /* the max number of connections that the smbstatus program will show */ #define MAXSTATUS 1000 diff --git a/source3/include/proto.h b/source3/include/proto.h index f422b8fc90..fd31db7e62 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -47,7 +47,7 @@ BOOL chgpasswd(char *name,char *oldpass,char *newpass); BOOL chgpasswd(char *name,char *oldpass,char *newpass); BOOL check_lanman_password(char *user, unsigned char *pass1, unsigned char *pass2, struct smb_passwd **psmbpw); -BOOL change_lanman_password(struct smb_passwd *smbpw, char *pass1, char *pass2); +BOOL change_lanman_password(struct smb_passwd *smbpw, unsigned char *pass1, unsigned char *pass2); /*The following definitions come from client.c */ @@ -710,6 +710,7 @@ struct response_record *make_response_record( struct subnet_record *subrec, struct userdata_struct *userdata); struct response_record *find_response_record(struct subnet_record **ppsubrec, uint16 id); +BOOL is_refresh_already_queued(struct subnet_record *subrec, struct name_record *namerec); /*The following definitions come from nmbd_sendannounce.c */ diff --git a/source3/include/smb.h b/source3/include/smb.h index 9c55e3f8be..9a7278069d 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -27,11 +27,6 @@ #define BUFFER_SIZE (0xFFFF) #define SAFETY_MARGIN 1024 -/* Default size of shared memory used for share mode locking */ -#ifndef SHMEM_SIZE -#define SHMEM_SIZE 102400 -#endif - #define NMB_PORT 137 #define DGRAM_PORT 138 #define SMB_PORT 139 diff --git a/source3/nmbd/asyncdns.c b/source3/nmbd/asyncdns.c index ee3fdfcd17..3b71369d67 100644 --- a/source3/nmbd/asyncdns.c +++ b/source3/nmbd/asyncdns.c @@ -187,6 +187,9 @@ void run_dns_queue(void) if (fd_in == -1) return; + /* Allow SIGTERM to kill us. */ + BlockSignals(False, SIGTERM); + if (!process_exists(child_pid)) { close(fd_in); start_async_dns(); @@ -197,9 +200,12 @@ void run_dns_queue(void) DEBUG(0,("Incomplete DNS answer from child!\n")); fd_in = -1; } + BlockSignals(True, SIGTERM); return; } + BlockSignals(True, SIGTERM); + namerec = add_dns_result(&r.name, r.result); if (dns_current) { @@ -305,8 +311,14 @@ BOOL queue_dns_query(struct packet_struct *p,struct nmb_name *question, DEBUG(3,("DNS search for %s - ", namestr(question))); + /* Unblock TERM signal so we can be killed in DNS lookup. */ + BlockSignals(False, SIGTERM); + dns_ip.s_addr = interpret_addr(qname); + /* Re-block TERM signal. */ + BlockSignals(True, SIGTERM); + *n = add_dns_result(question, dns_ip); if(*n == NULL) send_wins_name_query_response(NAM_ERR, p, NULL); diff --git a/source3/nmbd/nmbd_mynames.c b/source3/nmbd/nmbd_mynames.c index 035d1e6d3f..9441449bed 100644 --- a/source3/nmbd/nmbd_mynames.c +++ b/source3/nmbd/nmbd_mynames.c @@ -156,7 +156,8 @@ void refresh_my_names(time_t t) multiple refresh calls being done. We actually deal with refresh failure in the fail_fn. */ - refresh_name(subrec, namerec, NULL, NULL, NULL); + if(!is_refresh_already_queued( subrec, namerec)) + refresh_name(subrec, namerec, NULL, NULL, NULL); namerec->death_time += lp_max_ttl(); namerec->refresh_time += lp_max_ttl(); } diff --git a/source3/nmbd/nmbd_responserecordsdb.c b/source3/nmbd/nmbd_responserecordsdb.c index a075284a4a..ceace36a61 100644 --- a/source3/nmbd/nmbd_responserecordsdb.c +++ b/source3/nmbd/nmbd_responserecordsdb.c @@ -236,3 +236,28 @@ matching record.\n", id)); return NULL; } + +/**************************************************************************** + Check if a refresh is queued for a particular name on a particular subnet. + **************************************************************************/ + +BOOL is_refresh_already_queued(struct subnet_record *subrec, struct name_record *namerec) +{ + struct response_record *rrec = NULL; + + for (rrec = subrec->responselist; rrec; rrec = rrec->next) + { + struct packet_struct *p = rrec->packet; + struct nmb_packet *nmb = &p->packet.nmb; + + if((nmb->header.opcode == NMB_NAME_REFRESH_OPCODE_8) || + (nmb->header.opcode == NMB_NAME_REFRESH_OPCODE_9)) + { + /* Yes it's a queued refresh - check if the name is correct. */ + if(nmb_name_equal(&nmb->question.question_name, &namerec->name)) + return True; + } + } + + return False; +} diff --git a/source3/nmbd/nmbd_winsserver.c b/source3/nmbd/nmbd_winsserver.c index eb120e0918..134b758c29 100644 --- a/source3/nmbd/nmbd_winsserver.c +++ b/source3/nmbd/nmbd_winsserver.c @@ -1052,6 +1052,18 @@ is one of our (WINS server) names. Denying registration.\n", namestr(question) ) } /* + * If the name exists check if the IP address is already registered + * to that name. If so then update the ttl and reply success. + */ + + if((namerec != NULL) && find_ip_in_name_record(namerec, from_ip)) + { + update_name_ttl(namerec, ttl); + send_wins_name_registration_response(0, ttl, p); + return; + } + + /* * If the name exists do a query to the owner * to see if they still want the name. */ @@ -1548,7 +1560,7 @@ void wins_write_database(void) if (namerec->source == REGISTER_NAME) { - fprintf(fp, "%s#%02x %d ", + fprintf(fp, "\"%s#%02x\" %d ", namerec->name.name,namerec->name.name_type, /* Ignore scope. */ (int)namerec->death_time); diff --git a/source3/smbd/chgpasswd.c b/source3/smbd/chgpasswd.c index b516ec8ac8..80c7a43750 100644 --- a/source3/smbd/chgpasswd.c +++ b/source3/smbd/chgpasswd.c @@ -451,9 +451,9 @@ BOOL check_lanman_password(char *user, unsigned char *pass1, no longer be valid. ************************************************************/ -BOOL change_lanman_password(struct smb_passwd *smbpw, char *pass1, char *pass2) +BOOL change_lanman_password(struct smb_passwd *smbpw, unsigned char *pass1, unsigned char *pass2) { - char unenc_new_pw[16]; + unsigned char unenc_new_pw[16]; BOOL ret; if(smbpw == NULL) |