fortrangoingonforty/fortty / 19adcf3

Browse files

Fix segfault caused by noexecstack linker flag

- Remove -Wl,-z,noexecstack flag which crashes gfortran trampolines
- Add -fno-trampolines compiler flag (best practice)
- Fix unused argument suppression using c_associated() instead of transfer()
- gfortran requires executable stack for internal procedure callbacks (do_render)
Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
19adcf3d5bb643e33da838da3d75e69af572fd6d
Parents
7c4a91a
Tree
6b47de8

2 changed files

StatusFile+-
M CMakeLists.txt 5 3
M src/window/window.f90 13 12
CMakeLists.txtmodified
@@ -5,9 +5,11 @@ project(fortty LANGUAGES Fortran C)
55
 set(CMAKE_C_STANDARD 11)
66
 set(CMAKE_C_STANDARD_REQUIRED ON)
77
 
8
-# Compiler warnings
8
+# Compiler warnings and security flags
99
 if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
1010
     add_compile_options(-Wall -Wextra -pedantic)
11
+    # Avoid trampolines which require executable stack
12
+    add_compile_options(-fno-trampolines)
1113
 endif()
1214
 
1315
 # Find dependencies
@@ -112,8 +114,8 @@ endif()
112114
 # For Linux, we need dl for GLAD's dlopen
113115
 if(UNIX AND NOT APPLE)
114116
     target_link_libraries(fortty PRIVATE dl)
115
-    # Mark stack as non-executable to suppress linker warning
116
-    target_link_options(fortty PRIVATE -Wl,-z,noexecstack)
117
+    # Note: Cannot use -Wl,-z,noexecstack as gfortran's internal procedures
118
+    # used as callbacks (do_render) require executable stack for trampolines
117119
 endif()
118120
 
119121
 # TODO: Link Cocoa framework for blur when CMake framework flag issue is resolved
src/window/window.f90modified
@@ -231,8 +231,8 @@ contains
231231
     type(c_ptr), value :: window
232232
     integer(c_int), value :: width, height
233233
 
234
-    ! Unused argument (required by GLFW callback signature)
235
-    if (.false.) print *, transfer(window, 0_c_int)
234
+    ! Suppress unused argument warning (required by GLFW callback signature)
235
+    if (.false. .and. c_associated(window)) continue
236236
 
237237
     call glViewport(0, 0, width, height)
238238
 
@@ -248,8 +248,8 @@ contains
248248
   subroutine window_refresh_callback(window) bind(C)
249249
     type(c_ptr), value :: window
250250
 
251
-    ! Unused argument (required by GLFW callback signature)
252
-    if (.false.) print *, transfer(window, 0_c_int)
251
+    ! Suppress unused argument warning (required by GLFW callback signature)
252
+    if (.false. .and. c_associated(window)) continue
253253
 
254254
     ! Trigger a redraw via the render callback
255255
     if (associated(render_callback)) then
@@ -525,8 +525,8 @@ contains
525525
     character(len=4) :: utf8
526526
     integer :: utf8_len
527527
 
528
-    ! Unused argument (required by GLFW callback signature)
529
-    if (.false.) print *, transfer(window, 0_c_int)
528
+    ! Suppress unused argument warning (required by GLFW callback signature)
529
+    if (.false. .and. c_associated(window)) continue
530530
 
531531
     if (.not. associated(active_pty)) return
532532
 
@@ -658,8 +658,8 @@ contains
658658
     integer(c_int), value :: error_code
659659
     type(c_ptr), value :: description
660660
 
661
-    ! Unused argument (required by GLFW callback signature)
662
-    if (.false.) print *, transfer(description, 0_c_int)
661
+    ! Suppress unused argument warning (required by GLFW callback signature)
662
+    if (.false. .and. c_associated(description)) continue
663663
 
664664
     print *, "GLFW Error ", error_code
665665
   end subroutine error_callback
@@ -670,8 +670,9 @@ contains
670670
     real(c_double), value :: xoffset, yoffset
671671
     integer :: scroll_lines
672672
 
673
-    ! Unused arguments (required by GLFW callback signature)
674
-    if (.false.) print *, transfer(window, 0_c_int), xoffset
673
+    ! Suppress unused argument warnings (required by GLFW callback signature)
674
+    if (.false. .and. c_associated(window)) continue
675
+    if (.false. .and. xoffset > 0.0d0) continue
675676
 
676677
     if (.not. associated(active_term)) return
677678
 
@@ -807,8 +808,8 @@ contains
807808
     real(c_double), value :: xpos, ypos
808809
     integer :: col, row
809810
 
810
-    ! Unused argument (required by GLFW callback signature)
811
-    if (.false.) print *, transfer(window, 0_c_int)
811
+    ! Suppress unused argument warning (required by GLFW callback signature)
812
+    if (.false. .and. c_associated(window)) continue
812813
 
813814
     ! Only update if actively selecting
814815
     if (.not. active_selection%selecting) return