Skip to content

Commit 5726fd4

Browse files
committed
librustc: Forbid access to cross-crate private static methods
1 parent 56d288d commit 5726fd4

File tree

5 files changed

+46
-17
lines changed

5 files changed

+46
-17
lines changed

src/librustc/metadata/csearch.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,11 @@ pub fn struct_dtor(cstore: @mut cstore::CStore, def: ast::def_id)
229229
decoder::struct_dtor(cdata, def.node)
230230
}
231231

232-
pub fn get_method_visibility(cstore: @mut cstore::CStore,
233-
def_id: ast::def_id)
234-
-> ast::visibility {
232+
pub fn get_item_visibility(cstore: @mut cstore::CStore,
233+
def_id: ast::def_id)
234+
-> ast::visibility {
235235
let cdata = cstore::get_crate_data(cstore, def_id.crate);
236-
decoder::get_method_visibility(cdata, def_id.node)
236+
decoder::get_item_visibility(cdata, def_id.node)
237237
}
238238

239239
pub fn get_link_args_for_crate(cstore: @mut cstore::CStore,

src/librustc/metadata/decoder.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,16 @@ fn item_family(item: ebml::Doc) -> Family {
145145
}
146146

147147
fn item_visibility(item: ebml::Doc) -> ast::visibility {
148-
let visibility = reader::get_doc(item, tag_items_data_item_visibility);
149-
debug!("item visibility for %?", item_family(item));
150-
match reader::doc_as_u8(visibility) as char {
151-
'y' => ast::public,
152-
'n' => ast::private,
153-
'i' => ast::inherited,
154-
_ => fail!(~"unknown visibility character"),
148+
match reader::maybe_get_doc(item, tag_items_data_item_visibility) {
149+
None => ast::public,
150+
Some(visibility_doc) => {
151+
match reader::doc_as_u8(visibility_doc) as char {
152+
'y' => ast::public,
153+
'n' => ast::private,
154+
'i' => ast::inherited,
155+
_ => fail!(~"unknown visibility character")
156+
}
157+
}
155158
}
156159
}
157160
@@ -909,8 +912,8 @@ pub fn get_struct_fields(intr: @ident_interner, cdata: cmd, id: ast::node_id)
909912
result
910913
}
911914

912-
pub fn get_method_visibility(cdata: cmd, id: ast::node_id)
913-
-> ast::visibility {
915+
pub fn get_item_visibility(cdata: cmd, id: ast::node_id)
916+
-> ast::visibility {
914917
item_visibility(lookup_item(id, cdata.data))
915918
}
916919

src/librustc/middle/privacy.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,7 @@ pub fn check_crate(tcx: ty::ctxt,
265265
}
266266
} else {
267267
let visibility =
268-
csearch::get_method_visibility(tcx.sess.cstore,
269-
method_id);
268+
csearch::get_item_visibility(tcx.sess.cstore, method_id);
270269
if visibility != public {
271270
tcx.sess.span_err(span,
272271
fmt!("method `%s` is private",
@@ -298,8 +297,16 @@ pub fn check_crate(tcx: ty::ctxt,
298297
.idents
299298
.last())));
300299
}
301-
} else {
302-
// XXX: Check privacy in external crates.
300+
} else if csearch::get_item_visibility(tcx.sess.cstore,
301+
def_id) != public {
302+
tcx.sess.span_err(span,
303+
fmt!("function `%s` is private",
304+
*tcx.sess
305+
.parse_sess
306+
.interner
307+
.get(copy *path
308+
.idents
309+
.last())));
303310
}
304311
}
305312
_ => {}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#[crate_type="lib"];
2+
3+
pub struct Foo {
4+
x: int
5+
}
6+
7+
impl Foo {
8+
fn new() -> Foo { Foo { x: 1 } }
9+
}
10+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// xfail-fast
2+
// aux-build:xc_private_method_lib.rs
3+
4+
extern mod xc_private_method_lib;
5+
6+
fn main() {
7+
let _ = xc_private_method_lib::Foo::new(); //~ ERROR function `new` is private
8+
}
9+

0 commit comments

Comments
 (0)