(nat_ca, cou_ca, ef_init_srv, xdvisible): Plug major information leak:
nat_ca[] was designed for visibility to the owner only, while cou_ca[] was designed for the public. xdvisible() implemented that for xdump. But selectors don't care for that! Since nat_ca[] applies to EF_NATION, it must be for public visibility. Broken in 4.2.21. Fix by exchanging contents of nat_ca[] and and cou_ca[]. This breaks clients relying on xdump.
This commit is contained in:
parent
548bc5bbdc
commit
93b6a54356
3 changed files with 11 additions and 11 deletions
|
@ -215,9 +215,9 @@ xdvisible(int type, void *p)
|
||||||
case EF_LOST:
|
case EF_LOST:
|
||||||
return gp->own != 0 && (gp->own == player->cnum || player->god);
|
return gp->own != 0 && (gp->own == player->cnum || player->god);
|
||||||
case EF_NATION:
|
case EF_NATION:
|
||||||
return gp->own == player->cnum;
|
|
||||||
case EF_COUNTRY:
|
|
||||||
return ((struct natstr *)p)->nat_stat != STAT_UNUSED;
|
return ((struct natstr *)p)->nat_stat != STAT_UNUSED;
|
||||||
|
case EF_COUNTRY:
|
||||||
|
return gp->own == player->cnum;
|
||||||
case EF_NEWS:
|
case EF_NEWS:
|
||||||
return ((struct nwsstr *)p)->nws_vrb != 0
|
return ((struct nwsstr *)p)->nws_vrb != 0
|
||||||
&& (!opt_HIDDEN || player->god); /* FIXME */
|
&& (!opt_HIDDEN || player->god); /* FIXME */
|
||||||
|
|
|
@ -485,14 +485,14 @@ struct castr trade_ca[] = {
|
||||||
{NSC_NOTYPE, 0, 0, 0, NULL, EF_BAD}
|
{NSC_NOTYPE, 0, 0, 0, NULL, EF_BAD}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct castr nat_ca[] = {
|
struct castr cou_ca[] = {
|
||||||
/*
|
/*
|
||||||
* This is the owner's view, i.e. it applies only to the own
|
* This is the owner's view, i.e. it applies only to the own
|
||||||
* nation. The public view cou_ca[], which applies to all
|
* nation. The public view nat_ca[], which applies to all
|
||||||
* nations, has the same selectors with different flags: NSC_DEITY
|
* nations, has the same selectors with different flags: NSC_DEITY
|
||||||
* is set except for cnum (which must come first) and all
|
* is set except for cnum (which must come first) and all
|
||||||
* NSC_EXTRA selectors, NSC_EXTRA is cleared.
|
* NSC_EXTRA selectors, NSC_EXTRA is cleared.
|
||||||
* cou_ca[] should also make tech, research, education and
|
* nat_ca[] should also make tech, research, education and
|
||||||
* happiness available, but we can't express the obfuscation
|
* happiness available, but we can't express the obfuscation
|
||||||
* necessary for foreign levels.
|
* necessary for foreign levels.
|
||||||
*/
|
*/
|
||||||
|
@ -543,7 +543,7 @@ struct castr nat_ca[] = {
|
||||||
{NSC_NOTYPE, 0, 0, 0, NULL, EF_BAD}
|
{NSC_NOTYPE, 0, 0, 0, NULL, EF_BAD}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct castr cou_ca[sizeof(nat_ca) / sizeof(*nat_ca)];
|
struct castr nat_ca[sizeof(cou_ca) / sizeof(*cou_ca)];
|
||||||
/* initialized in ef_init_srv() */
|
/* initialized in ef_init_srv() */
|
||||||
|
|
||||||
struct castr realm_ca[] = {
|
struct castr realm_ca[] = {
|
||||||
|
|
|
@ -71,16 +71,16 @@ ef_init_srv(void)
|
||||||
empfile[fileinit[i].ef_type].prewrite = fileinit[i].prewrite;
|
empfile[fileinit[i].ef_type].prewrite = fileinit[i].prewrite;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; nat_ca[i].ca_name; i++) {
|
for (i = 0; cou_ca[i].ca_name; i++) {
|
||||||
cou_ca[i] = nat_ca[i];
|
nat_ca[i] = cou_ca[i];
|
||||||
flags = cou_ca[i].ca_flags | NSC_CONST;
|
flags = nat_ca[i].ca_flags | NSC_CONST;
|
||||||
if (flags & NSC_EXTRA)
|
if (flags & NSC_EXTRA)
|
||||||
flags &= ~NSC_EXTRA;
|
flags &= ~NSC_EXTRA;
|
||||||
else if (i != 0)
|
else if (i != 0)
|
||||||
flags |= NSC_DEITY;
|
flags |= NSC_DEITY;
|
||||||
cou_ca[i].ca_flags = flags;
|
nat_ca[i].ca_flags = flags;
|
||||||
}
|
}
|
||||||
cou_ca[i] = nat_ca[i];
|
nat_ca[i] = cou_ca[i];
|
||||||
|
|
||||||
ef_open_srv();
|
ef_open_srv();
|
||||||
if (ef_verify() < 0)
|
if (ef_verify() < 0)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue