@@ -17,7 +17,7 @@ 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 ,
20+ LinkRequiresName , MultipleModifiers , NullOnLinkName , NullOnLinkSection , RawDylibOnlyWindows ,
2121 WholeArchiveNeedsStatic ,
2222} ;
2323
@@ -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}
@@ -222,7 +235,7 @@ impl<S: Stage> CombineAttributeParser<S> for LinkParser {
222235 if wasm_import_module. is_some ( ) {
223236 ( name, kind) = ( wasm_import_module, Some ( NativeLibKind :: WasmImportModule ) ) ;
224237 }
225- let Some ( ( name, name_span ) ) = name else {
238+ let Some ( ( name, _name_span ) ) = name else {
226239 cx. emit_err ( LinkRequiresName { span : cx. attr_span } ) ;
227240 return None ;
228241 } ;
@@ -234,12 +247,6 @@ impl<S: Stage> CombineAttributeParser<S> for LinkParser {
234247 }
235248 }
236249
237- if let Some ( NativeLibKind :: RawDylib { .. } ) = kind
238- && name. as_str ( ) . contains ( '\0' )
239- {
240- cx. emit_err ( RawDylibNoNul { span : name_span } ) ;
241- }
242-
243250 Some ( LinkEntry {
244251 span : cx. attr_span ,
245252 kind : kind. unwrap_or ( NativeLibKind :: Unspecified ) ,
@@ -270,9 +277,13 @@ impl LinkParser {
270277 return false ;
271278 } ;
272279
280+ if link_name. as_str ( ) . contains ( '\0' ) {
281+ cx. emit_err ( NullOnLinkName { span : nv. value_span } ) ;
282+ }
273283 if link_name. is_empty ( ) {
274284 cx. emit_err ( EmptyLinkName { span : nv. value_span } ) ;
275285 }
286+
276287 * name = Some ( ( link_name, nv. value_span ) ) ;
277288 true
278289 }
0 commit comments