diff options
author | Jeffrey Hutzelman <jhutz@cmu.edu> | 2013-01-04 16:33:59 -0500 |
---|---|---|
committer | Jeffrey Hutzelman <jhutz@cmu.edu> | 2013-02-17 22:34:40 -0500 |
commit | 3923d414d0408e2f33dff220c5964b36e28565ba (patch) | |
tree | 43c7518b25eb340cc1a41e6c4d017507ac893046 /server/realm.c | |
parent | 854948b8a897cfc2791c8823922b4600668445b1 (diff) |
Make otherrealms be an array of pointers
The server keeps pointers to realms in non-ephemeral data structures, such
as triplet subscriber lists. Thus, we cannot move existing realms around
in memory without causing data corruption. However, dynamic reloading of
the realm.list means new realms can appear, which sooner or later will
mean reallocating the otherrealms array to make room for more realms.
Therefore, to allow otherrealms to be reallocated without changing the
addresses of existing realms, otherrealms is converted from an array of
realms to an array of pointers to realms.
Diffstat (limited to 'server/realm.c')
-rw-r--r-- | server/realm.c | 94 |
1 files changed, 50 insertions, 44 deletions
diff --git a/server/realm.c b/server/realm.c index 68502d6..6b84e05 100644 --- a/server/realm.c +++ b/server/realm.c @@ -3,7 +3,7 @@ Unacked *rlm_nacklist = NULL; /* not acked list for realm-realm packets */ -ZRealm *otherrealms; /* points to an array of the known +ZRealm **otherrealms; /* points to an array of the known servers */ int nrealms = 0; /* number of other realms */ @@ -127,7 +127,6 @@ realm_next_idx_by_idx(realm, idx) const char * realm_expand_realm(char *realmname) { - ZRealm *realm; int a; /* First, look for an exact match (case insensitive) */ @@ -136,9 +135,9 @@ realm_expand_realm(char *realmname) return(ZGetRealm()); #endif - for (realm = otherrealms, a = 0; a < nrealms; a++, realm++) - if (!strcasecmp(realm->name, realmname)) - return(realm->name); + for (a = 0; a < nrealms; a++) + if (!strcasecmp(otherrealms[a]->name, realmname)) + return(otherrealms[a]->name); /* No exact match. See if there's a partial match */ #if defined(HAVE_KRB4) || defined(HAVE_KRB5) @@ -146,21 +145,20 @@ realm_expand_realm(char *realmname) return(ZGetRealm()); #endif - for (realm = otherrealms, a = 0; a < nrealms; a++, realm++) - if (!strncasecmp(realm->name, realmname, strlen(realmname))) - return(realm->name); + for (a = 0; a < nrealms; a++) + if (!strncasecmp(otherrealms[a]->name, realmname, strlen(realmname))) + return(otherrealms[a]->name); return(realmname); } ZRealm * realm_get_realm_by_pid(int pid) { - ZRealm *realm; int a; - for (realm = otherrealms, a = 0; a < nrealms; a++, realm++) - if (realm->child_pid == pid) - return(realm); + for (a = 0; a < nrealms; a++) + if (otherrealms[a]->child_pid == pid) + return(otherrealms[a]); return 0; } @@ -168,12 +166,11 @@ realm_get_realm_by_pid(int pid) void kill_realm_pids(void) { - ZRealm *realm; int a; - for (realm = otherrealms, a = 0; a < nrealms; a++, realm++) - if (realm->child_pid != 0) - kill(realm->child_pid, 9); + for (a = 0; a < nrealms; a++) + if (otherrealms[a]->child_pid != 0) + kill(otherrealms[a]->child_pid, 9); return; } @@ -279,7 +276,7 @@ realm_send_realms(void) { int cnt, retval; for (cnt = 0; cnt < nrealms; cnt++) { - retval = subscr_send_realm_subs(&otherrealms[cnt]); + retval = subscr_send_realm_subs(otherrealms[cnt]); if (retval != ZERR_NONE) return(retval); } @@ -325,7 +322,6 @@ realm_sender_in_realm(const char *realm, char *sender) ZRealm * realm_which_realm(struct sockaddr_in *who) { - ZRealm *realm; ZRealm_server *srvr; int a, b; @@ -333,13 +329,15 @@ realm_which_realm(struct sockaddr_in *who) return 0; /* loop through the realms */ - for (realm = otherrealms, a = 0; a < nrealms; a++, realm++) + for (a = 0; a < nrealms; a++) /* loop through the addresses for the realm */ - for (srvr = realm->srvrs, b = 0; b < realm->count; b++, srvr++) { + for (srvr = otherrealms[a]->srvrs, b = 0; + b < otherrealms[a]->count; + b++, srvr++) { if (!srvr->usable) continue; if (srvr->addr.sin_addr.s_addr == who->sin_addr.s_addr) - return(realm); + return(otherrealms[a]); } return 0; @@ -349,17 +347,16 @@ ZRealm * realm_get_realm_by_name(char *name) { int a; - ZRealm *realm; /* First, look for an exact match (case insensitive) */ - for (realm = otherrealms, a = 0; a < nrealms; a++, realm++) - if (!strcasecmp(realm->name, name)) - return(realm); + for (a = 0; a < nrealms; a++) + if (!strcasecmp(otherrealms[a]->name, name)) + return(otherrealms[a]); /* Failing that, look for an inexact match */ - for (realm = otherrealms, a = 0; a < nrealms; a++, realm++) - if (!strncasecmp(realm->name, name, strlen(name))) - return(realm); + for (a = 0; a < nrealms; a++) + if (!strncasecmp(otherrealms[a]->name, name, strlen(name))) + return(otherrealms[a]); return 0; } @@ -368,10 +365,10 @@ ZRealm * realm_get_realm_by_name_string(String *z) { int a; - ZRealm *realm; - for (realm = otherrealms, a = 0; a < nrealms; a++, realm++) - if (realm->namestr == z) return realm; + for (a = 0; a < nrealms; a++) + if (otherrealms[a]->namestr == z) + return otherrealms[a]; return 0; } @@ -393,7 +390,7 @@ rlm_nack_cancel(register ZNotice_t *notice, } for (nacked = rlm_nacklist; nacked; nacked = nacked->next) { - if (&otherrealms[nacked->dest.rlm.rlm_idx] == which) { + if (nacked->dest.rlm.realm == which) { /* First, note the realm appears to be up */ which->state = REALM_UP; if (ZCompareUID(&nacked->uid, ¬ice->z_uid)) { @@ -532,15 +529,22 @@ realm_init(void) for (nrealms = 0; rlmnames[nrealms].name; nrealms++); - otherrealms = (ZRealm *)malloc(nrealms * sizeof(ZRealm)); + otherrealms = (ZRealm **)malloc(nrealms * sizeof(ZRealm *)); if (!otherrealms) { syslog(LOG_CRIT, "malloc failed in realm_init"); abort(); } - memset(otherrealms, 0, (nrealms * sizeof(ZRealm))); + memset(otherrealms, 0, (nrealms * sizeof(ZRealm *))); for (ii = 0; ii < nrealms; ii++) { - rlm = &otherrealms[ii]; + rlm = (ZRealm *) malloc(sizeof(ZRealm)); + if (!rlm) { + syslog(LOG_CRIT, "malloc failed in realm_init"); + abort(); + } + memset(rlm, 0, sizeof(ZRealm)); + otherrealms[ii] = rlm; + rlm->namestr = rlmnames[ii].name; rlm->name = rlm->namestr->string; @@ -604,12 +608,13 @@ realm_deathgram(Server *server) int jj = 0; /* Get it out once, and assume foreign servers will share */ - for (realm = otherrealms, jj = 0; jj < nrealms; jj++, realm++) { + for (jj = 0; jj < nrealms; jj++) { ZNotice_t snotice; char *pack; char rlm_recipient[REALM_SZ + 1]; int packlen, retval; + realm = otherrealms[jj]; memset (&snotice, 0, sizeof (snotice)); snotice.z_kind = ACKED; @@ -671,12 +676,13 @@ realm_wakeup(void) if (nservers < 2 || !found) { /* if we're the only server up, send a REALM_BOOT to one of their servers here */ - for (realm = otherrealms, jj = 0; jj < nrealms; jj++, realm++) { + for (jj = 0; jj < nrealms; jj++) { ZNotice_t snotice; char *pack; char rlm_recipient[REALM_SZ + 1]; int packlen, retval; + realm = otherrealms[jj]; memset (&snotice, 0, sizeof (snotice)); snotice.z_opcode = REALM_BOOT; @@ -979,7 +985,7 @@ realm_sendit(ZNotice_t *notice, memset(nacked, 0, sizeof(Unacked)); nacked->packet = pack; - nacked->dest.rlm.rlm_idx = realm - otherrealms; + nacked->dest.rlm.realm = realm; nacked->dest.rlm.rlm_srv_idx = realm->idx; nacked->packsz = packlen; nacked->uid = notice->z_uid; @@ -1018,7 +1024,7 @@ rlm_rexmit(void *arg) zdbug((LOG_DEBUG,"rlm_rexmit")); - realm = &otherrealms[nackpacket->dest.rlm.rlm_idx]; + realm = nackpacket->dest.rlm.realm; zdbug((LOG_DEBUG, "rlm_rexmit: sending to %s:%d (%d)", realm->name, realm->idx, nackpacket->rexmits)); @@ -1094,13 +1100,13 @@ realm_dump_realms(FILE *fp) register int ii, jj; for (ii = 0; ii < nrealms; ii++) { - (void) fprintf(fp, "%d:%s\n", ii, otherrealms[ii].name); - for (jj = 0; jj < otherrealms[ii].count; jj++) { + (void) fprintf(fp, "%d:%s\n", ii, otherrealms[ii]->name); + for (jj = 0; jj < otherrealms[ii]->count; jj++) { (void) fprintf(fp, "\t%s\n", - inet_ntoa(otherrealms[ii].srvrs[jj].addr.sin_addr)); + inet_ntoa(otherrealms[ii]->srvrs[jj].addr.sin_addr)); } /* dump the subs */ - subscr_dump_subs(fp, otherrealms[ii].subs); + subscr_dump_subs(fp, otherrealms[ii]->subs); } } @@ -1119,7 +1125,7 @@ realm_auth_sendit_nacked(char *buffer, int packlen, ZRealm *realm, memset(nacked, 0, sizeof(Unacked)); nacked->packet = buffer; - nacked->dest.rlm.rlm_idx = realm - otherrealms; + nacked->dest.rlm.realm = realm; nacked->dest.rlm.rlm_srv_idx = realm->idx; nacked->packsz = packlen; nacked->uid = uid; |