Skip to content

Bug: iparmq_ function crash due to incorrect name_len assignment (f2c string, s_copy macro, roots/Armadillo/Win10/MSVC2019) #5809

@ZeroPointField

Description

@ZeroPointField

Summary

A crash or undefined behavior occurs in the LAPACK auxiliary routine iparmq_ due to name_len being set to 0 before calling s_copy, resulting in invalid string copying and uninitialized memory access.


Steps to reproduce / Environment

  • High-level library: Armadillo (C++ linear algebra library)
  • Function: roots
  • Platform: Windows 10 x64
  • Compiler: MSVC 2019
  • OpenBLAS build: develop branch, built with MSVC2019 (64-bit)

Problem details

When using Armadillo's roots function (internally triggers LAPACK/exposed via OpenBLAS), program crashes in iparmq_ (f2c-generated LAPACK code). The bug lies in this code section:

char subnam[6];
integer name_len = 0;
s_copy(subnam, name__, (ftnlen)6, name_len);

Because name_len is set to 0, s_copy does not copy any characters from name__, leaving subnam uninitialized. Subsequent access (e.g., s_cmp, pointer arithmetic) reads undefined memory and causes a crash.

Macro context:

#define f2cmin(a,b) ((a) <= (b) ? (a) : (b))
#define s_copy(A,B,C,D) { int __i,__m; for (__i=0, __m=f2cmin((C),(D)); __i<__m && (B)[__i] != 0; ++__i) (A)[__i] = (B)[__i]; }
  • When D==0, no copy occurs; subnam remains uninitialized stack memory.

User workaround confirmation / test result

Manually patching to name_len = strlen(name__); eliminates the crash. Results of Armadillo's roots match MATLAB, confirming functional correctness in this environment (likely due to NUL-terminated C string via MSVC/f2c/Armadillo stack). However, this is not portable, as pure Fortran calls may not guarantee NUL-termination or C string conventions.


Recommendation / Fix

  • Preferred: Change routine signature to accept the hidden Fortran length argument (ftnlen name_len) and pass this to s_copy (the Fortran/C interface standard for f2c-converted code).
  • Workaround: If changing interface is not feasible, compute the argument length safely (e.g., use strlen(name__) but only if NUL-terminated is guaranteed; otherwise, implement a Fortran-compatible length computation).
  • At minimum: Zero out subnam before access to prevent undefined reads, but this hides the real bug.

Impact

Affects any high-level code using OpenBLAS/LAPACK f2c wrappers in environments similar to the above (Win10/MSVC/Armadillo/roots). Likely applies to other platforms/builds using the same pattern.


Please review and fix as appropriate, and consider auditing similar f2c-generated string handling sites.


中文摘要:
在 Win10 x64 MSVC2019 下,使用Armadillo库调用 roots 时,OpenBLAS-develop(LAPACK/f2c/src/iparmq_)内部 name_len=0 直接传给 s_copy,subnam 未初始化后续代码读取崩溃。用 name_len=strlen(name__) 后功能恢复。建议官方修正形参与长度传递,或实现更通用的字符串长度拷贝处理逻辑。


环境测试人/反馈人:@ZeroPointField (如需进一步日志、testcase 可补充)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions