@@ -17,8 +17,8 @@ use crate::session_diagnostics::{
1717 AsNeededCompatibility , BundleNeedsStatic , EmptyLinkName , ExportSymbolsNeedsStatic ,
1818 ImportNameTypeRaw , ImportNameTypeX86 , IncompatibleWasmLink , InvalidLinkModifier ,
1919 InvalidMachoSection , InvalidMachoSectionReason , LinkFrameworkApple , LinkOrdinalOutOfRange ,
20- LinkRequiresName , MultipleModifiers , NullOnLinkSection , RawDylibNoNul , RawDylibOnlyWindows ,
21- WholeArchiveNeedsStatic ,
20+ LinkRequiresName , MultipleModifiers , NullOnLinkName , NullOnLinkSection , RawDylibNoNul ,
21+ RawDylibOnlyWindows , WholeArchiveNeedsStatic ,
2222} ;
2323
2424pub ( crate ) struct LinkNameParser ;
@@ -46,6 +46,19 @@ impl<S: Stage> SingleAttributeParser<S> for LinkNameParser {
4646 return None ;
4747 } ;
4848
49+ if name. as_str ( ) . contains ( '\0' ) {
50+ // `#[link_name = ...]` will be converted to a null-terminated string,
51+ // so it may not contain any null characters.
52+ cx. emit_err ( NullOnLinkName { span : nv. value_span } ) ;
53+ return None ;
54+ }
55+ if name. is_empty ( ) {
56+ // Otherwise LLVM will just make up a name and the linker will fail
57+ // to find an empty symbol name.
58+ cx. emit_err ( EmptyLinkName { span : nv. value_span } ) ;
59+ return None ;
60+ }
61+
4962 Some ( LinkName { name, span : cx. attr_span } )
5063 }
5164}
@@ -270,9 +283,13 @@ impl LinkParser {
270283 return false ;
271284 } ;
272285
286+ if link_name. as_str ( ) . contains ( '\0' ) {
287+ cx. emit_err ( NullOnLinkName { span : nv. value_span } ) ;
288+ }
273289 if link_name. is_empty ( ) {
274290 cx. emit_err ( EmptyLinkName { span : nv. value_span } ) ;
275291 }
292+
276293 * name = Some ( ( link_name, nv. value_span ) ) ;
277294 true
278295 }
0 commit comments